From ef84610051c26d9af75fe7dc342ce85ddc3a6828 Mon Sep 17 00:00:00 2001 From: Sugui Date: Thu, 28 Mar 2024 09:29:33 +0100 Subject: [PATCH] First commit of code --- .gitignore | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++ bun.lockb | Bin 0 -> 34517 bytes compose.yml | 33 ++++++++++ index.ts | 18 ++++++ package.json | 25 ++++++++ tsconfig.json | 22 +++++++ 6 files changed, 273 insertions(+) create mode 100644 .gitignore create mode 100755 bun.lockb create mode 100644 compose.yml create mode 100644 index.ts create mode 100644 package.json create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..468f82a --- /dev/null +++ b/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..0d56a6c18d989d5faf4fc57ae4c54946e81272c3 GIT binary patch literal 34517 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 literal 0 HcmV?d00001 diff --git a/compose.yml b/compose.yml new file mode 100644 index 0000000..5d86c69 --- /dev/null +++ b/compose.yml @@ -0,0 +1,33 @@ +version: "3" + +services: + mongodb: + image: mongo:bionic + container_name: mongodb + ports: + - "27017:27017" + environment: + MONGO_INITDB_ROOT_USERNAME: root + MONGO_INITDB_ROOT_PASSWORD: password + MONGO_INITDB_DATABASE: bot + volumes: + - mongodb_data:/data/db + + fe-middleware: + image: oven/bun:1 + container_name: fe-middleware + command: bun run docker-dev + working_dir: /usr/src/app + ports: + - "8080:8080" + depends_on: + - mongodb + environment: + MONGODB_URI: "mongodb://mongodb:27017/bot" + MONGODB_USER: "root" + MONGODB_PASS: "password" + volumes: + - ./:/usr/src/app:ro + +volumes: + mongodb_data: diff --git a/index.ts b/index.ts new file mode 100644 index 0000000..eea0e28 --- /dev/null +++ b/index.ts @@ -0,0 +1,18 @@ +import compression from "compression"; +import express from "express"; +import listEndpoints from "express-list-endpoints"; + +const app = express(); +const port = 3000; + +app.use(express.json()); +app.use(compression()); + +app.get("/", (_, res) => { + const endpoints = listEndpoints(app); + res.json({ endpoints }); +}); + +app.listen(port, () => + console.log(`Express server listening on port ${port}`) +); \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..afef0fd --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "fe-middleware", + "module": "index.ts", + "type": "module", + "devDependencies": { + "@types/compression": "^1.7.5", + "@types/express": "^4.17.21", + "@types/express-list-endpoints": "^6.0.3", + "bun-types": "latest" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "compression": "^1.7.4", + "express": "^4.19.2", + "express-list-endpoints": "^6.0.0" + }, + "scripts": { + "start": "bun run index.ts", + "docker-dev": "bun --hot run index.ts", + "dev": "docker compose down -v && docker compose up", + "test": "docker compose down -v && docker compose run fe-middleware bun test" + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7556e1d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": ["ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "react-jsx", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" // add Bun global + ] + } +}