- Add vitest as dev dep (pnpm add -D vitest), create vitest.config.ts with globals:true and setupFiles - Migrate digest-template, normalize-relay-url, reschedule-on-frequency-change, and event-arrival-race from raw JS + hand-rolled asserts to vitest describe/it/expect, as .test.ts (port all assertions without weakening) - Create test/setup.ts with env vars needed by env.ts/mailer.ts - DELETE test/web-ui.test.js: dead test for removed web UI (PR #1) - package.json: add test:unit script (vitest run), keep test = bash E2E - script/checks: add pnpm test:unit after build - README: document pnpm test:unit / pnpm test
70 lines
2 KiB
JSON
70 lines
2 KiB
JSON
{
|
|
"name": "mailship",
|
|
"type": "module",
|
|
"version": "1.0.0",
|
|
"scripts": {
|
|
"build": "tsc && pnpm run build:html",
|
|
"build:html": "cp -r src/pages dist/ && cp -r src/emails dist/",
|
|
"check": "tsc --noEmit && eslint src",
|
|
"format": "prettier --write \"src/**/*.{ts,js,json,html}\"",
|
|
"start": "node dist/index.js",
|
|
"preview:digest": "node script/render-preview.mjs",
|
|
"run-alert": "node dist/run.js",
|
|
"test": "bash test/integration.sh",
|
|
"test:unit": "vitest run",
|
|
"test:server": "bash test/integration.sh --server-only"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^9.35.0",
|
|
"@types/better-sqlite3": "^7.6.13",
|
|
"@types/express": "^5.0.3",
|
|
"@types/express-ws": "^3.0.5",
|
|
"@types/mjml": "^4.7.4",
|
|
"@types/mustache": "^4.2.6",
|
|
"@types/nodemailer": "^8.0.1",
|
|
"@types/sanitize-html": "^2.16.0",
|
|
"@types/ws": "^8.18.1",
|
|
"@typescript-eslint/eslint-plugin": "^8.43.0",
|
|
"@typescript-eslint/parser": "^8.43.0",
|
|
"eslint": "^9.35.0",
|
|
"globals": "^15.15.0",
|
|
"onchange": "^7.1.0",
|
|
"prettier": "^3.6.2",
|
|
"typescript": "^5.9.2",
|
|
"vitest": "^5.0.0"
|
|
},
|
|
"dependencies": {
|
|
"@types/node": "^22.18.1",
|
|
"@welshman/content": "^0.6.3",
|
|
"@welshman/feeds": "^0.6.3",
|
|
"@welshman/lib": "^0.6.3",
|
|
"@welshman/net": "^0.6.3",
|
|
"@welshman/router": "^0.6.3",
|
|
"@welshman/signer": "^0.6.3",
|
|
"@welshman/store": "^0.6.3",
|
|
"@welshman/util": "^0.6.3",
|
|
"bcrypt": "^5.1.1",
|
|
"cron": "^4.3.3",
|
|
"cron-parser": "^5.3.1",
|
|
"dotenv": "^16.6.1",
|
|
"express": "^4.21.2",
|
|
"express-rate-limit": "^7.5.1",
|
|
"express-ws": "^5.0.2",
|
|
"localstorage-polyfill": "^1.0.1",
|
|
"mjml": "^4.15.3",
|
|
"mustache": "^4.2.0",
|
|
"nodemailer": "^6.10.1",
|
|
"nostr-tools": "^2.16.2",
|
|
"sanitize-html": "^2.17.0",
|
|
"sqlite3": "^5.1.7",
|
|
"succinct-async": "^1.0.4",
|
|
"ts-node-dev": "^2.0.0",
|
|
"ws": "^8.18.3"
|
|
},
|
|
"pnpm": {
|
|
"onlyBuiltDependencies": [
|
|
"bcrypt",
|
|
"sqlite3"
|
|
]
|
|
}
|
|
}
|