`pnpm doctor` and `startApi` each read their own subset of the same environment variables, and the subsets had drifted. Doctor never read `S3_*` or module secrets at all, so a correctly configured installation was told its object storage was "not configured" and every module requiring a bucket or a secret was reported blocked -- while the runtime, from the identical environment, bound those buckets and ran the modules. Both executables now map the environment through one `loadHostConfiguration(env)` in Core, which takes the environment as an argument and never reads `process.env` itself. Validation stays with the existing per-domain validators, so each caller keeps its own failure behaviour: startup refuses a rejected value, Doctor reports it as a sanitized code. Doctor's storage option becomes raw input like its mail option, so a half-configured provider is reported as a blocking configuration failure instead of throwing before a report exists. The outbound-email check -- computed, counted toward the result, but absent from every rendered section -- is now printed, and the rendered set is asserted against a real report so a future check cannot go missing the same way. Co-Authored-By: Claude Opus 5 <[email protected]>
92 lines
2.5 KiB
JSON
92 lines
2.5 KiB
JSON
{
|
|
"name": "@ekklesia/core",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"files": [
|
|
"dist"
|
|
],
|
|
"exports": {
|
|
".": {
|
|
"types": "./dist/index.d.ts",
|
|
"import": "./dist/index.js"
|
|
},
|
|
"./modules": {
|
|
"types": "./dist/modules/index.d.ts",
|
|
"import": "./dist/modules/index.js"
|
|
},
|
|
"./storage": {
|
|
"types": "./dist/storage/index.d.ts",
|
|
"import": "./dist/storage/index.js"
|
|
},
|
|
"./dashboard": {
|
|
"types": "./dist/dashboard/index.d.ts",
|
|
"import": "./dist/dashboard/index.js"
|
|
},
|
|
"./migrations": {
|
|
"types": "./dist/migrations/index.d.ts",
|
|
"import": "./dist/migrations/index.js"
|
|
},
|
|
"./diagnostics": {
|
|
"types": "./dist/diagnostics/index.d.ts",
|
|
"import": "./dist/diagnostics/index.js"
|
|
},
|
|
"./identity": {
|
|
"types": "./dist/identity/index.d.ts",
|
|
"import": "./dist/identity/index.js"
|
|
},
|
|
"./authorization": {
|
|
"types": "./dist/authorization/index.d.ts",
|
|
"import": "./dist/authorization/index.js"
|
|
},
|
|
"./database": {
|
|
"types": "./dist/database/index.d.ts",
|
|
"import": "./dist/database/index.js"
|
|
},
|
|
"./devices": {
|
|
"types": "./dist/devices/index.d.ts",
|
|
"import": "./dist/devices/index.js"
|
|
},
|
|
"./mail": {
|
|
"types": "./dist/mail/index.d.ts",
|
|
"import": "./dist/mail/index.js"
|
|
},
|
|
"./host": {
|
|
"types": "./dist/host/index.d.ts",
|
|
"import": "./dist/host/index.js"
|
|
}
|
|
},
|
|
"scripts": {
|
|
"build": "tsc --project tsconfig.build.json",
|
|
"identity:migration:generate": "drizzle-kit generate --config=drizzle.config.ts",
|
|
"identity:schema:generate": "auth generate --config=identity-schema-generator.config.ts --output=.identity-schema-reference.ts -y",
|
|
"lint": "biome lint .",
|
|
"test": "vitest run",
|
|
"typecheck": "tsc --noEmit --project tsconfig.json"
|
|
},
|
|
"dependencies": {
|
|
"@aws-sdk/client-s3": "3.1116.0",
|
|
"@aws-sdk/s3-request-presigner": "3.1116.0",
|
|
"@ekklesia/contracts": "workspace:*",
|
|
"better-auth": "1.6.23",
|
|
"drizzle-orm": "0.45.2",
|
|
"nodemailer": "9.0.5",
|
|
"pg": "8.22.0"
|
|
},
|
|
"devDependencies": {
|
|
"@biomejs/biome": "2.5.3",
|
|
"@types/node": "24.13.3",
|
|
"@types/nodemailer": "8.0.1",
|
|
"@types/pg": "8.20.0",
|
|
"@types/smtp-server": "3.5.13",
|
|
"auth": "1.6.23",
|
|
"drizzle-kit": "0.31.10",
|
|
"smtp-server": "3.19.3",
|
|
"typescript": "7.0.2",
|
|
"vitest": "4.1.10"
|
|
},
|
|
"ekklesia": {
|
|
"layer": "core"
|
|
}
|
|
}
|