95efc23139
Scaffold mirrors tcp-ingestion conventions: ESM, strict TS, pnpm, vitest
with unit/integration split, ESLint flat config with no-floating-promises
+ no-misused-promises + import/no-restricted-paths (the new src/core/ →
src/domain/ boundary that protects Phase 1 from Phase 2 churn).
Core types in src/core/types.ts (Position, StreamRecord, DeviceState,
Metrics, AttributeValue) — Position is byte-equivalent to tcp-ingestion's
output. Codec in src/core/codec.ts implements sentinel reversal:
{__bigint:"..."} → bigint, {__buffer_b64:"..."} → Buffer, ISO timestamp
string → Date. CodecError surfaces malformed payload reasons with the
failing field named.
Config in src/config/load.ts (zod schema, all 13 env vars with defaults
and bounded numerics). Logger in src/observability/logger.ts matches
tcp-ingestion exactly: ISO timestamps, string level labels, pino-pretty
in development.
Postgres in src/db/: createPool with sane defaults and application_name,
connectWithRetry mirroring the ioredis retry pattern, a 30-line
migration runner using a schema_migrations table, and 0001_positions.sql
with the hypertable + (device_id, ts) unique index + ts DESC index.
Migration runner unit-tested against a mocked pg.Pool; the real
TimescaleDB round-trip is deferred to task 1.10 per spec.
Verification: typecheck, lint, build all clean; 73 unit tests passing
across 4 files. import/no-restricted-paths verified live by temporarily
adding a forbidden src/domain/ import.
25 lines
830 B
TypeScript
25 lines
830 B
TypeScript
import { defineConfig } from 'vitest/config';
|
|
|
|
/**
|
|
* Vitest config for integration tests that depend on external services
|
|
* (Docker, real Redis, TimescaleDB, etc.). Run via `pnpm test:integration`.
|
|
* Requires a working Docker daemon — `testcontainers` will spin up the services
|
|
* it needs, then tear them down.
|
|
*
|
|
* NOT run in default CI. Run locally before changes that touch the Redis consumer
|
|
* or Postgres writer, or in a separate CI job that has Docker access.
|
|
*/
|
|
export default defineConfig({
|
|
test: {
|
|
include: ['test/**/*.integration.test.ts'],
|
|
environment: 'node',
|
|
// Container startup can be slow on first run (image pull, ryuk
|
|
// container, etc). Allow generous hook + test timeouts.
|
|
hookTimeout: 120_000,
|
|
testTimeout: 60_000,
|
|
},
|
|
resolve: {
|
|
extensions: ['.ts', '.js'],
|
|
},
|
|
});
|