From bb56fa60a9a2fc8a620dcdda4ddc7014b98a3238 Mon Sep 17 00:00:00 2001 From: Dan Barclay Date: Sun, 8 Dec 2024 23:54:05 +0000 Subject: [PATCH] feat: initial commit --- .github/workflows/ci.yml | 56 ++++++++++++ .gitignore | 44 +++++++++ README.md | 37 ++++++-- apps/server/README.md | 11 +++ biome.json => apps/server/biome.json | 0 apps/server/package.json | 20 +++++ {src => apps/server/src}/context.ts | 0 {src => apps/server/src}/index.test.ts | 0 {src => apps/server/src}/index.ts | 0 {src => apps/server/src}/router.ts | 0 {src => apps/server/src}/schemas.ts | 0 {src => apps/server/src}/types.ts | 0 tsconfig.json => apps/server/tsconfig.json | 0 apps/web/.dockerignore | 4 + apps/web/.gitignore | 5 ++ apps/web/Dockerfile | 25 ++++++ apps/web/README.md | 100 +++++++++++++++++++++ apps/web/app/app.css | 9 ++ apps/web/app/root.tsx | 76 ++++++++++++++++ apps/web/app/routes.ts | 4 + apps/web/app/routes/_index.tsx | 19 ++++ apps/web/biome.json | 38 ++++++++ apps/web/index.ts | 10 +++ apps/web/package.json | 41 +++++++++ apps/web/playwright.config.ts | 26 ++++++ apps/web/public/favicon.ico | Bin 0 -> 15086 bytes apps/web/react-router.config.ts | 5 ++ apps/web/tests/index.spec.ts | 7 ++ apps/web/tsconfig.json | 27 ++++++ apps/web/vite.config.ts | 23 +++++ bun.lockb | Bin 0 -> 217000 bytes package.json | 28 +++--- turbo.json | 16 ++++ 33 files changed, 609 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 apps/server/README.md rename biome.json => apps/server/biome.json (100%) create mode 100644 apps/server/package.json rename {src => apps/server/src}/context.ts (100%) rename {src => apps/server/src}/index.test.ts (100%) rename {src => apps/server/src}/index.ts (100%) rename {src => apps/server/src}/router.ts (100%) rename {src => apps/server/src}/schemas.ts (100%) rename {src => apps/server/src}/types.ts (100%) rename tsconfig.json => apps/server/tsconfig.json (100%) create mode 100644 apps/web/.dockerignore create mode 100644 apps/web/.gitignore create mode 100644 apps/web/Dockerfile create mode 100644 apps/web/README.md create mode 100644 apps/web/app/app.css create mode 100644 apps/web/app/root.tsx create mode 100644 apps/web/app/routes.ts create mode 100644 apps/web/app/routes/_index.tsx create mode 100644 apps/web/biome.json create mode 100644 apps/web/index.ts create mode 100644 apps/web/package.json create mode 100644 apps/web/playwright.config.ts create mode 100644 apps/web/public/favicon.ico create mode 100644 apps/web/react-router.config.ts create mode 100644 apps/web/tests/index.spec.ts create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/vite.config.ts create mode 100755 bun.lockb create mode 100644 turbo.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0c4063a --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,56 @@ +name: CI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + name: Build and Test + timeout-minutes: 15 + runs-on: ubuntu-latest + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - uses: oven-sh/setup-bun@v2 + + - name: Create Service Account file + run: | + echo "${{ secrets.FIRESTORE_SERVICE_ACCOUNT_BASE64 }}" | base64 -d > apps/server/service-account.json + + - name: Cache bun dependencies + uses: actions/cache@v4 + with: + path: | + ~/.bun/install/cache + key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} + + + - name: Install dependencies + run: bun install + + - name: Install Playwright Browsers + run: bunx playwright install --with-deps chromium + + - name: Lint + run: bun run lint + + - name: Test + run: | + bun run dev & # Start in background + bunx wait-on http://localhost:5173 + bun run test + + - name: Upload test results + if: always() + uses: actions/upload-artifact@v4 + with: + name: playwright-report + path: apps/web/playwright-report + retention-days: 30 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..974124e --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +node_modules +.pnp +.pnp.js + +# Local env files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Testing +coverage + +# Turbo +.turbo + +# Vercel +.vercel + +# Build Outputs +.next/ +out/ +build +dist + + +# Debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Misc +.DS_Store +*.pem + +# IDE +.code +.idea + +# React Router +.react-router/ +.vite/ +/build/ \ No newline at end of file diff --git a/README.md b/README.md index 6dd13e7..5af4fc9 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,34 @@ -To install dependencies: -```sh +# React Router + Hono Monorepo Template + +### Setup + +```shell +git clone https://github.com/barclayd/ +cd repo-name bun install ``` -To run: -```sh -bun run dev -``` +### Technologies + +| Category | Technology | Version | +|-------------------|------------|---------| +| Monorepo | [Turborepo](https://turbo.build/repo) [Turborepo](https://turbo.build/repo) | 2.3.3 | +| Workspace/Runtime | [Bun](https://bun.sh) [Bun](https://bun.sh) | 1.1.38 | +| Linting | [Biome](https://biomejs.dev/) [Biome](https://biomejs.dev/) | 1.9.4 | +| Language | [TypeScript](https://www.typescriptlang.org/) [TypeScript](https://www.typescriptlang.org/) | 5.5.4 | +| Server | [Hono](https://hono.dev) [Hono](https://hono.dev) | 4.6.13 | +| API | [tRPC](https://trpc.io) [tRPC](https://trpc.io) | 11.0.0-rc.660 | +| Schema Validation | [Zod](https://zod.dev) [Zod](https://zod.dev) | 3.23.8 | +| UI Framework | [React Router](https://reactrouter.com) [React Router](https://reactrouter.com) | 7.0.2 | +| UI Library | [React](https://react.dev) [React](https://react.dev) | 19.0.0 | +| Styling | [Tailwind CSS](https://tailwindcss.com) [Tailwind CSS](https://tailwindcss.com) | 4.0.0-beta.6 | +| E2E Testing | [Playwright](https://playwright.dev) [Playwright](https://playwright.dev) | 1.49.0 | +| Bundler | [Vite](https://vitejs.dev) [Vite](https://vitejs.dev) | 6.0.3 | +| CI | [GitHub Actions](https://github.com/features/actions) [GitHub Actions](https://github.com/features/actions) | N/A | + +### Still to come -open http://localhost:3000 +* Database connectivity - SQL and NoSQL +* Vitest + Vitest Browser Mode +* Docker +* Deployment via CD, powered by Github Actions \ No newline at end of file diff --git a/apps/server/README.md b/apps/server/README.md new file mode 100644 index 0000000..6dd13e7 --- /dev/null +++ b/apps/server/README.md @@ -0,0 +1,11 @@ +To install dependencies: +```sh +bun install +``` + +To run: +```sh +bun run dev +``` + +open http://localhost:3000 diff --git a/biome.json b/apps/server/biome.json similarity index 100% rename from biome.json rename to apps/server/biome.json diff --git a/apps/server/package.json b/apps/server/package.json new file mode 100644 index 0000000..98110e3 --- /dev/null +++ b/apps/server/package.json @@ -0,0 +1,20 @@ +{ + "name": "server", + "scripts": { + "dev": "bun run --hot src/index.ts", + "lint": "bunx biome check --write .", + "test": "bun test", + "types": "tsc --noEmit" + }, + "dependencies": { + "@trpc/server": "^11.0.0-rc.660", + "hono": "^4.6.13", + "uuid": "^11.0.3", + "zod": "^3.23.8" + }, + "devDependencies": { + "@biomejs/biome": "^1.9.4", + "@hono/trpc-server": "0.3.4", + "@types/bun": "latest" + } +} diff --git a/src/context.ts b/apps/server/src/context.ts similarity index 100% rename from src/context.ts rename to apps/server/src/context.ts diff --git a/src/index.test.ts b/apps/server/src/index.test.ts similarity index 100% rename from src/index.test.ts rename to apps/server/src/index.test.ts diff --git a/src/index.ts b/apps/server/src/index.ts similarity index 100% rename from src/index.ts rename to apps/server/src/index.ts diff --git a/src/router.ts b/apps/server/src/router.ts similarity index 100% rename from src/router.ts rename to apps/server/src/router.ts diff --git a/src/schemas.ts b/apps/server/src/schemas.ts similarity index 100% rename from src/schemas.ts rename to apps/server/src/schemas.ts diff --git a/src/types.ts b/apps/server/src/types.ts similarity index 100% rename from src/types.ts rename to apps/server/src/types.ts diff --git a/tsconfig.json b/apps/server/tsconfig.json similarity index 100% rename from tsconfig.json rename to apps/server/tsconfig.json diff --git a/apps/web/.dockerignore b/apps/web/.dockerignore new file mode 100644 index 0000000..9b8d514 --- /dev/null +++ b/apps/web/.dockerignore @@ -0,0 +1,4 @@ +.react-router +build +node_modules +README.md \ No newline at end of file diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 0000000..68c5d18 --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 0000000..973038e --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,25 @@ +FROM oven/bun:1 AS dependencies-env +COPY . /app + +FROM dependencies-env AS development-dependencies-env +COPY ./package.json bun.lockb /app/ +WORKDIR /app +RUN bun i --frozen-lockfile + +FROM dependencies-env AS production-dependencies-env +COPY ./package.json bun.lockb /app/ +WORKDIR /app +RUN bun i --production + +FROM dependencies-env AS build-env +COPY ./package.json bun.lockb /app/ +COPY --from=development-dependencies-env /app/node_modules /app/node_modules +WORKDIR /app +RUN bun run build + +FROM dependencies-env +COPY ./package.json bun.lockb /app/ +COPY --from=production-dependencies-env /app/node_modules /app/node_modules +COPY --from=build-env /app/build /app/build +WORKDIR /app +CMD ["bun", "run", "start"] \ No newline at end of file diff --git a/apps/web/README.md b/apps/web/README.md new file mode 100644 index 0000000..f28b6d2 --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,100 @@ +# Welcome to React Router! + +A modern, production-ready template for building full-stack React applications using React Router. + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/remix-run/react-router-templates/tree/main/default) + +## Features + +- 🚀 Server-side rendering +- ⚡️ Hot Module Replacement (HMR) +- 📦 Asset bundling and optimization +- 🔄 Data loading and mutations +- 🔒 TypeScript by default +- 🎉 TailwindCSS for styling +- 📖 [React Router docs](https://reactrouter.com/) + +## Getting Started + +### Installation + +Install the dependencies: + +```bash +npm install +``` + +### Development + +Start the development server with HMR: + +```bash +npm run dev +``` + +Your application will be available at `http://localhost:5173`. + +## Building for Production + +Create a production build: + +```bash +npm run build +``` + +## Deployment + +### Docker Deployment + +This template includes three Dockerfiles optimized for different package managers: + +- `Dockerfile` - for npm +- `Dockerfile.pnpm` - for pnpm +- `Dockerfile.bun` - for bun + +To build and run using Docker: + +```bash +# For npm +docker build -t my-app . + +# For pnpm +docker build -f Dockerfile.pnpm -t my-app . + +# For bun +docker build -f Dockerfile -t my-app . + +# Run the container +docker run -p 3000:3000 my-app +``` + +The containerized application can be deployed to any platform that supports Docker, including: + +- AWS ECS +- Google Cloud Run +- Azure Container Apps +- Digital Ocean App Platform +- Fly.io +- Railway + +### DIY Deployment + +If you're familiar with deploying Node applications, the built-in app server is production-ready. + +Make sure to deploy the output of `npm run build` + +``` +├── package.json +├── package-lock.json (or pnpm-lock.yaml, or bun.lockb) +├── build/ +│ ├── client/ # Static assets +│ └── server/ # Server-side code +``` + +## Styling + +This template comes with [Tailwind CSS](https://tailwindcss.com/) already configured for a simple default starting experience. You can use whatever CSS framework you prefer. + +--- + +Built with ❤️ using React Router. diff --git a/apps/web/app/app.css b/apps/web/app/app.css new file mode 100644 index 0000000..74b0b55 --- /dev/null +++ b/apps/web/app/app.css @@ -0,0 +1,9 @@ +@import "tailwindcss"; + +@layer theme, base, components, utilities; + +@layer theme { + :root { + --font-sans: '"Inter"', ui-sans-serif, system-ui, sans-serif; + } +} diff --git a/apps/web/app/root.tsx b/apps/web/app/root.tsx new file mode 100644 index 0000000..e8b258f --- /dev/null +++ b/apps/web/app/root.tsx @@ -0,0 +1,76 @@ +import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, + isRouteErrorResponse, +} from 'react-router'; + +import type { Route } from './+types/root'; +import stylesheet from './app.css?url'; + +export const links: Route.LinksFunction = () => [ + { rel: 'preconnect', href: 'https://fonts.googleapis.com' }, + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossOrigin: 'anonymous', + }, + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap', + }, + { rel: 'stylesheet', href: stylesheet }, +]; + +export function Layout({ children }: { children: React.ReactNode }) { + return ( + + + + + + + + + {children} + + + + + ); +} + +export default function App() { + return ; +} + +export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) { + let message = 'Oops!'; + let details = 'An unexpected error occurred.'; + let stack: string | undefined; + + if (isRouteErrorResponse(error)) { + message = error.status === 404 ? '404' : 'Error'; + details = + error.status === 404 + ? 'The requested page could not be found.' + : error.statusText || details; + } else if (import.meta.env.DEV && error && error instanceof Error) { + details = error.message; + stack = error.stack; + } + + return ( +
+

