@kelpie/server 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/index.d.ts +17 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/actor.d.ts +9 -1
- package/dist/lib/actor.d.ts.map +1 -1
- package/dist/lib/actor.js +13 -0
- package/dist/lib/actor.js.map +1 -1
- package/dist/lib/config.d.ts +44 -6
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +9 -5
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/email.d.ts +15 -63
- package/dist/lib/email.d.ts.map +1 -1
- package/dist/lib/email.js +13 -65
- package/dist/lib/email.js.map +1 -1
- package/dist/lib/fromEnv.d.ts +60 -0
- package/dist/lib/fromEnv.d.ts.map +1 -0
- package/dist/lib/fromEnv.js +94 -0
- package/dist/lib/fromEnv.js.map +1 -0
- package/dist/lib/ids.d.ts +6 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +6 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/lib/kelpieConfigFile.d.ts +123 -0
- package/dist/lib/kelpieConfigFile.d.ts.map +1 -0
- package/dist/lib/kelpieConfigFile.js +111 -0
- package/dist/lib/kelpieConfigFile.js.map +1 -0
- package/dist/lib/logger.d.ts +38 -7
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +58 -20
- package/dist/lib/logger.js.map +1 -1
- package/dist/modules/agent-tasks/index.d.ts.map +1 -1
- package/dist/modules/agent-tasks/index.js +4 -1
- package/dist/modules/agent-tasks/index.js.map +1 -1
- package/dist/modules/agent-tasks/prompt.d.ts +36 -6
- package/dist/modules/agent-tasks/prompt.d.ts.map +1 -1
- package/dist/modules/agent-tasks/prompt.js +33 -4
- package/dist/modules/agent-tasks/prompt.js.map +1 -1
- package/dist/modules/agent-tasks/service.d.ts.map +1 -1
- package/dist/modules/agent-tasks/service.js +3 -2
- package/dist/modules/agent-tasks/service.js.map +1 -1
- package/dist/modules/agent-tasks/wire.d.ts +11 -0
- package/dist/modules/agent-tasks/wire.d.ts.map +1 -1
- package/dist/modules/agent-tasks/wire.js +1 -0
- package/dist/modules/agent-tasks/wire.js.map +1 -1
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/auth/index.js +8 -7
- package/dist/modules/auth/index.js.map +1 -1
- package/dist/modules/companies/events.d.ts +22 -0
- package/dist/modules/companies/events.d.ts.map +1 -0
- package/dist/modules/companies/events.js +8 -0
- package/dist/modules/companies/events.js.map +1 -0
- package/dist/modules/companies/index.d.ts.map +1 -1
- package/dist/modules/companies/index.js +2 -0
- package/dist/modules/companies/index.js.map +1 -1
- package/dist/modules/companies/service.d.ts +1 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +8 -11
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +4 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/deals/events.d.ts +31 -0
- package/dist/modules/deals/events.d.ts.map +1 -0
- package/dist/modules/deals/events.js +12 -0
- package/dist/modules/deals/events.js.map +1 -0
- package/dist/modules/deals/index.d.ts.map +1 -1
- package/dist/modules/deals/index.js +2 -0
- package/dist/modules/deals/index.js.map +1 -1
- package/dist/modules/deals/service.d.ts +1 -0
- package/dist/modules/deals/service.d.ts.map +1 -1
- package/dist/modules/deals/service.js +9 -18
- package/dist/modules/deals/service.js.map +1 -1
- package/dist/modules/decisions/events.d.ts +21 -0
- package/dist/modules/decisions/events.d.ts.map +1 -0
- package/dist/modules/decisions/events.js +11 -0
- package/dist/modules/decisions/events.js.map +1 -0
- package/dist/modules/decisions/index.d.ts.map +1 -1
- package/dist/modules/decisions/index.js +2 -0
- package/dist/modules/decisions/index.js.map +1 -1
- package/dist/modules/decisions/service.d.ts +1 -0
- package/dist/modules/decisions/service.d.ts.map +1 -1
- package/dist/modules/decisions/service.js +4 -7
- package/dist/modules/decisions/service.js.map +1 -1
- package/dist/modules/forms/events.d.ts +37 -0
- package/dist/modules/forms/events.d.ts.map +1 -0
- package/dist/modules/forms/events.js +15 -0
- package/dist/modules/forms/events.js.map +1 -0
- package/dist/modules/forms/index.d.ts.map +1 -1
- package/dist/modules/forms/index.js +2 -0
- package/dist/modules/forms/index.js.map +1 -1
- package/dist/modules/forms/service.d.ts +1 -0
- package/dist/modules/forms/service.d.ts.map +1 -1
- package/dist/modules/forms/service.js +8 -11
- package/dist/modules/forms/service.js.map +1 -1
- package/dist/modules/forms/submission.d.ts +5 -0
- package/dist/modules/forms/submission.d.ts.map +1 -1
- package/dist/modules/forms/submission.js +54 -28
- package/dist/modules/forms/submission.js.map +1 -1
- package/dist/modules/handbook/events.d.ts +28 -0
- package/dist/modules/handbook/events.d.ts.map +1 -0
- package/dist/modules/handbook/events.js +14 -0
- package/dist/modules/handbook/events.js.map +1 -0
- package/dist/modules/handbook/index.d.ts.map +1 -1
- package/dist/modules/handbook/index.js +2 -0
- package/dist/modules/handbook/index.js.map +1 -1
- package/dist/modules/handbook/service.d.ts +1 -0
- package/dist/modules/handbook/service.d.ts.map +1 -1
- package/dist/modules/handbook/service.js +8 -15
- package/dist/modules/handbook/service.js.map +1 -1
- package/dist/modules/hiring/candidates.d.ts +1 -0
- package/dist/modules/hiring/candidates.d.ts.map +1 -1
- package/dist/modules/hiring/candidates.js +8 -11
- package/dist/modules/hiring/candidates.js.map +1 -1
- package/dist/modules/hiring/events.d.ts +35 -0
- package/dist/modules/hiring/events.d.ts.map +1 -0
- package/dist/modules/hiring/events.js +11 -0
- package/dist/modules/hiring/events.js.map +1 -0
- package/dist/modules/hiring/index.d.ts.map +1 -1
- package/dist/modules/hiring/index.js +2 -0
- package/dist/modules/hiring/index.js.map +1 -1
- package/dist/modules/hiring/roles.d.ts +1 -0
- package/dist/modules/hiring/roles.d.ts.map +1 -1
- package/dist/modules/hiring/roles.js +8 -11
- package/dist/modules/hiring/roles.js.map +1 -1
- package/dist/modules/import-export/events.d.ts +22 -0
- package/dist/modules/import-export/events.d.ts.map +1 -0
- package/dist/modules/import-export/events.js +12 -0
- package/dist/modules/import-export/events.js.map +1 -0
- package/dist/modules/import-export/index.d.ts.map +1 -1
- package/dist/modules/import-export/index.js +2 -0
- package/dist/modules/import-export/index.js.map +1 -1
- package/dist/modules/import-export/service.d.ts +5 -0
- package/dist/modules/import-export/service.d.ts.map +1 -1
- package/dist/modules/import-export/service.js +53 -14
- package/dist/modules/import-export/service.js.map +1 -1
- package/dist/modules/notes/events.d.ts +22 -0
- package/dist/modules/notes/events.d.ts.map +1 -0
- package/dist/modules/notes/events.js +12 -0
- package/dist/modules/notes/events.js.map +1 -0
- package/dist/modules/notes/index.d.ts.map +1 -1
- package/dist/modules/notes/index.js +2 -0
- package/dist/modules/notes/index.js.map +1 -1
- package/dist/modules/notes/service.d.ts +1 -0
- package/dist/modules/notes/service.d.ts.map +1 -1
- package/dist/modules/notes/service.js +4 -7
- package/dist/modules/notes/service.js.map +1 -1
- package/dist/modules/opportunities/events.d.ts +31 -0
- package/dist/modules/opportunities/events.d.ts.map +1 -0
- package/dist/modules/opportunities/events.js +12 -0
- package/dist/modules/opportunities/events.js.map +1 -0
- package/dist/modules/opportunities/index.d.ts.map +1 -1
- package/dist/modules/opportunities/index.js +2 -0
- package/dist/modules/opportunities/index.js.map +1 -1
- package/dist/modules/opportunities/service.d.ts +1 -0
- package/dist/modules/opportunities/service.d.ts.map +1 -1
- package/dist/modules/opportunities/service.js +9 -18
- package/dist/modules/opportunities/service.js.map +1 -1
- package/dist/modules/partnerships/events.d.ts +31 -0
- package/dist/modules/partnerships/events.d.ts.map +1 -0
- package/dist/modules/partnerships/events.js +12 -0
- package/dist/modules/partnerships/events.js.map +1 -0
- package/dist/modules/partnerships/index.d.ts.map +1 -1
- package/dist/modules/partnerships/index.js +2 -0
- package/dist/modules/partnerships/index.js.map +1 -1
- package/dist/modules/partnerships/service.d.ts +1 -0
- package/dist/modules/partnerships/service.d.ts.map +1 -1
- package/dist/modules/partnerships/service.js +9 -18
- package/dist/modules/partnerships/service.js.map +1 -1
- package/dist/modules/people/events.d.ts +28 -0
- package/dist/modules/people/events.d.ts.map +1 -0
- package/dist/modules/people/events.js +18 -0
- package/dist/modules/people/events.js.map +1 -0
- package/dist/modules/people/index.d.ts.map +1 -1
- package/dist/modules/people/index.js +2 -0
- package/dist/modules/people/index.js.map +1 -1
- package/dist/modules/people/service.d.ts +1 -0
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +8 -11
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/pipelines/service.d.ts +4 -0
- package/dist/modules/pipelines/service.d.ts.map +1 -1
- package/dist/modules/pipelines/service.js +31 -8
- package/dist/modules/pipelines/service.js.map +1 -1
- package/dist/modules/plans/events.d.ts +21 -0
- package/dist/modules/plans/events.d.ts.map +1 -0
- package/dist/modules/plans/events.js +11 -0
- package/dist/modules/plans/events.js.map +1 -0
- package/dist/modules/plans/index.d.ts.map +1 -1
- package/dist/modules/plans/index.js +2 -0
- package/dist/modules/plans/index.js.map +1 -1
- package/dist/modules/plans/service.d.ts +1 -0
- package/dist/modules/plans/service.d.ts.map +1 -1
- package/dist/modules/plans/service.js +6 -14
- package/dist/modules/plans/service.js.map +1 -1
- package/dist/modules/positions/events.d.ts +22 -0
- package/dist/modules/positions/events.d.ts.map +1 -0
- package/dist/modules/positions/events.js +8 -0
- package/dist/modules/positions/events.js.map +1 -0
- package/dist/modules/positions/index.d.ts.map +1 -1
- package/dist/modules/positions/index.js +2 -0
- package/dist/modules/positions/index.js.map +1 -1
- package/dist/modules/positions/service.d.ts +1 -0
- package/dist/modules/positions/service.d.ts.map +1 -1
- package/dist/modules/positions/service.js +8 -11
- package/dist/modules/positions/service.js.map +1 -1
- package/dist/modules/raises/events.d.ts +31 -0
- package/dist/modules/raises/events.d.ts.map +1 -0
- package/dist/modules/raises/events.js +12 -0
- package/dist/modules/raises/events.js.map +1 -0
- package/dist/modules/raises/index.d.ts.map +1 -1
- package/dist/modules/raises/index.js +2 -0
- package/dist/modules/raises/index.js.map +1 -1
- package/dist/modules/raises/service.d.ts +1 -0
- package/dist/modules/raises/service.d.ts.map +1 -1
- package/dist/modules/raises/service.js +9 -18
- package/dist/modules/raises/service.js.map +1 -1
- package/dist/modules/reseal.d.ts +55 -0
- package/dist/modules/reseal.d.ts.map +1 -1
- package/dist/modules/reseal.js +90 -1
- package/dist/modules/reseal.js.map +1 -1
- package/dist/modules/smtp-email/index.d.ts +69 -0
- package/dist/modules/smtp-email/index.d.ts.map +1 -0
- package/dist/modules/smtp-email/index.js +82 -0
- package/dist/modules/smtp-email/index.js.map +1 -0
- package/dist/modules/webhooks/index.d.ts.map +1 -1
- package/dist/modules/webhooks/index.js +5 -1
- package/dist/modules/webhooks/index.js.map +1 -1
- package/dist/modules/webhooks/payloads.d.ts +22 -7
- package/dist/modules/webhooks/payloads.d.ts.map +1 -1
- package/dist/modules/webhooks/payloads.js +63 -44
- package/dist/modules/webhooks/payloads.js.map +1 -1
- package/dist/modules/workspace/events.d.ts +52 -0
- package/dist/modules/workspace/events.d.ts.map +1 -0
- package/dist/modules/workspace/events.js +16 -0
- package/dist/modules/workspace/events.js.map +1 -0
- package/dist/modules/workspace/index.d.ts.map +1 -1
- package/dist/modules/workspace/index.js +6 -2
- package/dist/modules/workspace/index.js.map +1 -1
- package/dist/modules/workspace/service.d.ts +1 -0
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +13 -15
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/runtime/events.d.ts +86 -108
- package/dist/runtime/events.d.ts.map +1 -1
- package/dist/runtime/events.js +123 -52
- package/dist/runtime/events.js.map +1 -1
- package/dist/runtime/module.d.ts +54 -2
- package/dist/runtime/module.d.ts.map +1 -1
- package/dist/runtime/registry.d.ts +23 -0
- package/dist/runtime/registry.d.ts.map +1 -1
- package/dist/runtime/registry.js +102 -2
- package/dist/runtime/registry.js.map +1 -1
- package/dist/runtime/transaction.d.ts +29 -4
- package/dist/runtime/transaction.d.ts.map +1 -1
- package/dist/runtime/transaction.js +48 -7
- package/dist/runtime/transaction.js.map +1 -1
- package/dist/testing/app.d.ts.map +1 -1
- package/dist/testing/app.js +11 -3
- package/dist/testing/app.js.map +1 -1
- package/dist/testing/database.d.ts.map +1 -1
- package/dist/testing/database.js +6 -3
- package/dist/testing/database.js.map +1 -1
- package/dist/testing/services.d.ts +21 -1
- package/dist/testing/services.d.ts.map +1 -1
- package/dist/testing/services.js +20 -5
- package/dist/testing/services.js.map +1 -1
- package/package.json +5 -2
- package/src/index.ts +44 -9
- package/src/lib/actor.ts +15 -1
- package/src/lib/config.ts +56 -7
- package/src/lib/email.ts +22 -92
- package/src/lib/fromEnv.ts +143 -0
- package/src/lib/ids.ts +6 -0
- package/src/lib/kelpieConfigFile.ts +283 -0
- package/src/lib/logger.ts +92 -34
- package/src/modules/agent-tasks/index.ts +4 -1
- package/src/modules/agent-tasks/prompt.ts +57 -9
- package/src/modules/agent-tasks/service.ts +3 -2
- package/src/modules/agent-tasks/wire.ts +12 -0
- package/src/modules/auth/index.ts +11 -9
- package/src/modules/companies/events.ts +25 -0
- package/src/modules/companies/index.ts +2 -0
- package/src/modules/companies/service.ts +8 -11
- package/src/modules/core.ts +4 -0
- package/src/modules/deals/events.ts +34 -0
- package/src/modules/deals/index.ts +2 -0
- package/src/modules/deals/service.ts +17 -18
- package/src/modules/decisions/events.ts +24 -0
- package/src/modules/decisions/index.ts +2 -0
- package/src/modules/decisions/service.ts +8 -7
- package/src/modules/forms/events.ts +37 -0
- package/src/modules/forms/index.ts +2 -0
- package/src/modules/forms/service.ts +12 -11
- package/src/modules/forms/submission.ts +80 -29
- package/src/modules/handbook/events.ts +31 -0
- package/src/modules/handbook/index.ts +2 -0
- package/src/modules/handbook/service.ts +8 -15
- package/src/modules/hiring/candidates.ts +8 -11
- package/src/modules/hiring/events.ts +36 -0
- package/src/modules/hiring/index.ts +2 -0
- package/src/modules/hiring/roles.ts +8 -11
- package/src/modules/import-export/events.ts +25 -0
- package/src/modules/import-export/index.ts +2 -0
- package/src/modules/import-export/service.ts +83 -15
- package/src/modules/notes/events.ts +25 -0
- package/src/modules/notes/index.ts +2 -0
- package/src/modules/notes/service.ts +8 -7
- package/src/modules/opportunities/events.ts +34 -0
- package/src/modules/opportunities/index.ts +2 -0
- package/src/modules/opportunities/service.ts +17 -18
- package/src/modules/partnerships/events.ts +34 -0
- package/src/modules/partnerships/index.ts +2 -0
- package/src/modules/partnerships/service.ts +17 -18
- package/src/modules/people/events.ts +36 -0
- package/src/modules/people/index.ts +2 -0
- package/src/modules/people/service.ts +97 -87
- package/src/modules/pipelines/service.ts +47 -8
- package/src/modules/plans/events.ts +24 -0
- package/src/modules/plans/index.ts +2 -0
- package/src/modules/plans/service.ts +14 -14
- package/src/modules/positions/events.ts +25 -0
- package/src/modules/positions/index.ts +2 -0
- package/src/modules/positions/service.ts +8 -11
- package/src/modules/raises/events.ts +34 -0
- package/src/modules/raises/index.ts +2 -0
- package/src/modules/raises/service.ts +17 -18
- package/src/modules/reseal.ts +144 -1
- package/src/modules/smtp-email/index.ts +119 -0
- package/src/modules/webhooks/index.ts +5 -1
- package/src/modules/webhooks/payloads.ts +94 -48
- package/src/modules/workspace/events.ts +46 -0
- package/src/modules/workspace/index.ts +6 -2
- package/src/modules/workspace/service.ts +37 -15
- package/src/runtime/events.ts +268 -107
- package/src/runtime/module.ts +55 -2
- package/src/runtime/registry.ts +169 -1
- package/src/runtime/transaction.ts +94 -17
- package/src/testing/app.ts +11 -3
- package/src/testing/database.ts +6 -3
- package/src/testing/services.ts +34 -5
package/README.md
CHANGED
|
@@ -18,12 +18,15 @@ Needs Node 24 or newer and a Postgres it can reach through `DATABASE_URL`.
|
|
|
18
18
|
|
|
19
19
|
```ts
|
|
20
20
|
import { serve } from '@hono/node-server'
|
|
21
|
-
import { connectDatabase, createApp, createEventBus, createIdFactory, createLogger, loadConfig, registerModules, runMigrations } from '@kelpie/server'
|
|
21
|
+
import { connectDatabase, createApp, createEventBus, createIdFactory, createLogger, createTransportForDestination, loadConfig, registerModules, runMigrations } from '@kelpie/server'
|
|
22
22
|
|
|
23
23
|
import { modules } from './kelpie.config.ts'
|
|
24
24
|
|
|
25
25
|
const config = loadConfig(process.env)
|
|
26
|
-
const logger = createLogger(
|
|
26
|
+
const logger = createLogger({
|
|
27
|
+
level: config.logging.level,
|
|
28
|
+
transports: config.logging.destinations.map(createTransportForDestination),
|
|
29
|
+
})
|
|
27
30
|
const database = connectDatabase(config.databaseUrl, logger)
|
|
28
31
|
const events = createEventBus(logger)
|
|
29
32
|
|
package/dist/index.d.ts
CHANGED
|
@@ -4,13 +4,21 @@ export { WebBundleError, serveWebBundle } from './webBundle.ts';
|
|
|
4
4
|
export type { WebBundleOptions } from './webBundle.ts';
|
|
5
5
|
export { ConfigurationError, loadConfig } from './lib/config.ts';
|
|
6
6
|
export type { Environment, KelpieConfig, LogLevel, RuntimeMode } from './lib/config.ts';
|
|
7
|
+
export { fromEnv, isFromEnvMarker, resolveMarker, resolveMarkers } from './lib/fromEnv.ts';
|
|
8
|
+
export type { ConfigValue, FromEnvMarker, FromEnvProblem, ResolveResult } from './lib/fromEnv.ts';
|
|
9
|
+
export { defineKelpieConfig, resolveKelpieConfig } from './lib/kelpieConfigFile.ts';
|
|
10
|
+
export type { EmailInput, KelpieConfigInput, RateLimitBudgetInput, RateLimitInput, SecretEncryptionInput, } from './lib/kelpieConfigFile.ts';
|
|
11
|
+
export { appUrlConfigSchema } from './lib/appUrl.ts';
|
|
12
|
+
export type { AppUrlConfig } from './lib/appUrl.ts';
|
|
7
13
|
export { resolveClientIpFrom } from './lib/clientIp.ts';
|
|
8
14
|
export { ModuleConfigFileError, readModuleConfigFile } from './lib/moduleConfig.ts';
|
|
9
15
|
export { FOREIGN_KEY_VIOLATION, RESTRICT_VIOLATION, UNIQUE_VIOLATION, connectDatabase, isReferenceViolation, postgresErrorCode, } from './lib/database.ts';
|
|
10
16
|
export type { Database, DatabaseConnection, DatabaseProbe } from './lib/database.ts';
|
|
11
17
|
export * as schema from './schema/index.ts';
|
|
12
|
-
export {
|
|
18
|
+
export { createLogEmailSender, emailConfigSchema } from './lib/email.ts';
|
|
13
19
|
export type { EmailConfig, EmailMessage, EmailSender } from './lib/email.ts';
|
|
20
|
+
export { SMTP_EMAIL_PROVIDER, createSmtpEmailModule, createSmtpEmailSender } from './modules/smtp-email/index.ts';
|
|
21
|
+
export type { SmtpEmailConfig, SmtpEmailModuleOptions, SmtpTransport } from './modules/smtp-email/index.ts';
|
|
14
22
|
export { MINIMUM_PASSWORD_LENGTH, hashPassword, isPasswordStrongEnough, verifyPassword } from './lib/passwords.ts';
|
|
15
23
|
export { generateToken, hashToken, tokenHashesMatch } from './lib/tokens.ts';
|
|
16
24
|
export { SecretDecryptionError, createSecretCipher, secretEncryptionConfigSchema, } from './lib/secrets.ts';
|
|
@@ -19,22 +27,23 @@ export { AppError, describeThrown, describeValidationIssue, internalErrorBody, t
|
|
|
19
27
|
export type { ErrorBody, ErrorCode, ErrorDetail, ErrorStatus, ValidationIssue } from './lib/errors.ts';
|
|
20
28
|
export { createIdFactory, idPrefixes } from './lib/ids.ts';
|
|
21
29
|
export type { IdFactory, ObjectKind } from './lib/ids.ts';
|
|
22
|
-
export { createLogger } from './lib/logger.ts';
|
|
23
|
-
export type { LogFields, Logger,
|
|
30
|
+
export { createCaptureTransport, createLogger, createStdoutTransport, createTransportForDestination, } from './lib/logger.ts';
|
|
31
|
+
export type { CreateLoggerOptions, LogFields, Logger, LoggingDestination } from './lib/logger.ts';
|
|
24
32
|
export type { KelpieModule, McpTool, McpToolDefinition, McpToolRegistry, ModuleCatalogEntry, ModuleContext, SchemaContribution, } from './runtime/module.ts';
|
|
25
33
|
export { ModuleBootError, orderModules } from './runtime/order.ts';
|
|
26
34
|
export { createEntitlementRegistry, limitFor, requireCapability } from './runtime/entitlements.ts';
|
|
27
35
|
export type { Capability, Entitlement, EntitlementRegistry, FlagCapability, GrantProvider, LimitCapability, } from './runtime/entitlements.ts';
|
|
28
36
|
export { SEATS_LIMIT } from './modules/workspace/capabilities.ts';
|
|
29
|
-
export {
|
|
30
|
-
export type {
|
|
37
|
+
export { RECORD_OBJECT_TYPES, checkEventCycle, createEventBus, currentEventChain, } from './runtime/events.ts';
|
|
38
|
+
export type { AnyEventHandler, CycleGuardOutcome, EventBus, EventBusOptions, EventCatalog, EventChainEntry, EventHandler, EventName, KelpieEventMap, RecordObjectType, SubscribeOptions, } from './runtime/events.ts';
|
|
39
|
+
export type { ModuleEventCatalog } from './runtime/module.ts';
|
|
31
40
|
export { createTransactionScope } from './runtime/transaction.ts';
|
|
32
|
-
export type { BufferedEvents, Transaction, TransactionContext, TransactionScope, TransactionScopeDependencies, } from './runtime/transaction.ts';
|
|
41
|
+
export type { BufferedEvents, Transaction, TransactionContext, TransactionOptions, TransactionScope, TransactionScopeDependencies, } from './runtime/transaction.ts';
|
|
33
42
|
export { planMigrations, runMigrations } from './runtime/migrate.ts';
|
|
34
43
|
export type { MigrationPlanStep } from './runtime/migrate.ts';
|
|
35
44
|
export { coreMigrationsDirectory, coreModules } from './modules/core.ts';
|
|
36
|
-
export { resealStoredSecrets } from './modules/reseal.ts';
|
|
37
|
-
export type { ResealColumnOutcome, ResealOutcome } from './modules/reseal.ts';
|
|
45
|
+
export { resealStoredSecrets, runReseal } from './modules/reseal.ts';
|
|
46
|
+
export type { ResealColumnOutcome, ResealOutcome, ResealPass, RunResealOptions } from './modules/reseal.ts';
|
|
38
47
|
export { KEY_KINDS, kindOfSecret, mintKey, parseKeyKind, readBearerToken } from './modules/api-keys/keys.ts';
|
|
39
48
|
export type { KeyKind, MintedKey } from './modules/api-keys/keys.ts';
|
|
40
49
|
export { registerModules } from './runtime/registry.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE5D,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/D,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEtD,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAChE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAEvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEnF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEpF,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
export { createApp } from './app.js';
|
|
2
2
|
export { WebBundleError, serveWebBundle } from './webBundle.js';
|
|
3
3
|
export { ConfigurationError, loadConfig } from './lib/config.js';
|
|
4
|
+
export { fromEnv, isFromEnvMarker, resolveMarker, resolveMarkers } from './lib/fromEnv.js';
|
|
5
|
+
export { defineKelpieConfig, resolveKelpieConfig } from './lib/kelpieConfigFile.js';
|
|
6
|
+
export { appUrlConfigSchema } from './lib/appUrl.js';
|
|
4
7
|
export { resolveClientIpFrom } from './lib/clientIp.js';
|
|
5
8
|
export { ModuleConfigFileError, readModuleConfigFile } from './lib/moduleConfig.js';
|
|
6
9
|
export { FOREIGN_KEY_VIOLATION, RESTRICT_VIOLATION, UNIQUE_VIOLATION, connectDatabase, isReferenceViolation, postgresErrorCode, } from './lib/database.js';
|
|
7
10
|
export * as schema from './schema/index.js';
|
|
8
|
-
export {
|
|
11
|
+
export { createLogEmailSender, emailConfigSchema } from './lib/email.js';
|
|
12
|
+
export { SMTP_EMAIL_PROVIDER, createSmtpEmailModule, createSmtpEmailSender } from './modules/smtp-email/index.js';
|
|
9
13
|
export { MINIMUM_PASSWORD_LENGTH, hashPassword, isPasswordStrongEnough, verifyPassword } from './lib/passwords.js';
|
|
10
14
|
export { generateToken, hashToken, tokenHashesMatch } from './lib/tokens.js';
|
|
11
15
|
export { SecretDecryptionError, createSecretCipher, secretEncryptionConfigSchema, } from './lib/secrets.js';
|
|
12
16
|
export { AppError, describeThrown, describeValidationIssue, internalErrorBody, toErrorBody, toErrorDetails, } from './lib/errors.js';
|
|
13
17
|
export { createIdFactory, idPrefixes } from './lib/ids.js';
|
|
14
|
-
export { createLogger } from './lib/logger.js';
|
|
18
|
+
export { createCaptureTransport, createLogger, createStdoutTransport, createTransportForDestination, } from './lib/logger.js';
|
|
15
19
|
export { ModuleBootError, orderModules } from './runtime/order.js';
|
|
16
20
|
export { createEntitlementRegistry, limitFor, requireCapability } from './runtime/entitlements.js';
|
|
17
21
|
export { SEATS_LIMIT } from './modules/workspace/capabilities.js';
|
|
18
|
-
export {
|
|
22
|
+
export { RECORD_OBJECT_TYPES, checkEventCycle, createEventBus, currentEventChain, } from './runtime/events.js';
|
|
19
23
|
export { createTransactionScope } from './runtime/transaction.js';
|
|
20
24
|
export { planMigrations, runMigrations } from './runtime/migrate.js';
|
|
21
25
|
export { coreMigrationsDirectory, coreModules } from './modules/core.js';
|
|
22
|
-
export { resealStoredSecrets } from './modules/reseal.js';
|
|
26
|
+
export { resealStoredSecrets, runReseal } from './modules/reseal.js';
|
|
23
27
|
export { KEY_KINDS, kindOfSecret, mintKey, parseKeyKind, readBearerToken } from './modules/api-keys/keys.js';
|
|
24
28
|
export { registerModules } from './runtime/registry.js';
|
|
25
29
|
export { actorUserId, actorWorkspaceId, requireSessionActor } from './modules/auth/actor.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEnF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAGhE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAG1F,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AASnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAGpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEnF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAGxE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAA;AAGjH,OAAO,EAAE,uBAAuB,EAAE,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAClH,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAE5E,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,4BAA4B,GAC7B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,WAAW,EACX,cAAc,GACf,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG1D,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AAaxB,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAElE,OAAO,EAAE,yBAAyB,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAUlG,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAA;AAEjE,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,iBAAiB,GAClB,MAAM,qBAAqB,CAAA;AAgB5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AAUjE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAGpE,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAExE,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAGpE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAG5G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAWvD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA"}
|
package/dist/lib/actor.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MemberRole } from '@kelpie/schemas';
|
|
1
|
+
import type { EventActor, MemberRole } from '@kelpie/schemas';
|
|
2
2
|
/**
|
|
3
3
|
* Who is making a request. Resolved from credentials and passed explicitly to
|
|
4
4
|
* services; nothing reads auth state from a global.
|
|
@@ -68,4 +68,12 @@ export declare function actorUserId(actor: Actor): string | null;
|
|
|
68
68
|
* one the `actor_label` column exists for.
|
|
69
69
|
*/
|
|
70
70
|
export declare function actorMemberId(actor: Actor): string | null;
|
|
71
|
+
/**
|
|
72
|
+
* Maps the request actor to the actor stamped on domain events.
|
|
73
|
+
*
|
|
74
|
+
* A signed-in user becomes `user`. A workspace key (no user behind it) becomes
|
|
75
|
+
* `system`, because the event was caused by the workspace itself rather than
|
|
76
|
+
* any one person.
|
|
77
|
+
*/
|
|
78
|
+
export declare function toEventActor(actor: Actor): EventActor;
|
|
71
79
|
//# sourceMappingURL=actor.d.ts.map
|
package/dist/lib/actor.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"actor.d.ts","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI7D;;;;;;;;;;;;GAYG;AAEH,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;IAChC,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;AAED,MAAM,MAAM,KAAK,GAAG,YAAY,GAAG,WAAW,CAAA;AAE9C,uFAAuF;AACvF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAE5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAMvD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,YAAY,CAM9D;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAEzD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAKrD"}
|
package/dist/lib/actor.js
CHANGED
|
@@ -45,4 +45,17 @@ export function actorUserId(actor) {
|
|
|
45
45
|
export function actorMemberId(actor) {
|
|
46
46
|
return actor.memberId;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Maps the request actor to the actor stamped on domain events.
|
|
50
|
+
*
|
|
51
|
+
* A signed-in user becomes `user`. A workspace key (no user behind it) becomes
|
|
52
|
+
* `system`, because the event was caused by the workspace itself rather than
|
|
53
|
+
* any one person.
|
|
54
|
+
*/
|
|
55
|
+
export function toEventActor(actor) {
|
|
56
|
+
if (actor.userId !== null) {
|
|
57
|
+
return { kind: 'user', id: actor.userId };
|
|
58
|
+
}
|
|
59
|
+
return { kind: 'system' };
|
|
60
|
+
}
|
|
48
61
|
//# sourceMappingURL=actor.js.map
|
package/dist/lib/actor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AA6CtC,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,OAAO,KAAK,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC7C,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAA;IAC1F,CAAC;IAED,OAAO,KAAK,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAY;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAA;IACzF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC,MAAM,CAAA;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAO,KAAK,CAAC,QAAQ,CAAA;AACvB,CAAC"}
|
|
1
|
+
{"version":3,"file":"actor.js","sourceRoot":"","sources":["../../src/lib/actor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AA6CtC,uFAAuF;AACvF,MAAM,UAAU,gBAAgB,CAAC,KAAY;IAC3C,OAAO,KAAK,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAY;IAC7C,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;QAC/B,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAA;IAC1F,CAAC;IAED,OAAO,KAAK,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAY;IAC9C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,sDAAsD,CAAC,CAAA;IACzF,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,OAAO,KAAK,CAAC,MAAM,CAAA;AACrB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAY;IACxC,OAAO,KAAK,CAAC,QAAQ,CAAA;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;IAC3C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC3B,CAAC"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { EmailConfig } from './email.ts';
|
|
2
|
+
import type { LoggingDestination } from './logger.ts';
|
|
2
3
|
import type { RateLimitConfig } from './rateLimit.ts';
|
|
4
|
+
import type { SecretEncryptionConfig } from './secrets.ts';
|
|
3
5
|
/**
|
|
4
6
|
* The single place the service reads environment variables. Every other module
|
|
5
7
|
* receives configuration as an argument. Nothing defaults silently: a missing or
|
|
@@ -8,12 +10,28 @@ import type { RateLimitConfig } from './rateLimit.ts';
|
|
|
8
10
|
export type Environment = Readonly<Record<string, string | undefined>>;
|
|
9
11
|
export type RuntimeMode = 'development' | 'test' | 'production';
|
|
10
12
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
13
|
+
/**
|
|
14
|
+
* Everything the logger needs to boot: the minimum severity to emit, and the
|
|
15
|
+
* ordered list of destinations each line is written to. Stdout is one such
|
|
16
|
+
* destination; adding a file or a hosted collector means adding an entry to
|
|
17
|
+
* `destinations` and extending `LoggingDestination` in `lib/logger.ts`.
|
|
18
|
+
*/
|
|
19
|
+
export interface LoggingConfig {
|
|
20
|
+
readonly level: LogLevel;
|
|
21
|
+
readonly destinations: readonly LoggingDestination[];
|
|
22
|
+
}
|
|
11
23
|
export interface KelpieConfig {
|
|
12
24
|
readonly runtimeMode: RuntimeMode;
|
|
13
25
|
readonly port: number;
|
|
14
26
|
readonly databaseUrl: string;
|
|
15
|
-
readonly
|
|
16
|
-
/**
|
|
27
|
+
readonly logging: LoggingConfig;
|
|
28
|
+
/**
|
|
29
|
+
* The provider name the module runtime looks up in its registry, and the
|
|
30
|
+
* from address every outgoing message uses. See `lib/email.ts` for the
|
|
31
|
+
* shape and rules; `'log'` is always available, `'smtp'` is registered by
|
|
32
|
+
* the built-in `smtp-email` core module, and other names come from
|
|
33
|
+
* third-party provider modules.
|
|
34
|
+
*/
|
|
17
35
|
readonly email: EmailConfig;
|
|
18
36
|
/**
|
|
19
37
|
* Path to the deploy-time module override file (`lib/moduleConfig.ts`).
|
|
@@ -34,6 +52,28 @@ export interface KelpieConfig {
|
|
|
34
52
|
* client IP is read from `X-Forwarded-For` (`lib/clientIp.ts`).
|
|
35
53
|
*/
|
|
36
54
|
readonly trustedProxyHopCount: number;
|
|
55
|
+
/**
|
|
56
|
+
* What modules see through `context.config(schema)`. `resolveKelpieConfig`
|
|
57
|
+
* produces this by merging any `env` section in `kelpie.config.ts` over
|
|
58
|
+
* `process.env`, so a key in the config file wins for that key and unset
|
|
59
|
+
* keys pass through. `loadConfig` sets it to the environment it was given,
|
|
60
|
+
* so an old caller keeps the same behaviour.
|
|
61
|
+
*/
|
|
62
|
+
readonly env: Environment;
|
|
63
|
+
/**
|
|
64
|
+
* The deployment's base URL, source of every emailed link. Optional so an
|
|
65
|
+
* older assembly that omits it from `kelpie.config.ts` still boots: modules
|
|
66
|
+
* that need it fall back to `context.config(appUrlConfigSchema)` when unset.
|
|
67
|
+
* A new assembly declares it as a first-class field.
|
|
68
|
+
*/
|
|
69
|
+
readonly appBaseUrl: string | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* The key(s) that seal stored secrets. Optional for the same reason
|
|
72
|
+
* `appBaseUrl` is: modules that need it fall back to
|
|
73
|
+
* `context.config(secretEncryptionConfigSchema)`. The base assembly declares
|
|
74
|
+
* it, so both webhooks and agent-tasks receive it through `services`.
|
|
75
|
+
*/
|
|
76
|
+
readonly secretEncryption: SecretEncryptionConfig | undefined;
|
|
37
77
|
}
|
|
38
78
|
/** Thrown at boot when the environment cannot produce a valid configuration. */
|
|
39
79
|
export declare class ConfigurationError extends Error {
|
|
@@ -43,10 +83,8 @@ export declare class ConfigurationError extends Error {
|
|
|
43
83
|
/**
|
|
44
84
|
* Parses an environment into a validated config.
|
|
45
85
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
* only its own `EMAIL_PROVIDER`-keyed branches. Problems from both parses are
|
|
49
|
-
* combined into one error, preserving the "every missing variable at once" rule.
|
|
86
|
+
* The email variables are parsed separately so a caller sees every missing
|
|
87
|
+
* variable at once, rather than one at a time.
|
|
50
88
|
*
|
|
51
89
|
* @param environment Raw variables, normally `process.env`.
|
|
52
90
|
* @throws ConfigurationError listing every invalid or missing variable.
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAM7C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAE1D;;;;GAIG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAEtE,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,GAAG,YAAY,CAAA;AAE/D,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,kBAAkB,EAAE,CAAA;CACrD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAA;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/C,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAA;IACnC;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAA;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAA;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,SAAS,CAAA;CAC9D;AAED,gFAAgF;AAChF,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IAEpC,YAAY,QAAQ,EAAE,SAAS,MAAM,EAAE,EAItC;CACF;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,CA8BjE"}
|
package/dist/lib/config.js
CHANGED
|
@@ -35,10 +35,8 @@ const environmentSchema = z.object({
|
|
|
35
35
|
/**
|
|
36
36
|
* Parses an environment into a validated config.
|
|
37
37
|
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* only its own `EMAIL_PROVIDER`-keyed branches. Problems from both parses are
|
|
41
|
-
* combined into one error, preserving the "every missing variable at once" rule.
|
|
38
|
+
* The email variables are parsed separately so a caller sees every missing
|
|
39
|
+
* variable at once, rather than one at a time.
|
|
42
40
|
*
|
|
43
41
|
* @param environment Raw variables, normally `process.env`.
|
|
44
42
|
* @throws ConfigurationError listing every invalid or missing variable.
|
|
@@ -57,12 +55,18 @@ export function loadConfig(environment) {
|
|
|
57
55
|
runtimeMode: environmentResult.data.NODE_ENV,
|
|
58
56
|
port: environmentResult.data.PORT,
|
|
59
57
|
databaseUrl: environmentResult.data.DATABASE_URL,
|
|
60
|
-
|
|
58
|
+
logging: {
|
|
59
|
+
level: environmentResult.data.LOG_LEVEL,
|
|
60
|
+
destinations: [{ kind: 'stdout' }],
|
|
61
|
+
},
|
|
61
62
|
email: emailResult.data,
|
|
62
63
|
moduleConfigPath: environmentResult.data.KELPIE_MODULE_CONFIG_PATH,
|
|
63
64
|
webBundleDirectory: environmentResult.data.WEB_BUNDLE_DIR,
|
|
64
65
|
rateLimit: rateLimitConfigFrom(environmentResult.data),
|
|
65
66
|
trustedProxyHopCount: environmentResult.data.TRUSTED_PROXY_HOP_COUNT,
|
|
67
|
+
env: environment,
|
|
68
|
+
appBaseUrl: undefined,
|
|
69
|
+
secretEncryption: undefined,
|
|
66
70
|
};
|
|
67
71
|
}
|
|
68
72
|
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/email.d.ts
CHANGED
|
@@ -5,15 +5,15 @@ import type { Logger } from './logger.ts';
|
|
|
5
5
|
* and account-change notifications, nothing else. Kelpie never sends outreach
|
|
6
6
|
* email.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* a
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
8
|
+
* The assembly names one named provider in `kelpie.config.ts`'s
|
|
9
|
+
* `email.provider`. The module runtime resolves the name against a registry
|
|
10
|
+
* every module can contribute to via `context.provideEmailSender(name, sender)`.
|
|
11
|
+
* `'log'` is a built-in name the runtime always registers, so a bare install
|
|
12
|
+
* has something to point at. `'smtp'` is registered by the built-in
|
|
13
|
+
* `smtp-email` core module. Other names come from third-party provider modules
|
|
14
|
+
* (Resend, Postmark, SES) that follow the same registry pattern. Transport is
|
|
15
|
+
* arbitrary: the module builds one behind the `EmailSender` interface and
|
|
16
|
+
* hands it to core, which knows only how to `send`.
|
|
17
17
|
*/
|
|
18
18
|
export interface EmailMessage {
|
|
19
19
|
readonly to: string;
|
|
@@ -23,64 +23,16 @@ export interface EmailMessage {
|
|
|
23
23
|
export interface EmailSender {
|
|
24
24
|
send(message: EmailMessage): Promise<void>;
|
|
25
25
|
}
|
|
26
|
-
declare const
|
|
27
|
-
EMAIL_PROVIDER: z.
|
|
26
|
+
export declare const emailConfigSchema: z.ZodObject<{
|
|
27
|
+
EMAIL_PROVIDER: z.ZodString;
|
|
28
28
|
EMAIL_FROM: z.ZodString;
|
|
29
|
-
SMTP_HOST: z.ZodString;
|
|
30
|
-
SMTP_PORT: z.ZodCoercedNumber<unknown>;
|
|
31
|
-
SMTP_SECURE: z.ZodPipe<z.ZodEnum<{
|
|
32
|
-
false: "false";
|
|
33
|
-
true: "true";
|
|
34
|
-
}>, z.ZodTransform<boolean, "false" | "true">>;
|
|
35
|
-
SMTP_USER: z.ZodString;
|
|
36
|
-
SMTP_PASSWORD: z.ZodString;
|
|
37
29
|
}, z.core.$strip>;
|
|
38
|
-
export declare const emailConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
39
|
-
EMAIL_PROVIDER: z.ZodLiteral<"log">;
|
|
40
|
-
EMAIL_FROM: z.ZodString;
|
|
41
|
-
}, z.core.$strip>, z.ZodObject<{
|
|
42
|
-
EMAIL_PROVIDER: z.ZodLiteral<"smtp">;
|
|
43
|
-
EMAIL_FROM: z.ZodString;
|
|
44
|
-
SMTP_HOST: z.ZodString;
|
|
45
|
-
SMTP_PORT: z.ZodCoercedNumber<unknown>;
|
|
46
|
-
SMTP_SECURE: z.ZodPipe<z.ZodEnum<{
|
|
47
|
-
false: "false";
|
|
48
|
-
true: "true";
|
|
49
|
-
}>, z.ZodTransform<boolean, "false" | "true">>;
|
|
50
|
-
SMTP_USER: z.ZodString;
|
|
51
|
-
SMTP_PASSWORD: z.ZodString;
|
|
52
|
-
}, z.core.$strip>], "EMAIL_PROVIDER">;
|
|
53
30
|
export type EmailConfig = z.infer<typeof emailConfigSchema>;
|
|
54
|
-
export type SmtpEmailConfig = z.infer<typeof smtpEmailConfigSchema>;
|
|
55
31
|
/**
|
|
56
|
-
* Writes the message to the log instead of sending it.
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* so nobody reaches this provider without naming it.
|
|
32
|
+
* Writes the message to the log instead of sending it. The registry default,
|
|
33
|
+
* swapped out for a real sender by picking a different provider name in
|
|
34
|
+
* `email.provider` (`'smtp'` for the built-in SMTP module, or any name a
|
|
35
|
+
* third-party provider module registers).
|
|
61
36
|
*/
|
|
62
37
|
export declare function createLogEmailSender(logger: Logger, from: string): EmailSender;
|
|
63
|
-
/**
|
|
64
|
-
* What `createSmtpEmailSender` sends a message through. A real deployment gets
|
|
65
|
-
* one backed by `nodemailer`; a test injects one that records calls, so the
|
|
66
|
-
* sender is verifiable without a container running a real SMTP conversation.
|
|
67
|
-
*/
|
|
68
|
-
export interface SmtpTransport {
|
|
69
|
-
sendMail(message: {
|
|
70
|
-
from: string;
|
|
71
|
-
to: string;
|
|
72
|
-
subject: string;
|
|
73
|
-
text: string;
|
|
74
|
-
}): Promise<unknown>;
|
|
75
|
-
}
|
|
76
|
-
/** Sends over SMTP. `transport` defaults to a real connection built from `config`. */
|
|
77
|
-
export declare function createSmtpEmailSender(config: SmtpEmailConfig, logger: Logger, transport?: SmtpTransport): EmailSender;
|
|
78
|
-
/**
|
|
79
|
-
* Builds the configured sender.
|
|
80
|
-
*
|
|
81
|
-
* @throws Never. An unknown provider cannot reach here: the config schema is a
|
|
82
|
-
* discriminated union, so boot rejects it first.
|
|
83
|
-
*/
|
|
84
|
-
export declare function createEmailSender(config: EmailConfig, logger: Logger): EmailSender;
|
|
85
|
-
export {};
|
|
86
38
|
//# sourceMappingURL=email.d.ts.map
|
package/dist/lib/email.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/lib/email.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/lib/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3C;AAED,eAAO,MAAM,iBAAiB;;;iBAS5B,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAE3D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAa9E"}
|
package/dist/lib/email.js
CHANGED
|
@@ -1,34 +1,24 @@
|
|
|
1
|
-
import nodemailer from 'nodemailer';
|
|
2
1
|
import { z } from 'zod';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
export const emailConfigSchema = z.object({
|
|
3
|
+
/**
|
|
4
|
+
* The named provider `registerModules` resolves against its registry. `'log'`
|
|
5
|
+
* is a built-in, always present. Any other name needs a module that
|
|
6
|
+
* registered it via `context.provideEmailSender(name, sender)`. Free-string
|
|
7
|
+
* so a self-hoster can add a module core has never heard of.
|
|
8
|
+
*/
|
|
9
|
+
EMAIL_PROVIDER: z.string().min(1),
|
|
6
10
|
EMAIL_FROM: z.string().min(1),
|
|
7
11
|
});
|
|
8
|
-
const smtpEmailConfigSchema = z.object({
|
|
9
|
-
EMAIL_PROVIDER: z.literal('smtp'),
|
|
10
|
-
EMAIL_FROM: z.string().min(1),
|
|
11
|
-
SMTP_HOST: z.string().min(1),
|
|
12
|
-
SMTP_PORT: z.coerce.number().int().positive().max(65535),
|
|
13
|
-
SMTP_SECURE: z.enum(['true', 'false']).transform((value) => value === 'true'),
|
|
14
|
-
SMTP_USER: z.string().min(1),
|
|
15
|
-
SMTP_PASSWORD: z.string().min(1),
|
|
16
|
-
});
|
|
17
|
-
export const emailConfigSchema = z.discriminatedUnion('EMAIL_PROVIDER', [
|
|
18
|
-
logEmailConfigSchema,
|
|
19
|
-
smtpEmailConfigSchema,
|
|
20
|
-
]);
|
|
21
12
|
/**
|
|
22
|
-
* Writes the message to the log instead of sending it.
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* so nobody reaches this provider without naming it.
|
|
13
|
+
* Writes the message to the log instead of sending it. The registry default,
|
|
14
|
+
* swapped out for a real sender by picking a different provider name in
|
|
15
|
+
* `email.provider` (`'smtp'` for the built-in SMTP module, or any name a
|
|
16
|
+
* third-party provider module registers).
|
|
27
17
|
*/
|
|
28
18
|
export function createLogEmailSender(logger, from) {
|
|
29
19
|
return {
|
|
30
20
|
send(message) {
|
|
31
|
-
logger.info('email not sent: provider
|
|
21
|
+
logger.info('email not sent: no provider module registered', {
|
|
32
22
|
from,
|
|
33
23
|
to: message.to,
|
|
34
24
|
subject: message.subject,
|
|
@@ -38,46 +28,4 @@ export function createLogEmailSender(logger, from) {
|
|
|
38
28
|
},
|
|
39
29
|
};
|
|
40
30
|
}
|
|
41
|
-
function createNodemailerTransport(config) {
|
|
42
|
-
return nodemailer.createTransport({
|
|
43
|
-
host: config.SMTP_HOST,
|
|
44
|
-
port: config.SMTP_PORT,
|
|
45
|
-
secure: config.SMTP_SECURE,
|
|
46
|
-
auth: { user: config.SMTP_USER, pass: config.SMTP_PASSWORD },
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
/** Sends over SMTP. `transport` defaults to a real connection built from `config`. */
|
|
50
|
-
export function createSmtpEmailSender(config, logger, transport = createNodemailerTransport(config)) {
|
|
51
|
-
return {
|
|
52
|
-
async send(message) {
|
|
53
|
-
try {
|
|
54
|
-
await transport.sendMail({
|
|
55
|
-
from: config.EMAIL_FROM,
|
|
56
|
-
to: message.to,
|
|
57
|
-
subject: message.subject,
|
|
58
|
-
text: message.body,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
catch (cause) {
|
|
62
|
-
const reason = describeThrown(cause);
|
|
63
|
-
logger.error('smtp send failed', { to: message.to, reason });
|
|
64
|
-
throw new Error(`Failed to send email to ${message.to} over SMTP: ${reason}`, { cause });
|
|
65
|
-
}
|
|
66
|
-
},
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Builds the configured sender.
|
|
71
|
-
*
|
|
72
|
-
* @throws Never. An unknown provider cannot reach here: the config schema is a
|
|
73
|
-
* discriminated union, so boot rejects it first.
|
|
74
|
-
*/
|
|
75
|
-
export function createEmailSender(config, logger) {
|
|
76
|
-
switch (config.EMAIL_PROVIDER) {
|
|
77
|
-
case 'log':
|
|
78
|
-
return createLogEmailSender(logger, config.EMAIL_FROM);
|
|
79
|
-
case 'smtp':
|
|
80
|
-
return createSmtpEmailSender(config, logger);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
31
|
//# sourceMappingURL=email.js.map
|
package/dist/lib/email.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/lib/email.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../src/lib/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AA8BvB,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC;;;;;OAKG;IACH,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAA;AAIF;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAAY;IAC/D,OAAO;QACL,IAAI,CAAC,OAAO;YACV,MAAM,CAAC,IAAI,CAAC,+CAA+C,EAAE;gBAC3D,IAAI;gBACJ,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC,CAAA;YAEF,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
import type { Environment } from './config.ts';
|
|
3
|
+
/**
|
|
4
|
+
* A marker a `kelpie.config.ts` file uses to say "read this leaf from the
|
|
5
|
+
* environment." The assembly's config file is the shape and the defaults;
|
|
6
|
+
* `fromEnv` marks the leaves a deployment may override without a code change.
|
|
7
|
+
*
|
|
8
|
+
* Every marker names an env var, the Zod schema that parses it, and optionally
|
|
9
|
+
* a default. Without a default the marker is required: the env var must be set,
|
|
10
|
+
* or boot fails with the other configuration problems.
|
|
11
|
+
*
|
|
12
|
+
* The resolver walks the config object, replaces each marker with the parsed
|
|
13
|
+
* value, and returns the fully-resolved object. Nothing in the app reads
|
|
14
|
+
* `process.env` for these fields after boot.
|
|
15
|
+
*/
|
|
16
|
+
declare const FROM_ENV_MARKER: unique symbol;
|
|
17
|
+
export interface FromEnvMarker<T> {
|
|
18
|
+
readonly [FROM_ENV_MARKER]: true;
|
|
19
|
+
readonly envKey: string;
|
|
20
|
+
readonly schema: ZodType<T>;
|
|
21
|
+
readonly defaultValue: T | undefined;
|
|
22
|
+
readonly hasDefault: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** A leaf in the config file: either a literal already-typed value, or a marker. */
|
|
25
|
+
export type ConfigValue<T> = T | FromEnvMarker<T>;
|
|
26
|
+
export declare function fromEnv<T>(envKey: string, schema: ZodType<T>): FromEnvMarker<T>;
|
|
27
|
+
export declare function fromEnv<T>(envKey: string, schema: ZodType<T>, defaultValue: T): FromEnvMarker<T>;
|
|
28
|
+
export declare function isFromEnvMarker(value: unknown): value is FromEnvMarker<unknown>;
|
|
29
|
+
/** One problem discovered while resolving markers. Path is the dotted field. */
|
|
30
|
+
export interface FromEnvProblem {
|
|
31
|
+
readonly path: string;
|
|
32
|
+
readonly message: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ResolveResult<T> {
|
|
35
|
+
readonly value: T | undefined;
|
|
36
|
+
readonly problems: readonly FromEnvProblem[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolves one marker against an environment.
|
|
40
|
+
*
|
|
41
|
+
* Missing and no default: one required problem.
|
|
42
|
+
* Missing with default: the default, unvalidated. A hardcoded default is
|
|
43
|
+
* trusted because the developer wrote it in the assembly file.
|
|
44
|
+
* Present: parsed through the marker's schema. Parse failures become problems.
|
|
45
|
+
*/
|
|
46
|
+
export declare function resolveMarker<T>(marker: FromEnvMarker<T>, environment: Environment, path: string): ResolveResult<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Walks any value, replacing every `FromEnvMarker` with its resolved value.
|
|
49
|
+
* Objects and arrays are walked recursively; other values pass through.
|
|
50
|
+
*
|
|
51
|
+
* Collects problems from every marker rather than throwing at the first one,
|
|
52
|
+
* so a self-hoster fixes their environment once rather than a variable at a
|
|
53
|
+
* time.
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolveMarkers(input: unknown, environment: Environment, path?: string): {
|
|
56
|
+
readonly value: unknown;
|
|
57
|
+
readonly problems: readonly FromEnvProblem[];
|
|
58
|
+
};
|
|
59
|
+
export {};
|
|
60
|
+
//# sourceMappingURL=fromEnv.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fromEnv.d.ts","sourceRoot":"","sources":["../../src/lib/fromEnv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAElC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9C;;;;;;;;;;;;GAYG;AAEH,QAAA,MAAM,eAAe,eAA+B,CAAA;AAEpD,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAA;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IAC3B,QAAQ,CAAC,YAAY,EAAE,CAAC,GAAG,SAAS,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAA;CAC7B;AAED,oFAAoF;AACpF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAEjD,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAChF,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;AAajG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,CAE/E;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAC7C;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CA2BnH;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,WAAW,EACxB,IAAI,SAAK,GACR;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,CAiC3E"}
|