From a765e598babf8b71a2ab224d8aca8e2c369047c0 Mon Sep 17 00:00:00 2001 From: Yuzu Date: Sat, 21 Sep 2024 13:28:02 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20Initialized=20project?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 177 +++++++++++++++++++++++++++++++++++++ .vscode/settings.json | 3 + apps/backend/.gitignore | 175 ++++++++++++++++++++++++++++++++++++ apps/backend/README.md | 15 ++++ apps/backend/package.json | 24 +++++ apps/backend/src/index.ts | 17 ++++ apps/backend/tsconfig.json | 27 ++++++ apps/web/.gitignore | 175 ++++++++++++++++++++++++++++++++++++ apps/web/README.md | 15 ++++ apps/web/app/layout.tsx | 11 +++ apps/web/app/page.tsx | 17 ++++ apps/web/next-env.d.ts | 5 ++ apps/web/next.config.mjs | 10 +++ apps/web/package.json | 27 ++++++ apps/web/tsconfig.json | 44 +++++++++ biome.json | 30 +++++++ bun.lockb | Bin 0 -> 59137 bytes drizzle.config.ts | 10 +++ package.json | 21 +++++ packages/api/.gitignore | 175 ++++++++++++++++++++++++++++++++++++ packages/api/README.md | 15 ++++ packages/api/package.json | 17 ++++ packages/api/src/index.ts | 4 + packages/api/tsconfig.json | 27 ++++++ packages/db/.gitignore | 175 ++++++++++++++++++++++++++++++++++++ packages/db/README.md | 15 ++++ packages/db/package.json | 18 ++++ packages/db/src/index.ts | 15 ++++ packages/db/src/schema.ts | 13 +++ packages/db/tsconfig.json | 27 ++++++ tsconfig.json | 27 ++++++ turbo.json | 18 ++++ 32 files changed, 1349 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 apps/backend/.gitignore create mode 100644 apps/backend/README.md create mode 100644 apps/backend/package.json create mode 100644 apps/backend/src/index.ts create mode 100644 apps/backend/tsconfig.json create mode 100644 apps/web/.gitignore create mode 100644 apps/web/README.md create mode 100644 apps/web/app/layout.tsx create mode 100644 apps/web/app/page.tsx create mode 100644 apps/web/next-env.d.ts create mode 100644 apps/web/next.config.mjs create mode 100644 apps/web/package.json create mode 100644 apps/web/tsconfig.json create mode 100644 biome.json create mode 100644 bun.lockb create mode 100644 drizzle.config.ts create mode 100644 package.json create mode 100644 packages/api/.gitignore create mode 100644 packages/api/README.md create mode 100644 packages/api/package.json create mode 100644 packages/api/src/index.ts create mode 100644 packages/api/tsconfig.json create mode 100644 packages/db/.gitignore create mode 100644 packages/db/README.md create mode 100644 packages/db/package.json create mode 100644 packages/db/src/index.ts create mode 100644 packages/db/src/schema.ts create mode 100644 packages/db/tsconfig.json create mode 100644 tsconfig.json create mode 100644 turbo.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d925ea2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,177 @@ +.turbo + +# 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/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7c2b296 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.defaultFormatter": "biomejs.biome" +} \ No newline at end of file diff --git a/apps/backend/.gitignore b/apps/backend/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/apps/backend/.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/apps/backend/README.md b/apps/backend/README.md new file mode 100644 index 0000000..c55dce9 --- /dev/null +++ b/apps/backend/README.md @@ -0,0 +1,15 @@ +# backend + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.28. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/apps/backend/package.json b/apps/backend/package.json new file mode 100644 index 0000000..9b447bf --- /dev/null +++ b/apps/backend/package.json @@ -0,0 +1,24 @@ +{ + "name": "@minikura/backend", + "module": "src/index.ts", + "type": "module", + "exports": "./src/index.ts", + "scripts": { + "dev": "bun --watch src/index.ts", + "build": "bun build src/index.ts --target bun --outdir ./dist", + "start": "NODE_ENV=production bun dist/index.js", + "test": "bun test" + }, + "devDependencies": { + "@types/bun": "^1.1.9" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@elysiajs/swagger": "^1.1.1", + "@minikura/db": "workspace:*", + "dotenv": "^16.4.5", + "elysia": "^1.1.13" + } +} diff --git a/apps/backend/src/index.ts b/apps/backend/src/index.ts new file mode 100644 index 0000000..1dddd07 --- /dev/null +++ b/apps/backend/src/index.ts @@ -0,0 +1,17 @@ +import { Elysia } from "elysia"; +import { swagger } from "@elysiajs/swagger"; +import { db } from "@minikura/db"; + +const app = new Elysia() + .use(swagger()) + .get("/", async () => { + return "Hello Elysia"; + }) + .get("/hello", "Do you miss me?") + .listen(3000, async () => { + console.log("Server is running on port 3000"); + const result = await db.query.server.findMany(); + console.log(result); + }); + +export type App = typeof app; diff --git a/apps/backend/tsconfig.json b/apps/backend/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/apps/backend/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/apps/web/.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/apps/web/README.md b/apps/web/README.md new file mode 100644 index 0000000..e91038c --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,15 @@ +# web + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run index.ts +``` + +This project was created using `bun init` in bun v1.1.28. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx new file mode 100644 index 0000000..225b603 --- /dev/null +++ b/apps/web/app/layout.tsx @@ -0,0 +1,11 @@ +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx new file mode 100644 index 0000000..3834edb --- /dev/null +++ b/apps/web/app/page.tsx @@ -0,0 +1,17 @@ +import { api } from "@minikura/api"; + +async function fetchData() { + const response = await api.index.get(); + return response; +} + +export default async function Page() { + const data = await fetchData(); + + return ( +
+