{message}

+

{details}

+ {stack && ( +
+          {stack}
+        
+ )} +
+ ); +} diff --git a/apps/web/app/routes.ts b/apps/web/app/routes.ts new file mode 100644 index 0000000..6fb6b54 --- /dev/null +++ b/apps/web/app/routes.ts @@ -0,0 +1,4 @@ +import type { RouteConfig } from '@react-router/dev/routes'; +import { flatRoutes } from '@react-router/fs-routes'; + +export default flatRoutes() satisfies RouteConfig; diff --git a/apps/web/app/routes/_index.tsx b/apps/web/app/routes/_index.tsx new file mode 100644 index 0000000..7d29c16 --- /dev/null +++ b/apps/web/app/routes/_index.tsx @@ -0,0 +1,19 @@ +import { client } from 'index'; +import type { Route } from './+types/_index'; + +export function meta({}: Route.MetaArgs) { + return [ + { title: 'New React Router App' }, + { name: 'description', content: 'Welcome to React Router!' }, + ]; +} + +export async function loader() { + return { + data: await client.get.query(), + }; +} + +export default function Home({ loaderData }: Route.ComponentProps) { + return

{loaderData.data.id}

; +} diff --git a/apps/web/biome.json b/apps/web/biome.json new file mode 100644 index 0000000..bfb166d --- /dev/null +++ b/apps/web/biome.json @@ -0,0 +1,38 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [] + }, + "formatter": { + "enabled": true, + "indentStyle": "space" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "complexity": { + "noForEach": "off" + }, + "correctness": { + "noUnusedVariables": "error", + "noUnusedImports": "error", + "noEmptyPattern": "off" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + } +} diff --git a/apps/web/index.ts b/apps/web/index.ts new file mode 100644 index 0000000..7b96533 --- /dev/null +++ b/apps/web/index.ts @@ -0,0 +1,10 @@ +import { createTRPCProxyClient, httpBatchLink } from '@trpc/client'; +import type { AppRouter } from '../server/src/router'; + +export const client = createTRPCProxyClient({ + links: [ + httpBatchLink({ + url: 'http://localhost:3000/trpc', + }), + ], +}); diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..54b7125 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,41 @@ +{ + "name": "web", + "private": true, + "type": "module", + "scripts": { + "build": "react-router build", + "dev": "react-router dev", + "lint": "bunx biome check --write .", + "start": "react-router-serve ./build/server/index.js", + "test": "bunx playwright test", + "typecheck": "react-router typegen && tsc" + }, + "dependencies": { + "@react-router/fs-routes": "^7.0.2", + "@react-router/node": "^7.0.2", + "@react-router/serve": "^7.0.2", + "@trpc/client": "^11.0.0-rc.660", + "isbot": "^5.1.17", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router": "^7.0.2" + }, + "devDependencies": { + "@babel/preset-typescript": "7.26.0", + "@biomejs/biome": "^1.9.4", + "@playwright/test": "^1.49.0", + "@react-router/dev": "^7.0.2", + "@tailwindcss/vite": "^4.0.0-beta.6", + "@types/node": "^22.10.1", + "@types/react": "^19.0.1", + "@types/react-dom": "^19.0.1", + "babel-plugin-react-compiler": "19.0.0-beta-df7b47d-20241124", + "postcss": "^8.4.49", + "react-router-devtools": "1.0.5", + "tailwindcss": "^4.0.0-beta.6", + "typescript": "^5.7.2", + "vite": "^6.0.3", + "vite-plugin-babel": "1.3.0", + "vite-tsconfig-paths": "^5.1.4" + } +} diff --git a/apps/web/playwright.config.ts b/apps/web/playwright.config.ts new file mode 100644 index 0000000..a0c9512 --- /dev/null +++ b/apps/web/playwright.config.ts @@ -0,0 +1,26 @@ +import { defineConfig, devices } from '@playwright/test'; + +export default defineConfig({ + testDir: './tests', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: 'html', + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://127.0.0.1:5173', + trace: 'on-first-retry', + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + ], + // webServer: { + // command: 'bun dev', + // url: 'http://127.0.0.1:5173', + // reuseExistingServer: !process.env.CI, + // }, +}); diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5dbdfcddcb14182535f6d32d1c900681321b1aa3 GIT binary patch literal 15086 zcmeI33v3ic7{|AFEmuJ-;v>ep_G*NPi6KM`qNryCe1PIJ8siIN1WZ(7qVa)RVtmC% z)Ch?tN+afMKm;5@rvorJk zcXnoOc4q51HBQnQH_jn!cAg&XI1?PlX>Kl^k8qq0;zkha`kY$Fxt#=KNJAE9CMdpW zqr4#g8`nTw191(+H4xW8Tmyru2I^3=J1G3emPxkPXA=3{vvuvse_WWSshqaqls^-m zgB7q8&Vk*aYRe?sn$n53dGH#%3y%^vxv{pL*-h0Z4bmb_(k6{FL7HWIz(V*HT#IcS z-wE{)+0x1U!RUPt3gB97%p}@oHxF4|6S*+Yw=_tLtxZ~`S=z6J?O^AfU>7qOX`JNBbV&8+bO0%@fhQitKIJ^O^ zpgIa__qD_y07t@DFlBJ)8SP_#^j{6jpaXt{U%=dx!qu=4u7^21lWEYHPPY5U3TcoQ zX_7W+lvZi>TapNk_X>k-KO%MC9iZp>1E`N34gHKd9tK&){jq2~7OsJ>!G0FzxQFw6G zm&Vb(2#-T|rM|n3>uAsG_hnbvUKFf3#ay@u4uTzia~NY%XgCHfx4^To4BDU@)HlV? z@EN=g^ymETa1sQK{kRwyE4Ax8?wT&GvaG@ASO}{&a17&^v`y z!oPdiSiia^oov(Z)QhG2&|FgE{M9_4hJROGbnj>#$~ZF$-G^|zPj*QApltKe?;u;uKHJ~-V!=VLkg7Kgct)l7u39f@%VG8e3f$N-B zAu3a4%ZGf)r+jPAYCSLt73m_J3}p>}6Tx0j(wg4vvKhP!DzgiWANiE;Ppvp}P2W@m z-VbYn+NXFF?6ngef5CfY6ZwKnWvNV4z6s^~yMXw2i5mv}jC$6$46g?G|CPAu{W5qF zDobS=zb2ILX9D827g*NtGe5w;>frjanY{f)hrBP_2ehBt1?`~ypvg_Ot4x1V+43P@Ve8>qd)9NX_jWdLo`Zfy zoeam9)@Dpym{4m@+LNxXBPjPKA7{3a&H+~xQvr>C_A;7=JrfK~$M2pCh>|xLz>W6SCs4qC|#V`)# z)0C|?$o>jzh<|-cpf

K7osU{Xp5PG4-K+L2G=)c3f&}H&M3wo7TlO_UJjQ-Oq&_ zjAc9=nNIYz{c3zxOiS5UfcE1}8#iI4@uy;$Q7>}u`j+OU0N<*Ezx$k{x_27+{s2Eg z`^=rhtIzCm!_UcJ?Db~Lh-=_))PT3{Q0{Mwdq;0>ZL%l3+;B&4!&xm#%HYAK|;b456Iv&&f$VQHf` z>$*K9w8T+paVwc7fLfMlhQ4)*zL_SG{~v4QR;IuX-(oRtYAhWOlh`NLoX0k$RUYMi z2Y!bqpdN}wz8q`-%>&Le@q|jFw92ErW-hma-le?S z-@OZt2EEUm4wLsuEMkt4zlyy29_3S50JAcQHTtgTC{P~%-mvCTzrjXOc|{}N`Cz`W zSj7CrXfa7lcsU0J(0uSX6G`54t^7}+OLM0n(|g4waOQ}bd3%!XLh?NX9|8G_|06Ie zD5F1)w5I~!et7lA{G^;uf7aqT`KE&2qx9|~O;s6t!gb`+zVLJyT2T)l*8l(j literal 0 HcmV?d00001 diff --git a/apps/web/react-router.config.ts b/apps/web/react-router.config.ts new file mode 100644 index 0000000..51e8967 --- /dev/null +++ b/apps/web/react-router.config.ts @@ -0,0 +1,5 @@ +import type { Config } from '@react-router/dev/config'; + +export default { + ssr: true, +} satisfies Config; diff --git a/apps/web/tests/index.spec.ts b/apps/web/tests/index.spec.ts new file mode 100644 index 0000000..6ae8caa --- /dev/null +++ b/apps/web/tests/index.spec.ts @@ -0,0 +1,7 @@ +import { expect, test } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('http://localhost:5173'); + + await expect(page.getByRole('heading', { name: '4' })).toBeVisible(); +}); diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..dc391a4 --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,27 @@ +{ + "include": [ + "**/*", + "**/.server/**/*", + "**/.client/**/*", + ".react-router/types/**/*" + ], + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["node", "vite/client"], + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "jsx": "react-jsx", + "rootDirs": [".", "./.react-router/types"], + "baseUrl": ".", + "paths": { + "~/*": ["./app/*"] + }, + "esModuleInterop": true, + "verbatimModuleSyntax": true, + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "strict": true + } +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..f8afbc5 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,23 @@ +import { reactRouter } from '@react-router/dev/vite'; +import tailwindcss from '@tailwindcss/vite'; +import { reactRouterDevTools } from 'react-router-devtools'; +import { defineConfig } from 'vite'; +import babel from 'vite-plugin-babel'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export default defineConfig({ + plugins: [ + tailwindcss(), + babel({ + include: ['./app/**/*'], + filter: (name) => name.endsWith('tsx'), + babelConfig: { + presets: ['@babel/preset-typescript'], + plugins: ['babel-plugin-react-compiler'], + }, + }), + reactRouterDevTools(), + reactRouter(), + tsconfigPaths(), + ], +}); diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..477a628956c8b86afcc3a587c5887c6a67d37753 GIT binary patch literal 217000 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 b@Tx*)d;&QHF`gq&S|2Vwn(A@=AN~7(`=(pi literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 98110e3..4c0e588 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,18 @@ { - "name": "server", + "name": "swipe-move", + "private": true, "scripts": { - "dev": "bun run --hot src/index.ts", - "lint": "bunx biome check --write .", - "test": "bun test", - "types": "tsc --noEmit" - }, - "dependencies": { - "@trpc/server": "^11.0.0-rc.660", - "hono": "^4.6.13", - "uuid": "^11.0.3", - "zod": "^3.23.8" + "build": "turbo build", + "dev": "turbo dev", + "lint": "turbo lint", + "test": "turbo test" }, "devDependencies": { - "@biomejs/biome": "^1.9.4", - "@hono/trpc-server": "0.3.4", - "@types/bun": "latest" - } + "turbo": "^2.3.3", + "typescript": "5.5.4" + }, + "packageManager": "bun@1.1.38", + "workspaces": [ + "apps/*" + ] } diff --git a/turbo.json b/turbo.json new file mode 100644 index 0000000..603669a --- /dev/null +++ b/turbo.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://turbo.build/schema.json", + "ui": "tui", + "tasks": { + "lint": { + "dependsOn": ["^lint"] + }, + "test": { + "dependsOn": ["^test"] + }, + "dev": { + "cache": false, + "persistent": true + } + } +}