From 57b89f5bded1ac384f7f1f015b4cf428c3011392 Mon Sep 17 00:00:00 2001 From: zumbiepig <121742281+zumbiepig@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:02:20 -0700 Subject: [PATCH] add express server --- bun.lockb | Bin 72024 -> 104947 bytes eslint.config.js | 27 +++++++++++--------- index.ts | 63 ++++++++++++++++++++++++++++++++++++++++++++++- package.json | 19 ++++++++++++-- routes/index.ts | 8 ++++++ 5 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 routes/index.ts diff --git a/bun.lockb b/bun.lockb index 7af1cbc5e0d115172c5c598dc7e7dd21a85c6fc5..08f5dea9e865328bdb0d5fe99c4811b33915519d 100755 GIT binary patch delta 33392 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

gA>Hz6TAw-x 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 D_%$J6 delta 13855 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 diff --git a/eslint.config.js b/eslint.config.js index 1190c20..277aeba 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,15 +1,18 @@ import eslint from '@eslint/js'; import tseslint from 'typescript-eslint'; -export default tseslint.config(eslint.configs.recommended, ...tseslint.configs.strict, { - rules: { - '@typescript-eslint/ban-ts-comment': [ - 'error', - { - 'ts-expect-error': false, - 'ts-nocheck': false, - 'ts-check': true, - }, - ], - }, -}); +export default tseslint.config( + eslint.configs.recommended, + ...tseslint.configs.strict, + { + rules: { + '@typescript-eslint/ban-ts-comment': [ + 'error', { + 'ts-expect-error': false, + 'ts-nocheck': false, + 'ts-check': true, + }, + ], + }, + } +); diff --git a/index.ts b/index.ts index 3f2f3f8..63a193c 100644 --- a/index.ts +++ b/index.ts @@ -1 +1,62 @@ -console.log('Hello via Bun!'); +import { join } from 'path'; +import { env } from 'bun'; +import express, { json, urlencoded } from 'express'; +import chalk from 'chalk' +import compression from 'compression'; +import cookieParser from 'cookie-parser'; +import debug from 'debug'; +import errorhandler from 'errorhandler'; +import helmet from 'helmet'; +import morgan from 'morgan'; +import serveFavicon from 'serve-favicon'; +import serveStatic from 'serve-static'; + +import { indexRouter } from './routes/index.ts'; + +const BASE_DIR = join(import.meta.dir, 'public'); +const PORT = env.PORT || 3000; + +const debugLogger = debug('app:server'); +const isDev = env.NODE_ENV === 'development'; + +const app = express(); +app.enable('strict routing'); + +debugLogger('Booting server.'); + +app.use( + helmet({ + contentSecurityPolicy: false, + }) +); + +app.use(morgan('combined')); +app.use(json()); +app.use(urlencoded({ extended: false })); + +app.use(cookieParser()); + +app.use(compression()); + +if (isDev) app.use(errorhandler()); + +app.use(serveFavicon(join(BASE_DIR, 'resources/images/icons/favicon.webp'), { maxAge: 86400 })); +app.use(serveStatic(BASE_DIR)); + +app.use('/', indexRouter); + +app.use(async (req, res, next) => { + res.status(404).sendFile(join(BASE_DIR, '404.html')); + next(); +}); + +app.use(async (err, req, res, next) => { + console.error(err.stack); + res.status(500).send('500 Internal Server Error'); + next(); +}); + +app.listen(PORT, async () => { + debugLogger('Server started.'); + console.log(chalk.green(`Server is running on port ${PORT}`)); +}); diff --git a/package.json b/package.json index 2088d2b..6c29a3b 100644 --- a/package.json +++ b/package.json @@ -4,17 +4,32 @@ "module": "index.ts", "type": "module", "scripts": { - "start": "bun run ./index.ts", + "start": "NODE_ENV=production bun run ./index.ts", + "dev": "NODE_ENV=development DEBUG=app:* bun --watch run ./index.ts", "lint": "eslint ./src/", "lint:fix": "eslint --fix ./src/", "build": "bun run lint; rm -rf ./public/resources/scripts/ ./public/assets.json; tsc; javascript-obfuscator ./public/resources/scripts/ --output ./public/resources/scripts/ --options-preset high-obfuscation; bun run ./build.ts" }, "dependencies": { - "@types/bun": "latest" + "chalk": "^5.3.0", + "compression": "^1.7.4", + "cookie-parser": "^1.4.6", + "debug": "^4.3.6", + "errorhandler": "^1.5.1", + "express": "^4.19.2", + "helmet": "^7.1.0", + "morgan": "^1.10.0", + "serve-favicon": "^2.5.0" }, "devDependencies": { "@tsconfig/bun": "^1.0.7", "@tsconfig/strictest": "^2.0.5", + "@types/bun": "^1.1.8", + "@types/compression": "^1.7.5", + "@types/debug": "^4.1.12", + "@types/errorhandler": "^1.5.3", + "@types/morgan": "^1.9.9", + "@types/serve-favicon": "^2.5.7", "eslint": "^9.9.1", "javascript-obfuscator": "^4.1.1", "typescript-eslint": "^8.3.0" diff --git a/routes/index.ts b/routes/index.ts new file mode 100644 index 0000000..b8fedc7 --- /dev/null +++ b/routes/index.ts @@ -0,0 +1,8 @@ +import { Router } from 'express'; +const indexRouter = Router(); + +indexRouter.get('/', async (req, res) => { + // router for future use +}); + +export { indexRouter };