feat(hq): app skeleton with health endpoint (HQ-1 task 1)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
feat/client-detail-redesign
Thomas Joise 2 weeks ago
parent 5c3c13c9d3
commit d17726941f

@ -0,0 +1,25 @@
{
"name": "@sims/hq",
"version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
"build": "node build-server.mjs",
"start": "npm run build && node dist/server.cjs",
"typecheck": "tsc -p tsconfig.json"
},
"dependencies": {
"@sims/auth": "*",
"@sims/billing-engine": "*",
"@sims/domain": "*",
"better-sqlite3": "^11.7.0",
"express": "^4.21.0",
"puppeteer": "^23.11.0"
},
"devDependencies": {
"@types/better-sqlite3": "^7.6.11",
"@types/express": "^4.17.21",
"esbuild": "^0.25.0",
"tsx": "^4.19.0"
}
}

@ -0,0 +1,10 @@
import { Router } from 'express'
import type { DB } from './db'
export function apiRouter(_db: DB | null): Router {
const r = Router()
r.get('/health', (_req, res) => {
res.json({ ok: true, service: 'sims-hq', version: '0.1.0' })
})
return r
}

@ -0,0 +1,17 @@
import express from 'express'
import type http from 'node:http'
import { apiRouter } from './api'
export function startServer(port: number): http.Server {
const app = express()
app.use(express.json({ limit: '2mb' }))
app.use('/api', apiRouter(null))
return app.listen(port)
}
// Direct launch (bundled dist/server.cjs); vitest imports startServer instead.
if (process.argv[1]?.endsWith('server.cjs') || process.argv[1]?.endsWith('server.ts')) {
const PORT = Number(process.env['HQ_PORT'] ?? 5182)
startServer(PORT)
console.log(`SiMS HQ console on http://localhost:${PORT}`)
}

@ -0,0 +1,14 @@
import { describe, it, expect, afterAll } from 'vitest'
import { startServer } from '../src/server'
const server = startServer(0)
const base = () => `http://localhost:${(server.address() as { port: number }).port}`
describe('hq health', () => {
afterAll(() => server.close())
it('answers /api/health', async () => {
const res = await fetch(`${base()}/api/health`)
expect(res.status).toBe(200)
expect(await res.json()).toMatchObject({ ok: true, service: 'sims-hq' })
})
})

@ -0,0 +1,4 @@
{
"extends": "../../tsconfig.base.json",
"include": ["src/**/*"]
}

7166
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,21 @@
import { defineConfig } from 'vitest/config'
import { fileURLToPath } from 'node:url'
const p = (rel: string) => fileURLToPath(new URL(rel, import.meta.url))
export default defineConfig({
resolve: {
alias: {
'@sims/domain': p('./packages/domain/src/index.ts'),
'@sims/billing-engine': p('./packages/billing-engine/src/index.ts'),
'@sims/config': p('./packages/config/src/index.ts'),
'@sims/auth': p('./packages/auth/src/index.ts'),
'@sims/scanning': p('./packages/scanning/src/index.ts'),
'@sims/search-core': p('./packages/search-core/src/index.ts'),
'@sims/printing': p('./packages/printing/src/index.ts'),
},
},
test: {
include: ['packages/*/test/**/*.test.ts', 'apps/*/test/**/*.test.ts'],
},
})
Loading…
Cancel
Save