Phase 1 / commit 1 of 14 — installs deps and lays down the brand-kit
primitives used by every internal-only PDF. No callers wired yet.
Adds:
@react-pdf/renderer 4.5.1 one engine for internal exports
unpdf 1.6.2 reserved for berth-PDF parser tier-2
react-image-crop 11.0.10 admin logo crop UI (commit 2)
svgo 4.0.1 SVG sanitization on logo upload (commit 2)
brand-kit/
tokens.ts single source of truth for colors/fonts/spacing
logo.ts resolvePortLogo() — cached, soft-fallback
DocumentShell <Document><Page> + fixed Header + fixed Footer
Header dark band, logo slot (letterboxed) + text fallback
Footer page N of M + generated-at + confidential tag
Section heading + bottom border
KeyValueGrid 2-col (default) or stacked label/value
DataTable zebra rows + sticky header + totals row + empty state
Badge 5 tone pills
charts/
BarChart pure SVG, 4-tick y-axis, optional value labels
LineChart pure SVG, line + markers + grid
PieChart pure SVG, donut-or-pie + side legend
FunnelChart pure SVG, slope-cut slices for pipeline stages
render.ts renderToBuffer + renderToStream wrappers, typed
svg-primitives.tsx <SvgLabel> wraps react-pdf SVG <Text> to bridge
missing TS declarations for fontSize/fontFamily
Smoke test renders a kitchen-sink Document including every primitive
and every chart, plus an empty-data path. 1293+4 vitest tests green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { defineConfig } from 'vitest/config';
|
|
import react from '@vitejs/plugin-react';
|
|
import path from 'path';
|
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
const { loadEnv } = require('vite');
|
|
|
|
export default defineConfig({
|
|
// Next.js tsconfig sets jsx: 'preserve' so .tsx files imported by
|
|
// tests (e.g. react-email templates) aren't transformed by vite's
|
|
// default loader. The official react plugin handles the JSX
|
|
// transform in test-time only — Next's runtime keeps its preserve
|
|
// setting for the prod build.
|
|
plugins: [react()],
|
|
test: {
|
|
globals: true,
|
|
environment: 'node',
|
|
include: [
|
|
'tests/unit/**/*.test.ts',
|
|
'tests/unit/**/*.test.tsx',
|
|
'tests/integration/**/*.test.ts',
|
|
'tests/integration/**/*.test.tsx',
|
|
],
|
|
exclude: ['tests/e2e/**', 'node_modules/**'],
|
|
pool: 'forks',
|
|
globalSetup: ['./tests/global-setup.ts'],
|
|
coverage: {
|
|
provider: 'v8',
|
|
reporter: ['text', 'lcov', 'json-summary'],
|
|
include: ['src/lib/**'],
|
|
exclude: ['src/lib/db/migrations/**', 'src/lib/db/schema/**', 'src/**/*.d.ts'],
|
|
},
|
|
testTimeout: 30_000,
|
|
env: loadEnv('test', process.cwd(), ''),
|
|
},
|
|
resolve: {
|
|
alias: { '@': path.resolve(__dirname, './src') },
|
|
},
|
|
});
|