@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,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migrations ship with the package (`files: ["drizzle"]`), so an application can
|
|
3
|
+
* apply core migrations without vendoring the SQL. Resolved relative to this
|
|
4
|
+
* module so it works from both `src/` and `dist/`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const coreMigrationsFolder: string;
|
|
7
|
+
export interface RunMigrationsOptions {
|
|
8
|
+
/** Connection string. Falls back to the `database` configuration section. */
|
|
9
|
+
url?: string;
|
|
10
|
+
/** Override the migrations directory. Defaults to the core migrations. */
|
|
11
|
+
migrationsFolder?: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Apply core migrations, then close the connection.
|
|
15
|
+
*
|
|
16
|
+
* Uses a dedicated single connection rather than the shared pool: migrations
|
|
17
|
+
* take advisory locks and must not compete with application traffic, and the
|
|
18
|
+
* process running them is usually short-lived.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runMigrations(options?: RunMigrationsOptions): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,QAA2D,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWrF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
2
|
+
import { migrate } from "drizzle-orm/postgres-js/migrator";
|
|
3
|
+
import { createDatabase } from "./client.js";
|
|
4
|
+
/**
|
|
5
|
+
* Migrations ship with the package (`files: ["drizzle"]`), so an application can
|
|
6
|
+
* apply core migrations without vendoring the SQL. Resolved relative to this
|
|
7
|
+
* module so it works from both `src/` and `dist/`.
|
|
8
|
+
*/
|
|
9
|
+
export const coreMigrationsFolder = fileURLToPath(new URL("../../drizzle", import.meta.url));
|
|
10
|
+
/**
|
|
11
|
+
* Apply core migrations, then close the connection.
|
|
12
|
+
*
|
|
13
|
+
* Uses a dedicated single connection rather than the shared pool: migrations
|
|
14
|
+
* take advisory locks and must not compete with application traffic, and the
|
|
15
|
+
* process running them is usually short-lived.
|
|
16
|
+
*/
|
|
17
|
+
export async function runMigrations(options = {}) {
|
|
18
|
+
const url = options.url ?? (await import("../config/index.js")).config.database.url;
|
|
19
|
+
const migrationsFolder = options.migrationsFolder ?? coreMigrationsFolder;
|
|
20
|
+
const handle = createDatabase({ url, maxConnections: 1 });
|
|
21
|
+
try {
|
|
22
|
+
await migrate(handle.db, { migrationsFolder });
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
await handle.close();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAS7F;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAO,GAAyB,EAAE;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;IACpF,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,oBAAoB,CAAC;IAE1E,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACjD,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared column conventions for every core-owned table.
|
|
3
|
+
*
|
|
4
|
+
* Conventions this package follows, and that product applications should follow
|
|
5
|
+
* for their own tables so the two halves of the schema stay coherent:
|
|
6
|
+
*
|
|
7
|
+
* - Table and column names are `snake_case` and written **explicitly**. Nothing
|
|
8
|
+
* relies on Drizzle's `casing` inference, so a rename is always a visible diff.
|
|
9
|
+
* - Primary keys are UUIDs generated by PostgreSQL (`gen_random_uuid()`), not
|
|
10
|
+
* sequential integers: identifiers appear in URLs and API payloads, and
|
|
11
|
+
* sequential ids leak volume and allow enumeration across tenants.
|
|
12
|
+
* - Timestamps are `timestamptz`. Never store naive local time.
|
|
13
|
+
* - Every tenant-scoped table carries `workspace_id` and enforces isolation with
|
|
14
|
+
* a foreign key; tenancy is never inferred from a join path alone.
|
|
15
|
+
*/
|
|
16
|
+
/** Standard UUID primary key, generated by PostgreSQL. */
|
|
17
|
+
export declare const primaryId: () => import("drizzle-orm").IsPrimaryKey<import("drizzle-orm").NotNull<import("drizzle-orm").HasDefault<import("drizzle-orm/pg-core").PgUUIDBuilderInitial<"id">>>>;
|
|
18
|
+
/**
|
|
19
|
+
* `created_at` / `updated_at` pair.
|
|
20
|
+
*
|
|
21
|
+
* `updated_at` is maintained by Drizzle on update. It is intentionally *not* a
|
|
22
|
+
* database trigger: writes that bypass the application (manual SQL, data
|
|
23
|
+
* repairs) should be visible as a stale timestamp rather than silently
|
|
24
|
+
* rewritten.
|
|
25
|
+
*/
|
|
26
|
+
export declare const timestamps: {
|
|
27
|
+
createdAt: import("drizzle-orm").HasDefault<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTimestampBuilderInitial<"created_at">>>;
|
|
28
|
+
updatedAt: import("drizzle-orm").HasDefault<import("drizzle-orm").HasDefault<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTimestampBuilderInitial<"updated_at">>>>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=_shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.d.ts","sourceRoot":"","sources":["../../../src/db/schema/_shared.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AAEH,0DAA0D;AAC1D,eAAO,MAAM,SAAS,qKAAgD,CAAC;AAEvE;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU;IACrB,SAAS;IAGT,SAAS;CAIV,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { timestamp, uuid } from "drizzle-orm/pg-core";
|
|
2
|
+
/**
|
|
3
|
+
* Shared column conventions for every core-owned table.
|
|
4
|
+
*
|
|
5
|
+
* Conventions this package follows, and that product applications should follow
|
|
6
|
+
* for their own tables so the two halves of the schema stay coherent:
|
|
7
|
+
*
|
|
8
|
+
* - Table and column names are `snake_case` and written **explicitly**. Nothing
|
|
9
|
+
* relies on Drizzle's `casing` inference, so a rename is always a visible diff.
|
|
10
|
+
* - Primary keys are UUIDs generated by PostgreSQL (`gen_random_uuid()`), not
|
|
11
|
+
* sequential integers: identifiers appear in URLs and API payloads, and
|
|
12
|
+
* sequential ids leak volume and allow enumeration across tenants.
|
|
13
|
+
* - Timestamps are `timestamptz`. Never store naive local time.
|
|
14
|
+
* - Every tenant-scoped table carries `workspace_id` and enforces isolation with
|
|
15
|
+
* a foreign key; tenancy is never inferred from a join path alone.
|
|
16
|
+
*/
|
|
17
|
+
/** Standard UUID primary key, generated by PostgreSQL. */
|
|
18
|
+
export const primaryId = () => uuid("id").defaultRandom().primaryKey();
|
|
19
|
+
/**
|
|
20
|
+
* `created_at` / `updated_at` pair.
|
|
21
|
+
*
|
|
22
|
+
* `updated_at` is maintained by Drizzle on update. It is intentionally *not* a
|
|
23
|
+
* database trigger: writes that bypass the application (manual SQL, data
|
|
24
|
+
* repairs) should be visible as a stale timestamp rather than silently
|
|
25
|
+
* rewritten.
|
|
26
|
+
*/
|
|
27
|
+
export const timestamps = {
|
|
28
|
+
createdAt: timestamp("created_at", { withTimezone: true, mode: "date" })
|
|
29
|
+
.notNull()
|
|
30
|
+
.defaultNow(),
|
|
31
|
+
updatedAt: timestamp("updated_at", { withTimezone: true, mode: "date" })
|
|
32
|
+
.notNull()
|
|
33
|
+
.defaultNow()
|
|
34
|
+
.$onUpdate(() => new Date()),
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=_shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_shared.js","sourceRoot":"","sources":["../../../src/db/schema/_shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AAEH,0DAA0D;AAC1D,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,CAAC;AAEvE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACrE,OAAO,EAAE;SACT,UAAU,EAAE;IACf,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;SACrE,OAAO,EAAE;SACT,UAAU,EAAE;SACZ,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;CAC/B,CAAC"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A workspace-scoped API key.
|
|
3
|
+
*
|
|
4
|
+
* ## How a key is stored
|
|
5
|
+
*
|
|
6
|
+
* A presented key looks like `dgk_<keyId>_<secret>`. Only `key_id` is stored in
|
|
7
|
+
* the clear; `key_hash` is a SHA-256 digest of the secret half.
|
|
8
|
+
*
|
|
9
|
+
* The split exists so validation is a single indexed lookup. Hashing the whole key
|
|
10
|
+
* would mean either scanning every row's hash or storing a searchable copy — the
|
|
11
|
+
* first is O(n) on every API request, the second defeats the point of hashing.
|
|
12
|
+
*
|
|
13
|
+
* ## Why SHA-256 and not bcrypt
|
|
14
|
+
*
|
|
15
|
+
* The secret is 256 bits of CSPRNG output, so there is no dictionary to attack and
|
|
16
|
+
* no need for a slow KDF. bcrypt or Argon2 exist to make *low-entropy* human
|
|
17
|
+
* passwords expensive to guess; applying one here would add tens of milliseconds
|
|
18
|
+
* to every authenticated request and buy nothing.
|
|
19
|
+
*/
|
|
20
|
+
export declare const apiKeys: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
21
|
+
name: "api_keys";
|
|
22
|
+
schema: undefined;
|
|
23
|
+
columns: {
|
|
24
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
|
+
name: "created_at";
|
|
26
|
+
tableName: "api_keys";
|
|
27
|
+
dataType: "date";
|
|
28
|
+
columnType: "PgTimestamp";
|
|
29
|
+
data: Date;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: true;
|
|
32
|
+
hasDefault: true;
|
|
33
|
+
isPrimaryKey: false;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: undefined;
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {}>;
|
|
41
|
+
updatedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
42
|
+
name: "updated_at";
|
|
43
|
+
tableName: "api_keys";
|
|
44
|
+
dataType: "date";
|
|
45
|
+
columnType: "PgTimestamp";
|
|
46
|
+
data: Date;
|
|
47
|
+
driverParam: string;
|
|
48
|
+
notNull: true;
|
|
49
|
+
hasDefault: true;
|
|
50
|
+
isPrimaryKey: false;
|
|
51
|
+
isAutoincrement: false;
|
|
52
|
+
hasRuntimeDefault: false;
|
|
53
|
+
enumValues: undefined;
|
|
54
|
+
baseColumn: never;
|
|
55
|
+
identity: undefined;
|
|
56
|
+
generated: undefined;
|
|
57
|
+
}, {}, {}>;
|
|
58
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
59
|
+
name: "id";
|
|
60
|
+
tableName: "api_keys";
|
|
61
|
+
dataType: "string";
|
|
62
|
+
columnType: "PgUUID";
|
|
63
|
+
data: string;
|
|
64
|
+
driverParam: string;
|
|
65
|
+
notNull: true;
|
|
66
|
+
hasDefault: true;
|
|
67
|
+
isPrimaryKey: true;
|
|
68
|
+
isAutoincrement: false;
|
|
69
|
+
hasRuntimeDefault: false;
|
|
70
|
+
enumValues: undefined;
|
|
71
|
+
baseColumn: never;
|
|
72
|
+
identity: undefined;
|
|
73
|
+
generated: undefined;
|
|
74
|
+
}, {}, {}>;
|
|
75
|
+
workspaceId: import("drizzle-orm/pg-core").PgColumn<{
|
|
76
|
+
name: "workspace_id";
|
|
77
|
+
tableName: "api_keys";
|
|
78
|
+
dataType: "string";
|
|
79
|
+
columnType: "PgUUID";
|
|
80
|
+
data: string;
|
|
81
|
+
driverParam: string;
|
|
82
|
+
notNull: true;
|
|
83
|
+
hasDefault: false;
|
|
84
|
+
isPrimaryKey: false;
|
|
85
|
+
isAutoincrement: false;
|
|
86
|
+
hasRuntimeDefault: false;
|
|
87
|
+
enumValues: undefined;
|
|
88
|
+
baseColumn: never;
|
|
89
|
+
identity: undefined;
|
|
90
|
+
generated: undefined;
|
|
91
|
+
}, {}, {}>;
|
|
92
|
+
name: import("drizzle-orm/pg-core").PgColumn<{
|
|
93
|
+
name: "name";
|
|
94
|
+
tableName: "api_keys";
|
|
95
|
+
dataType: "string";
|
|
96
|
+
columnType: "PgText";
|
|
97
|
+
data: string;
|
|
98
|
+
driverParam: string;
|
|
99
|
+
notNull: true;
|
|
100
|
+
hasDefault: false;
|
|
101
|
+
isPrimaryKey: false;
|
|
102
|
+
isAutoincrement: false;
|
|
103
|
+
hasRuntimeDefault: false;
|
|
104
|
+
enumValues: [string, ...string[]];
|
|
105
|
+
baseColumn: never;
|
|
106
|
+
identity: undefined;
|
|
107
|
+
generated: undefined;
|
|
108
|
+
}, {}, {}>;
|
|
109
|
+
keyId: import("drizzle-orm/pg-core").PgColumn<{
|
|
110
|
+
name: "key_id";
|
|
111
|
+
tableName: "api_keys";
|
|
112
|
+
dataType: "string";
|
|
113
|
+
columnType: "PgText";
|
|
114
|
+
data: string;
|
|
115
|
+
driverParam: string;
|
|
116
|
+
notNull: true;
|
|
117
|
+
hasDefault: false;
|
|
118
|
+
isPrimaryKey: false;
|
|
119
|
+
isAutoincrement: false;
|
|
120
|
+
hasRuntimeDefault: false;
|
|
121
|
+
enumValues: [string, ...string[]];
|
|
122
|
+
baseColumn: never;
|
|
123
|
+
identity: undefined;
|
|
124
|
+
generated: undefined;
|
|
125
|
+
}, {}, {}>;
|
|
126
|
+
keyHash: import("drizzle-orm/pg-core").PgColumn<{
|
|
127
|
+
name: "key_hash";
|
|
128
|
+
tableName: "api_keys";
|
|
129
|
+
dataType: "string";
|
|
130
|
+
columnType: "PgText";
|
|
131
|
+
data: string;
|
|
132
|
+
driverParam: string;
|
|
133
|
+
notNull: true;
|
|
134
|
+
hasDefault: false;
|
|
135
|
+
isPrimaryKey: false;
|
|
136
|
+
isAutoincrement: false;
|
|
137
|
+
hasRuntimeDefault: false;
|
|
138
|
+
enumValues: [string, ...string[]];
|
|
139
|
+
baseColumn: never;
|
|
140
|
+
identity: undefined;
|
|
141
|
+
generated: undefined;
|
|
142
|
+
}, {}, {}>;
|
|
143
|
+
scopes: import("drizzle-orm/pg-core").PgColumn<{
|
|
144
|
+
name: "scopes";
|
|
145
|
+
tableName: "api_keys";
|
|
146
|
+
dataType: "array";
|
|
147
|
+
columnType: "PgArray";
|
|
148
|
+
data: string[];
|
|
149
|
+
driverParam: string | string[];
|
|
150
|
+
notNull: true;
|
|
151
|
+
hasDefault: true;
|
|
152
|
+
isPrimaryKey: false;
|
|
153
|
+
isAutoincrement: false;
|
|
154
|
+
hasRuntimeDefault: false;
|
|
155
|
+
enumValues: [string, ...string[]];
|
|
156
|
+
baseColumn: import("drizzle-orm").Column<{
|
|
157
|
+
name: "scopes";
|
|
158
|
+
tableName: "api_keys";
|
|
159
|
+
dataType: "string";
|
|
160
|
+
columnType: "PgText";
|
|
161
|
+
data: string;
|
|
162
|
+
driverParam: string;
|
|
163
|
+
notNull: false;
|
|
164
|
+
hasDefault: false;
|
|
165
|
+
isPrimaryKey: false;
|
|
166
|
+
isAutoincrement: false;
|
|
167
|
+
hasRuntimeDefault: false;
|
|
168
|
+
enumValues: [string, ...string[]];
|
|
169
|
+
baseColumn: never;
|
|
170
|
+
identity: undefined;
|
|
171
|
+
generated: undefined;
|
|
172
|
+
}, {}, {}>;
|
|
173
|
+
identity: undefined;
|
|
174
|
+
generated: undefined;
|
|
175
|
+
}, {}, {
|
|
176
|
+
baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
|
|
177
|
+
name: "scopes";
|
|
178
|
+
dataType: 'string';
|
|
179
|
+
columnType: 'PgText';
|
|
180
|
+
data: string;
|
|
181
|
+
enumValues: [string, ...string[]];
|
|
182
|
+
driverParam: string;
|
|
183
|
+
}, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
|
|
184
|
+
size: undefined;
|
|
185
|
+
}>;
|
|
186
|
+
createdByUserId: import("drizzle-orm/pg-core").PgColumn<{
|
|
187
|
+
name: "created_by_user_id";
|
|
188
|
+
tableName: "api_keys";
|
|
189
|
+
dataType: "string";
|
|
190
|
+
columnType: "PgUUID";
|
|
191
|
+
data: string;
|
|
192
|
+
driverParam: string;
|
|
193
|
+
notNull: false;
|
|
194
|
+
hasDefault: false;
|
|
195
|
+
isPrimaryKey: false;
|
|
196
|
+
isAutoincrement: false;
|
|
197
|
+
hasRuntimeDefault: false;
|
|
198
|
+
enumValues: undefined;
|
|
199
|
+
baseColumn: never;
|
|
200
|
+
identity: undefined;
|
|
201
|
+
generated: undefined;
|
|
202
|
+
}, {}, {}>;
|
|
203
|
+
lastUsedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
204
|
+
name: "last_used_at";
|
|
205
|
+
tableName: "api_keys";
|
|
206
|
+
dataType: "date";
|
|
207
|
+
columnType: "PgTimestamp";
|
|
208
|
+
data: Date;
|
|
209
|
+
driverParam: string;
|
|
210
|
+
notNull: false;
|
|
211
|
+
hasDefault: false;
|
|
212
|
+
isPrimaryKey: false;
|
|
213
|
+
isAutoincrement: false;
|
|
214
|
+
hasRuntimeDefault: false;
|
|
215
|
+
enumValues: undefined;
|
|
216
|
+
baseColumn: never;
|
|
217
|
+
identity: undefined;
|
|
218
|
+
generated: undefined;
|
|
219
|
+
}, {}, {}>;
|
|
220
|
+
expiresAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
221
|
+
name: "expires_at";
|
|
222
|
+
tableName: "api_keys";
|
|
223
|
+
dataType: "date";
|
|
224
|
+
columnType: "PgTimestamp";
|
|
225
|
+
data: Date;
|
|
226
|
+
driverParam: string;
|
|
227
|
+
notNull: false;
|
|
228
|
+
hasDefault: false;
|
|
229
|
+
isPrimaryKey: false;
|
|
230
|
+
isAutoincrement: false;
|
|
231
|
+
hasRuntimeDefault: false;
|
|
232
|
+
enumValues: undefined;
|
|
233
|
+
baseColumn: never;
|
|
234
|
+
identity: undefined;
|
|
235
|
+
generated: undefined;
|
|
236
|
+
}, {}, {}>;
|
|
237
|
+
revokedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
238
|
+
name: "revoked_at";
|
|
239
|
+
tableName: "api_keys";
|
|
240
|
+
dataType: "date";
|
|
241
|
+
columnType: "PgTimestamp";
|
|
242
|
+
data: Date;
|
|
243
|
+
driverParam: string;
|
|
244
|
+
notNull: false;
|
|
245
|
+
hasDefault: false;
|
|
246
|
+
isPrimaryKey: false;
|
|
247
|
+
isAutoincrement: false;
|
|
248
|
+
hasRuntimeDefault: false;
|
|
249
|
+
enumValues: undefined;
|
|
250
|
+
baseColumn: never;
|
|
251
|
+
identity: undefined;
|
|
252
|
+
generated: undefined;
|
|
253
|
+
}, {}, {}>;
|
|
254
|
+
};
|
|
255
|
+
dialect: 'pg';
|
|
256
|
+
}>;
|
|
257
|
+
export declare const apiKeysRelations: import("drizzle-orm").Relations<"api_keys", {
|
|
258
|
+
workspace: import("drizzle-orm").One<"workspaces", true>;
|
|
259
|
+
createdBy: import("drizzle-orm").One<"users", false>;
|
|
260
|
+
}>;
|
|
261
|
+
export type ApiKey = typeof apiKeys.$inferSelect;
|
|
262
|
+
export type NewApiKey = typeof apiKeys.$inferInsert;
|
|
263
|
+
//# sourceMappingURL=apikeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apikeys.d.ts","sourceRoot":"","sources":["../../../src/db/schema/apikeys.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDnB,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;EAG1B,CAAC;AAEJ,MAAM,MAAM,MAAM,GAAG,OAAO,OAAO,CAAC,YAAY,CAAC;AACjD,MAAM,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,YAAY,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { relations, sql } from "drizzle-orm";
|
|
2
|
+
import { index, pgTable, text, timestamp, uuid } from "drizzle-orm/pg-core";
|
|
3
|
+
import { primaryId, timestamps } from "./_shared.js";
|
|
4
|
+
import { users } from "./users.js";
|
|
5
|
+
import { workspaces } from "./workspaces.js";
|
|
6
|
+
/**
|
|
7
|
+
* A workspace-scoped API key.
|
|
8
|
+
*
|
|
9
|
+
* ## How a key is stored
|
|
10
|
+
*
|
|
11
|
+
* A presented key looks like `dgk_<keyId>_<secret>`. Only `key_id` is stored in
|
|
12
|
+
* the clear; `key_hash` is a SHA-256 digest of the secret half.
|
|
13
|
+
*
|
|
14
|
+
* The split exists so validation is a single indexed lookup. Hashing the whole key
|
|
15
|
+
* would mean either scanning every row's hash or storing a searchable copy — the
|
|
16
|
+
* first is O(n) on every API request, the second defeats the point of hashing.
|
|
17
|
+
*
|
|
18
|
+
* ## Why SHA-256 and not bcrypt
|
|
19
|
+
*
|
|
20
|
+
* The secret is 256 bits of CSPRNG output, so there is no dictionary to attack and
|
|
21
|
+
* no need for a slow KDF. bcrypt or Argon2 exist to make *low-entropy* human
|
|
22
|
+
* passwords expensive to guess; applying one here would add tens of milliseconds
|
|
23
|
+
* to every authenticated request and buy nothing.
|
|
24
|
+
*/
|
|
25
|
+
export const apiKeys = pgTable("api_keys", {
|
|
26
|
+
id: primaryId(),
|
|
27
|
+
workspaceId: uuid("workspace_id")
|
|
28
|
+
.notNull()
|
|
29
|
+
.references(() => workspaces.id, { onDelete: "cascade" }),
|
|
30
|
+
/** Human label, shown in the key list. */
|
|
31
|
+
name: text("name").notNull(),
|
|
32
|
+
/**
|
|
33
|
+
* Public half of the key. Unique, indexed, and safe to display — it is what
|
|
34
|
+
* lets an operator match a key in a log line to a row in the table.
|
|
35
|
+
*/
|
|
36
|
+
keyId: text("key_id").notNull().unique(),
|
|
37
|
+
/** SHA-256 of the secret half. Never the secret. */
|
|
38
|
+
keyHash: text("key_hash").notNull(),
|
|
39
|
+
/**
|
|
40
|
+
* What the key may do. Application-defined, like permissions — but separate
|
|
41
|
+
* from them: a key is not a user and holds no roles.
|
|
42
|
+
*/
|
|
43
|
+
scopes: text("scopes").array().notNull().default(sql `'{}'::text[]`),
|
|
44
|
+
/**
|
|
45
|
+
* Who created it. Set null on user deletion so the key survives, but see
|
|
46
|
+
* `apiKeys.resolveContext` — a key can be made to stop working when its
|
|
47
|
+
* creator loses access.
|
|
48
|
+
*/
|
|
49
|
+
createdByUserId: uuid("created_by_user_id").references(() => users.id, {
|
|
50
|
+
onDelete: "set null",
|
|
51
|
+
}),
|
|
52
|
+
/**
|
|
53
|
+
* Last successful validation, updated at most once a minute.
|
|
54
|
+
*
|
|
55
|
+
* Writing on every request would turn a read path into a write path; a
|
|
56
|
+
* minute's resolution is enough to answer "is this key still in use?".
|
|
57
|
+
*/
|
|
58
|
+
lastUsedAt: timestamp("last_used_at", { withTimezone: true, mode: "date" }),
|
|
59
|
+
/** Null for a key that never expires. */
|
|
60
|
+
expiresAt: timestamp("expires_at", { withTimezone: true, mode: "date" }),
|
|
61
|
+
revokedAt: timestamp("revoked_at", { withTimezone: true, mode: "date" }),
|
|
62
|
+
...timestamps,
|
|
63
|
+
}, (table) => [
|
|
64
|
+
index("api_keys_workspace_idx").on(table.workspaceId, table.createdAt.desc()),
|
|
65
|
+
]);
|
|
66
|
+
export const apiKeysRelations = relations(apiKeys, ({ one }) => ({
|
|
67
|
+
workspace: one(workspaces, { fields: [apiKeys.workspaceId], references: [workspaces.id] }),
|
|
68
|
+
createdBy: one(users, { fields: [apiKeys.createdByUserId], references: [users.id] }),
|
|
69
|
+
}));
|
|
70
|
+
//# sourceMappingURL=apikeys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apikeys.js","sourceRoot":"","sources":["../../../src/db/schema/apikeys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAC5B,UAAU,EACV;IACE,EAAE,EAAE,SAAS,EAAE;IACf,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;SAC9B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAE3D,0CAA0C;IAC1C,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAE5B;;;OAGG;IACH,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IAExC,oDAAoD;IACpD,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE;IAEnC;;;OAGG;IACH,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,cAAc,CAAC;IAEnE;;;;OAIG;IACH,eAAe,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE;QACrE,QAAQ,EAAE,UAAU;KACrB,CAAC;IAEF;;;;;OAKG;IACH,UAAU,EAAE,SAAS,CAAC,cAAc,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAE3E,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACxE,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAExE,GAAG,UAAU;CACd,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;CAC9E,CACF,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/D,SAAS,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1F,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;CACrF,CAAC,CAAC,CAAC"}
|