From 6bd7c32a8aaaa6f68e5792986b89d1cbf9c7664c Mon Sep 17 00:00:00 2001 From: Ethan Niser <100045248+ethanniser@users.noreply.github.com> Date: Tue, 12 Sep 2023 15:58:44 +0000 Subject: [PATCH] first commit --- .gitignore | 169 ++++++++++++++++++++++++++++++++++++++ README.md | 15 ++++ books.db | Bin 0 -> 12288 bytes bun.lockb | Bin 0 -> 50696 bytes package.json | 24 ++++++ public/example.txt | 0 sqlite.db | 0 src/config/index.ts | 9 ++ src/context/index.ts | 32 ++++++++ src/controllers/todos.tsx | 24 ++++++ src/lib/index.ts | 0 src/main.ts | 14 ++++ src/model/schema.ts | 1 + src/model/store/index.ts | 6 ++ src/model/todo.ts | 14 ++++ src/views/todoItem.tsx | 10 +++ tsconfig.json | 24 ++++++ 17 files changed, 342 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 books.db create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 public/example.txt create mode 100644 sqlite.db create mode 100644 src/config/index.ts create mode 100644 src/context/index.ts create mode 100644 src/controllers/todos.tsx create mode 100644 src/lib/index.ts create mode 100644 src/main.ts create mode 100644 src/model/schema.ts create mode 100644 src/model/store/index.ts create mode 100644 src/model/todo.ts create mode 100644 src/views/todoItem.tsx create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f81d56e --- /dev/null +++ b/.gitignore @@ -0,0 +1,169 @@ +# 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* + +# 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/) + +.cache +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +.cache/ + +# 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 +.cache + +# 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.\* diff --git a/README.md b/README.md new file mode 100644 index 0000000..88d6915 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# test + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.0.0. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/books.db b/books.db new file mode 100644 index 0000000000000000000000000000000000000000..3d2481903dcfdcd0a282422847376960c6a60275 GIT binary patch literal 12288 zcmeI&F;Buk6bJCTwrCto-MW$I1_5y}#?`79L;Id+f_)+{Q z?p~WP$byNJ=Kpecz1O~b!*9E!H`nbrQ#91`X_(Og+hLruV8sj}QN=DwK)0Rad=00Izz00bZa0SG_<0ucD40zGTPtJQcv3!{ljXA^Uw zen{19p_0ed)IJS_F9k{eq%CNrwvvQXRW~QABfjZ*9)H;{T1Hxr(_*o{9WP!{B_2?# zD@9WT)C*c2Kj_n?=#zgduUcJmpd-4nPI+&V;?8WtMK;p&BB|zgbH{yV?uYyCzM2gJ z0uX=z1Rwwb2tWV=5P$##AOL}12$UU%?e58uqH`TZady$5pcqn5#<5DOw!@B!?`=IF zkRDQIYJ)g=N>@wE)|yuQ$F1`FKX*Tw83+hK00Izz00bZa0SG_<0uX=z1pbr27PmcK I{5{}&0WXVoR{#J2 literal 0 HcmV?d00001 diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..772b64c4ae1524cd5d559af5256fa6b32a33ad13 GIT binary patch literal 50696 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 UBTDCeI@f;8<$injKkw)N2ce6e(f|Me literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..0bd666b --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "test", + "module": "src/main.ts", + "type": "module", + "devDependencies": { + "bun-types": "latest", + "drizzle-kit": "^0.19.13" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@bogeychan/elysia-logger": "^0.0.8", + "@elysiajs/html": "^0.6.5", + "@elysiajs/static": "^0.6.0", + "@elysiajs/swagger": "^0.6.2", + "@t3-oss/env-core": "^0.6.1", + "drizzle-orm": "^0.28.6", + "drizzle-typebox": "^0.1.1", + "elysia": "^0.6.22", + "pino-pretty": "^10.2.0", + "zod": "^3.22.2" + } +} \ No newline at end of file diff --git a/public/example.txt b/public/example.txt new file mode 100644 index 0000000..e69de29 diff --git a/sqlite.db b/sqlite.db new file mode 100644 index 0000000..e69de29 diff --git a/src/config/index.ts b/src/config/index.ts new file mode 100644 index 0000000..4ac2999 --- /dev/null +++ b/src/config/index.ts @@ -0,0 +1,9 @@ +import { createEnv } from "@t3-oss/env-core"; +import { z } from "zod"; + +export const env = createEnv({ + server: { + LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]), + }, + runtimeEnv: process.env, +}); diff --git a/src/context/index.ts b/src/context/index.ts new file mode 100644 index 0000000..3c01238 --- /dev/null +++ b/src/context/index.ts @@ -0,0 +1,32 @@ +import { Elysia } from "elysia"; +import { logger } from "@bogeychan/elysia-logger"; +import pretty from "pino-pretty"; +import { html } from "@elysiajs/html"; +import { env } from "../config"; +import { db } from "../model/store"; + +const stream = pretty({ + colorize: true, +}); + +export const ctx = new Elysia({ + name: "@app/ctx", +}) + .use( + logger({ + level: env.LOG_LEVEL, + stream, + }) + ) + .use(html()) + .decorate("db", db) + .decorate("config", env) + .onStart(({ log }) => log.info("Server starting")) + .onStop(({ log }) => log.info("Server stopping")) + .onRequest(({ log, request }) => + log.debug(`Request received: ${request.method}: ${request.url}`) + ) + .onResponse(({ log, response }) => + log.debug(`Response sent: ${response.statusCode}`) + ) + .onError(({ log, error }) => log.error(error)); diff --git a/src/controllers/todos.tsx b/src/controllers/todos.tsx new file mode 100644 index 0000000..b5a300f --- /dev/null +++ b/src/controllers/todos.tsx @@ -0,0 +1,24 @@ +import Elysia from "elysia"; +import { ctx } from "../context"; +import { insertTodoSchema } from "../model/todo"; +import { TodoItem } from "../views/todoItem"; + +export const todosController = new Elysia({ + name: "@app/todos", + prefix: "/todos", +}) + .use(ctx) + .model({ + todo: insertTodoSchema, + }) + .get("/", async ({ db }) => { + const todos = await db.query.todos.findMany(); + + return ( +
+ {todos.map((todo) => ( + + ))} +
+ ); + }); diff --git a/src/lib/index.ts b/src/lib/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..51525f8 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { Elysia } from "elysia"; +import swagger from "@elysiajs/swagger"; +import { staticPlugin } from "@elysiajs/static"; +import { todosController } from "./controllers/todos"; + +const app = new Elysia({ + name: "@app/main", +}) + .use(swagger()) + .use(staticPlugin()) + .use(todosController) + .listen(3000); + +console.log(`app is listening on ${app.server?.hostname}:${app.server?.port}`); diff --git a/src/model/schema.ts b/src/model/schema.ts new file mode 100644 index 0000000..2c98c6d --- /dev/null +++ b/src/model/schema.ts @@ -0,0 +1 @@ +export { todos } from "./todo"; diff --git a/src/model/store/index.ts b/src/model/store/index.ts new file mode 100644 index 0000000..e87fe32 --- /dev/null +++ b/src/model/store/index.ts @@ -0,0 +1,6 @@ +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { Database } from "bun:sqlite"; +import * as schema from "../schema"; + +const sqlite = new Database("sqlite.db"); +export const db = drizzle(sqlite, { schema }); diff --git a/src/model/todo.ts b/src/model/todo.ts new file mode 100644 index 0000000..fa9cf9f --- /dev/null +++ b/src/model/todo.ts @@ -0,0 +1,14 @@ +import { text, integer, sqliteTable } from "drizzle-orm/sqlite-core"; +import { createInsertSchema, createSelectSchema } from "drizzle-typebox"; + +export const todos = sqliteTable("todo", { + id: integer("id").primaryKey({ autoIncrement: true }), + content: text("content").notNull(), + done: integer("done", { mode: "boolean" }).notNull().default(false), +}); + +export type Todo = typeof todos.$inferSelect; +export type InsertTodo = typeof todos.$inferInsert; + +export const insertTodoSchema = createInsertSchema(todos); +export const selectTodoSchema = createSelectSchema(todos); diff --git a/src/views/todoItem.tsx b/src/views/todoItem.tsx new file mode 100644 index 0000000..d4fe842 --- /dev/null +++ b/src/views/todoItem.tsx @@ -0,0 +1,10 @@ +import type { Todo } from "../model/todo"; + +export const TodoItem = (todo: Todo) => { + return ( +
  • + + {todo.content} +
  • + ); +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ebfbd2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "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", + "jsxFactory": "ElysiaJSX", + "jsxFragmentFactory": "ElysiaJSX.Fragment", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" // add Bun global + ] + } +}