Hello React

+
{JSON.stringify(data, null, 2)}
+
+ ); +} diff --git a/apps/web/next-env.d.ts b/apps/web/next-env.d.ts new file mode 100644 index 0000000..40c3d68 --- /dev/null +++ b/apps/web/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/apps/web/next.config.mjs b/apps/web/next.config.mjs new file mode 100644 index 0000000..da52b2a --- /dev/null +++ b/apps/web/next.config.mjs @@ -0,0 +1,10 @@ +// @ts-check + +/** + * @type {import('next').NextConfig} + */ +const nextConfig = { + /* config options here */ +} + +export default nextConfig \ No newline at end of file diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..d6a8263 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,27 @@ +{ + "name": "@minikura/web", + "module": "index.ts", + "type": "module", + "scripts": { + "dev": "PORT=3001 next dev --turbo", + "build": "next build", + "start": "next start", + "lint": "next lint", + "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@types/bun": "latest", + "@types/react": "^18.3.7", + "elysia": "^1.1.13" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@elysiajs/eden": "^1.1.3", + "@minikura/api": "workspace:*", + "next": "^14.2.12", + "react": "^18.3.1", + "react-dom": "^18.3.1" + } +} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..2a9c1fd --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,44 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": [ + "ESNext", + "DOM" + ], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "preserve", + "allowJs": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false, + "incremental": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": [ + "next-env.d.ts", + ".next/types/**/*.ts", + "**/*.ts", + "**/*.tsx" +, "next.config.mjs" ], + "exclude": [ + "node_modules" + ] +} diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..e82a582 --- /dev/null +++ b/biome.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.1/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + } +} diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..6047e7faae1cc7a731c343a42d3b34b71f7d73c8 GIT binary patch literal 59137 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"http://localhost:3000"); diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/api/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/packages/db/.gitignore b/packages/db/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/packages/db/.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/packages/db/README.md b/packages/db/README.md new file mode 100644 index 0000000..ce1af97 --- /dev/null +++ b/packages/db/README.md @@ -0,0 +1,15 @@ +# @minikura/db + +To install dependencies: + +```bash +bun install +``` + +To run: + +```bash +bun run src/index.ts +``` + +This project was created using `bun init` in bun v1.1.28. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime. diff --git a/packages/db/package.json b/packages/db/package.json new file mode 100644 index 0000000..3b1aaac --- /dev/null +++ b/packages/db/package.json @@ -0,0 +1,18 @@ +{ + "name": "@minikura/db", + "module": "src/index.ts", + "type": "module", + "exports": "./src/index.ts", + "devDependencies": { + "@types/bun": "latest", + "drizzle-kit": "^0.24.2" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "dotenv": "^16.4.5", + "drizzle-orm": "^0.33.0", + "postgres": "^3.4.4" + } +} diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts new file mode 100644 index 0000000..45400b3 --- /dev/null +++ b/packages/db/src/index.ts @@ -0,0 +1,15 @@ +import "dotenv/config"; +import { drizzle } from "drizzle-orm/postgres-js"; +import { migrate } from "drizzle-orm/postgres-js/migrator"; +import postgres from "postgres"; +import * as schema from "./schema"; + +console.log(process.env.DATABASE_URL); + +// for migrations +const migrationClient = postgres(process.env.DATABASE_URL || "", { max: 1 }); +// migrate(drizzle(migrationClient), ...) + +// for query purposes +const queryClient = postgres(process.env.DATABASE_URL || ""); +export const db = drizzle(queryClient, { schema }); diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts new file mode 100644 index 0000000..cf72604 --- /dev/null +++ b/packages/db/src/schema.ts @@ -0,0 +1,13 @@ +import { + serial, + text, + timestamp, + pgTable, + pgSchema, +} from "drizzle-orm/pg-core"; + +export const server = pgTable("server", { + id: serial("id"), + createdAt: timestamp("created_at"), + updatedAt: timestamp("updated_at"), +}); diff --git a/packages/db/tsconfig.json b/packages/db/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/packages/db/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..15a9068 --- /dev/null +++ b/turbo.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://turbo.build/schema.json", + "tasks": { + "build": { + "dependsOn": ["^build"], + "outputs": [".next/**", "!.next/cache/**"] + }, + "typecheck": { + "dependsOn": ["^typecheck"] + }, + "dev": { + "persistent": true, + "cache": false + } + }, + "ui": "tui", + "globalDependencies": ["**/.env"] +}