feat: scaffold monorepo with shared types and NestJS server

- pnpm workspace with packages/app, packages/server, packages/shared
- @mp-pilates/shared: enums, constants, TypeScript interfaces for all 8 data models
- @mp-pilates/server: NestJS bootstrap with health check, validation pipe, CORS
- Base TypeScript config with strict mode
This commit is contained in:
richarjiang
2026-04-02 11:37:35 +08:00
parent 05337944d8
commit 90b54d1138
31 changed files with 7437 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
# Database
DATABASE_URL=postgresql://user:pass@localhost:5432/mp_pilates
# JWT
JWT_SECRET=change-me-to-a-secure-random-string
# WeChat Mini Program
WX_APPID=your-appid
WX_SECRET=your-secret
# WeChat Pay
WX_MCH_ID=your-mch-id
WX_MCH_KEY=your-mch-key
WX_MCH_SERIAL_NO=your-serial-no
WX_MCH_CERT_PATH=./certs/apiclient_cert.pem
WX_MCH_KEY_PATH=./certs/apiclient_key.pem
# Server
PORT=3000

View File

@@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true
}
}

View File

@@ -0,0 +1,64 @@
{
"name": "@mp-pilates/server",
"version": "0.1.0",
"private": true,
"scripts": {
"build": "nest build",
"dev": "nest start --watch",
"start": "nest start",
"start:prod": "node dist/main",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"prisma:generate": "prisma generate",
"prisma:migrate": "prisma migrate dev",
"prisma:seed": "ts-node prisma/seed.ts",
"lint": "eslint \"{src,test}/**/*.ts\""
},
"dependencies": {
"@mp-pilates/shared": "workspace:*",
"@nestjs/common": "^10.4.0",
"@nestjs/config": "^3.2.0",
"@nestjs/core": "^10.4.0",
"@nestjs/jwt": "^10.2.0",
"@nestjs/passport": "^10.0.3",
"@nestjs/platform-express": "^10.4.0",
"@nestjs/schedule": "^4.1.0",
"@prisma/client": "^5.19.0",
"class-transformer": "^0.5.1",
"class-validator": "^0.14.1",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1"
},
"devDependencies": {
"@nestjs/cli": "^10.4.0",
"@nestjs/schematics": "^10.1.0",
"@nestjs/testing": "^10.4.0",
"@types/express": "^4.17.21",
"@types/jest": "^29.5.12",
"@types/passport-jwt": "^4.0.1",
"jest": "^29.7.0",
"prisma": "^5.19.0",
"source-map-support": "^0.5.21",
"supertest": "^7.0.0",
"ts-jest": "^29.2.0",
"ts-node": "^10.9.2",
"typescript": "^5.4.0"
},
"jest": {
"moduleFileExtensions": ["js", "json", "ts"],
"rootDir": "src",
"testRegex": ".*\\.spec\\.ts$",
"transform": {
"^.+\\.(t|j)s$": "ts-jest"
},
"collectCoverageFrom": ["**/*.(t|j)s", "!**/*.module.ts", "!main.ts"],
"coverageDirectory": "../coverage",
"testEnvironment": "node",
"moduleNameMapper": {
"^@mp-pilates/shared(.*)$": "<rootDir>/../../shared/src$1"
}
}
}

View File

@@ -0,0 +1,9 @@
import { Controller, Get } from '@nestjs/common'
@Controller()
export class AppController {
@Get('health')
health() {
return { status: 'ok', timestamp: new Date().toISOString() }
}
}

View File

@@ -0,0 +1,14 @@
import { Module } from '@nestjs/common'
import { ConfigModule } from '@nestjs/config'
import { AppController } from './app.controller'
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: ['.env.local', '.env'],
}),
],
controllers: [AppController],
})
export class AppModule {}

View File

@@ -0,0 +1,24 @@
import { NestFactory } from '@nestjs/core'
import { ValidationPipe } from '@nestjs/common'
import { ConfigService } from '@nestjs/config'
import { AppModule } from './app.module'
async function bootstrap() {
const app = await NestFactory.create(AppModule)
const configService = app.get(ConfigService)
app.setGlobalPrefix('api')
app.useGlobalPipes(
new ValidationPipe({
whitelist: true,
forbidNonWhitelisted: true,
transform: true,
}),
)
app.enableCors()
const port = configService.get<number>('PORT', 3000)
await app.listen(port)
console.log(`Server running on http://localhost:${port}`)
}
bootstrap()

View File

@@ -0,0 +1,7 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "dist"
},
"exclude": ["node_modules", "dist", "test", "**/*.spec.ts"]
}

View File

@@ -0,0 +1,18 @@
{
"extends": "../../tsconfig.base.json",
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
"module": "CommonJS",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "ES2021",
"sourceMap": true,
"incremental": true,
"declaration": false,
"declarationMap": false
},
"include": ["src"],
"exclude": ["node_modules", "dist", "test"]
}