@digimuza/saas-core 0.0.2
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/CLAUDE.md +1165 -0
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/api-keys/index.d.ts +9 -0
- package/dist/api-keys/index.d.ts.map +1 -0
- package/dist/api-keys/index.js +37 -0
- package/dist/api-keys/index.js.map +1 -0
- package/dist/api-keys/keys.d.ts +55 -0
- package/dist/api-keys/keys.d.ts.map +1 -0
- package/dist/api-keys/keys.js +92 -0
- package/dist/api-keys/keys.js.map +1 -0
- package/dist/api-keys/service.d.ts +111 -0
- package/dist/api-keys/service.d.ts.map +1 -0
- package/dist/api-keys/service.js +210 -0
- package/dist/api-keys/service.js.map +1 -0
- package/dist/audit/index.d.ts +5 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +44 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +88 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +128 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/auth/client.d.ts +5 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +26 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/cookies.d.ts +51 -0
- package/dist/auth/cookies.d.ts.map +1 -0
- package/dist/auth/cookies.js +58 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +46 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/service.d.ts +67 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +275 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/auth/types.d.ts +56 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/authorization/index.d.ts +4 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +24 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/service.d.ts +92 -0
- package/dist/authorization/service.d.ts.map +1 -0
- package/dist/authorization/service.js +254 -0
- package/dist/authorization/service.js.map +1 -0
- package/dist/billing/index.d.ts +16 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +47 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/provider.d.ts +114 -0
- package/dist/billing/provider.d.ts.map +1 -0
- package/dist/billing/provider.js +2 -0
- package/dist/billing/provider.js.map +1 -0
- package/dist/billing/revolut.d.ts +68 -0
- package/dist/billing/revolut.d.ts.map +1 -0
- package/dist/billing/revolut.js +181 -0
- package/dist/billing/revolut.js.map +1 -0
- package/dist/billing/service.d.ts +124 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +470 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +43 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +212 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/project.d.ts +12 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +49 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/docker.d.ts +50 -0
- package/dist/cli/docker.d.ts.map +1 -0
- package/dist/cli/docker.js +84 -0
- package/dist/cli/docker.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +198 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +30 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +66 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/templates.d.ts +52 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +225 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/config/client.d.ts +60 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +94 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/config-loader.d.ts +2 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +2 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/env.d.ts +24 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +40 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/errors.d.ts +17 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +26 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +72 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +106 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/runtime.d.ts +15 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +22 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/config/sections.d.ts +226 -0
- package/dist/config/sections.d.ts.map +1 -0
- package/dist/config/sections.js +141 -0
- package/dist/config/sections.js.map +1 -0
- package/dist/db/client.d.ts +43 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +77 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +39 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +67 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +10 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +21 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +28 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema/_shared.d.ts +30 -0
- package/dist/db/schema/_shared.d.ts.map +1 -0
- package/dist/db/schema/_shared.js +36 -0
- package/dist/db/schema/_shared.js.map +1 -0
- package/dist/db/schema/apikeys.d.ts +263 -0
- package/dist/db/schema/apikeys.d.ts.map +1 -0
- package/dist/db/schema/apikeys.js +70 -0
- package/dist/db/schema/apikeys.js.map +1 -0
- package/dist/db/schema/authorization.d.ts +465 -0
- package/dist/db/schema/authorization.d.ts.map +1 -0
- package/dist/db/schema/authorization.js +134 -0
- package/dist/db/schema/authorization.js.map +1 -0
- package/dist/db/schema/billing.d.ts +1100 -0
- package/dist/db/schema/billing.d.ts.map +1 -0
- package/dist/db/schema/billing.js +223 -0
- package/dist/db/schema/billing.js.map +1 -0
- package/dist/db/schema/events.d.ts +161 -0
- package/dist/db/schema/events.d.ts.map +1 -0
- package/dist/db/schema/events.js +66 -0
- package/dist/db/schema/events.js.map +1 -0
- package/dist/db/schema/features.d.ts +243 -0
- package/dist/db/schema/features.d.ts.map +1 -0
- package/dist/db/schema/features.js +87 -0
- package/dist/db/schema/features.js.map +1 -0
- package/dist/db/schema/files.d.ts +253 -0
- package/dist/db/schema/files.d.ts.map +1 -0
- package/dist/db/schema/files.js +74 -0
- package/dist/db/schema/files.js.map +1 -0
- package/dist/db/schema/index.d.ts +38 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/index.js +38 -0
- package/dist/db/schema/index.js.map +1 -0
- package/dist/db/schema/invitations.d.ts +214 -0
- package/dist/db/schema/invitations.d.ts.map +1 -0
- package/dist/db/schema/invitations.js +80 -0
- package/dist/db/schema/invitations.js.map +1 -0
- package/dist/db/schema/messaging.d.ts +442 -0
- package/dist/db/schema/messaging.d.ts.map +1 -0
- package/dist/db/schema/messaging.js +120 -0
- package/dist/db/schema/messaging.js.map +1 -0
- package/dist/db/schema/users.d.ts +246 -0
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/db/schema/users.js +60 -0
- package/dist/db/schema/users.js.map +1 -0
- package/dist/db/schema/webhooks.d.ts +693 -0
- package/dist/db/schema/webhooks.d.ts.map +1 -0
- package/dist/db/schema/webhooks.js +147 -0
- package/dist/db/schema/webhooks.js.map +1 -0
- package/dist/db/schema/workspaces.d.ts +196 -0
- package/dist/db/schema/workspaces.d.ts.map +1 -0
- package/dist/db/schema/workspaces.js +57 -0
- package/dist/db/schema/workspaces.js.map +1 -0
- package/dist/db/types.d.ts +18 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/email/adapters.d.ts +29 -0
- package/dist/email/adapters.d.ts.map +1 -0
- package/dist/email/adapters.js +60 -0
- package/dist/email/adapters.js.map +1 -0
- package/dist/email/index.d.ts +20 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +79 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/provider.d.ts +47 -0
- package/dist/email/provider.d.ts.map +1 -0
- package/dist/email/provider.js +7 -0
- package/dist/email/provider.js.map +1 -0
- package/dist/email/resend.d.ts +22 -0
- package/dist/email/resend.d.ts.map +1 -0
- package/dist/email/resend.js +51 -0
- package/dist/email/resend.js.map +1 -0
- package/dist/email/service.d.ts +55 -0
- package/dist/email/service.d.ts.map +1 -0
- package/dist/email/service.js +87 -0
- package/dist/email/service.js.map +1 -0
- package/dist/email/templates.d.ts +81 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +84 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/index.d.ts +10 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +28 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/service.d.ts +83 -0
- package/dist/entitlements/service.d.ts.map +1 -0
- package/dist/entitlements/service.js +158 -0
- package/dist/entitlements/service.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +95 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/core-events.d.ts +120 -0
- package/dist/events/core-events.d.ts.map +1 -0
- package/dist/events/core-events.js +109 -0
- package/dist/events/core-events.js.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +58 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/publisher.d.ts +46 -0
- package/dist/events/publisher.d.ts.map +1 -0
- package/dist/events/publisher.js +54 -0
- package/dist/events/publisher.js.map +1 -0
- package/dist/events/registry.d.ts +87 -0
- package/dist/events/registry.d.ts.map +1 -0
- package/dist/events/registry.js +34 -0
- package/dist/events/registry.js.map +1 -0
- package/dist/events/service.d.ts +78 -0
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/service.js +182 -0
- package/dist/events/service.js.map +1 -0
- package/dist/features/bucket.d.ts +22 -0
- package/dist/features/bucket.d.ts.map +1 -0
- package/dist/features/bucket.js +42 -0
- package/dist/features/bucket.js.map +1 -0
- package/dist/features/index.d.ts +15 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +78 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/registry.d.ts +51 -0
- package/dist/features/registry.d.ts.map +1 -0
- package/dist/features/registry.js +52 -0
- package/dist/features/registry.js.map +1 -0
- package/dist/features/service.d.ts +78 -0
- package/dist/features/service.d.ts.map +1 -0
- package/dist/features/service.js +207 -0
- package/dist/features/service.js.map +1 -0
- package/dist/files/index.d.ts +6 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +64 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/service.d.ts +92 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +303 -0
- package/dist/files/service.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/backend.d.ts +23 -0
- package/dist/jobs/backend.d.ts.map +1 -0
- package/dist/jobs/backend.js +23 -0
- package/dist/jobs/backend.js.map +1 -0
- package/dist/jobs/index.d.ts +29 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +114 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/service.d.ts +67 -0
- package/dist/jobs/service.d.ts.map +1 -0
- package/dist/jobs/service.js +139 -0
- package/dist/jobs/service.js.map +1 -0
- package/dist/jobs/types.d.ts +78 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +4 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/logger/default.d.ts +7 -0
- package/dist/logger/default.d.ts.map +1 -0
- package/dist/logger/default.js +28 -0
- package/dist/logger/default.js.map +1 -0
- package/dist/logger/index.d.ts +24 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +90 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/redact.d.ts +40 -0
- package/dist/logger/redact.d.ts.map +1 -0
- package/dist/logger/redact.js +178 -0
- package/dist/logger/redact.js.map +1 -0
- package/dist/logger/service.d.ts +14 -0
- package/dist/logger/service.d.ts.map +1 -0
- package/dist/logger/service.js +56 -0
- package/dist/logger/service.js.map +1 -0
- package/dist/logger/sinks.d.ts +37 -0
- package/dist/logger/sinks.d.ts.map +1 -0
- package/dist/logger/sinks.js +135 -0
- package/dist/logger/sinks.js.map +1 -0
- package/dist/logger/types.d.ts +47 -0
- package/dist/logger/types.d.ts.map +1 -0
- package/dist/logger/types.js +8 -0
- package/dist/logger/types.js.map +1 -0
- package/dist/notifications/index.d.ts +8 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +72 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/service.d.ts +79 -0
- package/dist/notifications/service.d.ts.map +1 -0
- package/dist/notifications/service.js +164 -0
- package/dist/notifications/service.js.map +1 -0
- package/dist/realtime/channels.d.ts +37 -0
- package/dist/realtime/channels.d.ts.map +1 -0
- package/dist/realtime/channels.js +58 -0
- package/dist/realtime/channels.js.map +1 -0
- package/dist/realtime/index.d.ts +19 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +118 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/postgres.d.ts +48 -0
- package/dist/realtime/postgres.d.ts.map +1 -0
- package/dist/realtime/postgres.js +151 -0
- package/dist/realtime/postgres.js.map +1 -0
- package/dist/realtime/service.d.ts +75 -0
- package/dist/realtime/service.d.ts.map +1 -0
- package/dist/realtime/service.js +103 -0
- package/dist/realtime/service.js.map +1 -0
- package/dist/realtime/sse.d.ts +55 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +123 -0
- package/dist/realtime/sse.js.map +1 -0
- package/dist/realtime/transport.d.ts +52 -0
- package/dist/realtime/transport.d.ts.map +1 -0
- package/dist/realtime/transport.js +2 -0
- package/dist/realtime/transport.js.map +1 -0
- package/dist/storage/index.d.ts +18 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +89 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/keys.d.ts +50 -0
- package/dist/storage/keys.d.ts.map +1 -0
- package/dist/storage/keys.js +120 -0
- package/dist/storage/keys.js.map +1 -0
- package/dist/storage/memory.d.ts +32 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +84 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/provider.d.ts +93 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +2 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/s3.d.ts +34 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +175 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/service.d.ts +86 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +107 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/sigv4.d.ts +58 -0
- package/dist/storage/sigv4.d.ts.map +1 -0
- package/dist/storage/sigv4.js +114 -0
- package/dist/storage/sigv4.js.map +1 -0
- package/dist/streams/client.d.ts +91 -0
- package/dist/streams/client.d.ts.map +1 -0
- package/dist/streams/client.js +128 -0
- package/dist/streams/client.js.map +1 -0
- package/dist/streams/events.d.ts +68 -0
- package/dist/streams/events.d.ts.map +1 -0
- package/dist/streams/events.js +81 -0
- package/dist/streams/events.js.map +1 -0
- package/dist/streams/index.d.ts +47 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +47 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/realtime.d.ts +27 -0
- package/dist/streams/realtime.d.ts.map +1 -0
- package/dist/streams/realtime.js +50 -0
- package/dist/streams/realtime.js.map +1 -0
- package/dist/streams/state.d.ts +26 -0
- package/dist/streams/state.d.ts.map +1 -0
- package/dist/streams/state.js +34 -0
- package/dist/streams/state.js.map +1 -0
- package/dist/users/index.d.ts +9 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +23 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/service.d.ts +43 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +113 -0
- package/dist/users/service.js.map +1 -0
- package/dist/webhooks/inbound.d.ts +70 -0
- package/dist/webhooks/inbound.d.ts.map +1 -0
- package/dist/webhooks/inbound.js +146 -0
- package/dist/webhooks/inbound.js.map +1 -0
- package/dist/webhooks/index.d.ts +12 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +65 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/outgoing.d.ts +89 -0
- package/dist/webhooks/outgoing.d.ts.map +1 -0
- package/dist/webhooks/outgoing.js +375 -0
- package/dist/webhooks/outgoing.js.map +1 -0
- package/dist/webhooks/signature.d.ts +40 -0
- package/dist/webhooks/signature.d.ts.map +1 -0
- package/dist/webhooks/signature.js +77 -0
- package/dist/webhooks/signature.js.map +1 -0
- package/dist/workspaces/context.d.ts +30 -0
- package/dist/workspaces/context.d.ts.map +1 -0
- package/dist/workspaces/context.js +12 -0
- package/dist/workspaces/context.js.map +1 -0
- package/dist/workspaces/index.d.ts +5 -0
- package/dist/workspaces/index.d.ts.map +1 -0
- package/dist/workspaces/index.js +21 -0
- package/dist/workspaces/index.js.map +1 -0
- package/dist/workspaces/service.d.ts +126 -0
- package/dist/workspaces/service.d.ts.map +1 -0
- package/dist/workspaces/service.js +495 -0
- package/dist/workspaces/service.js.map +1 -0
- package/docs/README.md +71 -0
- package/docs/api-keys.md +184 -0
- package/docs/audit.md +198 -0
- package/docs/auth.md +196 -0
- package/docs/authorization.md +225 -0
- package/docs/billing.md +293 -0
- package/docs/cli.md +238 -0
- package/docs/config.md +163 -0
- package/docs/db.md +219 -0
- package/docs/email.md +222 -0
- package/docs/entitlements.md +194 -0
- package/docs/errors.md +158 -0
- package/docs/events.md +279 -0
- package/docs/feature-flags.md +237 -0
- package/docs/files.md +229 -0
- package/docs/jobs.md +288 -0
- package/docs/logger.md +269 -0
- package/docs/notifications.md +179 -0
- package/docs/publishing.md +128 -0
- package/docs/realtime.md +360 -0
- package/docs/storage.md +279 -0
- package/docs/streams.md +296 -0
- package/docs/users.md +117 -0
- package/docs/webhooks.md +272 -0
- package/docs/workspaces.md +269 -0
- package/drizzle/0000_init_users.sql +21 -0
- package/drizzle/0001_workspaces_roles_permissions.sql +86 -0
- package/drizzle/0002_billing_entitlements.sql +97 -0
- package/drizzle/0003_events.sql +17 -0
- package/drizzle/0004_notifications_audit.sql +64 -0
- package/drizzle/0005_api_keys_webhooks.sql +77 -0
- package/drizzle/0006_feature_flags.sql +22 -0
- package/drizzle/0007_files.sql +23 -0
- package/drizzle/meta/0000_snapshot.json +160 -0
- package/drizzle/meta/0001_snapshot.json +837 -0
- package/drizzle/meta/0002_snapshot.json +1580 -0
- package/drizzle/meta/0003_snapshot.json +1751 -0
- package/drizzle/meta/0004_snapshot.json +2109 -0
- package/drizzle/meta/0005_snapshot.json +2719 -0
- package/drizzle/meta/0006_snapshot.json +2909 -0
- package/drizzle/meta/0007_snapshot.json +3113 -0
- package/drizzle/meta/_journal.json +62 -0
- package/package.json +180 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration section definitions.
|
|
4
|
+
*
|
|
5
|
+
* Each section's Zod schema is keyed by the *environment variable name* rather
|
|
6
|
+
* than the final property name. This makes validation errors name the exact
|
|
7
|
+
* variable an operator has to fix, and keeps the env-var-to-config mapping in
|
|
8
|
+
* one readable place. The `map` step then produces the ergonomic, camelCase
|
|
9
|
+
* shape that application code consumes.
|
|
10
|
+
*/
|
|
11
|
+
export interface SectionDefinition<TEnv extends z.ZodObject, TOut> {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
readonly env: TEnv;
|
|
14
|
+
readonly map: (env: z.output<TEnv>) => TOut;
|
|
15
|
+
}
|
|
16
|
+
export declare const appSection: SectionDefinition<z.ZodObject<{
|
|
17
|
+
APP_NAME: z.ZodString;
|
|
18
|
+
APP_URL: z.ZodURL;
|
|
19
|
+
APP_ENV: z.ZodDefault<z.ZodEnum<{
|
|
20
|
+
development: "development";
|
|
21
|
+
production: "production";
|
|
22
|
+
staging: "staging";
|
|
23
|
+
test: "test";
|
|
24
|
+
}>>;
|
|
25
|
+
LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
|
|
26
|
+
debug: "debug";
|
|
27
|
+
error: "error";
|
|
28
|
+
info: "info";
|
|
29
|
+
warn: "warn";
|
|
30
|
+
}>>;
|
|
31
|
+
}, z.core.$strip>, {
|
|
32
|
+
name: string;
|
|
33
|
+
url: string;
|
|
34
|
+
environment: "development" | "production" | "staging" | "test";
|
|
35
|
+
logLevel: "debug" | "error" | "info" | "warn";
|
|
36
|
+
isProduction: boolean;
|
|
37
|
+
}>;
|
|
38
|
+
export declare const databaseSection: SectionDefinition<z.ZodObject<{
|
|
39
|
+
DATABASE_URL: z.ZodString;
|
|
40
|
+
DATABASE_MAX_CONNECTIONS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
41
|
+
DATABASE_SSL: z.ZodDefault<z.ZodPipe<z.ZodEnum<{
|
|
42
|
+
0: "0";
|
|
43
|
+
1: "1";
|
|
44
|
+
false: "false";
|
|
45
|
+
true: "true";
|
|
46
|
+
}>, z.ZodTransform<boolean, "0" | "1" | "false" | "true">>>;
|
|
47
|
+
DATABASE_STATEMENT_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
48
|
+
DATABASE_PREPARED_STATEMENTS: z.ZodDefault<z.ZodPipe<z.ZodEnum<{
|
|
49
|
+
0: "0";
|
|
50
|
+
1: "1";
|
|
51
|
+
false: "false";
|
|
52
|
+
true: "true";
|
|
53
|
+
}>, z.ZodTransform<boolean, "0" | "1" | "false" | "true">>>;
|
|
54
|
+
}, z.core.$strip>, {
|
|
55
|
+
url: string;
|
|
56
|
+
maxConnections: number;
|
|
57
|
+
ssl: boolean;
|
|
58
|
+
statementTimeoutMs: number;
|
|
59
|
+
preparedStatements: boolean;
|
|
60
|
+
}>;
|
|
61
|
+
export declare const authSection: SectionDefinition<z.ZodObject<{
|
|
62
|
+
WORKOS_API_KEY: z.ZodString;
|
|
63
|
+
WORKOS_CLIENT_ID: z.ZodString;
|
|
64
|
+
WORKOS_COOKIE_PASSWORD: z.ZodString;
|
|
65
|
+
WORKOS_REDIRECT_URI: z.ZodURL;
|
|
66
|
+
}, z.core.$strip>, {
|
|
67
|
+
workosApiKey: string;
|
|
68
|
+
workosClientId: string;
|
|
69
|
+
cookiePassword: string;
|
|
70
|
+
redirectUri: string;
|
|
71
|
+
}>;
|
|
72
|
+
export declare const billingSection: SectionDefinition<z.ZodObject<{
|
|
73
|
+
REVOLUT_API_KEY: z.ZodString;
|
|
74
|
+
REVOLUT_WEBHOOK_SECRET: z.ZodString;
|
|
75
|
+
REVOLUT_API_URL: z.ZodDefault<z.ZodURL>;
|
|
76
|
+
}, z.core.$strip>, {
|
|
77
|
+
apiKey: string;
|
|
78
|
+
webhookSecret: string;
|
|
79
|
+
apiUrl: string;
|
|
80
|
+
}>;
|
|
81
|
+
export declare const emailSection: SectionDefinition<z.ZodObject<{
|
|
82
|
+
EMAIL_API_KEY: z.ZodString;
|
|
83
|
+
EMAIL_FROM_ADDRESS: z.ZodEmail;
|
|
84
|
+
EMAIL_FROM_NAME: z.ZodOptional<z.ZodString>;
|
|
85
|
+
}, z.core.$strip>, {
|
|
86
|
+
apiKey: string;
|
|
87
|
+
fromAddress: string;
|
|
88
|
+
fromName: string | undefined;
|
|
89
|
+
}>;
|
|
90
|
+
export declare const storageSection: SectionDefinition<z.ZodObject<{
|
|
91
|
+
STORAGE_BUCKET: z.ZodString;
|
|
92
|
+
STORAGE_REGION: z.ZodString;
|
|
93
|
+
STORAGE_ACCESS_KEY_ID: z.ZodString;
|
|
94
|
+
STORAGE_SECRET_ACCESS_KEY: z.ZodString;
|
|
95
|
+
STORAGE_ENDPOINT: z.ZodOptional<z.ZodURL>;
|
|
96
|
+
STORAGE_PUBLIC_URL: z.ZodOptional<z.ZodURL>;
|
|
97
|
+
}, z.core.$strip>, {
|
|
98
|
+
bucket: string;
|
|
99
|
+
region: string;
|
|
100
|
+
accessKeyId: string;
|
|
101
|
+
secretAccessKey: string;
|
|
102
|
+
endpoint: string | undefined;
|
|
103
|
+
publicUrl: string | undefined;
|
|
104
|
+
}>;
|
|
105
|
+
export declare const realtimeSection: SectionDefinition<z.ZodObject<{
|
|
106
|
+
REALTIME_URL: z.ZodURL;
|
|
107
|
+
REALTIME_API_KEY: z.ZodString;
|
|
108
|
+
}, z.core.$strip>, {
|
|
109
|
+
url: string;
|
|
110
|
+
apiKey: string;
|
|
111
|
+
}>;
|
|
112
|
+
export declare const jobsSection: SectionDefinition<z.ZodObject<{
|
|
113
|
+
TRIGGER_SECRET_KEY: z.ZodString;
|
|
114
|
+
TRIGGER_API_URL: z.ZodDefault<z.ZodURL>;
|
|
115
|
+
}, z.core.$strip>, {
|
|
116
|
+
secretKey: string;
|
|
117
|
+
apiUrl: string;
|
|
118
|
+
}>;
|
|
119
|
+
export declare const sections: {
|
|
120
|
+
readonly app: SectionDefinition<z.ZodObject<{
|
|
121
|
+
APP_NAME: z.ZodString;
|
|
122
|
+
APP_URL: z.ZodURL;
|
|
123
|
+
APP_ENV: z.ZodDefault<z.ZodEnum<{
|
|
124
|
+
development: "development";
|
|
125
|
+
production: "production";
|
|
126
|
+
staging: "staging";
|
|
127
|
+
test: "test";
|
|
128
|
+
}>>;
|
|
129
|
+
LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
|
|
130
|
+
debug: "debug";
|
|
131
|
+
error: "error";
|
|
132
|
+
info: "info";
|
|
133
|
+
warn: "warn";
|
|
134
|
+
}>>;
|
|
135
|
+
}, z.core.$strip>, {
|
|
136
|
+
name: string;
|
|
137
|
+
url: string;
|
|
138
|
+
environment: "development" | "production" | "staging" | "test";
|
|
139
|
+
logLevel: "debug" | "error" | "info" | "warn";
|
|
140
|
+
isProduction: boolean;
|
|
141
|
+
}>;
|
|
142
|
+
readonly database: SectionDefinition<z.ZodObject<{
|
|
143
|
+
DATABASE_URL: z.ZodString;
|
|
144
|
+
DATABASE_MAX_CONNECTIONS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
145
|
+
DATABASE_SSL: z.ZodDefault<z.ZodPipe<z.ZodEnum<{
|
|
146
|
+
0: "0";
|
|
147
|
+
1: "1";
|
|
148
|
+
false: "false";
|
|
149
|
+
true: "true";
|
|
150
|
+
}>, z.ZodTransform<boolean, "0" | "1" | "false" | "true">>>;
|
|
151
|
+
DATABASE_STATEMENT_TIMEOUT_MS: z.ZodDefault<z.ZodCoercedNumber<unknown>>;
|
|
152
|
+
DATABASE_PREPARED_STATEMENTS: z.ZodDefault<z.ZodPipe<z.ZodEnum<{
|
|
153
|
+
0: "0";
|
|
154
|
+
1: "1";
|
|
155
|
+
false: "false";
|
|
156
|
+
true: "true";
|
|
157
|
+
}>, z.ZodTransform<boolean, "0" | "1" | "false" | "true">>>;
|
|
158
|
+
}, z.core.$strip>, {
|
|
159
|
+
url: string;
|
|
160
|
+
maxConnections: number;
|
|
161
|
+
ssl: boolean;
|
|
162
|
+
statementTimeoutMs: number;
|
|
163
|
+
preparedStatements: boolean;
|
|
164
|
+
}>;
|
|
165
|
+
readonly auth: SectionDefinition<z.ZodObject<{
|
|
166
|
+
WORKOS_API_KEY: z.ZodString;
|
|
167
|
+
WORKOS_CLIENT_ID: z.ZodString;
|
|
168
|
+
WORKOS_COOKIE_PASSWORD: z.ZodString;
|
|
169
|
+
WORKOS_REDIRECT_URI: z.ZodURL;
|
|
170
|
+
}, z.core.$strip>, {
|
|
171
|
+
workosApiKey: string;
|
|
172
|
+
workosClientId: string;
|
|
173
|
+
cookiePassword: string;
|
|
174
|
+
redirectUri: string;
|
|
175
|
+
}>;
|
|
176
|
+
readonly billing: SectionDefinition<z.ZodObject<{
|
|
177
|
+
REVOLUT_API_KEY: z.ZodString;
|
|
178
|
+
REVOLUT_WEBHOOK_SECRET: z.ZodString;
|
|
179
|
+
REVOLUT_API_URL: z.ZodDefault<z.ZodURL>;
|
|
180
|
+
}, z.core.$strip>, {
|
|
181
|
+
apiKey: string;
|
|
182
|
+
webhookSecret: string;
|
|
183
|
+
apiUrl: string;
|
|
184
|
+
}>;
|
|
185
|
+
readonly email: SectionDefinition<z.ZodObject<{
|
|
186
|
+
EMAIL_API_KEY: z.ZodString;
|
|
187
|
+
EMAIL_FROM_ADDRESS: z.ZodEmail;
|
|
188
|
+
EMAIL_FROM_NAME: z.ZodOptional<z.ZodString>;
|
|
189
|
+
}, z.core.$strip>, {
|
|
190
|
+
apiKey: string;
|
|
191
|
+
fromAddress: string;
|
|
192
|
+
fromName: string | undefined;
|
|
193
|
+
}>;
|
|
194
|
+
readonly storage: SectionDefinition<z.ZodObject<{
|
|
195
|
+
STORAGE_BUCKET: z.ZodString;
|
|
196
|
+
STORAGE_REGION: z.ZodString;
|
|
197
|
+
STORAGE_ACCESS_KEY_ID: z.ZodString;
|
|
198
|
+
STORAGE_SECRET_ACCESS_KEY: z.ZodString;
|
|
199
|
+
STORAGE_ENDPOINT: z.ZodOptional<z.ZodURL>;
|
|
200
|
+
STORAGE_PUBLIC_URL: z.ZodOptional<z.ZodURL>;
|
|
201
|
+
}, z.core.$strip>, {
|
|
202
|
+
bucket: string;
|
|
203
|
+
region: string;
|
|
204
|
+
accessKeyId: string;
|
|
205
|
+
secretAccessKey: string;
|
|
206
|
+
endpoint: string | undefined;
|
|
207
|
+
publicUrl: string | undefined;
|
|
208
|
+
}>;
|
|
209
|
+
readonly realtime: SectionDefinition<z.ZodObject<{
|
|
210
|
+
REALTIME_URL: z.ZodURL;
|
|
211
|
+
REALTIME_API_KEY: z.ZodString;
|
|
212
|
+
}, z.core.$strip>, {
|
|
213
|
+
url: string;
|
|
214
|
+
apiKey: string;
|
|
215
|
+
}>;
|
|
216
|
+
readonly jobs: SectionDefinition<z.ZodObject<{
|
|
217
|
+
TRIGGER_SECRET_KEY: z.ZodString;
|
|
218
|
+
TRIGGER_API_URL: z.ZodDefault<z.ZodURL>;
|
|
219
|
+
}, z.core.$strip>, {
|
|
220
|
+
secretKey: string;
|
|
221
|
+
apiUrl: string;
|
|
222
|
+
}>;
|
|
223
|
+
};
|
|
224
|
+
export type SectionName = keyof typeof sections;
|
|
225
|
+
export declare const sectionNames: SectionName[];
|
|
226
|
+
//# sourceMappingURL=sections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.d.ts","sourceRoot":"","sources":["../../src/config/sections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;GAQG;AAEH,MAAM,WAAW,iBAAiB,CAAC,IAAI,SAAS,CAAC,CAAC,SAAS,EAAE,IAAI;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC;IACnB,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;CAC7C;AA6BD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;EAetB,CAAC;AAMF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;EAqB3B,CAAC;AAMF,eAAO,MAAM,WAAW;;;;;;;;;;EAevB,CAAC;AAMF,eAAO,MAAM,cAAc;;;;;;;;EAY1B,CAAC;AAOF,eAAO,MAAM,YAAY;;;;;;;;EAYxB,CAAC;AAMF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;EAoB1B,CAAC;AAMF,eAAO,MAAM,eAAe;;;;;;EAW3B,CAAC;AAMF,eAAO,MAAM,WAAW;;;;;;EAUvB,CAAC;AAEF,eAAO,MAAM,QAAQ;aACnB,GAAG;;;;;;;;;;;;;;;;;;;;;;aACH,QAAQ;;;;;;;;;;;;;;;;;;;;;;;aACR,IAAI;;;;;;;;;;;aACJ,OAAO;;;;;;;;;aACP,KAAK;;;;;;;;;aACL,OAAO;;;;;;;;;;;;;;;aACP,QAAQ;;;;;;;aACR,IAAI;;;;;;;CACI,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,QAAQ,CAAC;AAEhD,eAAO,MAAM,YAAY,EAA4B,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
function defineSection(name, env, map) {
|
|
3
|
+
return { name, env, map };
|
|
4
|
+
}
|
|
5
|
+
/** Environment variables carry strings; accept the usual truthy spellings. */
|
|
6
|
+
const envBoolean = z
|
|
7
|
+
.enum(["true", "false", "1", "0"])
|
|
8
|
+
.transform((value) => value === "true" || value === "1");
|
|
9
|
+
const envInt = z.coerce.number().int().positive();
|
|
10
|
+
const postgresUrl = z
|
|
11
|
+
.string()
|
|
12
|
+
.min(1)
|
|
13
|
+
.refine((value) => value.startsWith("postgres://") || value.startsWith("postgresql://"), { message: "must be a postgres:// or postgresql:// connection string" });
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// app
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export const appSection = defineSection("app", z.object({
|
|
18
|
+
APP_NAME: z.string().min(1),
|
|
19
|
+
APP_URL: z.url(),
|
|
20
|
+
APP_ENV: z.enum(["development", "test", "staging", "production"]).default("development"),
|
|
21
|
+
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
|
|
22
|
+
}), (env) => ({
|
|
23
|
+
name: env.APP_NAME,
|
|
24
|
+
url: env.APP_URL,
|
|
25
|
+
environment: env.APP_ENV,
|
|
26
|
+
logLevel: env.LOG_LEVEL,
|
|
27
|
+
isProduction: env.APP_ENV === "production",
|
|
28
|
+
}));
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// database
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
export const databaseSection = defineSection("database", z.object({
|
|
33
|
+
DATABASE_URL: postgresUrl,
|
|
34
|
+
DATABASE_MAX_CONNECTIONS: envInt.default(10),
|
|
35
|
+
DATABASE_SSL: envBoolean.default(false),
|
|
36
|
+
DATABASE_STATEMENT_TIMEOUT_MS: envInt.default(30_000),
|
|
37
|
+
/**
|
|
38
|
+
* Set to `false` behind a transaction-pooling proxy (pgBouncer, Supabase
|
|
39
|
+
* or Neon pooler). Prepared statements are per-session and break when the
|
|
40
|
+
* proxy multiplexes sessions across connections.
|
|
41
|
+
*/
|
|
42
|
+
DATABASE_PREPARED_STATEMENTS: envBoolean.default(true),
|
|
43
|
+
}), (env) => ({
|
|
44
|
+
url: env.DATABASE_URL,
|
|
45
|
+
maxConnections: env.DATABASE_MAX_CONNECTIONS,
|
|
46
|
+
ssl: env.DATABASE_SSL,
|
|
47
|
+
statementTimeoutMs: env.DATABASE_STATEMENT_TIMEOUT_MS,
|
|
48
|
+
preparedStatements: env.DATABASE_PREPARED_STATEMENTS,
|
|
49
|
+
}));
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// auth (WorkOS)
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
export const authSection = defineSection("auth", z.object({
|
|
54
|
+
WORKOS_API_KEY: z.string().min(1),
|
|
55
|
+
WORKOS_CLIENT_ID: z.string().min(1),
|
|
56
|
+
// WorkOS seals session cookies with this key and requires >= 32 bytes.
|
|
57
|
+
WORKOS_COOKIE_PASSWORD: z.string().min(32),
|
|
58
|
+
WORKOS_REDIRECT_URI: z.url(),
|
|
59
|
+
}), (env) => ({
|
|
60
|
+
workosApiKey: env.WORKOS_API_KEY,
|
|
61
|
+
workosClientId: env.WORKOS_CLIENT_ID,
|
|
62
|
+
cookiePassword: env.WORKOS_COOKIE_PASSWORD,
|
|
63
|
+
redirectUri: env.WORKOS_REDIRECT_URI,
|
|
64
|
+
}));
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// billing (Revolut)
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
export const billingSection = defineSection("billing", z.object({
|
|
69
|
+
REVOLUT_API_KEY: z.string().min(1),
|
|
70
|
+
REVOLUT_WEBHOOK_SECRET: z.string().min(1),
|
|
71
|
+
REVOLUT_API_URL: z.url().default("https://merchant.revolut.com"),
|
|
72
|
+
}), (env) => ({
|
|
73
|
+
apiKey: env.REVOLUT_API_KEY,
|
|
74
|
+
webhookSecret: env.REVOLUT_WEBHOOK_SECRET,
|
|
75
|
+
apiUrl: env.REVOLUT_API_URL,
|
|
76
|
+
}));
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// email
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
export const emailSection = defineSection("email", z.object({
|
|
81
|
+
EMAIL_API_KEY: z.string().min(1),
|
|
82
|
+
EMAIL_FROM_ADDRESS: z.email(),
|
|
83
|
+
EMAIL_FROM_NAME: z.string().min(1).optional(),
|
|
84
|
+
}), (env) => ({
|
|
85
|
+
apiKey: env.EMAIL_API_KEY,
|
|
86
|
+
fromAddress: env.EMAIL_FROM_ADDRESS,
|
|
87
|
+
fromName: env.EMAIL_FROM_NAME,
|
|
88
|
+
}));
|
|
89
|
+
// ---------------------------------------------------------------------------
|
|
90
|
+
// storage
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
export const storageSection = defineSection("storage", z.object({
|
|
93
|
+
STORAGE_BUCKET: z.string().min(1),
|
|
94
|
+
STORAGE_REGION: z.string().min(1),
|
|
95
|
+
STORAGE_ACCESS_KEY_ID: z.string().min(1),
|
|
96
|
+
STORAGE_SECRET_ACCESS_KEY: z.string().min(1),
|
|
97
|
+
/** Set for S3-compatible providers (R2, MinIO, Backblaze). */
|
|
98
|
+
STORAGE_ENDPOINT: z.url().optional(),
|
|
99
|
+
/** CDN or public base URL used to build object URLs. */
|
|
100
|
+
STORAGE_PUBLIC_URL: z.url().optional(),
|
|
101
|
+
}), (env) => ({
|
|
102
|
+
bucket: env.STORAGE_BUCKET,
|
|
103
|
+
region: env.STORAGE_REGION,
|
|
104
|
+
accessKeyId: env.STORAGE_ACCESS_KEY_ID,
|
|
105
|
+
secretAccessKey: env.STORAGE_SECRET_ACCESS_KEY,
|
|
106
|
+
endpoint: env.STORAGE_ENDPOINT,
|
|
107
|
+
publicUrl: env.STORAGE_PUBLIC_URL,
|
|
108
|
+
}));
|
|
109
|
+
// ---------------------------------------------------------------------------
|
|
110
|
+
// realtime
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
export const realtimeSection = defineSection("realtime", z.object({
|
|
113
|
+
/** Server-side transport endpoint used to publish events. */
|
|
114
|
+
REALTIME_URL: z.url(),
|
|
115
|
+
REALTIME_API_KEY: z.string().min(1),
|
|
116
|
+
}), (env) => ({
|
|
117
|
+
url: env.REALTIME_URL,
|
|
118
|
+
apiKey: env.REALTIME_API_KEY,
|
|
119
|
+
}));
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
// jobs (Trigger.dev)
|
|
122
|
+
// ---------------------------------------------------------------------------
|
|
123
|
+
export const jobsSection = defineSection("jobs", z.object({
|
|
124
|
+
TRIGGER_SECRET_KEY: z.string().min(1),
|
|
125
|
+
TRIGGER_API_URL: z.url().default("https://api.trigger.dev"),
|
|
126
|
+
}), (env) => ({
|
|
127
|
+
secretKey: env.TRIGGER_SECRET_KEY,
|
|
128
|
+
apiUrl: env.TRIGGER_API_URL,
|
|
129
|
+
}));
|
|
130
|
+
export const sections = {
|
|
131
|
+
app: appSection,
|
|
132
|
+
database: databaseSection,
|
|
133
|
+
auth: authSection,
|
|
134
|
+
billing: billingSection,
|
|
135
|
+
email: emailSection,
|
|
136
|
+
storage: storageSection,
|
|
137
|
+
realtime: realtimeSection,
|
|
138
|
+
jobs: jobsSection,
|
|
139
|
+
};
|
|
140
|
+
export const sectionNames = Object.keys(sections);
|
|
141
|
+
//# sourceMappingURL=sections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/config/sections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type PostgresJsDatabase } from "drizzle-orm/postgres-js";
|
|
2
|
+
import postgres from "postgres";
|
|
3
|
+
import * as schema from "./schema/index.ts";
|
|
4
|
+
export type Schema = typeof schema;
|
|
5
|
+
/** Drizzle database handle, typed against the full core schema. */
|
|
6
|
+
export type Database = PostgresJsDatabase<Schema>;
|
|
7
|
+
export interface DatabaseConnectionOptions {
|
|
8
|
+
/** PostgreSQL connection string. */
|
|
9
|
+
url: string;
|
|
10
|
+
/** Maximum pool size. */
|
|
11
|
+
maxConnections?: number;
|
|
12
|
+
ssl?: boolean;
|
|
13
|
+
/** Server-side `statement_timeout`, in milliseconds. */
|
|
14
|
+
statementTimeoutMs?: number;
|
|
15
|
+
/** Disable behind a transaction-pooling proxy. See `DATABASE_PREPARED_STATEMENTS`. */
|
|
16
|
+
preparedStatements?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface DatabaseHandle {
|
|
19
|
+
readonly db: Database;
|
|
20
|
+
/** Underlying postgres.js client, for `LISTEN`/`NOTIFY` and raw SQL. */
|
|
21
|
+
readonly client: postgres.Sql;
|
|
22
|
+
/** Drain the pool. Call on shutdown, and in tests. */
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create an explicitly configured database handle.
|
|
27
|
+
*
|
|
28
|
+
* Use this when a caller must own the connection lifecycle — migrations, tests,
|
|
29
|
+
* one-off scripts. Application code should use {@link getDatabase}.
|
|
30
|
+
*/
|
|
31
|
+
export declare function createDatabase(options: DatabaseConnectionOptions): DatabaseHandle;
|
|
32
|
+
/**
|
|
33
|
+
* The shared, configuration-driven database handle.
|
|
34
|
+
*
|
|
35
|
+
* Reads the `database` configuration section on first call, which throws a
|
|
36
|
+
* `ConfigError` if the database is not configured.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getDatabase(): Database;
|
|
39
|
+
/** As {@link getDatabase}, but exposes the raw client and lifecycle. */
|
|
40
|
+
export declare function getDatabaseHandle(): DatabaseHandle;
|
|
41
|
+
/** Close and forget the shared handle. For shutdown hooks and tests. */
|
|
42
|
+
export declare function closeDatabase(): Promise<void>;
|
|
43
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,QAAQ,MAAM,UAAU,CAAC;AAIhC,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAI5C,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAEnC,mEAAmE;AACnE,MAAM,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;IAC9B,sDAAsD;IACtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,cAAc,CA2BjF;AAeD;;;;;GAKG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,IAAI,cAAc,CAkBlD;AAED,wEAAwE;AACxE,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CASnD"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { drizzle } from "drizzle-orm/postgres-js";
|
|
2
|
+
import postgres from "postgres";
|
|
3
|
+
import { config } from "../config/index.js";
|
|
4
|
+
import { assertServerRuntime } from "../config/runtime.js";
|
|
5
|
+
import * as schema from "./schema/index.js";
|
|
6
|
+
assertServerRuntime("@digimuza/saas-core/db");
|
|
7
|
+
/**
|
|
8
|
+
* Create an explicitly configured database handle.
|
|
9
|
+
*
|
|
10
|
+
* Use this when a caller must own the connection lifecycle — migrations, tests,
|
|
11
|
+
* one-off scripts. Application code should use {@link getDatabase}.
|
|
12
|
+
*/
|
|
13
|
+
export function createDatabase(options) {
|
|
14
|
+
const { url, maxConnections = 10, ssl = false, statementTimeoutMs = 30_000, preparedStatements = true, } = options;
|
|
15
|
+
const client = postgres(url, {
|
|
16
|
+
max: maxConnections,
|
|
17
|
+
ssl,
|
|
18
|
+
prepare: preparedStatements,
|
|
19
|
+
connection: {
|
|
20
|
+
// Applied per connection, so a runaway query cannot hold a pool slot
|
|
21
|
+
// indefinitely.
|
|
22
|
+
statement_timeout: statementTimeoutMs,
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
const db = drizzle(client, { schema });
|
|
26
|
+
return {
|
|
27
|
+
db,
|
|
28
|
+
client,
|
|
29
|
+
close: () => client.end(),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Process-wide handle cache.
|
|
34
|
+
*
|
|
35
|
+
* Keyed on `globalThis` because Next.js dev-mode hot reloading re-evaluates
|
|
36
|
+
* modules on every edit. Without this, each edit would leak a connection pool
|
|
37
|
+
* until PostgreSQL refuses new connections.
|
|
38
|
+
*/
|
|
39
|
+
const HANDLE_KEY = Symbol.for("@digimuza/saas-core.database");
|
|
40
|
+
/**
|
|
41
|
+
* The shared, configuration-driven database handle.
|
|
42
|
+
*
|
|
43
|
+
* Reads the `database` configuration section on first call, which throws a
|
|
44
|
+
* `ConfigError` if the database is not configured.
|
|
45
|
+
*/
|
|
46
|
+
export function getDatabase() {
|
|
47
|
+
return getDatabaseHandle().db;
|
|
48
|
+
}
|
|
49
|
+
/** As {@link getDatabase}, but exposes the raw client and lifecycle. */
|
|
50
|
+
export function getDatabaseHandle() {
|
|
51
|
+
const carrier = globalThis;
|
|
52
|
+
const existing = carrier[HANDLE_KEY];
|
|
53
|
+
if (existing !== undefined) {
|
|
54
|
+
return existing;
|
|
55
|
+
}
|
|
56
|
+
const { url, maxConnections, ssl, statementTimeoutMs, preparedStatements } = config.database;
|
|
57
|
+
const handle = createDatabase({
|
|
58
|
+
url,
|
|
59
|
+
maxConnections,
|
|
60
|
+
ssl,
|
|
61
|
+
statementTimeoutMs,
|
|
62
|
+
preparedStatements,
|
|
63
|
+
});
|
|
64
|
+
carrier[HANDLE_KEY] = handle;
|
|
65
|
+
return handle;
|
|
66
|
+
}
|
|
67
|
+
/** Close and forget the shared handle. For shutdown hooks and tests. */
|
|
68
|
+
export async function closeDatabase() {
|
|
69
|
+
const carrier = globalThis;
|
|
70
|
+
const handle = carrier[HANDLE_KEY];
|
|
71
|
+
if (handle === undefined) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
delete carrier[HANDLE_KEY];
|
|
75
|
+
await handle.close();
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,MAAM,yBAAyB,CAAC;AAC3E,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAE5C,mBAAmB,CAAC,wBAAwB,CAAC,CAAC;AA2B9C;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAkC;IAC/D,MAAM,EACJ,GAAG,EACH,cAAc,GAAG,EAAE,EACnB,GAAG,GAAG,KAAK,EACX,kBAAkB,GAAG,MAAM,EAC3B,kBAAkB,GAAG,IAAI,GAC1B,GAAG,OAAO,CAAC;IAEZ,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE;QAC3B,GAAG,EAAE,cAAc;QACnB,GAAG;QACH,OAAO,EAAE,kBAAkB;QAC3B,UAAU,EAAE;YACV,qEAAqE;YACrE,gBAAgB;YAChB,iBAAiB,EAAE,kBAAkB;SACtC;KACF,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,OAAO;QACL,EAAE;QACF,MAAM;QACN,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAM9D;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,iBAAiB,EAAE,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,UAA2B,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC7F,MAAM,MAAM,GAAG,cAAc,CAAC;QAC5B,GAAG;QACH,cAAc;QACd,GAAG;QACH,kBAAkB;QAClB,kBAAkB;KACnB,CAAC,CAAC;IAEH,OAAO,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,OAAO,GAAG,UAA2B,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL error introspection.
|
|
3
|
+
*
|
|
4
|
+
* Constraint violations are how this schema enforces tenant isolation, so
|
|
5
|
+
* services need to tell "duplicate slug" from "cross-workspace role" from an
|
|
6
|
+
* unrelated failure. That means reading the SQLSTATE code and constraint name.
|
|
7
|
+
*
|
|
8
|
+
* Where those live depends on the driver, and they are not always on the error
|
|
9
|
+
* that reaches the caller:
|
|
10
|
+
*
|
|
11
|
+
* - postgres.js puts `code` and `constraint_name` on the thrown error.
|
|
12
|
+
* - Drizzle's PGlite driver wraps the driver error, exposing `code` and
|
|
13
|
+
* `constraint` on `error.cause`.
|
|
14
|
+
*
|
|
15
|
+
* So the chain is walked and both spellings are accepted.
|
|
16
|
+
*/
|
|
17
|
+
/** SQLSTATE class 23 — integrity constraint violation. */
|
|
18
|
+
export declare const PG_UNIQUE_VIOLATION = "23505";
|
|
19
|
+
export declare const PG_FOREIGN_KEY_VIOLATION = "23503";
|
|
20
|
+
export declare const PG_NOT_NULL_VIOLATION = "23502";
|
|
21
|
+
export declare const PG_CHECK_VIOLATION = "23514";
|
|
22
|
+
export interface PostgresErrorInfo {
|
|
23
|
+
readonly code: string;
|
|
24
|
+
readonly constraint?: string;
|
|
25
|
+
readonly table?: string;
|
|
26
|
+
readonly detail?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extract PostgreSQL error details from anywhere in an error's cause chain.
|
|
30
|
+
*
|
|
31
|
+
* Returns `undefined` for errors that are not PostgreSQL integrity failures, so
|
|
32
|
+
* callers can rethrow anything they do not recognise rather than swallowing it.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getPostgresError(error: unknown): PostgresErrorInfo | undefined;
|
|
35
|
+
/** True for a unique-constraint violation, optionally on a named constraint. */
|
|
36
|
+
export declare function isUniqueViolation(error: unknown, constraint?: string): boolean;
|
|
37
|
+
/** True for a foreign-key violation, optionally on a named constraint. */
|
|
38
|
+
export declare function isForeignKeyViolation(error: unknown, constraint?: string): boolean;
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0DAA0D;AAC1D,eAAO,MAAM,mBAAmB,UAAU,CAAC;AAC3C,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAC7C,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAgBD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAyB9E;AAUD,gFAAgF;AAChF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9E;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAElF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL error introspection.
|
|
3
|
+
*
|
|
4
|
+
* Constraint violations are how this schema enforces tenant isolation, so
|
|
5
|
+
* services need to tell "duplicate slug" from "cross-workspace role" from an
|
|
6
|
+
* unrelated failure. That means reading the SQLSTATE code and constraint name.
|
|
7
|
+
*
|
|
8
|
+
* Where those live depends on the driver, and they are not always on the error
|
|
9
|
+
* that reaches the caller:
|
|
10
|
+
*
|
|
11
|
+
* - postgres.js puts `code` and `constraint_name` on the thrown error.
|
|
12
|
+
* - Drizzle's PGlite driver wraps the driver error, exposing `code` and
|
|
13
|
+
* `constraint` on `error.cause`.
|
|
14
|
+
*
|
|
15
|
+
* So the chain is walked and both spellings are accepted.
|
|
16
|
+
*/
|
|
17
|
+
/** SQLSTATE class 23 — integrity constraint violation. */
|
|
18
|
+
export const PG_UNIQUE_VIOLATION = "23505";
|
|
19
|
+
export const PG_FOREIGN_KEY_VIOLATION = "23503";
|
|
20
|
+
export const PG_NOT_NULL_VIOLATION = "23502";
|
|
21
|
+
export const PG_CHECK_VIOLATION = "23514";
|
|
22
|
+
function asString(value) {
|
|
23
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Extract PostgreSQL error details from anywhere in an error's cause chain.
|
|
27
|
+
*
|
|
28
|
+
* Returns `undefined` for errors that are not PostgreSQL integrity failures, so
|
|
29
|
+
* callers can rethrow anything they do not recognise rather than swallowing it.
|
|
30
|
+
*/
|
|
31
|
+
export function getPostgresError(error) {
|
|
32
|
+
let current = error;
|
|
33
|
+
// Bounded so a cyclic `cause` chain cannot spin forever.
|
|
34
|
+
for (let depth = 0; current !== null && current !== undefined && depth < 8; depth += 1) {
|
|
35
|
+
const candidate = current;
|
|
36
|
+
const code = asString(candidate.code);
|
|
37
|
+
if (code !== undefined) {
|
|
38
|
+
const constraint = asString(candidate.constraint) ?? asString(candidate.constraint_name);
|
|
39
|
+
const table = asString(candidate.table) ?? asString(candidate.table_name);
|
|
40
|
+
const detail = asString(candidate.detail);
|
|
41
|
+
return {
|
|
42
|
+
code,
|
|
43
|
+
...(constraint !== undefined ? { constraint } : {}),
|
|
44
|
+
...(table !== undefined ? { table } : {}),
|
|
45
|
+
...(detail !== undefined ? { detail } : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
current = candidate.cause;
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function matches(error, code, constraint) {
|
|
53
|
+
const info = getPostgresError(error);
|
|
54
|
+
if (info?.code !== code) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return constraint === undefined || info.constraint === constraint;
|
|
58
|
+
}
|
|
59
|
+
/** True for a unique-constraint violation, optionally on a named constraint. */
|
|
60
|
+
export function isUniqueViolation(error, constraint) {
|
|
61
|
+
return matches(error, PG_UNIQUE_VIOLATION, constraint);
|
|
62
|
+
}
|
|
63
|
+
/** True for a foreign-key violation, optionally on a named constraint. */
|
|
64
|
+
export function isForeignKeyViolation(error, constraint) {
|
|
65
|
+
return matches(error, PG_FOREIGN_KEY_VIOLATION, constraint);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/db/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,OAAO,CAAC;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,OAAO,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAmB1C,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,GAAY,KAAK,CAAC;IAE7B,yDAAyD;IACzD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACvF,MAAM,SAAS,GAAG,OAA2B,CAAC;QAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACzF,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAE1C,OAAO;gBACL,IAAI;gBACJ,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnD,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5C,CAAC;QACJ,CAAC;QAED,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC;IAC5B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,OAAO,CAAC,KAAc,EAAE,IAAY,EAAE,UAAmB;IAChE,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC;AACpE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAE,UAAmB;IACnE,OAAO,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,qBAAqB,CAAC,KAAc,EAAE,UAAmB;IACvE,OAAO,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE,UAAU,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public database surface: `@digimuza/saas-core/db`.
|
|
3
|
+
*
|
|
4
|
+
* Server-only. Table definitions alone are available from
|
|
5
|
+
* `@digimuza/saas-core/db/schema`, which pulls in no configuration or driver.
|
|
6
|
+
*/
|
|
7
|
+
export { closeDatabase, createDatabase, getDatabase, getDatabaseHandle, type Database, type DatabaseConnectionOptions, type DatabaseHandle, type Schema, } from "./client.ts";
|
|
8
|
+
export { coreMigrationsFolder, runMigrations, type RunMigrationsOptions } from "./migrate.ts";
|
|
9
|
+
export * as schema from "./schema/index.ts";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,KAAK,QAAQ,EACb,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,MAAM,GACZ,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE9F,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
|
package/dist/db/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public database surface: `@digimuza/saas-core/db`.
|
|
3
|
+
*
|
|
4
|
+
* Server-only. Table definitions alone are available from
|
|
5
|
+
* `@digimuza/saas-core/db/schema`, which pulls in no configuration or driver.
|
|
6
|
+
*/
|
|
7
|
+
export { closeDatabase, createDatabase, getDatabase, getDatabaseHandle, } from "./client.js";
|
|
8
|
+
export { coreMigrationsFolder, runMigrations } from "./migrate.js";
|
|
9
|
+
export * as schema from "./schema/index.js";
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,cAAc,EACd,WAAW,EACX,iBAAiB,GAKlB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAA6B,MAAM,cAAc,CAAC;AAE9F,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC"}
|