Add svelte as a view engine to swaf #33

Merged
ashpie merged 97 commits from svelte into develop 2021-11-09 19:31:22 +01:00
94 changed files with 861 additions and 788 deletions
Showing only changes of commit 82ab0b963c - Show all commits

View File

@ -3,13 +3,16 @@ module.exports = {
parser: '@typescript-eslint/parser', parser: '@typescript-eslint/parser',
plugins: [ plugins: [
'svelte3', 'svelte3',
'@typescript-eslint' '@typescript-eslint',
'import',
'simple-import-sort',
], ],
parserOptions: { parserOptions: {
tsconfigRootDir: __dirname, tsconfigRootDir: __dirname,
project: [ project: [
'./tsconfig.json', './tsconfig.json',
'./tsconfig.test.json' './tsconfig.test.json',
'./tsconfig.frontend.json',
] ]
}, },
extends: [ extends: [
@ -40,6 +43,13 @@ module.exports = {
'no-extra-semi': 'error', 'no-extra-semi': 'error',
'eol-last': 'error', 'eol-last': 'error',
'comma-dangle': 'off', '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': [ '@typescript-eslint/comma-dangle': [
'error', 'error',
{ {
@ -53,11 +63,9 @@ module.exports = {
tuples: 'always-multiline' tuples: 'always-multiline'
} }
], ],
'no-extra-parens': 'off',
'@typescript-eslint/no-extra-parens': [ '@typescript-eslint/no-extra-parens': [
'error' 'error'
], ],
'no-nested-ternary': 'error',
'@typescript-eslint/no-inferrable-types': 'off', '@typescript-eslint/no-inferrable-types': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'error', '@typescript-eslint/explicit-module-boundary-types': 'error',
'@typescript-eslint/no-unnecessary-condition': 'error', '@typescript-eslint/no-unnecessary-condition': 'error',
@ -68,12 +76,9 @@ module.exports = {
} }
], ],
'@typescript-eslint/no-non-null-assertion': 'error', '@typescript-eslint/no-non-null-assertion': 'error',
'no-useless-return': 'error',
'no-useless-constructor': 'off',
'@typescript-eslint/no-useless-constructor': [ '@typescript-eslint/no-useless-constructor': [
'error' 'error'
], ],
'no-return-await': 'off',
'@typescript-eslint/return-await': [ '@typescript-eslint/return-await': [
'error', 'error',
'always' 'always'
@ -84,7 +89,7 @@ module.exports = {
accessibility: 'explicit' accessibility: 'explicit'
} }
], ],
'@typescript-eslint/no-floating-promises': 'error' '@typescript-eslint/no-floating-promises': 'error',
}, },
ignorePatterns: [ ignorePatterns: [
'.eslintrc.js', '.eslintrc.js',

1
.gitignore vendored
View File

@ -5,5 +5,4 @@ dist
public public
yarn-error.log yarn-error.log
src/package.json
config/local.* config/local.*

View File

@ -11,6 +11,7 @@
"access": "public" "access": "public"
}, },
"main": "dist/main.js", "main": "dist/main.js",
"type": "module",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"scripts": { "scripts": {
"test": "jest --verbose --runInBand", "test": "jest --verbose --runInBand",
@ -57,6 +58,7 @@
"eslint": "^7.9.0", "eslint": "^7.9.0",
"eslint-plugin-import": "^2.22.1", "eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-simple-import-sort": "^7.0.0",
"eslint-plugin-svelte3": "^3.1.2", "eslint-plugin-svelte3": "^3.1.2",
"jest": "^26.1.0", "jest": "^26.1.0",
"maildev": "^1.1.0", "maildev": "^1.1.0",

View File

@ -1,4 +1,4 @@
const fs = require('fs'); import fs from "fs";
[ [
'build', 'build',

View File

@ -1,5 +1,5 @@
const fs = require('fs'); import fs from "fs";
const path = require('path'); import path from "path";
function copyRecursively(file, destination) { function copyRecursively(file, destination) {
const target = path.join(destination, path.basename(file)); const target = path.join(destination, path.basename(file));

View File

@ -1,7 +1,4 @@
const fs = require('fs'); import fs from "fs";
const path = require('path');
fs.copyFileSync('package.json', path.join('src', 'package.json'));
// These folders must exist for nodemon not to loop indefinitely. // These folders must exist for nodemon not to loop indefinitely.
[ [

View File

@ -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 config from "config";
import express, {NextFunction, Request, Response, Router} from 'express';
import * as fs from "fs"; import * as fs from "fs";
import SecurityError from "./SecurityError"; import nunjucks from "nunjucks";
import * as path from "path"; import * as path from "path";
import CacheProvider from "./CacheProvider"; import url from "url";
import RedisComponent from "./components/RedisComponent";
import Extendable from "./Extendable"; import ApplicationComponent from "./ApplicationComponent.js";
import {logger, loggingContextMiddleware} from "./Logger"; import CacheProvider from "./CacheProvider.js";
import FrontendToolsComponent from "./components/FrontendToolsComponent"; import FrontendToolsComponent from "./components/FrontendToolsComponent.js";
import TemplateError = lib.TemplateError; 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<ApplicationComponent | WebSocketListener<Application>> { export default abstract class Application implements Extendable<ApplicationComponent | WebSocketListener<Application>> {
private readonly version: string; private readonly version: string;
@ -68,8 +70,8 @@ export default abstract class Application implements Extendable<ApplicationCompo
// Load core version // Load core version
const file = this.isInNodeModules() ? const file = this.isInNodeModules() ?
path.join(__dirname, '../../package.json') : 'node_modules/swaf/package.json' :
path.join(__dirname, '../package.json'); 'package.json';
try { try {
this.coreVersion = JSON.parse(fs.readFileSync(file).toString()).version; this.coreVersion = JSON.parse(fs.readFileSync(file).toString()).version;
@ -367,7 +369,7 @@ export default abstract class Application implements Extendable<ApplicationCompo
} }
public isInNodeModules(): boolean { public isInNodeModules(): boolean {
return fs.existsSync(path.join(__dirname, '../../package.json')); return path.dirname(url.fileURLToPath(import.meta.url)).endsWith('/node_modules/swaf');
} }
public isReady(): boolean { public isReady(): boolean {

View File

@ -1,10 +1,11 @@
import {Express, Router} from "express";
import {logger} from "./Logger";
import {sleep} from "./Utils";
import Application from "./Application";
import config from "config"; import config from "config";
import SecurityError from "./SecurityError"; import {Express, Router} from "express";
import Middleware, {MiddlewareType} from "./Middleware";
import Application from "./Application.js";
import {logger} from "./Logger.js";
import Middleware, {MiddlewareType} from "./Middleware.js";
import SecurityError from "./SecurityError.js";
import {sleep} from "./Utils.js";
export default abstract class ApplicationComponent { export default abstract class ApplicationComponent {
private currentRouter?: Router; private currentRouter?: Router;

View File

@ -1,12 +1,13 @@
import config from "config";
import express, {IRouter, RequestHandler, Router} from "express"; import express, {IRouter, RequestHandler, Router} from "express";
import {PathParams} from "express-serve-static-core"; import {PathParams} from "express-serve-static-core";
import config from "config";
import {logger} from "./Logger";
import FileUploadMiddleware from "./FileUploadMiddleware";
import * as querystring from "querystring"; import * as querystring from "querystring";
import {ParsedUrlQueryInput} from "querystring"; import {ParsedUrlQueryInput} from "querystring";
import Middleware, {MiddlewareType} from "./Middleware";
import Application from "./Application"; import Application from "./Application.js";
import FileUploadMiddleware from "./FileUploadMiddleware.js";
import {logger} from "./Logger.js";
import Middleware, {MiddlewareType} from "./Middleware.js";
export default abstract class Controller { export default abstract class Controller {
/** /**

View File

@ -1,4 +1,4 @@
import {Type} from "./Utils"; import {Type} from "./Utils.js";
export default interface Extendable<ComponentClass> { export default interface Extendable<ComponentClass> {
as<C extends ComponentClass>(type: Type<C>): C; as<C extends ComponentClass>(type: Type<C>): C;

View File

@ -1,7 +1,8 @@
import Formidable from "formidable";
import Middleware from "./Middleware";
import {NextFunction, Request, Response} from "express"; 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 { export default abstract class FileUploadMiddleware extends Middleware {
protected abstract makeForm(): Formidable; protected abstract makeForm(): Formidable;

View File

@ -1,4 +1,4 @@
import {WrappingError} from "./Utils"; import {WrappingError} from "./Utils.js";
export abstract class HttpError extends WrappingError { export abstract class HttpError extends WrappingError {
public readonly instructions: string; public readonly instructions: string;

View File

@ -1,7 +1,7 @@
import {Logger as TsLogger} from "tslog";
import {AsyncLocalStorage} from "async_hooks"; import {AsyncLocalStorage} from "async_hooks";
import {RequestHandler} from "express"; import {RequestHandler} from "express";
import {nanoid} from "nanoid"; import {nanoid} from "nanoid";
import {Logger as TsLogger} from "tslog";
const requestIdStorage: AsyncLocalStorage<string> = new AsyncLocalStorage(); const requestIdStorage: AsyncLocalStorage<string> = new AsyncLocalStorage();

View File

@ -1,5 +1,6 @@
import config from "config"; import config from "config";
import MailTemplate from "./mail/MailTemplate";
import MailTemplate from "./mail/MailTemplate.js";
export const MAGIC_LINK_MAIL = new MailTemplate( export const MAGIC_LINK_MAIL = new MailTemplate(
'magic_link', 'magic_link',

View File

@ -1,7 +1,8 @@
import {RequestHandler} from "express"; import {RequestHandler} from "express";
import {NextFunction, Request, Response} from "express-serve-static-core"; 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 { export default abstract class Middleware {
public constructor( public constructor(

View File

@ -1,4 +1,4 @@
import {WrappingError} from "./Utils"; import {WrappingError} from "./Utils.js";
export default class Pagination { export default class Pagination {
public readonly page: number; public readonly page: number;

View File

@ -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 {Express} from "express";
import MagicLinkAuthMethod from "./auth/magic_link/MagicLinkAuthMethod";
import PasswordAuthMethod from "./auth/password/PasswordAuthMethod"; import Application from "./Application.js";
import {MAGIC_LINK_MAIL} from "./Mails"; import AccountController from "./auth/AccountController.js";
import CreateMigrationsTable from "./migrations/CreateMigrationsTable"; import AuthComponent from "./auth/AuthComponent.js";
import CreateUsersAndUserEmailsTableMigration from "./auth/migrations/CreateUsersAndUserEmailsTableMigration"; import AuthController from "./auth/AuthController.js";
import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration"; import AddUsedToMagicLinksMigration from "./auth/magic_link/AddUsedToMagicLinksMigration.js";
import AuthController from "./auth/AuthController"; import CreateMagicLinksTableMigration from "./auth/magic_link/CreateMagicLinksTableMigration.js";
import MagicLinkWebSocketListener from "./auth/magic_link/MagicLinkWebSocketListener"; import MagicLinkAuthMethod from "./auth/magic_link/MagicLinkAuthMethod.js";
import MagicLinkController from "./auth/magic_link/MagicLinkController"; import MagicLinkController from "./auth/magic_link/MagicLinkController.js";
import AddPasswordToUsersMigration from "./auth/password/AddPasswordToUsersMigration"; import MagicLinkWebSocketListener from "./auth/magic_link/MagicLinkWebSocketListener.js";
import AddNameToUsersMigration from "./auth/migrations/AddNameToUsersMigration"; import MakeMagicLinksSessionNotUniqueMigration from "./auth/magic_link/MakeMagicLinksSessionNotUniqueMigration.js";
import CsrfProtectionComponent from "./components/CsrfProtectionComponent"; import AddNameChangedAtToUsersMigration from "./auth/migrations/AddNameChangedAtToUsersMigration.js";
import MailController from "./mail/MailController"; import AddNameToUsersMigration from "./auth/migrations/AddNameToUsersMigration.js";
import WebSocketServerComponent from "./components/WebSocketServerComponent"; import CreateUsersAndUserEmailsTableMigration from "./auth/migrations/CreateUsersAndUserEmailsTableMigration.js";
import Controller from "./Controller"; import AddPasswordToUsersMigration from "./auth/password/AddPasswordToUsersMigration.js";
import AccountController from "./auth/AccountController"; import PasswordAuthMethod from "./auth/password/PasswordAuthMethod.js";
import MakeMagicLinksSessionNotUniqueMigration from "./auth/magic_link/MakeMagicLinksSessionNotUniqueMigration"; import CsrfProtectionComponent from "./components/CsrfProtectionComponent.js";
import AddUsedToMagicLinksMigration from "./auth/magic_link/AddUsedToMagicLinksMigration"; import ExpressAppComponent from "./components/ExpressAppComponent.js";
import PreviousUrlComponent from "./components/PreviousUrlComponent"; import FormHelperComponent from "./components/FormHelperComponent.js";
import AddNameChangedAtToUsersMigration from "./auth/migrations/AddNameChangedAtToUsersMigration"; import FrontendToolsComponent from "./components/FrontendToolsComponent.js";
import BackendController from "./helpers/BackendController"; import LogRequestsComponent from "./components/LogRequestsComponent.js";
import FrontendToolsComponent from "./components/FrontendToolsComponent"; import MailComponent from "./components/MailComponent.js";
import SvelteViewEngine from "./frontend/SvelteViewEngine"; import MysqlComponent from "./components/MysqlComponent.js";
import MailViewEngine from "./frontend/MailViewEngine"; import PreviousUrlComponent from "./components/PreviousUrlComponent.js";
import NunjucksViewEngine from "./frontend/NunjucksViewEngine"; import RedisComponent from "./components/RedisComponent.js";
import packageJson = require('./package.json'); 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 = [ export const MIGRATIONS = [
CreateMigrationsTable, CreateMigrationsTable,
@ -52,8 +52,8 @@ export default class TestApp extends Application {
private readonly addr: string; private readonly addr: string;
private readonly port: number; private readonly port: number;
public constructor(addr: string, port: number, ignoreCommandLine: boolean = false) { public constructor(version: string, addr: string, port: number, ignoreCommandLine: boolean = false) {
super(packageJson.version, ignoreCommandLine); super(version, ignoreCommandLine);
this.addr = addr; this.addr = addr;
this.port = port; this.port = port;
} }

View File

@ -1,5 +1,5 @@
import {TooManyRequestsHttpError} from "./HttpError"; import {TooManyRequestsHttpError} from "./HttpError.js";
import {logger} from "./Logger"; import {logger} from "./Logger.js";
export default class Throttler { export default class Throttler {
private static readonly throttles: Record<string, Throttle | undefined> = {}; private static readonly throttles: Record<string, Throttle | undefined> = {};

View File

@ -1,7 +1,8 @@
import WebSocket from "ws";
import {IncomingMessage} from "http";
import Application from "./Application";
import {Session} from "express-session"; import {Session} from "express-session";
import {IncomingMessage} from "http";
import WebSocket from "ws";
import Application from "./Application.js";
export default abstract class WebSocketListener<T extends Application> { export default abstract class WebSocketListener<T extends Application> {
private app!: T; private app!: T;

View File

@ -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 config from "config";
import Validator, {EMAIL_REGEX, InvalidFormatValidationError} from "../db/Validator"; import {Request, Response} from "express";
import UserPasswordComponent from "./password/UserPasswordComponent";
import User from "./models/User"; import Controller from "../Controller.js";
import ModelFactory from "../db/ModelFactory"; import ModelFactory from "../db/ModelFactory.js";
import UserEmail from "./models/UserEmail"; import Validator, {EMAIL_REGEX, InvalidFormatValidationError} from "../db/Validator.js";
import MagicLinkController from "./magic_link/MagicLinkController"; import {BadRequestError, ForbiddenHttpError, NotFoundHttpError} from "../HttpError.js";
import {ADD_EMAIL_MAIL_TEMPLATE, REMOVE_PASSWORD_MAIL_TEMPLATE} from "../Mails"; import MailTemplate from "../mail/MailTemplate.js";
import AuthMagicLinkActionType from "./magic_link/AuthMagicLinkActionType"; import {ADD_EMAIL_MAIL_TEMPLATE, REMOVE_PASSWORD_MAIL_TEMPLATE} from "../Mails.js";
import UserNameComponent from "./models/UserNameComponent"; import Time from "../Time.js";
import Time from "../Time"; import {RequireAuthMiddleware} from "./AuthComponent.js";
import MailTemplate from "../mail/MailTemplate"; 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 { export default class AccountController extends Controller {

View File

@ -1,13 +1,14 @@
import ApplicationComponent from "../ApplicationComponent";
import {NextFunction, Request, Response} from "express"; import {NextFunction, Request, Response} from "express";
import AuthGuard from "./AuthGuard";
import Controller from "../Controller"; import Application from "../Application.js";
import {ForbiddenHttpError} from "../HttpError"; import ApplicationComponent from "../ApplicationComponent.js";
import Middleware from "../Middleware"; import Controller from "../Controller.js";
import User from "./models/User"; import {ForbiddenHttpError} from "../HttpError.js";
import Application from "../Application"; import Middleware from "../Middleware.js";
import AuthMethod from "./AuthMethod"; import AuthGuard from "./AuthGuard.js";
import AuthProof from "./AuthProof"; import AuthMethod from "./AuthMethod.js";
import AuthProof from "./AuthProof.js";
import User from "./models/User.js";
export default class AuthComponent extends ApplicationComponent { export default class AuthComponent extends ApplicationComponent {
private readonly authGuard: AuthGuard; private readonly authGuard: AuthGuard;

View File

@ -1,14 +1,15 @@
import Controller from "../Controller";
import {NextFunction, Request, Response} from "express"; import {NextFunction, Request, Response} from "express";
import AuthComponent, {AuthMiddleware, RequireAuthMiddleware, RequireGuestMiddleware} from "./AuthComponent";
import {BadRequestError} from "../HttpError"; import Controller from "../Controller.js";
import ModelFactory from "../db/ModelFactory"; import ModelFactory from "../db/ModelFactory.js";
import User from "./models/User"; import {UnknownRelationValidationError} from "../db/Validator.js";
import UserPasswordComponent from "./password/UserPasswordComponent"; import {BadRequestError} from "../HttpError.js";
import UserNameComponent from "./models/UserNameComponent"; import AuthComponent, {AuthMiddleware, RequireAuthMiddleware, RequireGuestMiddleware} from "./AuthComponent.js";
import {UnknownRelationValidationError} from "../db/Validator"; import AuthMethod from "./AuthMethod.js";
import AuthMethod from "./AuthMethod"; import AuthProof from "./AuthProof.js";
import AuthProof from "./AuthProof"; import User from "./models/User.js";
import UserNameComponent from "./models/UserNameComponent.js";
import UserPasswordComponent from "./password/UserPasswordComponent.js";
export default class AuthController extends Controller { export default class AuthController extends Controller {
public getRoutesPrefix(): string { public getRoutesPrefix(): string {

View File

@ -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 config from "config";
import Application from "../Application"; import {Request, Response} from "express";
import AuthMethod from "./AuthMethod";
import {Session, SessionData} from "express-session"; import {Session, SessionData} from "express-session";
import UserNameComponent from "./models/UserNameComponent"; import {Connection} from "mysql";
import MailComponent from "../components/MailComponent";
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 { export default class AuthGuard {
private readonly authMethods: AuthMethod<AuthProof<User>>[]; private readonly authMethods: AuthMethod<AuthProof<User>>[];

View File

@ -1,8 +1,9 @@
import User from "./models/User";
import AuthProof from "./AuthProof";
import {Request, Response} from "express"; import {Request, Response} from "express";
import {Session} from "express-session"; import {Session} from "express-session";
import AuthProof from "./AuthProof.js";
import User from "./models/User.js";
export default interface AuthMethod<P extends AuthProof<User>> { export default interface AuthMethod<P extends AuthProof<User>> {
/** /**

View File

@ -1,4 +1,4 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
export default class AddUsedToMagicLinksMigration extends Migration { export default class AddUsedToMagicLinksMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,6 +1,6 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
import ModelFactory from "../../db/ModelFactory"; import ModelFactory from "../../db/ModelFactory.js";
import MagicLink from "../models/MagicLink"; import MagicLink from "../models/MagicLink.js";
export default class CreateMagicLinksTableMigration extends Migration { export default class CreateMagicLinksTableMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,19 +1,20 @@
import AuthMethod from "../AuthMethod";
import {Request, Response} from "express"; 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 {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<MagicLink> { export default class MagicLinkAuthMethod implements AuthMethod<MagicLink> {
public constructor( public constructor(

View File

@ -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 config from "config";
import Application from "../../Application"; import {Request, Response} from "express";
import {ParsedUrlQueryInput} from "querystring"; import {ParsedUrlQueryInput} from "querystring";
import User from "../models/User";
import AuthComponent, {AuthMiddleware} from "../AuthComponent"; import Application from "../../Application.js";
import {AuthError, PendingApprovalAuthError, RegisterCallback} from "../AuthGuard"; import MailComponent from "../../components/MailComponent.js";
import UserEmail from "../models/UserEmail"; import Controller from "../../Controller.js";
import AuthMagicLinkActionType from "./AuthMagicLinkActionType"; import {QueryVariable} from "../../db/MysqlConnectionManager.js";
import {QueryVariable} from "../../db/MysqlConnectionManager"; import {BadRequestError, NotFoundHttpError} from "../../HttpError.js";
import UserNameComponent from "../models/UserNameComponent"; import {logger} from "../../Logger.js";
import MagicLinkUserNameComponent from "../models/MagicLinkUserNameComponent"; import Mail from "../../mail/Mail.js";
import {logger} from "../../Logger"; import MailTemplate from "../../mail/MailTemplate.js";
import UserPasswordComponent from "../password/UserPasswordComponent"; import Throttler from "../../Throttler.js";
import MailTemplate from "../../mail/MailTemplate"; import AuthComponent, {AuthMiddleware} from "../AuthComponent.js";
import MailComponent from "../../components/MailComponent"; 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<A extends Application> extends Controller { export default class MagicLinkController<A extends Application> extends Controller {
public static async sendMagicLink( public static async sendMagicLink(

View File

@ -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 {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<A extends Application> extends WebSocketListener<A> { export default class MagicLinkWebSocketListener<A extends Application> extends WebSocketListener<A> {
private readonly connections: { [p: string]: (() => void)[] | undefined } = {}; private readonly connections: { [p: string]: (() => void)[] | undefined } = {};

View File

@ -1,4 +1,4 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
export default class MakeMagicLinksSessionNotUniqueMigration extends Migration { export default class MakeMagicLinksSessionNotUniqueMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,7 +1,7 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
import ModelFactory from "../../db/ModelFactory"; import ModelFactory from "../../db/ModelFactory.js";
import User from "../models/User"; import User from "../models/User.js";
import UserApprovedComponent from "../models/UserApprovedComponent"; import UserApprovedComponent from "../models/UserApprovedComponent.js";
export default class AddApprovedFieldToUsersTableMigration extends Migration { export default class AddApprovedFieldToUsersTableMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,4 +1,4 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
export default class AddNameChangedAtToUsersMigration extends Migration { export default class AddNameChangedAtToUsersMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -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 {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 { export default class AddNameToUsersMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {
await this.query(`ALTER TABLE users await this.query(`ALTER TABLE users

View File

@ -1,7 +1,7 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
import ModelFactory from "../../db/ModelFactory"; import ModelFactory from "../../db/ModelFactory.js";
import User from "../models/User"; import User from "../models/User.js";
import UserEmail from "../models/UserEmail"; import UserEmail from "../models/UserEmail.js";
export default class CreateUsersAndUserEmailsTableMigration extends Migration { export default class CreateUsersAndUserEmailsTableMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -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. * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration.

View File

@ -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. * @deprecated - TODO may be remove at next major version >= 0.24, replace with DummyMigration.

View File

@ -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 argon2 from "argon2";
import UserEmail from "./UserEmail"; import config from "config";
import {EMAIL_REGEX} from "../../db/Validator"; 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<User> { export default class MagicLink extends Model implements AuthProof<User> {
public static validityPeriod(): number { public static validityPeriod(): number {

View File

@ -1,7 +1,7 @@
import ModelComponent from "../../db/ModelComponent"; import ModelComponent from "../../db/ModelComponent.js";
import MagicLink from "./MagicLink"; import MagicLink from "./MagicLink.js";
import {USERNAME_REGEXP} from "./UserNameComponent"; import User from "./User.js";
import User from "./User"; import {USERNAME_REGEXP} from "./UserNameComponent.js";
export default class MagicLinkUserNameComponent extends ModelComponent<MagicLink> { export default class MagicLinkUserNameComponent extends ModelComponent<MagicLink> {
public readonly username?: string = undefined; public readonly username?: string = undefined;

View File

@ -1,11 +1,12 @@
import Model from "../../db/Model";
import MysqlConnectionManager from "../../db/MysqlConnectionManager";
import AddApprovedFieldToUsersTableMigration from "../migrations/AddApprovedFieldToUsersTableMigration";
import config from "config"; import config from "config";
import {ManyModelRelation} from "../../db/ModelRelation";
import UserEmail from "./UserEmail"; import Model from "../../db/Model.js";
import UserApprovedComponent from "./UserApprovedComponent"; import {ManyModelRelation} from "../../db/ModelRelation.js";
import UserNameComponent from "./UserNameComponent"; 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 { export default class User extends Model {
/** /**

View File

@ -1,5 +1,5 @@
import ModelComponent from "../../db/ModelComponent"; import ModelComponent from "../../db/ModelComponent.js";
import User from "./User"; import User from "./User.js";
export default class UserApprovedComponent extends ModelComponent<User> { export default class UserApprovedComponent extends ModelComponent<User> {
public approved: boolean = false; public approved: boolean = false;

View File

@ -1,7 +1,7 @@
import User from "./User"; import Model from "../../db/Model.js";
import Model from "../../db/Model"; import {OneModelRelation} from "../../db/ModelRelation.js";
import {OneModelRelation} from "../../db/ModelRelation"; import {EMAIL_REGEX} from "../../db/Validator.js";
import {EMAIL_REGEX} from "../../db/Validator"; import User from "./User.js";
export default class UserEmail extends Model { export default class UserEmail extends Model {
public readonly id?: number = undefined; public readonly id?: number = undefined;

View File

@ -1,7 +1,8 @@
import ModelComponent from "../../db/ModelComponent";
import User from "../models/User";
import config from "config"; import config from "config";
import ModelComponent from "../../db/ModelComponent.js";
import User from "../models/User.js";
export const USERNAME_REGEXP = /^[0-9a-z_-]+$/; export const USERNAME_REGEXP = /^[0-9a-z_-]+$/;
export default class UserNameComponent extends ModelComponent<User> { export default class UserNameComponent extends ModelComponent<User> {

View File

@ -1,7 +1,7 @@
import Migration from "../../db/Migration"; import Migration from "../../db/Migration.js";
import ModelFactory from "../../db/ModelFactory"; import ModelFactory from "../../db/ModelFactory.js";
import User from "../models/User"; import User from "../models/User.js";
import UserPasswordComponent from "./UserPasswordComponent"; import UserPasswordComponent from "./UserPasswordComponent.js";
export default class AddPasswordToUsersMigration extends Migration { export default class AddPasswordToUsersMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,20 +1,21 @@
import AuthMethod from "../AuthMethod";
import PasswordAuthProof from "./PasswordAuthProof";
import User from "../models/User";
import {Request, Response} from "express"; 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 {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<PasswordAuthProof> { export default class PasswordAuthMethod implements AuthMethod<PasswordAuthProof> {
public constructor( public constructor(
protected readonly app: Application, protected readonly app: Application,

View File

@ -1,8 +1,9 @@
import AuthProof from "../AuthProof";
import User from "../models/User";
import UserPasswordComponent from "./UserPasswordComponent";
import {Session, SessionData} from "express-session"; 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<User> { export default class PasswordAuthProof implements AuthProof<User> {
public static getProofForSession(session: Session & Partial<SessionData>): PasswordAuthProof | null { public static getProofForSession(session: Session & Partial<SessionData>): PasswordAuthProof | null {

View File

@ -1,7 +1,8 @@
import argon2, {argon2id} from "argon2"; import argon2 from "argon2";
import ModelComponent from "../../db/ModelComponent";
import User from "../models/User"; import ModelComponent from "../../db/ModelComponent.js";
import Validator from "../../db/Validator"; import Validator from "../../db/Validator.js";
import User from "../models/User.js";
export default class UserPasswordComponent extends ModelComponent<User> { export default class UserPasswordComponent extends ModelComponent<User> {
public static readonly PASSWORD_MIN_LENGTH = 12; public static readonly PASSWORD_MIN_LENGTH = 12;
@ -22,7 +23,7 @@ export default class UserPasswordComponent extends ModelComponent<User> {
timeCost: 10, timeCost: 10,
memoryCost: 65536, memoryCost: 65536,
parallelism: 4, parallelism: 4,
type: argon2id, type: argon2.argon2id,
hashLength: 32, hashLength: 32,
}); });
} }

View File

@ -1,9 +1,10 @@
import {Router} from "express";
import config from "config";
import * as child_process from "child_process"; import * as child_process from "child_process";
import ApplicationComponent from "../ApplicationComponent"; import config from "config";
import {ForbiddenHttpError} from "../HttpError"; import {Router} from "express";
import {logger} from "../Logger";
import ApplicationComponent from "../ApplicationComponent.js";
import {ForbiddenHttpError} from "../HttpError.js";
import {logger} from "../Logger.js";
export default class AutoUpdateComponent extends ApplicationComponent { export default class AutoUpdateComponent extends ApplicationComponent {
private static async runCommand(command: string): Promise<void> { private static async runCommand(command: string): Promise<void> {

View File

@ -1,10 +1,11 @@
import ApplicationComponent from "../ApplicationComponent";
import {Request, Router} from "express";
import crypto from "crypto"; import crypto from "crypto";
import {BadRequestError} from "../HttpError"; import {Request, Router} from "express";
import {AuthMiddleware} from "../auth/AuthComponent";
import {Session, SessionData} from "express-session"; 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 { export default class CsrfProtectionComponent extends ApplicationComponent {
private static readonly excluders: ((req: Request) => boolean)[] = []; private static readonly excluders: ((req: Request) => boolean)[] = [];

View File

@ -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 compression from "compression";
import Middleware from "../Middleware"; import express, {Express, Router} from "express";
import {Type} from "../Utils"; 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 { export default class ExpressAppComponent extends ApplicationComponent {
private readonly addr: string; private readonly addr: string;

View File

@ -1,6 +1,7 @@
import ApplicationComponent from "../ApplicationComponent";
import {Router} from "express"; import {Router} from "express";
import ApplicationComponent from "../ApplicationComponent.js";
export default class FormHelperComponent extends ApplicationComponent { export default class FormHelperComponent extends ApplicationComponent {
public async init(router: Router): Promise<void> { public async init(router: Router): Promise<void> {
router.use((req, res, next) => { router.use((req, res, next) => {

View File

@ -1,17 +1,19 @@
import "../../node_modules/svelte/register.js";
import config from "config";
import {Express, Router} from "express"; import {Express, Router} from "express";
import path from "path"; 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 * as querystring from "querystring";
import {ParsedUrlQueryInput} from "querystring"; import {ParsedUrlQueryInput} from "querystring";
import util from "util"; 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 { export default class FrontendToolsComponent extends ApplicationComponent {
private readonly publicAssetsCache: FileCache = new FileCache(); private readonly publicAssetsCache: FileCache = new FileCache();
private readonly viewEngines: ViewEngine[]; private readonly viewEngines: ViewEngine[];

View File

@ -1,8 +1,9 @@
import ApplicationComponent from "../ApplicationComponent";
import onFinished from "on-finished";
import {logger} from "../Logger";
import {Request, Response, Router} from "express"; 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 { export default class LogRequestsComponent extends ApplicationComponent {
private static fullRequests: boolean = false; private static fullRequests: boolean = false;

View File

@ -1,15 +1,16 @@
import ApplicationComponent from "../ApplicationComponent";
import {Express} from "express";
import config from "config"; import config from "config";
import SecurityError from "../SecurityError"; import {Express} from "express";
import nodemailer, {SentMessageInfo, Transporter} from "nodemailer"; import nodemailer, {SentMessageInfo, Transporter} from "nodemailer";
import MailError from "../mail/MailError";
import util from "util"; import util from "util";
import {logger} from "../Logger";
import Controller from "../Controller"; import ApplicationComponent from "../ApplicationComponent.js";
import Mail from "../mail/Mail"; import Controller from "../Controller.js";
import MailViewEngine from "../frontend/MailViewEngine"; import MailViewEngine from "../frontend/MailViewEngine.js";
import ViewEngine from "../frontend/ViewEngine"; 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 { export default class MailComponent extends ApplicationComponent {
private transporter?: Transporter; private transporter?: Transporter;

View File

@ -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 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 { export default class MaintenanceComponent extends ApplicationComponent {
private readonly application: Application; private readonly application: Application;

View File

@ -1,6 +1,7 @@
import ApplicationComponent from "../ApplicationComponent";
import {Express} from "express"; 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 { export default class MysqlComponent extends ApplicationComponent {
public async start(_app: Express): Promise<void> { public async start(_app: Express): Promise<void> {

View File

@ -1,8 +1,9 @@
import ApplicationComponent from "../ApplicationComponent";
import {Router} from "express"; import {Router} from "express";
import onFinished from "on-finished"; 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 { export default class PreviousUrlComponent extends ApplicationComponent {

View File

@ -1,10 +1,11 @@
import ApplicationComponent from "../ApplicationComponent";
import {Express} from "express";
import redis, {RedisClient} from "redis";
import config from "config"; import config from "config";
import {logger} from "../Logger"; import {Express} from "express";
import session, {Store} from "express-session"; 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 { export default class RedisComponent extends ApplicationComponent implements CacheProvider {
private redisClient?: RedisClient; private redisClient?: RedisClient;

View File

@ -1,8 +1,9 @@
import ApplicationComponent from "../ApplicationComponent";
import express, {Router} from "express"; import express, {Router} from "express";
import {PathParams} from "express-serve-static-core"; import {PathParams} from "express-serve-static-core";
import * as path from "path"; 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 { export default class ServeStaticDirectoryComponent extends ApplicationComponent {
private readonly root: string; private readonly root: string;
@ -15,7 +16,7 @@ export default class ServeStaticDirectoryComponent extends ApplicationComponent
} }
public async init(router: Router): Promise<void> { public async init(router: Router): Promise<void> {
const resolvedRoot = path.join(__dirname, this.getApp().isInNodeModules() ? '../../../' : '../../', this.root); const resolvedRoot = path.resolve(this.root);
if (this.path) { if (this.path) {
router.use(this.path, express.static(resolvedRoot, {maxAge: 1000 * 3600 * 72})); router.use(this.path, express.static(resolvedRoot, {maxAge: 1000 * 3600 * 72}));

View File

@ -1,10 +1,11 @@
import ApplicationComponent from "../ApplicationComponent";
import session from "express-session";
import config from "config"; import config from "config";
import RedisComponent from "./RedisComponent";
import flash from "connect-flash"; import flash from "connect-flash";
import {Router} from "express"; 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 { export default class SessionComponent extends ApplicationComponent {
private readonly storeComponent: RedisComponent; private readonly storeComponent: RedisComponent;

View File

@ -1,16 +1,17 @@
import ApplicationComponent from "../ApplicationComponent"; import config from "config";
import {Express, Request} from "express";
import WebSocket, {Server as WebSocketServer} from "ws";
import {logger} from "../Logger";
import cookie from "cookie"; import cookie from "cookie";
import cookieParser from "cookie-parser"; import cookieParser from "cookie-parser";
import config from "config"; import {Express, Request} from "express";
import ExpressAppComponent from "./ExpressAppComponent";
import Application from "../Application";
import RedisComponent from "./RedisComponent";
import WebSocketListener from "../WebSocketListener";
import {Session} from "express-session"; 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 { export default class WebSocketServerComponent extends ApplicationComponent {
private wss?: WebSocket.Server; private wss?: WebSocket.Server;
@ -27,7 +28,7 @@ export default class WebSocketServerComponent extends ApplicationComponent {
public async start(_app: Express): Promise<void> { public async start(_app: Express): Promise<void> {
const listeners: { [p: string]: WebSocketListener<Application> } = this.application.getWebSocketListeners(); const listeners: { [p: string]: WebSocketListener<Application> } = this.application.getWebSocketListeners();
this.wss = new WebSocketServer({ this.wss = new WebSocket.Server({
server: this.expressAppComponent.getServer(), server: this.expressAppComponent.getServer(),
}, () => { }, () => {
logger.info(`Websocket server started over webserver.`); logger.info(`Websocket server started over webserver.`);

View File

@ -1,6 +1,7 @@
import {Connection} from "mysql"; 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 { export default abstract class Migration {
public readonly version: number; public readonly version: number;

View File

@ -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 {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<ModelComponent<Model>> { export default abstract class Model implements Extendable<ModelComponent<Model>> {
public static get table(): string { public static get table(): string {

View File

@ -1,7 +1,7 @@
import Model from "./Model"; import {getMethods} from "../Utils.js";
import Validator from "./Validator"; import Model from "./Model.js";
import {getMethods} from "../Utils"; import {ModelFieldData} from "./ModelQuery.js";
import {ModelFieldData} from "./ModelQuery"; import Validator from "./Validator.js";
export default abstract class ModelComponent<M extends Model> { export default abstract class ModelComponent<M extends Model> {
protected readonly _model: M; protected readonly _model: M;

View File

@ -1,9 +1,10 @@
import ModelComponent from "./ModelComponent";
import Model, {ModelType} from "./Model";
import ModelQuery, {ModelQueryResult, QueryFields} from "./ModelQuery";
import {Request} from "express"; 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<M extends Model> { export default class ModelFactory<M extends Model> {
private static readonly factories: { [modelType: string]: ModelFactory<Model> | undefined } = {}; private static readonly factories: { [modelType: string]: ModelFactory<Model> | undefined } = {};

View File

@ -1,9 +1,10 @@
import {isQueryVariable, query, QueryResult, QueryVariable} from "./MysqlConnectionManager";
import {Connection} from "mysql"; import {Connection} from "mysql";
import Model from "./Model";
import Pagination from "../Pagination"; import Pagination from "../Pagination.js";
import ModelRelation, {RelationDatabaseProperties} from "./ModelRelation"; import Model from "./Model.js";
import ModelFactory from "./ModelFactory"; import ModelFactory from "./ModelFactory.js";
import ModelRelation, {RelationDatabaseProperties} from "./ModelRelation.js";
import {isQueryVariable, query, QueryResult, QueryVariable} from "./MysqlConnectionManager.js";
export default class ModelQuery<M extends Model> implements WhereFieldConsumer<M> { export default class ModelQuery<M extends Model> implements WhereFieldConsumer<M> {

View File

@ -1,6 +1,6 @@
import ModelQuery, {ModelFieldData, ModelQueryResult, WhereTest} from "./ModelQuery"; import Model, {ModelType} from "./Model.js";
import Model, {ModelType} from "./Model"; import ModelFactory from "./ModelFactory.js";
import ModelFactory from "./ModelFactory"; import ModelQuery, {ModelFieldData, ModelQueryResult, WhereTest} from "./ModelQuery.js";
export default abstract class ModelRelation<S extends Model, O extends Model, R extends O | O[] | null> { export default abstract class ModelRelation<S extends Model, O extends Model, R extends O | O[] | null> {
protected readonly model: S; protected readonly model: S;

View File

@ -1,8 +1,9 @@
import mysql, {Connection, FieldInfo, MysqlError, Pool, PoolConnection} from 'mysql';
import config from 'config'; import config from 'config';
import Migration, {MigrationType} from "./Migration"; import mysql, {Connection, FieldInfo, MysqlError, Pool, PoolConnection} from 'mysql';
import {logger} from "../Logger";
import {Type} from "../Utils"; import {logger} from "../Logger.js";
import {Type} from "../Utils.js";
import Migration, {MigrationType} from "./Migration.js";
export interface QueryResult { export interface QueryResult {
readonly results: Record<string, unknown>[]; readonly results: Record<string, unknown>[];

View File

@ -1,7 +1,8 @@
import Model, {ModelType} from "./Model";
import ModelQuery, {WhereTest} from "./ModelQuery";
import {Connection} from "mysql"; 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])?)+$/; 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])?)+$/;

View File

@ -1,6 +1,7 @@
import mjml2html from "mjml"; 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 { export default class MailViewEngine extends NunjucksViewEngine {
public getExtension(): string { public getExtension(): string {

View File

@ -1,7 +1,8 @@
import ViewEngine from "./ViewEngine";
import config from "config"; import config from "config";
import nunjucks, {Environment} from "nunjucks"; import nunjucks, {Environment} from "nunjucks";
import ViewEngine from "./ViewEngine.js";
export default class NunjucksViewEngine extends ViewEngine { export default class NunjucksViewEngine extends ViewEngine {
private readonly environment: Environment; private readonly environment: Environment;

View File

@ -1,16 +1,18 @@
import crypto from "crypto"; import child_process from "child_process";
import path from "path";
import config from "config"; import config from "config";
import ViewEngine from "./ViewEngine"; import crypto from "crypto";
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 fs from "fs"; 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 = 'locals.';
const BACKEND_CODE_PREFIX_TEMPORARY_HOLDER = '$$locals$$'; const BACKEND_CODE_PREFIX_TEMPORARY_HOLDER = '$$locals$$';
@ -321,7 +323,6 @@ export default class SvelteViewEngine extends ViewEngine {
}); });
const globals = ViewEngine.getGlobals(); const globals = ViewEngine.getGlobals();
delete require.cache[path.resolve(file)];
const localsFunction = (key: string, rawArgs?: string) => { const localsFunction = (key: string, rawArgs?: string) => {
if (!rawArgs) return globals[key]; if (!rawArgs) return globals[key];
const args = Function(`"use strict";const locals = Object.assign(arguments[0], arguments[1]);return (${rawArgs});`)(localsFunction, globals) as string[]; 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.'); if (typeof f !== 'function') throw new Error(key + ' is not a function.');
return f.call(globals, ...args); return f.call(globals, ...args);
}; };
return requireFromString(svelteSsr.js.code, file).default.render({ return requireFromString(svelteSsr.js.code, file + nanoid()).default.render({
locals: localsFunction, locals: localsFunction,
}); });
} }

View File

@ -1,9 +1,10 @@
import path from "path";
import fs from "fs";
import chokidar, {FSWatcher} from "chokidar"; import chokidar, {FSWatcher} from "chokidar";
import {logger} from "../Logger";
import {afs, readdirRecursively} from "../Utils";
import {Express} from "express"; 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 { export default abstract class ViewEngine {
private static readonly globals: Record<string, unknown> = {}; private static readonly globals: Record<string, unknown> = {};
@ -31,11 +32,11 @@ export default abstract class ViewEngine {
...additionalViewPaths: string[] ...additionalViewPaths: string[]
) { ) {
this.viewPaths = [ this.viewPaths = [
...additionalViewPaths.map(p => path.resolve(p)), ...additionalViewPaths,
path.resolve(__dirname, '../../../views'), 'views',
path.resolve(__dirname, '../../views'), 'node_modules/swaf/views',
path.resolve(__dirname, '../views'), ].map(p => path.resolve(p))
].filter(dir => fs.existsSync(dir)); .filter(dir => fs.existsSync(dir));
} }
public abstract getExtension(): string; public abstract getExtension(): string;

View File

@ -1,16 +1,17 @@
import config from "config"; import config from "config";
import Controller from "../Controller";
import User from "../auth/models/User";
import {Request, Response} from "express"; import {Request, Response} from "express";
import {BadRequestError, NotFoundHttpError} from "../HttpError";
import Mail from "../mail/Mail"; import {RequireAdminMiddleware, RequireAuthMiddleware} from "../auth/AuthComponent.js";
import {ACCOUNT_REVIEW_NOTICE_MAIL_TEMPLATE} from "../Mails"; import User from "../auth/models/User.js";
import UserEmail from "../auth/models/UserEmail"; import UserApprovedComponent from "../auth/models/UserApprovedComponent.js";
import UserApprovedComponent from "../auth/models/UserApprovedComponent"; import UserEmail from "../auth/models/UserEmail.js";
import {RequireAdminMiddleware, RequireAuthMiddleware} from "../auth/AuthComponent"; import UserNameComponent from "../auth/models/UserNameComponent.js";
import ModelFactory from "../db/ModelFactory"; import MailComponent from "../components/MailComponent.js";
import UserNameComponent from "../auth/models/UserNameComponent"; import Controller from "../Controller.js";
import MailComponent from "../components/MailComponent"; 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 { export default class BackendController extends Controller {
private static readonly menu: BackendMenuElement[] = []; private static readonly menu: BackendMenuElement[] = [];

View File

@ -1,7 +1,8 @@
import {Options} from "nodemailer/lib/mailer"; import {Options} from "nodemailer/lib/mailer";
import {ParsedUrlQueryInput} from "querystring"; 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 { export default class Mail {
private readonly options: Options = {}; private readonly options: Options = {};

View File

@ -1,5 +1,6 @@
import {Request, Response} from "express"; import {Request, Response} from "express";
import Controller from "../Controller";
import Controller from "../Controller.js";
export default class MailController extends Controller { export default class MailController extends Controller {
public routes(): void { public routes(): void {

View File

@ -1,4 +1,4 @@
import {WrappingError} from "../Utils"; import {WrappingError} from "../Utils.js";
export default class MailError extends WrappingError { export default class MailError extends WrappingError {
public constructor(message: string = 'An error occurred while sending mail.', cause?: Error) { public constructor(message: string = 'An error occurred while sending mail.', cause?: Error) {

View File

@ -1,19 +1,23 @@
import {delimiter} from "path"; import path from "path";
// Load config from specified path or default + swaf/config (default defaults) // Load config from specified path or default + swaf/config (default defaults)
process.env['NODE_CONFIG_DIR'] = process.env['NODE_CONFIG_DIR'] =
__dirname + '/../node_modules/swaf/config/' path.resolve('node_modules/swaf/config')
+ delimiter + path.delimiter
+ (process.env['NODE_CONFIG_DIR'] || __dirname + '/../config/'); + (process.env['NODE_CONFIG_DIR'] || path.resolve('config'));
import {logger} from "./Logger";
import TestApp from "./TestApp";
import config from "config"; import config from "config";
import {logger} from "./Logger.js";
import TestApp from "./TestApp.js";
import {afs} from "./Utils.js";
(async () => { (async () => {
logger.debug('Config path:', process.env['NODE_CONFIG_DIR']); logger.debug('Config path:', process.env['NODE_CONFIG_DIR']);
const app = new TestApp(config.get<string>('listen_addr'), config.get<number>('port')); const packageJson = JSON.parse((await afs.readFile('package.json')).toString());
const app = new TestApp(packageJson.version, config.get<string>('listen_addr'), config.get<number>('port'));
await app.start(); await app.start();
})().catch(err => { })().catch(err => {
logger.error(err); logger.error(err);

View File

@ -1,5 +1,5 @@
import Migration from "../db/Migration"; import Migration from "../db/Migration.js";
import {query} from "../db/MysqlConnectionManager"; import {query} from "../db/MysqlConnectionManager.js";
/** /**
* Must be the first migration * Must be the first migration

View File

@ -1,4 +1,4 @@
import Migration from "../db/Migration"; import Migration from "../db/Migration.js";
export default class DropLegacyLogsTable extends Migration { export default class DropLegacyLogsTable extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -1,4 +1,4 @@
import Migration from "../db/Migration"; import Migration from "../db/Migration.js";
export default class DummyMigration extends Migration { export default class DummyMigration extends Migration {
public async install(): Promise<void> { public async install(): Promise<void> {

View File

@ -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 {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 { declare global {
namespace Express { namespace Express {

View File

@ -1,5 +1,6 @@
import fs from "fs"; import fs from "fs";
import {afs} from "../Utils";
import {afs} from "../Utils.js";
export default class FileCache { export default class FileCache {
private readonly cache: Record<string, string> = {}; private readonly cache: Record<string, string> = {};

View File

@ -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 * 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()); const app = useApp(authAppProvider());

View File

@ -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 querystring from "querystring";
import UserApprovedComponent from "../src/auth/models/UserApprovedComponent"; import supertest from "supertest";
import {popEmail} from "./_mail_server";
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)); const app = useApp(authAppProvider(true, true));

View File

@ -1,10 +1,11 @@
import useApp from "./_app";
import supertest from "supertest"; import supertest from "supertest";
import UserPasswordComponent from "../src/auth/password/UserPasswordComponent";
import {popEmail} from "./_mail_server"; import User from "../src/auth/models/User.js";
import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common"; import UserEmail from "../src/auth/models/UserEmail.js";
import UserEmail from "../src/auth/models/UserEmail"; import UserPasswordComponent from "../src/auth/password/UserPasswordComponent.js";
import User from "../src/auth/models/User"; import useApp from "./_app.js";
import {authAppProvider, followMagicLinkFromMail, testLogout} from "./_authentication_common.js";
import {popEmail} from "./_mail_server.js";
const app = useApp(authAppProvider(false)); const app = useApp(authAppProvider(false));

View File

@ -1,4 +1,4 @@
import Controller from "../src/Controller"; import Controller from "../src/Controller.js";
describe('Controller.route()', () => { describe('Controller.route()', () => {
new class extends Controller { new class extends Controller {

View File

@ -1,8 +1,9 @@
import useApp from "./_app";
import Controller from "../src/Controller";
import supertest from "supertest"; 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; let app: TestApp;
useApp(async (addr, port) => { useApp(async (addr, port) => {
@ -24,7 +25,7 @@ useApp(async (addr, port) => {
await super.init(); await super.init();
} }
}(addr, port, true); }('test', addr, port, true);
}); });
describe('Test CSRF protection', () => { describe('Test CSRF protection', () => {

View File

@ -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 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 { class FakeDummyModel extends Model {
public id?: number = undefined; public id?: number = undefined;
public name?: string = undefined; public name?: string = undefined;

View File

@ -1,6 +1,6 @@
import ModelQuery, {SelectFieldValue, WhereOperator} from "../src/db/ModelQuery"; import Model from "../src/db/Model.js";
import ModelFactory from "../src/db/ModelFactory"; import ModelFactory from "../src/db/ModelFactory.js";
import Model from "../src/db/Model"; import ModelQuery, {SelectFieldValue, WhereOperator} from "../src/db/ModelQuery.js";
describe('Test ModelQuery', () => { describe('Test ModelQuery', () => {
test('select', () => { test('select', () => {

View File

@ -1,4 +1,4 @@
import Pagination from "../src/Pagination"; import Pagination from "../src/Pagination.js";
describe('Pagination', () => { describe('Pagination', () => {
const pagination = new Pagination(3, 5, 31); const pagination = new Pagination(3, 5, 31);

View File

@ -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 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<T extends TestApp>(appSupplier: AppSupplier<T>): () => T { export default function useApp<T extends TestApp>(appSupplier: AppSupplier<T>): () => T {
let app: T; let app: T;

View File

@ -1,15 +1,16 @@
import {popEmail} from "./_mail_server";
import supertest from "supertest"; import supertest from "supertest";
import {AppSupplier} from "./_app";
import TestApp from "../src/TestApp"; import AuthComponent from "../src/auth/AuthComponent.js";
import Controller from "../src/Controller"; import AddApprovedFieldToUsersTableMigration from "../src/auth/migrations/AddApprovedFieldToUsersTableMigration.js";
import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent"; import AddNameToUsersMigration from "../src/auth/migrations/AddNameToUsersMigration.js";
import AuthComponent from "../src/auth/AuthComponent"; import MagicLink from "../src/auth/models/MagicLink.js";
import Migration, {MigrationType} from "../src/db/Migration"; import PasswordAuthProof from "../src/auth/password/PasswordAuthProof.js";
import AddNameToUsersMigration from "../src/auth/migrations/AddNameToUsersMigration"; import CsrfProtectionComponent from "../src/components/CsrfProtectionComponent.js";
import AddApprovedFieldToUsersTableMigration from "../src/auth/migrations/AddApprovedFieldToUsersTableMigration"; import Controller from "../src/Controller.js";
import PasswordAuthProof from "../src/auth/password/PasswordAuthProof"; import Migration, {MigrationType} from "../src/db/Migration.js";
import MagicLink from "../src/auth/models/MagicLink"; import TestApp from "../src/TestApp.js";
import {AppSupplier} from "./_app.js";
import {popEmail} from "./_mail_server.js";
export async function followMagicLinkFromMail( export async function followMagicLinkFromMail(
agent: supertest.SuperTest<supertest.Test>, agent: supertest.SuperTest<supertest.Test>,
@ -94,6 +95,6 @@ export function authAppProvider(withUsername: boolean = true, approvalMode: bool
return migrations; return migrations;
} }
}(addr, port, true); }('test', addr, port, true);
}; };
} }

View File

@ -1,7 +1,7 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES6", "target": "ESNext",
"module": "CommonJS", "module": "ESNext",
"declaration": true, "declaration": true,
"stripInternal": true, "stripInternal": true,

626
yarn.lock
View File

@ -17,24 +17,24 @@
"@babel/highlight" "^7.12.13" "@babel/highlight" "^7.12.13"
"@babel/compat-data@^7.13.15": "@babel/compat-data@^7.13.15":
version "7.13.15" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919"
integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA== integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==
"@babel/core@^7.1.0", "@babel/core@^7.7.5": "@babel/core@^7.1.0", "@babel/core@^7.7.5":
version "7.13.16" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88"
integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q== integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==
dependencies: dependencies:
"@babel/code-frame" "^7.12.13" "@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-compilation-targets" "^7.13.16"
"@babel/helper-module-transforms" "^7.13.14" "@babel/helper-module-transforms" "^7.14.0"
"@babel/helpers" "^7.13.16" "@babel/helpers" "^7.14.0"
"@babel/parser" "^7.13.16" "@babel/parser" "^7.14.0"
"@babel/template" "^7.12.13" "@babel/template" "^7.12.13"
"@babel/traverse" "^7.13.15" "@babel/traverse" "^7.14.0"
"@babel/types" "^7.13.16" "@babel/types" "^7.14.0"
convert-source-map "^1.7.0" convert-source-map "^1.7.0"
debug "^4.1.0" debug "^4.1.0"
gensync "^1.0.0-beta.2" gensync "^1.0.0-beta.2"
@ -42,12 +42,12 @@
semver "^6.3.0" semver "^6.3.0"
source-map "^0.5.0" source-map "^0.5.0"
"@babel/generator@^7.13.16": "@babel/generator@^7.14.0":
version "7.13.16" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.0.tgz#0f35d663506c43e4f10898fbda0d752ec75494be"
integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg== integrity sha512-C6u00HbmsrNPug6A+CiNl8rEys7TsdcXwg12BHi2ca5rUfAs3+UwZsuDQSXnc+wCElCXMB8gMaJ3YXDdh8fAlg==
dependencies: dependencies:
"@babel/types" "^7.13.16" "@babel/types" "^7.14.0"
jsesc "^2.5.1" jsesc "^2.5.1"
source-map "^0.5.0" source-map "^0.5.0"
@ -91,19 +91,19 @@
dependencies: dependencies:
"@babel/types" "^7.13.12" "@babel/types" "^7.13.12"
"@babel/helper-module-transforms@^7.13.14": "@babel/helper-module-transforms@^7.14.0":
version "7.13.14" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad"
integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==
dependencies: dependencies:
"@babel/helper-module-imports" "^7.13.12" "@babel/helper-module-imports" "^7.13.12"
"@babel/helper-replace-supers" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12"
"@babel/helper-simple-access" "^7.13.12" "@babel/helper-simple-access" "^7.13.12"
"@babel/helper-split-export-declaration" "^7.12.13" "@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/template" "^7.12.13"
"@babel/traverse" "^7.13.13" "@babel/traverse" "^7.14.0"
"@babel/types" "^7.13.14" "@babel/types" "^7.14.0"
"@babel/helper-optimise-call-expression@^7.12.13": "@babel/helper-optimise-call-expression@^7.12.13":
version "7.12.13" version "7.12.13"
@ -141,38 +141,38 @@
dependencies: dependencies:
"@babel/types" "^7.12.13" "@babel/types" "^7.12.13"
"@babel/helper-validator-identifier@^7.12.11": "@babel/helper-validator-identifier@^7.14.0":
version "7.12.11" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
"@babel/helper-validator-option@^7.12.17": "@babel/helper-validator-option@^7.12.17":
version "7.12.17" version "7.12.17"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
"@babel/helpers@^7.13.16": "@babel/helpers@^7.14.0":
version "7.13.17" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62"
integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg== integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==
dependencies: dependencies:
"@babel/template" "^7.12.13" "@babel/template" "^7.12.13"
"@babel/traverse" "^7.13.17" "@babel/traverse" "^7.14.0"
"@babel/types" "^7.13.17" "@babel/types" "^7.14.0"
"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
version "7.13.10" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
dependencies: dependencies:
"@babel/helper-validator-identifier" "^7.12.11" "@babel/helper-validator-identifier" "^7.14.0"
chalk "^2.0.0" chalk "^2.0.0"
js-tokens "^4.0.0" js-tokens "^4.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.16": "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0":
version "7.13.16" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.0.tgz#2f0ebfed92bcddcc8395b91f1895191ce2760380"
integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw== integrity sha512-AHbfoxesfBALg33idaTBVUkLnfXtsgvJREf93p4p0Lwsz4ppfE7g1tpEXVm4vrxUcH4DVhAa9Z1m1zqf9WUC7Q==
"@babel/plugin-syntax-async-generators@^7.8.4": "@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4" version "7.8.4"
@ -259,9 +259,9 @@
"@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13"
"@babel/runtime@^7.8.7": "@babel/runtime@^7.8.7":
version "7.13.17" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.17.tgz#8966d1fc9593bf848602f0662d6b4d0069e3a7ec" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6"
integrity sha512-NCdgJEelPTSh+FEFylhnP1ylq848l1z9t9N0j1Lfbcw0+KXGjsTvUmkxy+voLLXB5SOKMbLLx4jxYliGrYQseA== integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==
dependencies: dependencies:
regenerator-runtime "^0.13.4" regenerator-runtime "^0.13.4"
@ -274,26 +274,26 @@
"@babel/parser" "^7.12.13" "@babel/parser" "^7.12.13"
"@babel/types" "^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": "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0":
version "7.13.17" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef"
integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg== integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA==
dependencies: dependencies:
"@babel/code-frame" "^7.12.13" "@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-function-name" "^7.12.13"
"@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13"
"@babel/parser" "^7.13.16" "@babel/parser" "^7.14.0"
"@babel/types" "^7.13.17" "@babel/types" "^7.14.0"
debug "^4.1.0" debug "^4.1.0"
globals "^11.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": "@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.13.17" version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.0.tgz#3fc3fc74e0cdad878182e5f66cc6bcab1915a802"
integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA== integrity sha512-O2LVLdcnWplaGxiPBz12d0HcdN8QdxdsWYhz5LSeuukV/5mn2xUUc3gBeU4QBYPJ18g/UToe8F532XJ608prmg==
dependencies: dependencies:
"@babel/helper-validator-identifier" "^7.12.11" "@babel/helper-validator-identifier" "^7.14.0"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3": "@bcoe/v8-coverage@^0.2.3":
@ -788,9 +788,9 @@
"@types/istanbul-lib-report" "*" "@types/istanbul-lib-report" "*"
"@types/jest@^26.0.4": "@types/jest@^26.0.4":
version "26.0.22" version "26.0.23"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.22.tgz#8308a1debdf1b807aa47be2838acdcd91e88fbe6" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.23.tgz#a1b7eab3c503b80451d019efb588ec63522ee4e7"
integrity sha512-eeWwWjlqxvBxc4oQdkueW5OF/gtfSceKk4OnOAGlUSwS/liBRtZppbJuz1YkgbrbfGOoeBHun9fOvXnjNwrSOw== integrity sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==
dependencies: dependencies:
jest-diff "^26.0.0" jest-diff "^26.0.0"
pretty-format "^26.0.0" pretty-format "^26.0.0"
@ -845,9 +845,9 @@
form-data "^3.0.0" form-data "^3.0.0"
"@types/node@*": "@types/node@*":
version "14.14.41" version "15.0.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.1.tgz#ef34dea0881028d11398be5bf4e856743e3dc35a"
integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== integrity sha512-TMkXt0Ck1y0KKsGr9gJtWGjttxlZnnvDtphxUOSd0bfaR6Q1jle+sPvrzNR1urqYTWMinoKvjKfXUGsumaO1PA==
"@types/nodemailer@^6.4.0": "@types/nodemailer@^6.4.0":
version "6.4.1" version "6.4.1"
@ -953,9 +953,9 @@
integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ==
"@types/ws@^7.2.4": "@types/ws@^7.2.4":
version "7.4.1" version "7.4.2"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.1.tgz#49eacb15a0534663d53a36fbf5b4d98f5ae9a73a" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.2.tgz#bfe739b5f8b3a39742605fbe415ae7e88ee614c8"
integrity sha512-ISCK1iFnR+jYv7+jLNX0wDqesZ/5RAeY3wUx6QaphmocphU61h+b+PHjS18TF4WIPTu/MMzxIq2PHr32o2TS5Q== integrity sha512-PbeN0Eydl7LQl4OIav29YmkO2LxbVuz3nZD/kb19lOS+wLgIkRbWMNmU/QQR7ABpOJ7D7xDOU8co7iohObewrw==
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
@ -1088,9 +1088,9 @@ acorn@^7.1.1, acorn@^7.4.0:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.1.0: acorn@^8.1.0:
version "8.1.1" version "8.2.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.2.tgz#c4574e4fea298d6e6ed4b85ab844b06dd59f26d6"
integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g== integrity sha512-VrMS8kxT0e7J1EX0p6rI/E0FbfOVcvBpbIqHThFv+f8YrZIlMfVotYcXKVPmTvPW8sW5miJzfUFrrvthUZg8VQ==
addressparser@^1.0.1: addressparser@^1.0.1:
version "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" uri-js "^4.2.2"
ajv@^8.0.1: ajv@^8.0.1:
version "8.1.0" version "8.2.0"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.1.0.tgz#45d5d3d36c7cdd808930cc3e603cf6200dbeb736" resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.2.0.tgz#c89d3380a784ce81b2085f48811c4c101df4c602"
integrity sha512-B/Sk2Ix7A36fs/ZkuGLIR86EdjbgR6fsAcbx9lOP/QBSXujDNbVmIS/U4Itz5k8fPFDeVZl/zQ/gJW4Jrq6XjQ== integrity sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==
dependencies: dependencies:
fast-deep-equal "^3.1.1" fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0" json-schema-traverse "^1.0.0"
@ -1552,13 +1552,13 @@ browser-process-hrtime@^1.0.0:
integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
browserslist@^4.14.5: browserslist@^4.14.5:
version "4.16.5" version "4.16.6"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A== integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
dependencies: dependencies:
caniuse-lite "^1.0.30001214" caniuse-lite "^1.0.30001219"
colorette "^1.2.2" colorette "^1.2.2"
electron-to-chromium "^1.3.719" electron-to-chromium "^1.3.723"
escalade "^3.1.1" escalade "^3.1.1"
node-releases "^1.1.71" 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" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
caniuse-lite@^1.0.30001214: caniuse-lite@^1.0.30001219:
version "1.0.30001214" version "1.0.30001220"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001220.tgz#c080e1c8eefb99f6cc9685da6313840bdbaf4c36"
integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== integrity sha512-pjC2T4DIDyGAKTL4dMvGUQaMUHRmhvPpAgNNTa14jaBWHu+bLQgvpFqElxh9L4829Fdx0PlKiMp3wnYldRtECA==
capture-exit@^2.0.0: capture-exit@^2.0.0:
version "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" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.719: electron-to-chromium@^1.3.723:
version "1.3.720" version "1.3.725"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz#f5d66df8754d993006b7b2ded15ff7738c58bd94" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.725.tgz#04fc83f9189169aff50f0a00c6b4090b910cba85"
integrity sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw== integrity sha512-2BbeAESz7kc6KBzs7WVrMc1BY5waUphk4D4DX5dSQXJhsc3tP5ZFaiyuL0AB7vUKzDYpIeYwTYlEfxyjsGUrhw==
emittery@^0.7.1: emittery@^0.7.1:
version "0.7.2" version "0.7.2"
@ -2709,10 +2709,15 @@ eslint-plugin-node@^11.1.0:
resolve "^1.10.1" resolve "^1.10.1"
semver "^6.1.0" 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: eslint-plugin-svelte3@^3.1.2:
version "3.1.2" version "3.2.0"
resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-3.1.2.tgz#3fb394a0f368ad7a77b76c0de2d68f1e4db8d407" resolved "https://registry.yarnpkg.com/eslint-plugin-svelte3/-/eslint-plugin-svelte3-3.2.0.tgz#a6deb4ead4b31a647ea88a3823d7c96578f74683"
integrity sha512-+aGgYFC/yjhGXmBevzwICFVif8tu++C9/lRg8cE6TTS45Hw8qZ6t5wItSXVNPqnxJ212ik+bad1F0Y9A3Swo0Q== integrity sha512-qdWB1QN21dEozsJFdR8XlEhMnsS6aKHjsXWuNmchYwxoet5I6QdCr1Xcq62++IzRBMCNCeH4waXqSOAdqrZzgA==
eslint-scope@^5.0.0, eslint-scope@^5.1.1: eslint-scope@^5.0.0, eslint-scope@^5.1.1:
version "5.1.1" version "5.1.1"
@ -2740,9 +2745,9 @@ eslint-visitor-keys@^2.0.0:
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
eslint@^7.9.0: eslint@^7.9.0:
version "7.24.0" version "7.25.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.24.0.tgz#2e44fa62d93892bfdb100521f17345ba54b8513a" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.25.0.tgz#1309e4404d94e676e3e831b3a3ad2b050031eb67"
integrity sha512-k9gaHeHiFmGCDQ2rEfvULlSLruz6tgfA8DEn+rY9/oYPFFTlz55mM/Q/Rij1b2Y42jwZiK3lXvNTw6w6TXzcKQ== integrity sha512-TVpSovpvCNpLURIScDRB6g5CYu/ZFq9GfX2hLNIV4dSBKxIWojeDODvYl3t0k0VtMxYeR8OXPCFE5+oHMlGfhw==
dependencies: dependencies:
"@babel/code-frame" "7.12.11" "@babel/code-frame" "7.12.11"
"@eslint/eslintrc" "^0.4.0" "@eslint/eslintrc" "^0.4.0"
@ -3723,9 +3728,9 @@ is-ci@^2.0.0:
ci-info "^2.0.0" ci-info "^2.0.0"
is-core-module@^2.2.0: is-core-module@^2.2.0:
version "2.2.0" version "2.3.0"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.3.0.tgz#d341652e3408bca69c4671b79a0954a3d349f887"
integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== integrity sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==
dependencies: dependencies:
has "^1.0.3" has "^1.0.3"
@ -4888,46 +4893,46 @@ mixin-deep@^1.2.0:
for-in "^1.0.2" for-in "^1.0.2"
is-extendable "^1.0.1" is-extendable "^1.0.1"
mjml-accordion@4.9.1: mjml-accordion@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.9.1.tgz#d3ef75d52c9ad8f90cdc7a69da9ad003e42c0fca" resolved "https://registry.yarnpkg.com/mjml-accordion/-/mjml-accordion-4.9.3.tgz#d43fc306ca1a734a443d63e7445e95871af7ae57"
integrity sha512-IEPtf0EgMBHr2mg4wXuuN574idIiTR6XUmLnhF9EsKlJVVKabxSybLWJv81kAUqm2ld2dc/B2kT2ujLDWoQRFw== integrity sha512-mPpNtTs9dz14wiq/46hYxT37xGZi3PHwggZyLokj5d2GgqlQADhYoO7/TSqfKR6zIhzco0gDLjNJL5COXxOAeQ==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-body@4.9.1: mjml-body@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.9.1.tgz#6002edc62d57a44786e3ecc41e785fc5dba6d5d1" resolved "https://registry.yarnpkg.com/mjml-body/-/mjml-body-4.9.3.tgz#8cf918e1a92789d1934a23bcd6121b7bb82741be"
integrity sha512-P6WaVsFzHC3KTpyjZ5axsEQpiozKeOqhaykE2CV8dSrDjn3uHbDY26Bzd2eg5B1pQrwDubfAUY84I86DaktZUg== integrity sha512-PaClGgS86XtZvX3XLAOt96gob4PwwFr9o2EwRem3KgGlEtd1HLIiYAmfhwkPJtNTY8rO9qZubNqIg2iB9LfHyA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-button@4.9.1: mjml-button@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.9.1.tgz#61b500b62a28ef7792a47932c1b39504c97df930" resolved "https://registry.yarnpkg.com/mjml-button/-/mjml-button-4.9.3.tgz#71be5942c7985af945194de241a7f2b73f98527a"
integrity sha512-WicqC7LAuKtv+erIrTq8Q8vb3QD/fANg61sW7k1q86p1t3Co9wl6KWlMYc/9Otz/6tazSAeCxX4/AZS2ibs7Kw== integrity sha512-KbPxXSbHboXubS6Wo8pnc+co9dB1gL+fRTmBzeSBfy8uZhv+6AaU7iIvDvMOQQ4gSbtLb6AG9yranWtQCM8YTg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-carousel@4.9.1: mjml-carousel@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.9.1.tgz#9a357b536e5bfcf0fca8f8d686e995dc66370f74" resolved "https://registry.yarnpkg.com/mjml-carousel/-/mjml-carousel-4.9.3.tgz#ff714a329acf0247ab5ed5bf63eb115cdba5b362"
integrity sha512-RLIfe1V5x/KCVdJOQhCqR7FOa9GA5Lnw0t/Qe7OPgf2hUNnzs2qchQy5HHFRhQ5s5w2NfRaasXHJL48ZtihExQ== integrity sha512-9obd5NTnGVIDHWF+fmRBg19gawyI6min+2mawZbKG3ze5aUkqr308UTNOYcAWX1+E0UnSHksw570RCQhWnGFyA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-cli@4.9.1: mjml-cli@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.9.1.tgz#a0c8714ee0bfc73e1e6ace74c83b11992c04c0e8" resolved "https://registry.yarnpkg.com/mjml-cli/-/mjml-cli-4.9.3.tgz#9fe2be711cb43c110b4657fc6008ed4be988ce26"
integrity sha512-591NX8QpvjBGjsgq1nQdXL20TqSiSo+QbFLcx+1DRac6eP4zJbkk3PSZgOUbPcpT0p9V35Og832lfl/hXWCQSw== integrity sha512-85Zw5PFhGImb3yhrnnsbl6FMDUpS5oR6HnSpyhuPNt5Z/E9fA2ilZ1sRqezjxIhh9IHhLTpmqgZZcRINFXVUKw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
chokidar "^3.0.0" chokidar "^3.0.0"
@ -4935,25 +4940,25 @@ mjml-cli@4.9.1:
html-minifier "^4.0.0" html-minifier "^4.0.0"
js-beautify "^1.6.14" js-beautify "^1.6.14"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-migrate "4.9.1" mjml-migrate "4.9.3"
mjml-parser-xml "4.9.1" mjml-parser-xml "4.9.3"
mjml-validator "4.9.1" mjml-validator "4.9.3"
yargs "^16.1.0" yargs "^16.1.0"
mjml-column@4.9.1: mjml-column@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.9.1.tgz#9706f782f32dcae09a6d8b00867a862994bb4333" resolved "https://registry.yarnpkg.com/mjml-column/-/mjml-column-4.9.3.tgz#0a983baa6092b457dfb5b2dce24598db8ffa7ee9"
integrity sha512-XQ4cT+SQMg67dDRD1PDsNO77tgnPOwvwjThOETI35L3pN1WB3te3pkQjL1kkuzRYVebr+Qw6lJeTkIYS4TStZA== integrity sha512-vEpHwLBhFCP+g+sqUvKPoLk9FZ3NeYXhKyoJwCn/o/sPrSiibUsGFEMN77ypx/ekKV3QGj6iE6dAf696NZctvw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-core@4.9.1: mjml-core@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.9.1.tgz#19d6a829fbb741f869e3b634496fef4bb06bb763" resolved "https://registry.yarnpkg.com/mjml-core/-/mjml-core-4.9.3.tgz#e79a63106abcb469f1a50df989f8489aba2187e7"
integrity sha512-+xVnK7zxqFreP1EHPsT9BTmzT9N8/aCSsSG/hhnXHf08Mo/PSNXwrbsb4tAFcC4jC/Gl9qqaRI/94Ysasmk9EA== integrity sha512-MFuM6557R/brQoDALmd6SaQ1K/0t3frCvJAloL8KGOBocvJID8xN5/4iL87+KJg7k0fqXj1WSsIl9lLXtaEZfA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
cheerio "1.0.0-rc.3" cheerio "1.0.0-rc.3"
@ -4962,263 +4967,263 @@ mjml-core@4.9.1:
js-beautify "^1.6.14" js-beautify "^1.6.14"
juice "^7.0.0" juice "^7.0.0"
lodash "^4.17.15" lodash "^4.17.15"
mjml-migrate "4.9.1" mjml-migrate "4.9.3"
mjml-parser-xml "4.9.1" mjml-parser-xml "4.9.3"
mjml-validator "4.9.1" mjml-validator "4.9.3"
mjml-divider@4.9.1: mjml-divider@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.9.1.tgz#adace01da74af3514c08be10d3d96ac0378e91db" resolved "https://registry.yarnpkg.com/mjml-divider/-/mjml-divider-4.9.3.tgz#3e0b13d93f8e78a4969e895937cb6d768c76c689"
integrity sha512-LMRdZYwYYoS7mOhjPQHC5ZG26EumXxYt5JOO8Pe+qhQlsOvXdbCEmzDn5CrfB6R/jeSJBfQ5DiCijFwZhG5Vew== integrity sha512-NSc+MksfFv+6O4ERLWn2HG8h6w1AKKGdYbT3d2cNazNeUG9GIW4C7vuUaaguy4IBjVQqZTu55vo2/GhLRVL5eA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-group@4.9.1: mjml-group@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.9.1.tgz#7080c0fe4cfa442dd62ecb37f593541220651d6d" resolved "https://registry.yarnpkg.com/mjml-group/-/mjml-group-4.9.3.tgz#a424a5de85c194ae33aef23d6927eadbf0139800"
integrity sha512-ckf6cAKZH8tkS9+uHUmW+X7l/dLrP+TIEbj1XWp0hmVDpZOlSBkrJAODxQB4bYVptlkuNGExN+d7zzGBL+edmw== integrity sha512-TB8+Of4mYcJuT5Huq/RTtFyKUJ8jtk/p4QoZLGhbVo2Q6w5oWLLbp1qcTWj7B3GagLdhYfrtBrr0JRWiVaq6Kg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-attributes@4.9.1: mjml-head-attributes@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.9.1.tgz#df64224a9eb0ba50be735a48810e4e406fc19999" resolved "https://registry.yarnpkg.com/mjml-head-attributes/-/mjml-head-attributes-4.9.3.tgz#6544089be53f8a68cdfc7c10c8161b284e3da232"
integrity sha512-C5xGhRYZHQQzZobEkM38haaBOHG41+ov+tBiUHaGnCvhlc5YRcW9QKkFq4syn8MzTpZKE3SQfEELYU6LvC480A== integrity sha512-3EqQHe081uWoQEfnozwV1tEygzeTlRPLc87+D+cfB/fB0RxfOnyXNU2SZVyvfb1hzl2LmRO4TdujxKzQvI0sow==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-breakpoint@4.9.1: mjml-head-breakpoint@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.9.1.tgz#5a33952923864700dbf08cd0a9957babcec6b0cd" resolved "https://registry.yarnpkg.com/mjml-head-breakpoint/-/mjml-head-breakpoint-4.9.3.tgz#4caa8db156287d013b560ceb3b3f8620e48e2a07"
integrity sha512-iYTZvM1hcmSsy0ydW7puc4ACdJ4wdndezvw+FtDmPLfwIagGMTmsYUTX0E2K/x96EHdLurwpu0jl0iTrhbzsVw== integrity sha512-1ZCEK14yiLOp3tnk0riPMH6myNWWOTSsIl3ScTYQcr6KEsJrAXW+MpDwr2Ri2zOmuSqCDJorEMAsb8rAHxirCQ==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-font@4.9.1: mjml-head-font@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.9.1.tgz#01f1b2d08d002df1595ec5027d79109ad4beeddd" resolved "https://registry.yarnpkg.com/mjml-head-font/-/mjml-head-font-4.9.3.tgz#37956ee4945d214610dbff0d05aafc3a995365aa"
integrity sha512-EmFvuOORi7n3nz3Xjx+ZyJGPw2l190Sd5aKuNKjrfx2JswHT7UTLKbb+cOV1se3s7XprKiXtRoe5dsoD3+uDPA== integrity sha512-ciWMNT7ZFniJDXXyXpfQy0Ep2Xvr09BPpPCVx6DfjzWcfJwLjZdIuIK3Go6NgEY7PweflrZYVorE3FUdqVEWKQ==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-html-attributes@4.9.1: mjml-head-html-attributes@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.9.1.tgz#2d5efdc22612471fd70d9182fc57c2dd667fdb78" resolved "https://registry.yarnpkg.com/mjml-head-html-attributes/-/mjml-head-html-attributes-4.9.3.tgz#feab7386ca3597f75e97732a5dba31623a5c1b2d"
integrity sha512-VNqL6rA9AcG4DXIu4xm5K0P1XZj9dXpry6G98XeBTzmZDbxZWsS07qyrj15YWyEHGHVktXw5nZP6K3wDm8tRJQ== integrity sha512-DpyJrPPJibtwHZ32l9jLSb6B06dJouOf48hU59tcfeZRWkOBsr+FfYvbNktZbmfC6+lQOOjomDGzUybIJRjFbw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-preview@4.9.1: mjml-head-preview@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.9.1.tgz#3d93ba5cd6b30c4bc03036def725207087fe8b18" resolved "https://registry.yarnpkg.com/mjml-head-preview/-/mjml-head-preview-4.9.3.tgz#9439e930a72bbc612ea00c353d281b26d2d8be2e"
integrity sha512-38M0UqVRRPsBIU3MmH2B7sErKnMG5WdhpIQJ0LzqTOS7eQYWp4lsR7uNOV6NJZpld//6LhgglgyMvn/7t6HVqw== integrity sha512-4Ki+I7GREU5fFqTJBJbPwuoVeK5Azwp5lo++nYHA0LXkc3N5Zm9USOLNlvxao4PEQFZ5uS+wz3qQInjoW983TA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-style@4.9.1: mjml-head-style@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.9.1.tgz#ff08678b981666a5b624a26a12c5558cdf4f5386" resolved "https://registry.yarnpkg.com/mjml-head-style/-/mjml-head-style-4.9.3.tgz#d657ba910c2cd3028997afd3073645ae0729ebb6"
integrity sha512-OxCkGzi0fNOSpTKAjjZGcjgWkgws93BzWFE0c0qr+g+LlioC6FYBLQfV6LAnke64t58Sint4ExG6guEMRPQ/Bw== integrity sha512-8E/8SAv0Ba3GBuz8P2raDUU7oOjwfq2uIgPCGBQNreN3cVlxBAHQBNErlv3HY5YxH36Ep0Cn0v18FxKkiADlUA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head-title@4.9.1: mjml-head-title@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.9.1.tgz#58d132c322d0402106e4ccb73d66fd0d42ff3faf" resolved "https://registry.yarnpkg.com/mjml-head-title/-/mjml-head-title-4.9.3.tgz#43f2eaca1da33a5848b1a519926349c9166a6a03"
integrity sha512-Myr3x8cCMyw2GUW4DL/r+jkc5oLskn/lRxsZN88GOFIka0BDK3HZnsYvMF7SAJnyIXsm+pZsdWj4tW6yrFAwcQ== integrity sha512-IW2Zjlujz5Wl85RsIaAzCRcItDjsTpYH6GC0qRaNvbrg28J4jc/Z34uzdwtCBvt7Q+SDnHm780HLwKRvoW5Lyg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-head@4.9.1: mjml-head@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.9.1.tgz#74260a3ddb892c1120d0091677b73f2dfd716adc" resolved "https://registry.yarnpkg.com/mjml-head/-/mjml-head-4.9.3.tgz#215aca27397a536f24bc774191b4963964099b1a"
integrity sha512-xkLhofCMPNHsg6ouf3gFCJVueEPTDBkbf4s4FS65Yn5rl/Ni46fyRSRnbdgh00UyZeOQVkkkGE8EpLrZOLcgYw== integrity sha512-Mw7tcmuMhkruvDAqLHgR1M+WdjKj77Fp6YG3+j6aMTzkeCUP8eT6wQLoBVwKG8Y1XLHWVJccwFCp5ITsKG6E2A==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-hero@4.9.1: mjml-hero@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.9.1.tgz#ef9e502b2f291ed38629a97b42b6f678cff07aa8" resolved "https://registry.yarnpkg.com/mjml-hero/-/mjml-hero-4.9.3.tgz#24ea7a472d1dc57868e21127d083a8044d341174"
integrity sha512-2xHYhFdDhPTNXH9TAzCKgdYPwWu0Q49/uedxnbASWQa6LbxEB1AZFplTvyx3vru7scd9zpIGS04+dELJw5Zw+Q== integrity sha512-apzmRj2sHvmgE7qbyjiATDAUXHT6K6Ku+LUrrzerwdgxmeKmXHeeLduGQ7g4IhfNtbkB/IOqjit9e0Att6sQKg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-image@4.9.1: mjml-image@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.9.1.tgz#3a81bfd0191f92f94726a8813242f030b31aa665" resolved "https://registry.yarnpkg.com/mjml-image/-/mjml-image-4.9.3.tgz#c8c038356f291a04c5c4cd591c74fe349e4d3224"
integrity sha512-gWevdnpur0ctUgKuIUHZodGVZg8dUOKHASP4BOTKiDNS+PlKoBnmmZwxzBNRnFfj+ol4BZbexc5WOy1zqoQyrQ== integrity sha512-LchR36jOcQYiOqkmIaw+lZY43+fQnO7oT3c14wEMhfyycted/cXYrOYa0gqW7pBWZAA+uLgrQ8v9PB51+Wa7OA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-migrate@4.9.1: mjml-migrate@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.9.1.tgz#246b75e80165b84fc3f27c9befa93980d046f735" resolved "https://registry.yarnpkg.com/mjml-migrate/-/mjml-migrate-4.9.3.tgz#6b997e7548f22a9d6ed5c21fe0b4ffc7ad652a96"
integrity sha512-1uxxx7O2UEyP4Vvmz6peLTMlrguuOOFdMxXwoMc2c3HidfwUtqEJvQy6b357xXMcBHWmm4bBrYjWCYQ+Y1ixPA== integrity sha512-O14+3bJB+ZlwlWIx4gvmz0uu6V3ANV8WJ/dZy0hF0PRETDjr/zAjmbmtP9/qMKQTtTB/GjmMaIxvDlfR39hIYQ==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
js-beautify "^1.6.14" js-beautify "^1.6.14"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-parser-xml "4.9.1" mjml-parser-xml "4.9.3"
yargs "^16.1.0" yargs "^16.1.0"
mjml-navbar@4.9.1: mjml-navbar@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.9.1.tgz#07f9c1269b62fb5bc5bf6b838e383b3b836cf2cf" resolved "https://registry.yarnpkg.com/mjml-navbar/-/mjml-navbar-4.9.3.tgz#3c02e95a9e8de44827807bf5a8d74b7e1d4a49b8"
integrity sha512-p9PIxpx7fIFzJKzLEouqXxJ1ZojypcZUloLgFwoz+gRZa3z3XaxsoUcLCZLVl2QK+xwbTL6kZk9PRpxSeyPi1g== integrity sha512-8BjfQFszHBBa1/dHImwvUOC1xV+LkP3XeB2VA6vLAf+wd65Zw4gDd7muKNARUcHhoLqe039rbDEHbj0FOlOLhw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-parser-xml@4.9.1: mjml-parser-xml@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.9.1.tgz#971b09b3071233b44a9d1027c25123a024eaf429" resolved "https://registry.yarnpkg.com/mjml-parser-xml/-/mjml-parser-xml-4.9.3.tgz#919722118ac73ace483d001ba11924055960f9dc"
integrity sha512-zHzsB3/hiFUMX/TTkcyLXR7ztIOZUsOjjkqUbSbYjwY/+qTPzYlvIBx0XCAMByLr2Wr+/YmLGkhqhXdbNX8f6Q== integrity sha512-hEwMWBIKtS7YvA9Nt+nqc5SmILzHH20MZ6P5RY8d6AKQnBR0uxZAlYR7rqC8KYjblITILuNO54dVkPrpuB/VKg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
detect-node "2.0.4" detect-node "2.0.4"
htmlparser2 "^4.1.0" htmlparser2 "^4.1.0"
lodash "^4.17.15" lodash "^4.17.15"
mjml-preset-core@4.9.1: mjml-preset-core@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.9.1.tgz#7e121fc86e9711c957731bc22e620af6aa32e42a" resolved "https://registry.yarnpkg.com/mjml-preset-core/-/mjml-preset-core-4.9.3.tgz#2718cc405c5491a9cc27bf4733d470f9f5d35c10"
integrity sha512-cX74oaXvPkwBY/OaqL6UaBgt5BLRxNCQP/pd1jW5Yaw/9hKciWKnGm7iCl2MjalZ7dwJTlYHbU6L3sRCR/P3Og== integrity sha512-A28CiAZAMYaiKQ12JGI2bQ654piYXfVcmA+NkjNlZRDC9n0C38Ey4mGrVUMXg38v2ElpvMMpjA23CW368XZwLw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
mjml-accordion "4.9.1" mjml-accordion "4.9.3"
mjml-body "4.9.1" mjml-body "4.9.3"
mjml-button "4.9.1" mjml-button "4.9.3"
mjml-carousel "4.9.1" mjml-carousel "4.9.3"
mjml-column "4.9.1" mjml-column "4.9.3"
mjml-divider "4.9.1" mjml-divider "4.9.3"
mjml-group "4.9.1" mjml-group "4.9.3"
mjml-head "4.9.1" mjml-head "4.9.3"
mjml-head-attributes "4.9.1" mjml-head-attributes "4.9.3"
mjml-head-breakpoint "4.9.1" mjml-head-breakpoint "4.9.3"
mjml-head-font "4.9.1" mjml-head-font "4.9.3"
mjml-head-html-attributes "4.9.1" mjml-head-html-attributes "4.9.3"
mjml-head-preview "4.9.1" mjml-head-preview "4.9.3"
mjml-head-style "4.9.1" mjml-head-style "4.9.3"
mjml-head-title "4.9.1" mjml-head-title "4.9.3"
mjml-hero "4.9.1" mjml-hero "4.9.3"
mjml-image "4.9.1" mjml-image "4.9.3"
mjml-navbar "4.9.1" mjml-navbar "4.9.3"
mjml-raw "4.9.1" mjml-raw "4.9.3"
mjml-section "4.9.1" mjml-section "4.9.3"
mjml-social "4.9.1" mjml-social "4.9.3"
mjml-spacer "4.9.1" mjml-spacer "4.9.3"
mjml-table "4.9.1" mjml-table "4.9.3"
mjml-text "4.9.1" mjml-text "4.9.3"
mjml-wrapper "4.9.1" mjml-wrapper "4.9.3"
mjml-raw@4.9.1: mjml-raw@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.9.1.tgz#1dbe8691341dd0e859495036640c07002d2a6de9" resolved "https://registry.yarnpkg.com/mjml-raw/-/mjml-raw-4.9.3.tgz#c47c33dfe70c3e37f65adf12b0cfc343157ea72f"
integrity sha512-ADFJJLoQ0guQ61+p2uJbkM2pb+P1YGjnaz3bm13DCbntcEnFxQthAqgLROxT3URT/O93OSGVkrNGClqYesAG0A== integrity sha512-e2OknBwuiQvaLxHOH9OXSlmHEx7EqczkWdNS//TE1rsRcTQvLXzuajuMt+Oa72UZY85B/vw/iNk/Gm/jRSvieA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-section@4.9.1: mjml-section@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.9.1.tgz#6031b1c6bd967fc2e8974a9e232ade8c3cb7a2c7" resolved "https://registry.yarnpkg.com/mjml-section/-/mjml-section-4.9.3.tgz#b0bb01902c948aac3fc114a5a874f87bc81c9cf2"
integrity sha512-BsmyAebmIsxa11RUM7juNHWuPwWyqZFDU45ozKL1X1nfayy/S9YLWMAipsZvlM9WvarS5DvLQSeW6TOiZE2/WQ== integrity sha512-B7mXgT5yrNhPHTrMRHyPTiKs8rfiM9VRUEL078PCEqczrUtlIQUTVBrfDkwxUIXbNPDhpB8yUxs4i89DA+vX4g==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-social@4.9.1: mjml-social@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.9.1.tgz#4da32cbced1ea47f35b389e6c6614edc6b05e761" resolved "https://registry.yarnpkg.com/mjml-social/-/mjml-social-4.9.3.tgz#c561d0bcc767091e52ffb8a32878db9e74f963a5"
integrity sha512-RcNGXKRKvBWwO4uPN9OL4xMEAqjAx1zpplLWjaxS+q4ADjlQs+DKDQpAXQEMNGUcwQSAN40hTNt/eZWuwZOxsg== integrity sha512-kslVluCHXbXTpL7bclOVHUfHIwhLy+HaEHXilJtyxo0YfH68APRe5y9ikJqTZ6zVa2ziAjvHPMU5f200eZjqdA==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-spacer@4.9.1: mjml-spacer@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.9.1.tgz#9a9067c0408609e059e4eab396b43cac95f2b5be" resolved "https://registry.yarnpkg.com/mjml-spacer/-/mjml-spacer-4.9.3.tgz#41f95fe58c9b1f5eb51269073747e1276232fb9c"
integrity sha512-+Rabasldc5dqLuTE6LESIMSVsc1v2AiqVqWwYbV8kWHCVjbpITeUd9b9ouueW5XOXQsSQ0nabKjkk39F0BW+mw== integrity sha512-fqF0qbDoTjq24D4t0kX+CiMEn5MAoxDG+fHz3k6ruwIsijs/77LiumkOL97H9tnFapnw8jJNJUC6UIT0LQTC1A==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-table@4.9.1: mjml-table@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.9.1.tgz#0c7f9417f8dbb6a93b322bb1f92b93cf66645f98" resolved "https://registry.yarnpkg.com/mjml-table/-/mjml-table-4.9.3.tgz#e66e1fcd644e144edb383af94ff88508a0cf5f27"
integrity sha512-u1oGV6gBqKG59vkXb86ziVEqFU5/GB5RvfCuqGw33HzZn4jvlnGlGPoUrQt/pY/xEEy0EhkbP+XhoNql5ZeO3g== integrity sha512-5dlpAisy2GgteLZ5DhYrfjCiQKcoDHDd8h7idvdQWAx0/8cbbjo+t+EHLfIuxkhcm8cDlJLOjb//AVk2qxBuVw==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-text@4.9.1: mjml-text@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.9.1.tgz#49135c5a7630974479d2bc53c921ea6dadd49888" resolved "https://registry.yarnpkg.com/mjml-text/-/mjml-text-4.9.3.tgz#55b1424f04c252dbbbf5d793932b5496f5e88005"
integrity sha512-0Hig1vU5tHXN+s5Scta/UoJQuVQI2GUPgUnrRoPoFC+ZX0XPHT7wRhHJMPYokrZ+RF3kpOSoQd/4UKyBs0yYDA== integrity sha512-X30kIUhjF4cH2eF4yZcMgkhbHIOTfbcOqDMjav/i6FRnIXJXNkAHoNZ/bGsEYqOcN7pECTwDwFgZK5Igres/dg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-validator@4.9.1: mjml-validator@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.9.1.tgz#4eadf8ab400545cbc0d08fb4329eb410713d213b" resolved "https://registry.yarnpkg.com/mjml-validator/-/mjml-validator-4.9.3.tgz#e5dacf58b15032086c2a779472bc6c5d715bc1f5"
integrity sha512-DElsLG529ZcGGx6BcIi9UMV0LBKvrV/r1nWDlER1mG29rBaDfBtGKV1jR2Ipeu0/37rnd8ldS8Ici8cMNC8W0A== integrity sha512-k6qH9Sd7fwIklYh1LFjTFSB36vkIte41iC5XhAyMTYG3x9I03Cjw3KkEmGOrlbV0T1nOAuz3Iy+2rMcW26U6zQ==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
mjml-wrapper@4.9.1: mjml-wrapper@4.9.3:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.9.1.tgz#25207bd58d1ffb3ab7dd51ee11adbd8281727866" resolved "https://registry.yarnpkg.com/mjml-wrapper/-/mjml-wrapper-4.9.3.tgz#b26c38dd3332290030068308d04255fa37ba3081"
integrity sha512-y2gL0eEsYjX+obNCyVrZORxcE6FNJ+OzljT+a7gFWsRRHvJR45o06+OmlWJDmY2TajHuF1rrO1d1LMMpRsz0Dw== integrity sha512-F3PLghHqiusp2ax7eBtkjL0z1FJkQKHm1Jy9VCjCQSsqg8nqZ7iz6W2V/xo0pNeJWPQqoHW0bX0GK5aNP1aL2g==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
lodash "^4.17.15" lodash "^4.17.15"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-section "4.9.1" mjml-section "4.9.3"
mjml@^4.6.2: mjml@^4.6.2:
version "4.9.1" version "4.9.3"
resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.9.1.tgz#92746a50f72b9d9f3cf6e9237d48d125035f7254" resolved "https://registry.yarnpkg.com/mjml/-/mjml-4.9.3.tgz#670dab24030ea7b40d92041c83db13e56e7b8290"
integrity sha512-tzwFdv2Mzt8PqC97F6L5Ci+vMXqoXhNJPfW+hFEUXgv5//buRSX+d2LOdraNGgKRi26bZ2SQA6JDXWpzNUKZLA== integrity sha512-l3KzyBj8EkdkBwdFTFUHbkAXLDfyyFSkcm9YwLbMTLa6kX7Wyfo26v62iVRKX9aUnys2JkoSgP0JNBx7i0+chg==
dependencies: dependencies:
"@babel/runtime" "^7.8.7" "@babel/runtime" "^7.8.7"
mjml-cli "4.9.1" mjml-cli "4.9.3"
mjml-core "4.9.1" mjml-core "4.9.3"
mjml-migrate "4.9.1" mjml-migrate "4.9.3"
mjml-preset-core "4.9.1" mjml-preset-core "4.9.3"
mjml-validator "4.9.1" mjml-validator "4.9.3"
mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4:
version "1.0.4" version "1.0.4"
@ -5347,9 +5352,9 @@ nodemailer@^3.1.1:
integrity sha1-/r+sy0vSc2eEc6MJxstLSi88SOM= integrity sha1-/r+sy0vSc2eEc6MJxstLSi88SOM=
nodemailer@^6.4.6: nodemailer@^6.4.6:
version "6.5.0" version "6.6.0"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9" resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.6.0.tgz#ed47bb572b48d9d0dca3913fdc156203f438f427"
integrity sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw== integrity sha512-ikSMDU1nZqpo2WUPE0wTTw/NGGImTkwpJKDIFPZT+YvvR9Sj+ze5wzu95JHkBMglQLoG2ITxU21WukCC/XsFkg==
nodemon@^2.0.6: nodemon@^2.0.6:
version "2.0.7" version "2.0.7"
@ -6292,9 +6297,9 @@ rollup-pluginutils@^2.8.2:
estree-walker "^0.6.1" estree-walker "^0.6.1"
rollup@^2.42.3: rollup@^2.42.3:
version "2.45.2" version "2.46.0"
resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.45.2.tgz#8fb85917c9f35605720e92328f3ccbfba6f78b48" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.46.0.tgz#8cacf89d2ee31a34755f1af40a665168f592b829"
integrity sha512-kRRU7wXzFHUzBIv0GfoFFIN3m9oteY4uAsKllIpQDId5cfnkWF2J130l+27dzDju0E6MScKiV0ZM5Bw8m4blYQ== integrity sha512-qPGoUBNl+Z8uNu0z7pD3WPTABWRbcOwIrO/5ccDJzmrtzn0LVf6Lj91+L5CcWhXl6iWf23FQ6m8Jkl2CmN1O7Q==
optionalDependencies: optionalDependencies:
fsevents "~2.3.1" fsevents "~2.3.1"
@ -6947,9 +6952,9 @@ supports-hyperlinks@^2.0.0:
supports-color "^7.0.0" supports-color "^7.0.0"
svelte-check@^1.2.3: svelte-check@^1.2.3:
version "1.5.0" version "1.5.2"
resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-1.5.0.tgz#d0ee742ef9969f8b88c10919076e254802d81736" resolved "https://registry.yarnpkg.com/svelte-check/-/svelte-check-1.5.2.tgz#783f48a8e3b3e484b3bcfb990ff5102348c63a23"
integrity sha512-DdzUGxd5MLryW80sr695XIRCps8YS0E2VRJj9cXA3g/hXldozoxc/RDx0ZGV/sxoAU5nxgcH3A2kN0jJhnJKdg== integrity sha512-x9Pc13r814TKrMXY70IyqDEmPzuFiqNSpBmsrMKrFpi995MiG+lmqYnyw8iQC+DGh7H3eUt3LIFXbNd396XIFw==
dependencies: dependencies:
chalk "^4.0.0" chalk "^4.0.0"
chokidar "^3.4.1" chokidar "^3.4.1"
@ -6971,9 +6976,9 @@ svelte-preprocess@4.6.9:
strip-indent "^3.0.0" strip-indent "^3.0.0"
svelte-preprocess@^4.0.0: svelte-preprocess@^4.0.0:
version "4.7.2" version "4.7.3"
resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.2.tgz#e16bf5cc152df8097485ce8c7842073a83a12b1e" resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-4.7.3.tgz#454fa059c2400b15e7a3caeca18993cff9df0e96"
integrity sha512-EToG+08rEsA33btv+C5g2qnRArwpTc5AoU0QBB3ZEkYagxAb2yPNsy0qsmtvbJOTBMy6o3oyijDdl3DMpMvpEg== integrity sha512-Zx1/xLeGOIBlZMGPRCaXtlMe4ZA0faato5Dc3CosEqwu75MIEPuOstdkH6cy+RYTUYynoxzNaDxkPX4DbrPwRA==
dependencies: dependencies:
"@types/pug" "^2.0.4" "@types/pug" "^2.0.4"
"@types/sass" "^1.16.0" "@types/sass" "^1.16.0"
@ -6981,9 +6986,9 @@ svelte-preprocess@^4.0.0:
strip-indent "^3.0.0" strip-indent "^3.0.0"
svelte@^3.35.0: svelte@^3.35.0:
version "3.37.0" version "3.38.1"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.37.0.tgz#dc7cd24bcc275cdb3f8c684ada89e50489144ccd" resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.38.1.tgz#5d856a9d643f56a8d3e281f6dd8b4f8962155ca5"
integrity sha512-TRF30F4W4+d+Jr2KzUUL1j8Mrpns/WM/WacxYlo5MMb2E5Qy2Pk1Guj6GylxsW9OnKQl1tnF8q3hG/hQ3h6VUA== integrity sha512-N3XLAyfzqrFxwRLevBeW7Dke9ZlHRVGSIed5abo4Drvj+zvd2OyWpFa1x4nQUc8Lnvt4Kcn8/5le1peRDybNqg==
symbol-tree@^3.2.4: symbol-tree@^3.2.4:
version "3.2.4" version "3.2.4"
@ -6991,9 +6996,9 @@ symbol-tree@^3.2.4:
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
table@^6.0.4: table@^6.0.4:
version "6.3.4" version "6.6.0"
resolved "https://registry.yarnpkg.com/table/-/table-6.3.4.tgz#5d8a7fa1c887bd1ef08741751ec36246255a80b6" resolved "https://registry.yarnpkg.com/table/-/table-6.6.0.tgz#905654b79df98d9e9a973de1dd58682532c40e8e"
integrity sha512-fhKcZ3+oAYG/ld3seJEZ9+fGSsy+yeoPzLQUrwbOzNYdhrU+6TzObhJ2Sp76ZfUGIrDTrxsXz5NSCZJIUOJb4Q== integrity sha512-iZMtp5tUvcnAdtHpZTWLPF0M7AgiQsURR2DwmxnJwSy8I3+cY+ozzVvYha3BOLG2TB+L0CqjIz+91htuj6yCXg==
dependencies: dependencies:
ajv "^8.0.1" ajv "^8.0.1"
lodash.clonedeep "^4.5.0" lodash.clonedeep "^4.5.0"
@ -7001,6 +7006,7 @@ table@^6.0.4:
lodash.truncate "^4.4.2" lodash.truncate "^4.4.2"
slice-ansi "^4.0.0" slice-ansi "^4.0.0"
string-width "^4.2.0" string-width "^4.2.0"
strip-ansi "^6.0.0"
tar@^6.1.0: tar@^6.1.0:
version "6.1.0" version "6.1.0"
@ -7028,9 +7034,9 @@ terminal-link@^2.0.0:
supports-hyperlinks "^2.0.0" supports-hyperlinks "^2.0.0"
terser@^5.0.0: terser@^5.0.0:
version "5.6.1" version "5.7.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz#a48eeac5300c0a09b36854bf90d9c26fb201973c" resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693"
integrity sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw== integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==
dependencies: dependencies:
commander "^2.20.0" commander "^2.20.0"
source-map "~0.7.2" source-map "~0.7.2"
@ -7277,9 +7283,9 @@ typescript@*, typescript@^4.0.2:
integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==
uglify-js@^3.5.1: uglify-js@^3.5.1:
version "3.13.4" version "3.13.5"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113"
integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw== integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw==
uid-safe@~2.1.5: uid-safe@~2.1.5:
version "2.1.5" version "2.1.5"