swaf-boilerplate/src/App.ts

107 lines
4.4 KiB
TypeScript
Raw Normal View History

import Application from "swaf/Application";
2021-11-21 17:52:56 +01:00
import AutoUpdateComponent from "swaf/components/AutoUpdateComponent";
import CsrfProtectionComponent from "swaf/components/CsrfProtectionComponent";
import ExpressAppComponent from "swaf/components/ExpressAppComponent";
2021-11-21 17:52:56 +01:00
import FormHelperComponent from "swaf/components/FormHelperComponent";
import FrontendToolsComponent from "swaf/components/FrontendToolsComponent";
import LogRequestsComponent from "swaf/components/LogRequestsComponent";
2021-11-21 17:52:56 +01:00
import MailComponent from "swaf/components/MailComponent";
import MaintenanceComponent from "swaf/components/MaintenanceComponent";
import MysqlComponent from "swaf/components/MysqlComponent";
import PreviousUrlComponent from "swaf/components/PreviousUrlComponent";
import RedisComponent from "swaf/components/RedisComponent";
import ServeStaticDirectoryComponent from "swaf/components/ServeStaticDirectoryComponent";
import SessionComponent from "swaf/components/SessionComponent";
import WebSocketServerComponent from "swaf/components/WebSocketServerComponent";
2021-11-21 17:52:56 +01:00
import Migration, {MigrationType} from "swaf/db/Migration";
2021-11-20 19:54:59 +01:00
import AssetCompiler from "swaf/frontend/AssetCompiler";
import CopyAssetPreCompiler from "swaf/frontend/CopyAssetPreCompiler";
2021-11-21 17:52:56 +01:00
import MailViewEngine from "swaf/frontend/MailViewEngine";
import NunjucksViewEngine from "swaf/frontend/NunjucksViewEngine";
2021-11-20 19:54:59 +01:00
import ScssAssetPreCompiler from "swaf/frontend/ScssAssetPreCompiler";
import SvelteViewEngine from "swaf/frontend/SvelteViewEngine";
2021-11-21 17:52:56 +01:00
import TypeScriptPreCompiler from "swaf/frontend/TypeScriptPreCompiler";
import CreateMigrationsTable from "swaf/migrations/CreateMigrationsTable";
import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable";
import DummyMigration from "swaf/migrations/DummyMigration";
import HomeController from "./controllers/HomeController.js";
2020-04-23 18:07:55 +02:00
2020-06-27 17:20:06 +02:00
export default class App extends Application {
2020-10-05 13:38:03 +02:00
public constructor(
2021-11-20 19:54:59 +01:00
version: string,
2020-10-05 13:38:03 +02:00
private readonly addr: string,
private readonly port: number,
) {
2021-11-20 19:54:59 +01:00
super(version);
2020-04-23 18:07:55 +02:00
}
2020-10-05 13:38:03 +02:00
protected getMigrations(): MigrationType<Migration>[] {
2020-04-23 18:07:55 +02:00
return [
CreateMigrationsTable,
2020-11-02 18:17:55 +01:00
DummyMigration,
DropLegacyLogsTable,
2020-04-23 18:07:55 +02:00
];
}
protected async init(): Promise<void> {
this.registerComponents();
this.registerWebSocketListeners();
this.registerControllers();
}
private registerComponents() {
// Base
this.use(new ExpressAppComponent(this.addr, this.port));
2020-04-23 18:07:55 +02:00
this.use(new LogRequestsComponent());
// Static files
this.use(new ServeStaticDirectoryComponent('public'));
this.use(new ServeStaticDirectoryComponent('node_modules/feather-icons/dist', '/icons'));
// Dynamic views and routes
2021-11-20 19:54:59 +01:00
const intermediateDirectory = 'intermediates/assets';
const assetCompiler = new AssetCompiler(intermediateDirectory, 'public');
const additionalViewPaths = ['test/assets'];
this.use(new FrontendToolsComponent(
assetCompiler,
new CopyAssetPreCompiler(intermediateDirectory, '', 'json', additionalViewPaths, false),
new ScssAssetPreCompiler(intermediateDirectory, assetCompiler.targetDir, 'scss', additionalViewPaths),
new CopyAssetPreCompiler(intermediateDirectory, 'img', 'svg', additionalViewPaths, true),
new TypeScriptPreCompiler(intermediateDirectory, additionalViewPaths),
new SvelteViewEngine(intermediateDirectory, ...additionalViewPaths),
new NunjucksViewEngine(intermediateDirectory, ...additionalViewPaths),
));
this.use(new PreviousUrlComponent());
2020-04-23 18:07:55 +02:00
// Maintenance
2021-11-20 19:54:59 +01:00
this.use(new MaintenanceComponent());
2020-05-05 15:26:28 +02:00
this.use(new AutoUpdateComponent());
2020-04-23 18:07:55 +02:00
// Services
this.use(new MysqlComponent());
2021-11-20 19:54:59 +01:00
this.use(new MailComponent(new MailViewEngine(intermediateDirectory, ...additionalViewPaths)));
2020-04-23 18:07:55 +02:00
// Session
this.use(new RedisComponent());
this.use(new SessionComponent(this.as(RedisComponent)));
2020-04-23 18:07:55 +02:00
// Utils
this.use(new FormHelperComponent());
// Middlewares
this.use(new CsrfProtectionComponent());
// WebSocket server
2021-11-20 19:54:59 +01:00
this.use(new WebSocketServerComponent());
2020-04-23 18:07:55 +02:00
}
private registerWebSocketListeners() {
2020-10-05 13:38:03 +02:00
// WebSocket listeners
2020-04-23 18:07:55 +02:00
}
private registerControllers() {
this.use(new HomeController());
}
2020-10-05 13:38:03 +02:00
}