From 9e07d4bff4eeee005c4e976ef9ab0ed66b42ce38 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Mon, 2 Nov 2020 18:37:39 +0100 Subject: [PATCH 1/7] config: remove insecure default values --- config/default.json5 | 2 -- 1 file changed, 2 deletions(-) diff --git a/config/default.json5 b/config/default.json5 index 1831e21..e0c6b9b 100644 --- a/config/default.json5 +++ b/config/default.json5 @@ -8,7 +8,6 @@ public_url: "http://localhost:4899", public_websocket_url: "ws://localhost:4899", port: 4899, - gitlab_webhook_token: 'secret', mysql: { connectionLimit: 10, host: "localhost", @@ -23,7 +22,6 @@ prefix: 'example_app' }, session: { - secret: "very_secret_not_known", cookie: { secure: false } From a4df579937f3a0d184dadb16ba09562b8851e00a Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Tue, 3 Nov 2020 10:37:30 +0100 Subject: [PATCH 2/7] Rename "dist" task to more relevant "build" --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 3ad46b8..fd6dc27 100644 --- a/package.json +++ b/package.json @@ -7,14 +7,14 @@ "private": true, "main": "dist/main.js", "scripts": { - "test": "jest --verbose --runInBand", "dist-webpack": "webpack --mode production", - "dist": "yarn compile && yarn dist-webpack", "clean": "(test ! -d dist || rm -r dist)", "compile": "yarn clean && tsc && mv dist/src/* dist/", + "build": "yarn compile && yarn dist-webpack", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "dev": "concurrently -k -n \"Typescript,Node,Webpack,Maildev\" -p \"[{name}]\" -c \"blue,green,red,yellow\" \"tsc --watch\" \"nodemon\" \"webpack --watch --mode development\" \"maildev\"", - "start": "yarn dist && node dist/main.js", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx" + "start": "yarn build && node dist/main.js", + "test": "jest --verbose --runInBand" }, "devDependencies": { "@babel/core": "^7.9.0", From 04f19f5a28ba90cca4adeb8125ef19cb7a258c94 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Tue, 3 Nov 2020 17:26:32 +0100 Subject: [PATCH 3/7] Fix yarn dev script --- package.json | 6 +++--- src/main.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index fd6dc27..501e8f2 100644 --- a/package.json +++ b/package.json @@ -5,15 +5,15 @@ "repository": "https://gitlab.com/ArisuOngaku/wms-boilerplate", "author": "Alice Gaudon ", "private": true, - "main": "dist/main.js", + "main": "dist/src/main.js", "scripts": { "dist-webpack": "webpack --mode production", "clean": "(test ! -d dist || rm -r dist)", - "compile": "yarn clean && tsc && mv dist/src/* dist/", + "compile": "yarn clean && tsc", "build": "yarn compile && yarn dist-webpack", "lint": "eslint . --ext .js,.jsx,.ts,.tsx", "dev": "concurrently -k -n \"Typescript,Node,Webpack,Maildev\" -p \"[{name}]\" -c \"blue,green,red,yellow\" \"tsc --watch\" \"nodemon\" \"webpack --watch --mode development\" \"maildev\"", - "start": "yarn build && node dist/main.js", + "start": "yarn build && node dist/src/main.js", "test": "jest --verbose --runInBand" }, "devDependencies": { diff --git a/src/main.ts b/src/main.ts index e243999..14be157 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,9 +2,9 @@ import {delimiter} from "path"; // Load config from specified path or default + wms-core/config (default defaults) process.env['NODE_CONFIG_DIR'] = - __dirname + '/../node_modules/wms-core/config/' + __dirname + '/../../node_modules/wms-core/config/' + delimiter - + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../config/'); + + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../../config/'); import {log} from "wms-core/Logger"; import App from "./App"; From f16d63c74fd8e9c2437ecb2a3ac5d1ad35931eb6 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Tue, 3 Nov 2020 20:29:07 +0100 Subject: [PATCH 4/7] frontend: refactor $mobileThreshold and container media queries --- assets/sass/_vars.scss | 2 +- assets/sass/layout.scss | 24 ++++++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/assets/sass/_vars.scss b/assets/sass/_vars.scss index f0eb1fc..31b7580 100644 --- a/assets/sass/_vars.scss +++ b/assets/sass/_vars.scss @@ -28,4 +28,4 @@ $errorText: darken($error, 30%); $errorColor: desaturate($errorText, 50%); // Responsivity -$menuLayoutSwitchTreshold: 700px; +$mobileThreshold: 632px; diff --git a/assets/sass/layout.scss b/assets/sass/layout.scss index e05bbcb..5a00bff 100644 --- a/assets/sass/layout.scss +++ b/assets/sass/layout.scss @@ -183,7 +183,7 @@ body > header { } } - @media (max-width: $menuLayoutSwitchTreshold) { + @media (max-width: $mobileThreshold) { flex-direction: row-reverse; .logo { @@ -246,7 +246,7 @@ body > header { } } - @media (min-width: $menuLayoutSwitchTreshold) { + @media (min-width: $mobileThreshold) { nav ul li { a, button, .button { @include tip; @@ -274,7 +274,7 @@ footer { main { flex: 1; - padding: 8px; + padding: 8px 0; button, .button { @include tip; @@ -649,10 +649,22 @@ button, .button { text-align: center; } -.container { +@mixin container { + width: $mobileThreshold; padding: 0 16px; - max-width: 632px; - margin: 0 auto; + + @media (min-width: $mobileThreshold) { + margin: 0 auto; + } + + @media (max-width: $mobileThreshold) { + width: 100%; + padding: 0 8px; + } +} + +.container { + @include container; } .panel { From ba5b90a4f91df5742033afdf14c21e7752176b13 Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Fri, 13 Nov 2020 10:54:35 +0100 Subject: [PATCH 5/7] swaf rename: rename project to swaf-boilerplate --- README.md | 3 +++ app.service | 11 +++++---- assets/img/logo.svg | 1 - assets/ts/forms.ts | 2 +- config/test.json5 | 2 +- package.json | 6 ++--- src/App.ts | 38 +++++++++++++++---------------- src/controllers/HomeController.ts | 4 ++-- src/main.ts | 6 ++--- tsconfig.json | 2 +- views/about.njk | 4 ++-- 11 files changed, 42 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index e69de29..96b65aa 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,3 @@ +# swaf boilerplate + +Boilerplate for a quickstart with [swaf](https://eternae.ink/arisu/swaf) diff --git a/app.service b/app.service index 32f2b99..ece8fd0 100644 --- a/app.service +++ b/app.service @@ -1,13 +1,16 @@ +# Please customize values i.e. paths, user, group, WorkingDirectory based on your environment. Do not use the same +# user and group for different applications. + [Unit] -Description=WMS website +Description=swaf based website After=network-online.target Wants=network-online.target [Service] Type=simple -User=wms -Group=wms -WorkingDirectory=/home/wms/live +User=swaf +Group=swaf +WorkingDirectory=/home/swaf/live Restart=on-success Environment=NODE_ENV=production ExecStart=/bin/node . diff --git a/assets/img/logo.svg b/assets/img/logo.svg index c33da66..4f8fb6e 100644 --- a/assets/img/logo.svg +++ b/assets/img/logo.svg @@ -19,7 +19,6 @@ id="svg6" sodipodi:docname="logo.svg" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" - inkscape:export-filename="/r/arisu/dev/streams/wms/assets/img/logox1024.png" inkscape:export-xdpi="4096" inkscape:export-ydpi="4096"> ('input, textarea').forEach(el => { diff --git a/config/test.json5 b/config/test.json5 index c184427..cda9d47 100644 --- a/config/test.json5 +++ b/config/test.json5 @@ -3,7 +3,7 @@ host: "localhost", user: "root", password: "", - database: "wms2_test", + database: "swaf_test", create_database_automatically: true } } diff --git a/package.json b/package.json index 501e8f2..1550885 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { "name": "example-app", "version": "0.1.0", - "description": "Example App based on wms-core", - "repository": "https://gitlab.com/ArisuOngaku/wms-boilerplate", + "description": "Example App based on swaf", + "repository": "https://eternae.ink/arisu/swaf-boilerplate", "author": "Alice Gaudon ", "private": true, "main": "dist/src/main.js", @@ -60,6 +60,6 @@ "dependencies": { "config": "^3.3.1", "express": "^4.17.1", - "wms-core": "^0.22.0" + "swaf": "^0.22.5" } } diff --git a/src/App.ts b/src/App.ts index 6633f86..f645a64 100644 --- a/src/App.ts +++ b/src/App.ts @@ -1,24 +1,24 @@ -import Application from "wms-core/Application"; -import Migration, {MigrationType} from "wms-core/db/Migration"; -import CreateMigrationsTable from "wms-core/migrations/CreateMigrationsTable"; -import ExpressAppComponent from "wms-core/components/ExpressAppComponent"; -import NunjucksComponent from "wms-core/components/NunjucksComponent"; -import MysqlComponent from "wms-core/components/MysqlComponent"; -import LogRequestsComponent from "wms-core/components/LogRequestsComponent"; -import RedisComponent from "wms-core/components/RedisComponent"; -import ServeStaticDirectoryComponent from "wms-core/components/ServeStaticDirectoryComponent"; -import MaintenanceComponent from "wms-core/components/MaintenanceComponent"; -import MailComponent from "wms-core/components/MailComponent"; -import SessionComponent from "wms-core/components/SessionComponent"; -import RedirectBackComponent from "wms-core/components/RedirectBackComponent"; -import FormHelperComponent from "wms-core/components/FormHelperComponent"; -import CsrfProtectionComponent from "wms-core/components/CsrfProtectionComponent"; -import WebSocketServerComponent from "wms-core/components/WebSocketServerComponent"; +import Application from "swaf/Application"; +import Migration, {MigrationType} from "swaf/db/Migration"; +import CreateMigrationsTable from "swaf/migrations/CreateMigrationsTable"; +import ExpressAppComponent from "swaf/components/ExpressAppComponent"; +import NunjucksComponent from "swaf/components/NunjucksComponent"; +import MysqlComponent from "swaf/components/MysqlComponent"; +import LogRequestsComponent from "swaf/components/LogRequestsComponent"; +import RedisComponent from "swaf/components/RedisComponent"; +import ServeStaticDirectoryComponent from "swaf/components/ServeStaticDirectoryComponent"; +import MaintenanceComponent from "swaf/components/MaintenanceComponent"; +import MailComponent from "swaf/components/MailComponent"; +import SessionComponent from "swaf/components/SessionComponent"; +import RedirectBackComponent from "swaf/components/RedirectBackComponent"; +import FormHelperComponent from "swaf/components/FormHelperComponent"; +import CsrfProtectionComponent from "swaf/components/CsrfProtectionComponent"; +import WebSocketServerComponent from "swaf/components/WebSocketServerComponent"; import HomeController from "./controllers/HomeController"; -import AutoUpdateComponent from "wms-core/components/AutoUpdateComponent"; +import AutoUpdateComponent from "swaf/components/AutoUpdateComponent"; import packageJson = require('../package.json'); -import DummyMigration from "wms-core/migrations/DummyMigration"; -import DropLegacyLogsTable from "wms-core/migrations/DropLegacyLogsTable"; +import DummyMigration from "swaf/migrations/DummyMigration"; +import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable"; export default class App extends Application { public constructor( diff --git a/src/controllers/HomeController.ts b/src/controllers/HomeController.ts index e6e3fb3..d8a0379 100644 --- a/src/controllers/HomeController.ts +++ b/src/controllers/HomeController.ts @@ -1,4 +1,4 @@ -import Controller from "wms-core/Controller"; +import Controller from "swaf/Controller"; import {Request, Response} from "express"; export default class HomeController extends Controller { @@ -17,7 +17,7 @@ export default class HomeController extends Controller { } /** - * This is to test and assert that wms-core extended types are available + * This is to test and assert that swaf extended types are available */ protected async goBack(req: Request, res: Response): Promise { res.redirectBack(); diff --git a/src/main.ts b/src/main.ts index 14be157..0033726 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,12 +1,12 @@ import {delimiter} from "path"; -// Load config from specified path or default + wms-core/config (default defaults) +// Load config from specified path or default + swaf/config (default defaults) process.env['NODE_CONFIG_DIR'] = - __dirname + '/../../node_modules/wms-core/config/' + __dirname + '/../../node_modules/swaf/config/' + delimiter + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../../config/'); -import {log} from "wms-core/Logger"; +import {log} from "swaf/Logger"; import App from "./App"; import config from "config"; diff --git a/tsconfig.json b/tsconfig.json index 5ea85f7..9034d02 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,6 @@ }, "include": [ "src/**/*", - "node_modules/wms-core/types" + "node_modules/swaf/types" ] } diff --git a/views/about.njk b/views/about.njk index dbb6047..f1e7a0a 100644 --- a/views/about.njk +++ b/views/about.njk @@ -8,7 +8,7 @@

This is us

-

And we like wms!

+

And we like swaf!

-{% endblock %} \ No newline at end of file +{% endblock %} From 9f3a541c3e2fac185152ca8b0c839539ecb7251c Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Mon, 25 Jan 2021 11:43:36 +0100 Subject: [PATCH 6/7] Add maildev as a dev dependency --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 1550885..1681a4a 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "imagemin-svgo": "^8.0.0", "img-loader": "^3.0.1", "jest": "^26.1.0", + "maildev": "^1.1.0", "mini-css-extract-plugin": "^1.2.1", "node-sass": "^5.0.0", "nodemon": "^2.0.3", From 5eaebd5d120372a232b7338a05e9a6e17098828f Mon Sep 17 00:00:00 2001 From: Alice Gaudon Date: Mon, 25 Jan 2021 13:17:41 +0100 Subject: [PATCH 7/7] Upgrade dependencies and bump swaf to ^0.23.0 --- .gitignore | 2 ++ package.json | 18 +++++++++--------- src/App.ts | 27 +++++++++++++-------------- src/controllers/HomeController.ts | 2 +- src/main.ts | 10 +++++----- tsconfig.frontend.json | 1 + tsconfig.json | 1 + 7 files changed, 32 insertions(+), 29 deletions(-) diff --git a/.gitignore b/.gitignore index 7626c60..570ee35 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ node_modules public dist yarn-error.log + +src/package.json diff --git a/package.json b/package.json index 1681a4a..2eefcc6 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,22 @@ "repository": "https://eternae.ink/arisu/swaf-boilerplate", "author": "Alice Gaudon ", "private": true, - "main": "dist/src/main.js", + "main": "dist/main.js", "scripts": { - "dist-webpack": "webpack --mode production", + "test": "jest --verbose --runInBand", "clean": "(test ! -d dist || rm -r dist)", + "prepareSources": "cp package.json src/", "compile": "yarn clean && tsc", - "build": "yarn compile && yarn dist-webpack", - "lint": "eslint . --ext .js,.jsx,.ts,.tsx", - "dev": "concurrently -k -n \"Typescript,Node,Webpack,Maildev\" -p \"[{name}]\" -c \"blue,green,red,yellow\" \"tsc --watch\" \"nodemon\" \"webpack --watch --mode development\" \"maildev\"", - "start": "yarn build && node dist/src/main.js", - "test": "jest --verbose --runInBand" + "build": "yarn prepareSources && yarn compile && webpack --mode production", + "dev": "yarn prepareSources && concurrently -k -n \"Typescript,Node,Webpack,Maildev\" -p \"[{name}]\" -c \"blue,green,red,yellow\" \"tsc --watch\" \"nodemon\" \"webpack --watch --mode development\" \"maildev\"", + "start": "yarn build && node", + "lint": "eslint . --ext .js,.jsx,.ts,.tsx" }, "devDependencies": { "@babel/core": "^7.9.0", "@babel/preset-env": "^7.9.5", "@fortawesome/fontawesome-free": "^5.14.0", - "@types/config": "^0.0.36", + "@types/config": "^0.0.38", "@types/express": "^4.17.6", "@types/express-session": "^1.17.0", "@types/feather-icons": "^4.7.0", @@ -61,6 +61,6 @@ "dependencies": { "config": "^3.3.1", "express": "^4.17.1", - "swaf": "^0.22.5" + "swaf": "^0.23.0" } } diff --git a/src/App.ts b/src/App.ts index f645a64..6272da0 100644 --- a/src/App.ts +++ b/src/App.ts @@ -10,15 +10,15 @@ import ServeStaticDirectoryComponent from "swaf/components/ServeStaticDirectoryC import MaintenanceComponent from "swaf/components/MaintenanceComponent"; import MailComponent from "swaf/components/MailComponent"; import SessionComponent from "swaf/components/SessionComponent"; -import RedirectBackComponent from "swaf/components/RedirectBackComponent"; import FormHelperComponent from "swaf/components/FormHelperComponent"; import CsrfProtectionComponent from "swaf/components/CsrfProtectionComponent"; import WebSocketServerComponent from "swaf/components/WebSocketServerComponent"; import HomeController from "./controllers/HomeController"; import AutoUpdateComponent from "swaf/components/AutoUpdateComponent"; -import packageJson = require('../package.json'); import DummyMigration from "swaf/migrations/DummyMigration"; import DropLegacyLogsTable from "swaf/migrations/DropLegacyLogsTable"; +import PreviousUrlComponent from "swaf/components/PreviousUrlComponent"; +import packageJson = require('./package.json'); export default class App extends Application { public constructor( @@ -43,41 +43,40 @@ export default class App extends Application { } private registerComponents() { - const redisComponent = new RedisComponent(); - const mysqlComponent = new MysqlComponent(); - - const expressAppComponent = new ExpressAppComponent(this.addr, this.port); - this.use(expressAppComponent); - this.use(new NunjucksComponent()); + // Base + this.use(new ExpressAppComponent(this.addr, this.port)); 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 + this.use(new NunjucksComponent()); + this.use(new PreviousUrlComponent()); + // Maintenance this.use(new MaintenanceComponent(this, () => { - return redisComponent.canServe() && mysqlComponent.canServe(); + return this.as(RedisComponent).canServe() && this.as(MysqlComponent).canServe(); })); this.use(new AutoUpdateComponent()); // Services - this.use(mysqlComponent); + this.use(new MysqlComponent()); this.use(new MailComponent()); // Session - this.use(redisComponent); - this.use(new SessionComponent(redisComponent)); + this.use(new RedisComponent()); + this.use(new SessionComponent(this.as(RedisComponent))); // Utils - this.use(new RedirectBackComponent()); this.use(new FormHelperComponent()); // Middlewares this.use(new CsrfProtectionComponent()); // WebSocket server - this.use(new WebSocketServerComponent(this, expressAppComponent, redisComponent)); + this.use(new WebSocketServerComponent(this, this.as(ExpressAppComponent), this.as(RedisComponent))); } private registerWebSocketListeners() { diff --git a/src/controllers/HomeController.ts b/src/controllers/HomeController.ts index d8a0379..b5e1740 100644 --- a/src/controllers/HomeController.ts +++ b/src/controllers/HomeController.ts @@ -20,6 +20,6 @@ export default class HomeController extends Controller { * This is to test and assert that swaf extended types are available */ protected async goBack(req: Request, res: Response): Promise { - res.redirectBack(); + res.redirect(req.getPreviousUrl() || Controller.route('home')); } } diff --git a/src/main.ts b/src/main.ts index 0033726..babc7df 100644 --- a/src/main.ts +++ b/src/main.ts @@ -2,19 +2,19 @@ import {delimiter} from "path"; // Load config from specified path or default + swaf/config (default defaults) process.env['NODE_CONFIG_DIR'] = - __dirname + '/../../node_modules/swaf/config/' + __dirname + '/../node_modules/swaf/config/' + delimiter - + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../../config/'); + + (process.env['NODE_CONFIG_DIR'] || __dirname + '/../config/'); -import {log} from "swaf/Logger"; +import {logger} from "swaf/Logger"; import App from "./App"; import config from "config"; (async () => { - log.debug('Config path:', process.env['NODE_CONFIG_DIR']); + logger.debug('Config path:', process.env['NODE_CONFIG_DIR']); const app = new App(config.get('listen_addr'), config.get('port')); await app.start(); })().catch(err => { - log.error(err); + logger.error(err); }); diff --git a/tsconfig.frontend.json b/tsconfig.frontend.json index 4b5a3f5..ad74720 100644 --- a/tsconfig.frontend.json +++ b/tsconfig.frontend.json @@ -2,6 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "public/js", + "rootDir": "./assets", "target": "ES6", "strict": true, "lib": [ diff --git a/tsconfig.json b/tsconfig.json index 9034d02..12eec0a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,6 +3,7 @@ "module": "CommonJS", "esModuleInterop": true, "outDir": "dist", + "rootDir": "./src", "target": "ES6", "strict": true, "lib": [