Add project scaffolding and infrastructure config
pnpm monorepo with shared packages, server, and UI workspaces. Includes Docker multi-stage build, Postgres compose, and root TypeScript/Vitest config. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
3
.env.example
Normal file
3
.env.example
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
DATABASE_URL=postgres://paperclip:paperclip@localhost:5432/paperclip
|
||||||
|
PORT=3100
|
||||||
|
SERVE_UI=false
|
||||||
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
.env
|
||||||
|
*.tsbuildinfo
|
||||||
|
drizzle/meta/
|
||||||
|
.vite/
|
||||||
|
coverage/
|
||||||
|
.DS_Store
|
||||||
38
Dockerfile
Normal file
38
Dockerfile
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
FROM node:20-alpine AS base
|
||||||
|
RUN corepack enable
|
||||||
|
|
||||||
|
FROM base AS deps
|
||||||
|
WORKDIR /app
|
||||||
|
COPY package.json pnpm-workspace.yaml pnpm-lock.yaml .npmrc ./
|
||||||
|
COPY packages/shared/package.json packages/shared/
|
||||||
|
COPY packages/db/package.json packages/db/
|
||||||
|
COPY server/package.json server/
|
||||||
|
COPY ui/package.json ui/
|
||||||
|
RUN pnpm install --frozen-lockfile
|
||||||
|
|
||||||
|
FROM base AS build
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=deps /app/node_modules node_modules
|
||||||
|
COPY --from=deps /app/packages/shared/node_modules packages/shared/node_modules
|
||||||
|
COPY --from=deps /app/packages/db/node_modules packages/db/node_modules
|
||||||
|
COPY --from=deps /app/server/node_modules server/node_modules
|
||||||
|
COPY --from=deps /app/ui/node_modules ui/node_modules
|
||||||
|
COPY . .
|
||||||
|
RUN pnpm --filter @paperclip/ui build
|
||||||
|
RUN pnpm --filter @paperclip/server build
|
||||||
|
|
||||||
|
FROM base AS production
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=deps /app/node_modules node_modules
|
||||||
|
COPY --from=deps /app/packages/shared/node_modules packages/shared/node_modules
|
||||||
|
COPY --from=deps /app/packages/db/node_modules packages/db/node_modules
|
||||||
|
COPY --from=deps /app/server/node_modules server/node_modules
|
||||||
|
COPY --from=build /app/packages/shared packages/shared
|
||||||
|
COPY --from=build /app/packages/db packages/db
|
||||||
|
COPY --from=build /app/server/dist server/dist
|
||||||
|
COPY --from=build /app/server/package.json server/package.json
|
||||||
|
COPY --from=build /app/ui/dist ui/dist
|
||||||
|
COPY package.json pnpm-workspace.yaml ./
|
||||||
|
|
||||||
|
EXPOSE 3100
|
||||||
|
CMD ["node", "server/dist/index.js"]
|
||||||
25
docker-compose.yml
Normal file
25
docker-compose.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:17-alpine
|
||||||
|
environment:
|
||||||
|
POSTGRES_USER: paperclip
|
||||||
|
POSTGRES_PASSWORD: paperclip
|
||||||
|
POSTGRES_DB: paperclip
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
server:
|
||||||
|
build: .
|
||||||
|
ports:
|
||||||
|
- "3100:3100"
|
||||||
|
environment:
|
||||||
|
DATABASE_URL: postgres://paperclip:paperclip@db:5432/paperclip
|
||||||
|
PORT: "3100"
|
||||||
|
SERVE_UI: "true"
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
24
package.json
Normal file
24
package.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"name": "paperclip",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "pnpm run --parallel dev:server dev:ui",
|
||||||
|
"dev:server": "pnpm --filter @paperclip/server dev",
|
||||||
|
"dev:ui": "pnpm --filter @paperclip/ui dev",
|
||||||
|
"build": "pnpm -r build",
|
||||||
|
"typecheck": "pnpm -r typecheck",
|
||||||
|
"test": "vitest",
|
||||||
|
"test:run": "vitest run",
|
||||||
|
"db:generate": "pnpm --filter @paperclip/db generate",
|
||||||
|
"db:migrate": "pnpm --filter @paperclip/db migrate"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^5.7.3",
|
||||||
|
"vitest": "^3.0.5"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20"
|
||||||
|
},
|
||||||
|
"packageManager": "pnpm@9.15.4"
|
||||||
|
}
|
||||||
3845
pnpm-lock.yaml
generated
Normal file
3845
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
4
pnpm-workspace.yaml
Normal file
4
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
packages:
|
||||||
|
- packages/*
|
||||||
|
- server
|
||||||
|
- ui
|
||||||
18
tsconfig.json
Normal file
18
tsconfig.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2023",
|
||||||
|
"module": "NodeNext",
|
||||||
|
"moduleResolution": "NodeNext",
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"strict": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "dist",
|
||||||
|
"rootDir": "src",
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"isolatedModules": true
|
||||||
|
}
|
||||||
|
}
|
||||||
7
vitest.config.ts
Normal file
7
vitest.config.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { defineConfig } from "vitest/config";
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
test: {
|
||||||
|
projects: ["packages/db", "server", "ui"],
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user