chore: migrate to pnpm workspaces monorepo with Turborepo

- Restructure directories: apps/api, apps/admin, apps/website
- Add root pnpm-workspace.yaml, turbo.json, .prettierrc, .gitignore
- Rename packages to @inkreach/api, @inkreach/admin, @inkreach/website
- Add shared packages: packages/tsconfig, packages/shared-types
- Add pnpm.onlyBuiltDependencies for native builds
- Update docs: README.md, structs.md
- All three projects build successfully
This commit is contained in:
yeuimu
2026-07-11 16:54:05 +08:00
parent 69945b8749
commit 7e04877bb6
155 changed files with 20134 additions and 14393 deletions
+14
View File
@@ -0,0 +1,14 @@
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
/**
* Global Prisma module exporting {@link PrismaService}.
*
* Marked `@Global()` so feature modules do not need to import it again.
*/
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
@@ -0,0 +1,31 @@
import { PrismaService } from './prisma.service';
import { Test } from '@nestjs/testing';
describe('PrismaService', () => {
let service: PrismaService;
beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
providers: [PrismaService],
}).compile();
service = moduleRef.get(PrismaService);
await service.onModuleInit();
});
afterAll(async () => {
await service.onModuleDestroy();
});
it('should be defined', () => {
expect(service).toBeDefined();
});
it('should be able to run a trivial query against the database', async () => {
// Execute a raw query that does not depend on application tables
const result = await service.$queryRaw<Array<{ now: Date }>>`SELECT now() AS now`;
expect(Array.isArray(result)).toBe(true);
expect(result.length).toBe(1);
expect(result[0].now).toBeInstanceOf(Date);
});
});
+20
View File
@@ -0,0 +1,20 @@
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
/**
* Global Prisma client wrapper.
*
* - `onModuleInit`: connects to the database so the first request
* does not pay the connection cost.
* - `onModuleDestroy`: cleanly disconnects during shutdown.
*/
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async onModuleInit(): Promise<void> {
await this.$connect();
}
async onModuleDestroy(): Promise<void> {
await this.$disconnect();
}
}