appos 0.2.1-0 → 0.2.2-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/auth-schema-7KeUwlcd.mjs +2 -0
- package/dist/bin/concurrently.mjs +2 -0
- package/dist/bin/event-v2sCJkNd.mjs +2 -0
- package/dist/bin/extract-blob-metadata-TqNd9w-6.mjs +2 -0
- package/dist/bin/generate-image-variant-D8H9FxgD.mjs +2 -0
- package/dist/bin/generate-preview-5jLZLX6I.mjs +2 -0
- package/dist/bin/main.mjs +362 -0
- package/dist/bin/purge-attachment-CMlJMNOk.mjs +2 -0
- package/dist/bin/purge-audit-logs-hd6q6vnR.mjs +2 -0
- package/dist/bin/purge-unattached-blobs-BYv5b9R9.mjs +2 -0
- package/dist/bin/track-db-changes-q0Vl7Htm.mjs +2 -0
- package/dist/bin/vite.mjs +2 -0
- package/dist/bin/vitest.mjs +2 -0
- package/dist/bin/workflow-BagSlsMp.mjs +2 -0
- package/dist/bin/youch-handler-Jj6i1XIT.mjs +2 -0
- package/dist/exports/api/_virtual/rolldown_runtime.mjs +1 -0
- package/dist/exports/api/app-context.d.mts +115 -0
- package/dist/exports/api/app-context.mjs +1 -0
- package/dist/exports/api/auth-schema.d.mts +4248 -0
- package/dist/exports/api/auth-schema.mjs +1 -0
- package/dist/exports/api/auth.d.mts +398 -0
- package/dist/exports/api/auth.mjs +1 -0
- package/dist/exports/api/cache.d.mts +44 -0
- package/dist/exports/api/cache.mjs +1 -0
- package/dist/exports/api/config.d.mts +28 -0
- package/dist/exports/api/config.mjs +1 -0
- package/dist/exports/api/container.d.mts +210 -0
- package/dist/exports/api/container.mjs +1 -0
- package/dist/exports/api/database.d.mts +99 -0
- package/dist/exports/api/database.mjs +1 -0
- package/dist/exports/api/event.d.mts +235 -0
- package/dist/exports/api/event.mjs +1 -0
- package/dist/exports/api/i18n.d.mts +34 -0
- package/dist/exports/api/i18n.mjs +1 -0
- package/dist/exports/api/index.d.mts +21 -0
- package/dist/exports/api/index.mjs +1 -0
- package/dist/exports/api/logger.d.mts +21 -0
- package/dist/exports/api/logger.mjs +1 -0
- package/dist/exports/api/mailer.d.mts +70 -0
- package/dist/exports/api/mailer.mjs +1 -0
- package/dist/exports/api/middleware/request-logger.d.mts +24 -0
- package/dist/exports/api/middleware.d.mts +39 -0
- package/dist/exports/api/middleware.mjs +1 -0
- package/dist/exports/api/node_modules/.bun/change-case@5.4.4/node_modules/change-case/dist/index.mjs +1 -0
- package/dist/exports/api/openapi.d.mts +271 -0
- package/dist/exports/api/openapi.mjs +1 -0
- package/dist/exports/api/orm.d.mts +13 -0
- package/dist/exports/api/orm.mjs +1 -0
- package/dist/exports/api/otel.d.mts +40 -0
- package/dist/exports/api/otel.mjs +1 -0
- package/dist/exports/api/packages/appos/src/constants.mjs +1 -0
- package/dist/exports/api/packages/appos/src/instrumentation.d.mts +7 -0
- package/dist/exports/api/packages/appos/src/instrumentation.mjs +1 -0
- package/dist/exports/api/packages/appos/src/web/auth.mjs +1 -0
- package/dist/exports/api/redis.d.mts +34 -0
- package/dist/exports/api/redis.mjs +1 -0
- package/dist/exports/api/storage-schema.d.mts +707 -0
- package/dist/exports/api/storage-schema.mjs +1 -0
- package/dist/exports/api/storage.d.mts +506 -0
- package/dist/exports/api/storage.mjs +1 -0
- package/dist/exports/api/workflow.d.mts +250 -0
- package/dist/exports/api/workflow.mjs +1 -0
- package/dist/exports/api/workflows/_virtual/rolldown_runtime.mjs +1 -0
- package/dist/exports/api/workflows/auth-schema.mjs +1 -0
- package/dist/exports/api/workflows/auth.d.mts +375 -0
- package/dist/exports/api/workflows/cache.d.mts +44 -0
- package/dist/exports/api/workflows/config.d.mts +18 -0
- package/dist/exports/api/workflows/container.d.mts +167 -0
- package/dist/exports/api/workflows/database.d.mts +46 -0
- package/dist/exports/api/workflows/event.d.mts +68 -0
- package/dist/exports/api/workflows/event.mjs +1 -0
- package/dist/exports/api/workflows/extract-blob-metadata.mjs +1 -0
- package/dist/exports/api/workflows/generate-image-variant.d.mts +99 -0
- package/dist/exports/api/workflows/generate-image-variant.mjs +1 -0
- package/dist/exports/api/workflows/generate-preview.mjs +1 -0
- package/dist/exports/api/workflows/index.d.mts +2 -0
- package/dist/exports/api/workflows/index.mjs +1 -0
- package/dist/exports/api/workflows/logger.d.mts +21 -0
- package/dist/exports/api/workflows/mailer.d.mts +70 -0
- package/dist/exports/api/workflows/orm.d.mts +13 -0
- package/dist/exports/api/workflows/purge-attachment.mjs +1 -0
- package/dist/exports/api/workflows/purge-audit-logs.mjs +1 -0
- package/dist/exports/api/workflows/purge-unattached-blobs.mjs +1 -0
- package/dist/exports/api/workflows/redis.mjs +1 -0
- package/dist/exports/api/workflows/storage-schema.d.mts +699 -0
- package/dist/exports/api/workflows/storage.d.mts +396 -0
- package/dist/exports/api/workflows/track-db-changes.d.mts +72 -0
- package/dist/exports/api/workflows/track-db-changes.mjs +1 -0
- package/dist/exports/api/workflows/workflow.d.mts +24 -0
- package/dist/exports/api/workflows/workflow.mjs +1 -0
- package/dist/exports/cli/_virtual/rolldown_runtime.mjs +1 -0
- package/dist/exports/cli/api/auth-schema.mjs +1 -0
- package/dist/exports/cli/api/auth.d.mts +375 -0
- package/dist/exports/cli/api/cache.d.mts +44 -0
- package/dist/exports/cli/api/config.d.mts +18 -0
- package/dist/exports/cli/api/container.d.mts +167 -0
- package/dist/exports/cli/api/database.d.mts +46 -0
- package/dist/exports/cli/api/event.d.mts +68 -0
- package/dist/exports/cli/api/event.mjs +1 -0
- package/dist/exports/cli/api/logger.d.mts +21 -0
- package/dist/exports/cli/api/mailer.d.mts +70 -0
- package/dist/exports/cli/api/orm.d.mts +13 -0
- package/dist/exports/cli/api/redis.mjs +1 -0
- package/dist/exports/cli/api/storage-schema.d.mts +699 -0
- package/dist/exports/cli/api/storage.d.mts +396 -0
- package/dist/exports/cli/api/workflow.d.mts +2 -0
- package/dist/exports/cli/api/workflow.mjs +1 -0
- package/dist/exports/cli/api/workflows/extract-blob-metadata.mjs +1 -0
- package/dist/exports/cli/api/workflows/generate-image-variant.d.mts +63 -0
- package/dist/exports/cli/api/workflows/generate-image-variant.mjs +1 -0
- package/dist/exports/cli/api/workflows/generate-preview.mjs +1 -0
- package/dist/exports/cli/api/workflows/purge-attachment.mjs +1 -0
- package/dist/exports/cli/api/workflows/purge-audit-logs.mjs +1 -0
- package/dist/exports/cli/api/workflows/purge-unattached-blobs.mjs +1 -0
- package/dist/exports/cli/api/workflows/track-db-changes.mjs +1 -0
- package/dist/exports/cli/command.d.mts +54 -0
- package/dist/exports/cli/command.mjs +1 -0
- package/dist/exports/cli/context.d.mts +170 -0
- package/dist/exports/cli/index.d.mts +3 -0
- package/dist/exports/cli/index.mjs +1 -0
- package/dist/exports/devtools/index.d.ts +3 -0
- package/dist/exports/devtools/index.js +1 -0
- package/dist/exports/instrumentation.d.mts +1 -0
- package/dist/exports/instrumentation.mjs +1 -0
- package/dist/exports/tests/_virtual/rolldown_runtime.mjs +1 -0
- package/dist/exports/tests/api.d.mts +86 -0
- package/dist/exports/tests/api.mjs +1 -0
- package/dist/exports/tests/mock.d.mts +1 -0
- package/dist/exports/tests/mock.mjs +1 -0
- package/dist/exports/tests/node_modules/.bun/change-case@5.4.4/node_modules/change-case/dist/index.mjs +1 -0
- package/dist/exports/tests/node_modules/.bun/rate-limit-redis@4.3.1_f1fa5524233c9c60/node_modules/rate-limit-redis/dist/index.mjs +25 -0
- package/dist/exports/tests/packages/appos/src/api/app-context.d.mts +115 -0
- package/dist/exports/tests/packages/appos/src/api/auth-schema.d.mts +4248 -0
- package/dist/exports/tests/packages/appos/src/api/auth-schema.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/auth.d.mts +398 -0
- package/dist/exports/tests/packages/appos/src/api/cache.d.mts +44 -0
- package/dist/exports/tests/packages/appos/src/api/config.d.mts +28 -0
- package/dist/exports/tests/packages/appos/src/api/container.d.mts +210 -0
- package/dist/exports/tests/packages/appos/src/api/database.d.mts +99 -0
- package/dist/exports/tests/packages/appos/src/api/database.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/event.d.mts +235 -0
- package/dist/exports/tests/packages/appos/src/api/event.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/i18n.d.mts +34 -0
- package/dist/exports/tests/packages/appos/src/api/index.d.mts +27 -0
- package/dist/exports/tests/packages/appos/src/api/logger.d.mts +21 -0
- package/dist/exports/tests/packages/appos/src/api/mailer.d.mts +70 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/error-handler.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/health.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/i18n.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/request-logger.d.mts +24 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/request-logger.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/shutdown.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/timeout.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware/youch-handler.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/middleware.d.mts +39 -0
- package/dist/exports/tests/packages/appos/src/api/middleware.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/openapi.d.mts +271 -0
- package/dist/exports/tests/packages/appos/src/api/orm.d.mts +13 -0
- package/dist/exports/tests/packages/appos/src/api/otel.d.mts +40 -0
- package/dist/exports/tests/packages/appos/src/api/redis.d.mts +34 -0
- package/dist/exports/tests/packages/appos/src/api/redis.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/server.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/storage-schema.d.mts +707 -0
- package/dist/exports/tests/packages/appos/src/api/storage.d.mts +506 -0
- package/dist/exports/tests/packages/appos/src/api/workflow.d.mts +250 -0
- package/dist/exports/tests/packages/appos/src/api/workflow.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/extract-blob-metadata.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/generate-image-variant.d.mts +99 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/generate-image-variant.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/generate-preview.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/purge-attachment.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/purge-audit-logs.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/purge-unattached-blobs.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/api/workflows/track-db-changes.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/constants.mjs +1 -0
- package/dist/exports/tests/packages/appos/src/instrumentation.d.mts +7 -0
- package/dist/exports/tests/packages/appos/src/instrumentation.mjs +1 -0
- package/dist/exports/tests/react.d.mts +2 -0
- package/dist/exports/tests/react.mjs +1 -0
- package/dist/exports/tests/setup.d.mts +1 -0
- package/dist/exports/tests/setup.mjs +1 -0
- package/dist/exports/vendors/date.js +1 -0
- package/dist/exports/vendors/toolkit.js +1 -0
- package/dist/exports/vendors/zod.d.ts +1 -0
- package/dist/exports/vendors/zod.js +1 -0
- package/dist/exports/vite/index.d.mts +19 -0
- package/dist/exports/vite/index.mjs +1 -0
- package/dist/exports/vitest/config.d.mts +1 -0
- package/dist/exports/vitest/config.mjs +1 -0
- package/dist/exports/vitest/globals.d.mts +1 -0
- package/dist/exports/vitest/globals.mjs +1 -0
- package/dist/exports/vitest/index.d.mts +1 -0
- package/dist/exports/vitest/index.mjs +1 -0
- package/dist/exports/web/api/auth.d.ts +125 -0
- package/dist/exports/web/api/database.d.ts +4 -0
- package/dist/exports/web/api/logger.d.ts +1 -0
- package/dist/exports/web/auth.d.ts +2388 -0
- package/dist/exports/web/auth.js +1 -0
- package/dist/exports/web/i18n.d.ts +42 -0
- package/dist/exports/web/i18n.js +1 -0
- package/dist/exports/web/index.d.ts +6 -0
- package/dist/exports/web/index.js +1 -0
- package/package.json +138 -98
- package/build/bin/main.mjs +0 -2
- package/build/exports/cli/index.d.mts +0 -325
- package/build/exports/cli/index.mjs +0 -1
- package/build/exports/instrumentation/execAsync-DaIUcs6_.mjs +0 -1
- package/build/exports/instrumentation/getMachineId-bsd-bB6ipDhm.mjs +0 -1
- package/build/exports/instrumentation/getMachineId-darwin-D1Bx5aCe.mjs +0 -2
- package/build/exports/instrumentation/getMachineId-linux-D_R9Tla0.mjs +0 -1
- package/build/exports/instrumentation/getMachineId-unsupported-BZKPE_Ev.mjs +0 -1
- package/build/exports/instrumentation/getMachineId-win-CmPvIqHL.mjs +0 -1
- package/build/exports/instrumentation/instrumentation.d.mts +0 -1
- package/build/exports/instrumentation/instrumentation.mjs +0 -80
- package/build/exports/server/index.d.mts +0 -327
- package/build/exports/server/index.mjs +0 -219
- package/build/exports/server/react-gPO8Jsy-.mjs +0 -13
- package/build/exports/server/server.node-D_9RYjm9.mjs +0 -210
- package/build/exports/store/index.d.mts +0 -58
- package/build/exports/store/index.mjs +0 -15
- package/build/exports/support/datetime.js +0 -1
- package/build/exports/support/utils.js +0 -1
- package/build/exports/support/zod.d.ts +0 -2
- package/build/exports/support/zod.js +0 -23
- package/build/exports/test/dist-DAsoCGWk.mjs +0 -348
- package/build/exports/test/index.d.mts +0 -3
- package/build/exports/test/index.mjs +0 -1
- package/build/exports/test/magic-string.es-BWgiB2kd.mjs +0 -14
- package/build/exports/test/setup.d.mts +0 -1
- package/build/exports/test/setup.mjs +0 -329
- /package/{build/exports/support/datetime.d.ts → dist/exports/vendors/date.d.ts} +0 -0
- /package/{build/exports/support/utils.d.ts → dist/exports/vendors/toolkit.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{sql as e}from"drizzle-orm";import{pgTable as t}from"drizzle-orm/pg-core";function n(){let n=t(`accounts`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),accessToken:t.text(`access_token`),accessTokenExpiresAt:t.timestamp(`access_token_expires_at`,{mode:`string`,withTimezone:!0}),accountId:t.text(`account_id`).notNull(),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),idToken:t.text(`id_token`),providerId:t.text(`provider_id`).notNull(),password:t.text(`password`),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`}),refreshToken:t.text(`refresh_token`),refreshTokenExpiresAt:t.timestamp(`refresh_token_expires_at`,{mode:`string`,withTimezone:!0}),scope:t.text(`scope`),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),r=t(`api_keys`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),name:t.text(`name`),enabled:t.boolean(`enabled`).default(!0),expiresAt:t.timestamp(`expires_at`,{mode:`string`,withTimezone:!0}),key:t.text(`key`).notNull(),lastRefillAt:t.timestamp(`last_refill_at`,{mode:`string`,withTimezone:!0}),lastRequest:t.timestamp(`last_request`,{mode:`string`,withTimezone:!0}),lastUsedAt:t.timestamp(`last_used_at`,{mode:`string`,withTimezone:!0}),metadata:t.text(`metadata`),permissions:t.text(`permissions`),prefix:t.text(`prefix`),rateLimitEnabled:t.boolean(`rate_limit_enabled`).default(!0),rateLimitTimeWindow:t.integer(`rate_limit_time_window`).default(864e5),rateLimitMax:t.integer(`rate_limit_max`).default(10),refillInterval:t.integer(`refill_interval`),refillAmount:t.integer(`refill_amount`),requestCount:t.integer(`request_count`),remaining:t.integer(`remaining`),start:t.text(`start`),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`}),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),i=t(`invitations`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),email:t.text(`email`).notNull(),expiresAt:t.timestamp(`expires_at`,{mode:`string`,withTimezone:!0}).notNull(),inviterId:t.text(`inviter_id`).notNull().references(()=>l.id,{onDelete:`cascade`}),organizationId:t.text(`organization_id`).notNull().references(()=>o.id,{onDelete:`cascade`}),role:t.text(`role`),status:t.text(`status`).default(`pending`).notNull(),teamId:t.text(`team_id`),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),a=t(`members`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),organizationId:t.text(`organization_id`).notNull().references(()=>o.id,{onDelete:`cascade`}),role:t.text(`role`).default(`member`).notNull(),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`}),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),o=t(`organizations`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),name:t.text(`name`).notNull(),slug:t.text(`slug`).unique(),logo:t.text(`logo`),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),metadata:t.text(`metadata`)}),e=>[]),s=t(`sessions`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),activeOrganizationId:t.text(`active_organization_id`).references(()=>o.id,{onDelete:`set null`}),activeTeamId:t.text(`active_team_id`),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),expiresAt:t.timestamp(`expires_at`,{mode:`string`,withTimezone:!0}).notNull(),impersonatedBy:t.text(`impersonated_by`).references(()=>l.id,{onDelete:`set null`}),ipAddress:t.text(`ip_address`),token:t.text(`token`).notNull().unique(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),userAgent:t.text(`user_agent`),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`})}),e=>[]),c=t(`sso_providers`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),domain:t.text(`domain`).notNull(),issuer:t.text(`issuer`).notNull(),oidcConfig:t.text(`oidc_config`),organizationId:t.text(`organization_id`).references(()=>o.id,{onDelete:`cascade`}),providerId:t.text(`provider_id`).notNull().unique(),samlConfig:t.text(`saml_config`),userId:t.text(`user_id`).references(()=>l.id,{onDelete:`cascade`})}),e=>[]),l=t(`users`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),banExpires:t.timestamp(`ban_expires`,{mode:`string`,withTimezone:!0}),banReason:t.text(`ban_reason`),banned:t.boolean(`banned`).default(!1),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),displayUsername:t.text(`display_username`),email:t.text(`email`).notNull().unique(),emailVerified:t.boolean(`email_verified`).default(!1).notNull(),image:t.text(`image`),isAnonymous:t.boolean(`is_anonymous`),lastLoginMethod:t.text(`last_login_method`),name:t.text(`name`).notNull(),phoneNumber:t.text(`phone_number`).unique(),phoneNumberVerified:t.boolean(`phone_number_verified`),role:t.text(`role`),twoFactorEnabled:t.boolean(`two_factor_enabled`).default(!1),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),username:t.text(`username`).unique()}),e=>[]),u=t(`teams`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),name:t.text(`name`).notNull(),organizationId:t.text(`organization_id`).notNull().references(()=>o.id,{onDelete:`cascade`}),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),d=t(`team_members`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),teamId:t.text(`team_id`).notNull().references(()=>u.id,{onDelete:`cascade`}),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`}),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),f=t(`two_factors`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),secret:t.text(`secret`).notNull(),backupCodes:t.text(`backup_codes`).notNull(),userId:t.text(`user_id`).notNull().references(()=>l.id,{onDelete:`cascade`})}),e=>[]),p=t(`verifications`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),expiresAt:t.timestamp(`expires_at`,{mode:`string`,withTimezone:!0}).notNull(),identifier:t.text(`identifier`).notNull(),updatedAt:t.timestamp(`updated_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull(),value:t.text(`value`).notNull()}),e=>[]);return{tables:{accounts:n,apiKeys:r,auditLogs:t(`audit_logs`,t=>({id:t.text(`id`).primaryKey().default(e`uuidv7()`),tableName:t.text(`table_name`),action:t.text(`action`).notNull(),customAction:t.text(`custom_action`),oldData:t.jsonb(`old_data`),newData:t.jsonb(`new_data`),metadata:t.jsonb(`metadata`),organizationId:t.text(`organization_id`).references(()=>o.id,{onDelete:`set null`}),userId:t.text(`user_id`).references(()=>l.id,{onDelete:`set null`}),sessionId:t.text(`session_id`).references(()=>s.id,{onDelete:`set null`}),requestId:t.text(`request_id`),createdAt:t.timestamp(`created_at`,{mode:`string`,withTimezone:!0}).default(e`NOW()`).notNull()}),e=>[]),invitations:i,members:a,organizations:o,sessions:s,ssoProviders:c,teams:u,teamMembers:d,twoFactors:f,users:l,verifications:p},relations:e=>({users:{sessions:e.many.sessions({from:e.users.id,to:e.sessions.userId}),accounts:e.many.accounts({from:e.users.id,to:e.accounts.userId}),apiKeys:e.many.apiKeys({from:e.users.id,to:e.apiKeys.userId}),memberships:e.many.members({from:e.users.id,to:e.members.userId}),invitations:e.many.invitations({from:e.users.id,to:e.invitations.inviterId}),ssoProvider:e.one.ssoProviders({from:e.users.id,to:e.ssoProviders.userId}),twoFactor:e.one.twoFactors({from:e.users.id,to:e.twoFactors.userId})},sessions:{user:e.one.users({from:e.sessions.userId,to:e.users.id})},accounts:{user:e.one.users({from:e.accounts.userId,to:e.users.id})},apiKeys:{user:e.one.users({from:e.apiKeys.userId,to:e.users.id})},organizations:{members:e.many.members({from:e.organizations.id,to:e.members.organizationId}),invitations:e.many.invitations({from:e.organizations.id,to:e.invitations.organizationId}),teams:e.many.teams({from:e.organizations.id,to:e.teams.organizationId})},members:{organization:e.one.organizations({from:e.members.organizationId,to:e.organizations.id}),user:e.one.users({from:e.members.userId,to:e.users.id})},invitations:{organization:e.one.organizations({from:e.invitations.organizationId,to:e.organizations.id}),inviter:e.one.users({from:e.invitations.inviterId,to:e.users.id})},teams:{organization:e.one.organizations({from:e.teams.organizationId,to:e.organizations.id})},ssoProviders:{user:e.one.users({from:e.ssoProviders.userId,to:e.users.id})},verifications:{},twoFactors:{user:e.one.users({from:e.twoFactors.userId,to:e.users.id})},auditLogs:{organization:e.one.organizations({from:e.auditLogs.organizationId,to:e.organizations.id}),user:e.one.users({from:e.auditLogs.userId,to:e.users.id}),session:e.one.sessions({from:e.auditLogs.sessionId,to:e.sessions.id})}})}}export{n as defineAuthSchema};
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
import { Database, QualifiedTableNames } from "./database.mjs";
|
|
2
|
+
import { betterAuth } from "better-auth";
|
|
3
|
+
import { Role, createAccessControl } from "better-auth/plugins/access";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
|
|
6
|
+
//#region src/api/auth.d.ts
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Type for access controller created via createAccessControl().
|
|
10
|
+
* Used for RBAC on both server and client.
|
|
11
|
+
*/
|
|
12
|
+
type AccessController = ReturnType<typeof createAccessControl>;
|
|
13
|
+
/**
|
|
14
|
+
* Type for roles created via ac.newRole().
|
|
15
|
+
* Uses Role type from better-auth for compatibility.
|
|
16
|
+
*/
|
|
17
|
+
type AccessControlRoles = Record<string, Role>;
|
|
18
|
+
/**
|
|
19
|
+
* Standard audit log actions following OCSF/CADF standards.
|
|
20
|
+
* Zod enum provides both runtime validation and TypeScript type.
|
|
21
|
+
*
|
|
22
|
+
* Actions:
|
|
23
|
+
* - Data ops: INSERT, UPDATE, DELETE, TRUNCATE, SELECT
|
|
24
|
+
* - Auth ops: LOGIN, LOGOUT, LOGIN_FAILED, PASSWORD_CHANGE
|
|
25
|
+
* - Custom: CUSTOM (use customAction field for app-specific events)
|
|
26
|
+
*/
|
|
27
|
+
declare const auditActionSchema: z.ZodEnum<{
|
|
28
|
+
DELETE: "DELETE";
|
|
29
|
+
LOGIN: "LOGIN";
|
|
30
|
+
LOGOUT: "LOGOUT";
|
|
31
|
+
INSERT: "INSERT";
|
|
32
|
+
PASSWORD_CHANGE: "PASSWORD_CHANGE";
|
|
33
|
+
TRUNCATE: "TRUNCATE";
|
|
34
|
+
UPDATE: "UPDATE";
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* TypeScript type extracted from Zod enum.
|
|
38
|
+
* Use this type for type annotations.
|
|
39
|
+
*/
|
|
40
|
+
type AuditAction = z.infer<typeof auditActionSchema>;
|
|
41
|
+
/**
|
|
42
|
+
* Type-safe audit log options for defineAuth().
|
|
43
|
+
* Generic over db object to provide autocomplete for excludeTables.
|
|
44
|
+
*
|
|
45
|
+
* @template TDb - Database record type for table name inference
|
|
46
|
+
*/
|
|
47
|
+
type AuditLogOptions<TDb> = {
|
|
48
|
+
/**
|
|
49
|
+
* Tables to exclude from audit logging.
|
|
50
|
+
*/
|
|
51
|
+
excludeTables?: QualifiedTableNames<TDb>[];
|
|
52
|
+
/**
|
|
53
|
+
* Cron expression for purge schedule.
|
|
54
|
+
*
|
|
55
|
+
* @default "0 0 * * *"
|
|
56
|
+
*/
|
|
57
|
+
purgeCron?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Retention period in days. Audit logs older than this are auto-deleted.
|
|
60
|
+
* @default 90
|
|
61
|
+
*/
|
|
62
|
+
retentionDays?: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Neutral auth configuration - shared between server and client.
|
|
66
|
+
* Contains ONLY fields that affect both sides (UI + server features).
|
|
67
|
+
*
|
|
68
|
+
* PRESENCE-BASED CONFIG: If a key exists, it's enabled. No redundant `enabled` fields.
|
|
69
|
+
* Server-only fields (appName, session) are passed via DefineAuthOptions.
|
|
70
|
+
*/
|
|
71
|
+
interface AuthConfig {
|
|
72
|
+
/**
|
|
73
|
+
* Base URL where auth server is hosted.
|
|
74
|
+
*
|
|
75
|
+
* @default "" (same origin - client uses relative URLs)
|
|
76
|
+
* @example "http://localhost:8000" for cross-origin
|
|
77
|
+
*/
|
|
78
|
+
baseURL?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Base path for auth routes.
|
|
81
|
+
*
|
|
82
|
+
* @default "/auth"
|
|
83
|
+
*/
|
|
84
|
+
basePath?: string;
|
|
85
|
+
/** Authentication methods - if defined, it's enabled */
|
|
86
|
+
methods?: {
|
|
87
|
+
/** Email/password auth. If defined, enabled. */
|
|
88
|
+
emailPassword?: {
|
|
89
|
+
requireEmailVerification?: boolean;
|
|
90
|
+
minPasswordLength?: number;
|
|
91
|
+
maxPasswordLength?: number;
|
|
92
|
+
};
|
|
93
|
+
/** Magic link auth. If defined, enabled. */
|
|
94
|
+
magicLink?: {
|
|
95
|
+
expiresIn?: number;
|
|
96
|
+
};
|
|
97
|
+
/** Passkey auth. If defined (even as empty object), enabled. */
|
|
98
|
+
passkey?: Record<string, never>;
|
|
99
|
+
/** Phone OTP auth. If defined, enabled. */
|
|
100
|
+
phoneOtp?: {
|
|
101
|
+
otpLength?: number;
|
|
102
|
+
expiresIn?: number;
|
|
103
|
+
};
|
|
104
|
+
/** Email OTP auth. If defined, enabled. */
|
|
105
|
+
emailOtp?: {
|
|
106
|
+
otpLength?: number;
|
|
107
|
+
expiresIn?: number;
|
|
108
|
+
};
|
|
109
|
+
};
|
|
110
|
+
/** OAuth providers - true = enabled, undefined/false = disabled */
|
|
111
|
+
oauth?: {
|
|
112
|
+
google?: boolean;
|
|
113
|
+
github?: boolean;
|
|
114
|
+
apple?: boolean;
|
|
115
|
+
facebook?: boolean;
|
|
116
|
+
};
|
|
117
|
+
/** Plugins - if defined, it's enabled */
|
|
118
|
+
plugins?: {
|
|
119
|
+
/** Admin plugin. If defined, enabled. Includes RBAC for both server and client. */
|
|
120
|
+
admin?: {
|
|
121
|
+
defaultRole?: string;
|
|
122
|
+
adminRoles?: string[];
|
|
123
|
+
/** Access controller created via createAccessControl() - shared between server and client */
|
|
124
|
+
ac: AccessController;
|
|
125
|
+
/** Role definitions created via ac.newRole() - shared between server and client */
|
|
126
|
+
roles: AccessControlRoles;
|
|
127
|
+
};
|
|
128
|
+
/** API key plugin. If defined, enabled. */
|
|
129
|
+
apiKey?: {
|
|
130
|
+
defaultPrefix?: string;
|
|
131
|
+
defaultKeyLength?: number;
|
|
132
|
+
rateLimit?: {
|
|
133
|
+
maxRequests?: number;
|
|
134
|
+
timeWindow?: number;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
/** Two-factor plugin. If defined, enabled. Sub-features also presence-based. */
|
|
138
|
+
twoFactor?: {
|
|
139
|
+
issuer?: string;
|
|
140
|
+
totp?: {
|
|
141
|
+
digits?: 6 | 8;
|
|
142
|
+
period?: number;
|
|
143
|
+
};
|
|
144
|
+
otp?: boolean;
|
|
145
|
+
backupCodes?: {
|
|
146
|
+
amount?: number;
|
|
147
|
+
length?: number;
|
|
148
|
+
};
|
|
149
|
+
};
|
|
150
|
+
/** Multi-session plugin. If defined, enabled. */
|
|
151
|
+
multiSession?: {
|
|
152
|
+
maximumSessions?: number;
|
|
153
|
+
};
|
|
154
|
+
/** Username plugin. If defined, enabled. */
|
|
155
|
+
username?: {
|
|
156
|
+
minUsernameLength?: number;
|
|
157
|
+
maxUsernameLength?: number;
|
|
158
|
+
};
|
|
159
|
+
/** Anonymous auth plugin. If defined, enabled. */
|
|
160
|
+
anonymous?: {
|
|
161
|
+
emailDomainName?: string;
|
|
162
|
+
};
|
|
163
|
+
/** SSO plugin. If defined, enabled. Import from @better-auth/sso */
|
|
164
|
+
sso?: {
|
|
165
|
+
providersLimit?: number;
|
|
166
|
+
trustEmailVerified?: boolean;
|
|
167
|
+
domainVerification?: boolean;
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/** Base hook types for reference */
|
|
172
|
+
type EmailHook = (params: {
|
|
173
|
+
email: string;
|
|
174
|
+
url: string;
|
|
175
|
+
token: string;
|
|
176
|
+
}) => Promise<void>;
|
|
177
|
+
type OtpHook = (params: {
|
|
178
|
+
email: string;
|
|
179
|
+
otp: string;
|
|
180
|
+
}) => Promise<void>;
|
|
181
|
+
type PhoneOtpHook = (params: {
|
|
182
|
+
phoneNumber: string;
|
|
183
|
+
otp: string;
|
|
184
|
+
}) => Promise<void>;
|
|
185
|
+
/**
|
|
186
|
+
* Conditionally required hooks based on config.
|
|
187
|
+
* Uses PRESENCE-BASED detection - if key exists, hook is REQUIRED.
|
|
188
|
+
*/
|
|
189
|
+
type RequiredHooks<T extends AuthConfig> = (T["methods"] extends {
|
|
190
|
+
emailPassword: {
|
|
191
|
+
requireEmailVerification: true;
|
|
192
|
+
};
|
|
193
|
+
} ? {
|
|
194
|
+
sendVerificationEmail: EmailHook;
|
|
195
|
+
} : {
|
|
196
|
+
sendVerificationEmail?: EmailHook;
|
|
197
|
+
}) & (T["methods"] extends {
|
|
198
|
+
emailPassword: object;
|
|
199
|
+
} ? {
|
|
200
|
+
sendResetPasswordEmail: EmailHook;
|
|
201
|
+
} : {
|
|
202
|
+
sendResetPasswordEmail?: EmailHook;
|
|
203
|
+
}) & (T["methods"] extends {
|
|
204
|
+
magicLink: object;
|
|
205
|
+
} ? {
|
|
206
|
+
sendMagicLink: EmailHook;
|
|
207
|
+
} : {
|
|
208
|
+
sendMagicLink?: EmailHook;
|
|
209
|
+
}) & (T["methods"] extends {
|
|
210
|
+
emailOtp: object;
|
|
211
|
+
} ? {
|
|
212
|
+
sendEmailOTP: OtpHook;
|
|
213
|
+
} : {
|
|
214
|
+
sendEmailOTP?: OtpHook;
|
|
215
|
+
}) & (T["methods"] extends {
|
|
216
|
+
phoneOtp: object;
|
|
217
|
+
} ? {
|
|
218
|
+
sendPhoneOTP: PhoneOtpHook;
|
|
219
|
+
} : {
|
|
220
|
+
sendPhoneOTP?: PhoneOtpHook;
|
|
221
|
+
}) & (T["plugins"] extends {
|
|
222
|
+
twoFactor: {
|
|
223
|
+
otp: true;
|
|
224
|
+
};
|
|
225
|
+
} ? {
|
|
226
|
+
send2FAOTP: OtpHook;
|
|
227
|
+
} : {
|
|
228
|
+
send2FAOTP?: OtpHook;
|
|
229
|
+
});
|
|
230
|
+
/**
|
|
231
|
+
* Conditionally required OAuth credentials based on config.
|
|
232
|
+
* If an OAuth provider is enabled in config, its credentials are REQUIRED.
|
|
233
|
+
*/
|
|
234
|
+
type RequiredOAuth<T extends AuthConfig> = (T["oauth"] extends {
|
|
235
|
+
google: true;
|
|
236
|
+
} ? {
|
|
237
|
+
google: {
|
|
238
|
+
clientId: string;
|
|
239
|
+
clientSecret: string;
|
|
240
|
+
};
|
|
241
|
+
} : {
|
|
242
|
+
google?: {
|
|
243
|
+
clientId: string;
|
|
244
|
+
clientSecret: string;
|
|
245
|
+
};
|
|
246
|
+
}) & (T["oauth"] extends {
|
|
247
|
+
github: true;
|
|
248
|
+
} ? {
|
|
249
|
+
github: {
|
|
250
|
+
clientId: string;
|
|
251
|
+
clientSecret: string;
|
|
252
|
+
};
|
|
253
|
+
} : {
|
|
254
|
+
github?: {
|
|
255
|
+
clientId: string;
|
|
256
|
+
clientSecret: string;
|
|
257
|
+
};
|
|
258
|
+
}) & (T["oauth"] extends {
|
|
259
|
+
apple: true;
|
|
260
|
+
} ? {
|
|
261
|
+
apple: {
|
|
262
|
+
clientId: string;
|
|
263
|
+
clientSecret: string;
|
|
264
|
+
};
|
|
265
|
+
} : {
|
|
266
|
+
apple?: {
|
|
267
|
+
clientId: string;
|
|
268
|
+
clientSecret: string;
|
|
269
|
+
};
|
|
270
|
+
}) & (T["oauth"] extends {
|
|
271
|
+
facebook: true;
|
|
272
|
+
} ? {
|
|
273
|
+
facebook: {
|
|
274
|
+
clientId: string;
|
|
275
|
+
clientSecret: string;
|
|
276
|
+
};
|
|
277
|
+
} : {
|
|
278
|
+
facebook?: {
|
|
279
|
+
clientId: string;
|
|
280
|
+
clientSecret: string;
|
|
281
|
+
};
|
|
282
|
+
});
|
|
283
|
+
/** Check if any OAuth provider is enabled */
|
|
284
|
+
type HasOAuthEnabled<T extends AuthConfig> = T["oauth"] extends {
|
|
285
|
+
google: true;
|
|
286
|
+
} | {
|
|
287
|
+
github: true;
|
|
288
|
+
} | {
|
|
289
|
+
apple: true;
|
|
290
|
+
} | {
|
|
291
|
+
facebook: true;
|
|
292
|
+
} ? true : false;
|
|
293
|
+
/** Check if passkey is enabled */
|
|
294
|
+
type HasPasskeyEnabled<T extends AuthConfig> = T["methods"] extends {
|
|
295
|
+
passkey: object;
|
|
296
|
+
} ? true : false;
|
|
297
|
+
/**
|
|
298
|
+
* Server-only session configuration.
|
|
299
|
+
*/
|
|
300
|
+
interface AuthSessionConfig {
|
|
301
|
+
/**
|
|
302
|
+
* Session duration in seconds.
|
|
303
|
+
*
|
|
304
|
+
* @default 604800 (7 days)
|
|
305
|
+
*/
|
|
306
|
+
expiresIn?: number;
|
|
307
|
+
/**
|
|
308
|
+
* How often to update session in seconds.
|
|
309
|
+
*
|
|
310
|
+
* @default 86400 (1 day)
|
|
311
|
+
*/
|
|
312
|
+
updateAge?: number;
|
|
313
|
+
/**
|
|
314
|
+
* Session freshness in seconds for sensitive ops.
|
|
315
|
+
*
|
|
316
|
+
* @default 86400 (1 day)
|
|
317
|
+
*/
|
|
318
|
+
freshAge?: number;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Server-only passkey configuration (required if passkey is enabled).
|
|
322
|
+
*/
|
|
323
|
+
interface AuthPasskeyConfig {
|
|
324
|
+
/**
|
|
325
|
+
* Relying Party ID - domain for passkey (e.g., "example.com" or "localhost").
|
|
326
|
+
*/
|
|
327
|
+
rpID: string;
|
|
328
|
+
/**
|
|
329
|
+
* Origin URL for passkey verification (e.g., "http://localhost:8000").
|
|
330
|
+
*/
|
|
331
|
+
origin: string;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Fully type-safe options for defineAuth().
|
|
335
|
+
*
|
|
336
|
+
* Server-only fields:
|
|
337
|
+
* - `appName` - Application name for passkey rpName, TOTP issuer, emails
|
|
338
|
+
* - `auditLog` - Audit logging configuration
|
|
339
|
+
* - `session` - Session duration and freshness settings
|
|
340
|
+
*
|
|
341
|
+
* Conditional requirements:
|
|
342
|
+
* - If config has `oauth.google: true`, then `oauth.google` credentials are REQUIRED
|
|
343
|
+
* - If config has `methods.magicLink` defined, then `hooks.sendMagicLink` is REQUIRED
|
|
344
|
+
*
|
|
345
|
+
* @template T - Auth config type
|
|
346
|
+
* @template TDb - Database record type for type-safe excludeTables
|
|
347
|
+
*/
|
|
348
|
+
type DefineAuthOptions<T extends AuthConfig, TDb = unknown> = {
|
|
349
|
+
/**
|
|
350
|
+
* The application name.
|
|
351
|
+
*/
|
|
352
|
+
appName: string;
|
|
353
|
+
/**
|
|
354
|
+
* Audit logging configuration (server-only). Use qualified table names: "dbName.tableName".
|
|
355
|
+
*/
|
|
356
|
+
auditLog?: AuditLogOptions<TDb>;
|
|
357
|
+
/**
|
|
358
|
+
* The neutral auth configuration.
|
|
359
|
+
*/
|
|
360
|
+
config: T;
|
|
361
|
+
/**
|
|
362
|
+
* Full db object (container.db) for type inference.
|
|
363
|
+
*/
|
|
364
|
+
db: TDb;
|
|
365
|
+
/**
|
|
366
|
+
* Primary database for Better Auth storage.
|
|
367
|
+
*/
|
|
368
|
+
database: Database;
|
|
369
|
+
/**
|
|
370
|
+
* Hooks for email sending and OTP delivery.
|
|
371
|
+
*/
|
|
372
|
+
hooks: RequiredHooks<T>;
|
|
373
|
+
/**
|
|
374
|
+
* Session configuration.
|
|
375
|
+
*/
|
|
376
|
+
session?: AuthSessionConfig;
|
|
377
|
+
} & (HasOAuthEnabled<T> extends true ? {
|
|
378
|
+
oauth: RequiredOAuth<T>;
|
|
379
|
+
} : {
|
|
380
|
+
oauth?: RequiredOAuth<T>;
|
|
381
|
+
}) & (HasPasskeyEnabled<T> extends true ? {
|
|
382
|
+
passkey: AuthPasskeyConfig;
|
|
383
|
+
} : {
|
|
384
|
+
passkey?: AuthPasskeyConfig;
|
|
385
|
+
});
|
|
386
|
+
/**
|
|
387
|
+
* Defines Better Auth instance from neutral config + server dependencies.
|
|
388
|
+
*/
|
|
389
|
+
declare function defineAuth<T extends AuthConfig, TDb extends Record<"primary", Database> & Record<string, Database> = Record<"primary", Database> & Record<string, Database>>(opts: DefineAuthOptions<T, TDb>): ReturnType<typeof betterAuth> & {
|
|
390
|
+
auditLog?: AuditLogOptions<TDb>;
|
|
391
|
+
shouldAudit(tableName: QualifiedTableNames<TDb>): boolean;
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* The auth instance type.
|
|
395
|
+
*/
|
|
396
|
+
type Auth$1<TDb extends Record<"primary", Database> & Record<string, Database> = Record<"primary", Database> & Record<string, Database>> = ReturnType<typeof defineAuth<AuthConfig, TDb>>;
|
|
397
|
+
//#endregion
|
|
398
|
+
export { AccessControlRoles, AccessController, AuditAction, Auth$1 as Auth, AuthConfig, AuthPasskeyConfig, AuthSessionConfig, DefineAuthOptions, type Role, auditActionSchema, createAccessControl, defineAuth };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AUTH_BASE_PATH as e,AUTH_BASE_URL as t}from"./packages/appos/src/web/auth.mjs";import{passkey as n}from"@better-auth/passkey";import{sso as r}from"@better-auth/sso";import{betterAuth as i}from"better-auth";import{drizzleAdapter as a}from"better-auth/adapters/drizzle";import{admin as o,anonymous as s,apiKey as c,emailOTP as l,magicLink as u,multiSession as d,phoneNumber as f,twoFactor as p,username as m}from"better-auth/plugins";import{createAccessControl as h}from"better-auth/plugins/access";import{z as g}from"zod";const _=g.enum([`DELETE`,`LOGIN`,`LOGOUT`,`INSERT`,`PASSWORD_CHANGE`,`TRUNCATE`,`UPDATE`]);function v(h){let{auditLog:g,config:_,appName:v,database:y,hooks:b,oauth:x,session:S,passkey:C}=h,w=[];_.plugins?.admin&&w.push(o({defaultRole:_.plugins.admin.defaultRole,adminRoles:_.plugins.admin.adminRoles})),_.plugins?.apiKey&&w.push(c({defaultPrefix:_.plugins.apiKey.defaultPrefix,defaultKeyLength:_.plugins.apiKey.defaultKeyLength,rateLimit:_.plugins.apiKey.rateLimit?{enabled:!0,maxRequests:_.plugins.apiKey.rateLimit.maxRequests,timeWindow:_.plugins.apiKey.rateLimit.timeWindow}:void 0})),_.plugins?.twoFactor&&w.push(p({issuer:_.plugins.twoFactor.issuer??v,totpOptions:_.plugins.twoFactor.totp?{digits:_.plugins.twoFactor.totp.digits,period:_.plugins.twoFactor.totp.period}:void 0,backupCodeOptions:_.plugins.twoFactor.backupCodes?{amount:_.plugins.twoFactor.backupCodes.amount,length:_.plugins.twoFactor.backupCodes.length}:void 0,otpOptions:_.plugins.twoFactor.otp&&b.send2FAOTP?{sendOTP:async({user:e,otp:t})=>b.send2FAOTP({email:e.email,otp:t})}:void 0})),_.methods?.passkey&&C&&w.push(n({rpName:v,rpID:C.rpID,origin:C.origin})),_.methods?.magicLink&&b.sendMagicLink&&w.push(u({expiresIn:_.methods.magicLink.expiresIn,sendMagicLink:async({email:e,url:t,token:n})=>{await b.sendMagicLink({email:e,url:t,token:n})}})),_.methods?.phoneOtp&&b.sendPhoneOTP&&w.push(f({otpLength:_.methods.phoneOtp.otpLength,expiresIn:_.methods.phoneOtp.expiresIn,sendOTP:async({phoneNumber:e,code:t})=>{await b.sendPhoneOTP({phoneNumber:e,otp:t})}})),_.methods?.emailOtp&&b.sendEmailOTP&&w.push(l({otpLength:_.methods.emailOtp.otpLength,expiresIn:_.methods.emailOtp.expiresIn,sendVerificationOTP:async({email:e,otp:t})=>{await b.sendEmailOTP({email:e,otp:t})}})),_.plugins?.username&&w.push(m({minUsernameLength:_.plugins.username.minUsernameLength,maxUsernameLength:_.plugins.username.maxUsernameLength})),_.plugins?.anonymous&&w.push(s({emailDomainName:_.plugins.anonymous.emailDomainName})),_.plugins?.multiSession&&w.push(d({maximumSessions:_.plugins.multiSession.maximumSessions})),_.plugins?.sso&&w.push(r({providersLimit:_.plugins.sso.providersLimit,trustEmailVerified:_.plugins.sso.trustEmailVerified,domainVerification:_.plugins.sso.domainVerification?{enabled:!0}:void 0}));let T={};_.oauth?.google&&(T.google={clientId:x?.google?.clientId??process.env.GOOGLE_CLIENT_ID??``,clientSecret:x?.google?.clientSecret??process.env.GOOGLE_CLIENT_SECRET??``}),_.oauth?.github&&(T.github={clientId:x?.github?.clientId??process.env.GITHUB_CLIENT_ID??``,clientSecret:x?.github?.clientSecret??process.env.GITHUB_CLIENT_SECRET??``}),_.oauth?.apple&&(T.apple={clientId:x?.apple?.clientId??process.env.APPLE_CLIENT_ID??``,clientSecret:x?.apple?.clientSecret??process.env.APPLE_CLIENT_SECRET??``}),_.oauth?.facebook&&(T.facebook={clientId:x?.facebook?.clientId??process.env.FACEBOOK_CLIENT_ID??``,clientSecret:x?.facebook?.clientSecret??process.env.FACEBOOK_CLIENT_SECRET??``});let E=_.basePath??e,D=_.baseURL??t,O=i({account:{accountLinking:{enabled:!0,trustedProviders:[`email-password`,`google`]}},advanced:{cookiePrefix:v.replace(/\s+/g,`_`).toLowerCase(),database:{generateId:!1},ipAddress:{disableIpTracking:!1,ipAddressHeaders:[`cf-connecting-ip`,`x-client-ip`,`x-forwarded-for`,`x-real-ip`]}},appName:v,baseURL:D||void 0,basePath:E,database:a(y,{provider:`pg`,usePlural:!0}),emailAndPassword:_.methods?.emailPassword?{enabled:!0,requireEmailVerification:_.methods.emailPassword.requireEmailVerification,minPasswordLength:_.methods.emailPassword.minPasswordLength,maxPasswordLength:_.methods.emailPassword.maxPasswordLength,sendVerificationEmail:b.sendVerificationEmail?async({user:e,url:t,token:n})=>b.sendVerificationEmail({email:e.email,url:t,token:n}):void 0,sendResetPassword:b.sendResetPasswordEmail?async({user:e,url:t,token:n})=>b.sendResetPasswordEmail({email:e.email,url:t,token:n}):void 0}:{enabled:!1},plugins:w,socialProviders:Object.keys(T).length>0?T:void 0,session:S?{expiresIn:S.expiresIn,updateAge:S.updateAge,freshAge:S.freshAge}:void 0}),k=new Set(g?.excludeTables??[]);return Object.assign(O,{auditLog:g,shouldAudit(e){return!k.has(e)}})}export{_ as auditActionSchema,h as createAccessControl,v as defineAuth};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Logger } from "./logger.mjs";
|
|
2
|
+
import { KeyvRedisOptions } from "@keyv/redis";
|
|
3
|
+
import * as keyv0 from "keyv";
|
|
4
|
+
|
|
5
|
+
//#region src/api/cache.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* The cache instance type.
|
|
8
|
+
*/
|
|
9
|
+
type Cache = ReturnType<typeof defineCache>;
|
|
10
|
+
/**
|
|
11
|
+
* Options for defining the cache.
|
|
12
|
+
*/
|
|
13
|
+
type DefineCacheOptions = {
|
|
14
|
+
/**
|
|
15
|
+
* Redis URL(s). Single or comma-separated for cluster.
|
|
16
|
+
*/
|
|
17
|
+
url: string;
|
|
18
|
+
/**
|
|
19
|
+
* The logger instance.
|
|
20
|
+
*/
|
|
21
|
+
logger: Logger;
|
|
22
|
+
/**
|
|
23
|
+
* The Keyv Redis options.
|
|
24
|
+
*/
|
|
25
|
+
options?: KeyvRedisOptions;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Define the cache instance using shared Redis client.
|
|
29
|
+
* Connection is lazy - only connects when first cache operation is performed.
|
|
30
|
+
*
|
|
31
|
+
* Algorithm:
|
|
32
|
+
* 1. Create Redis client using defineRedisClient() (lazy connection)
|
|
33
|
+
* 2. Pass client to createKeyv() - connection happens on first use
|
|
34
|
+
*
|
|
35
|
+
* @param opts - The options for defining the cache.
|
|
36
|
+
* @returns The cache instance.
|
|
37
|
+
*/
|
|
38
|
+
declare function defineCache({
|
|
39
|
+
url,
|
|
40
|
+
logger,
|
|
41
|
+
options
|
|
42
|
+
}: DefineCacheOptions): keyv0.Keyv<any>;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { Cache, DefineCacheOptions, defineCache };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{defineRedisClient as e}from"./redis.mjs";import{createKeyv as t}from"@keyv/redis";function n({url:n,logger:r,options:i}){let a=t(e({logger:r,url:n}),i);return a.on(`error`,e=>{r.error({err:e},`Cache Keyv error`)}),a}export{n as defineCache};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/api/config.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The config base schema.
|
|
7
|
+
*/
|
|
8
|
+
declare const baseSchema: z.ZodObject<{
|
|
9
|
+
APP_NAME: z.ZodDefault<z.ZodString>;
|
|
10
|
+
APP_DESC: z.ZodDefault<z.ZodString>;
|
|
11
|
+
APP_VERSION: z.ZodDefault<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a configuration object by merging base config with user-defined schema.
|
|
15
|
+
*
|
|
16
|
+
* Variables in default values are expanded after defaults are applied.
|
|
17
|
+
* For example: `DATABASE_URL: z.string().default("postgres://{{DB_HOST}}:5432")`
|
|
18
|
+
*
|
|
19
|
+
* @param userSchema User-defined Zod schema to merge with base config.
|
|
20
|
+
* @returns Parsed and validated configuration object.
|
|
21
|
+
*/
|
|
22
|
+
declare function defineConfig<T extends z.ZodRawShape = {}>(userSchema: z.ZodObject<T>): Config<T>;
|
|
23
|
+
/**
|
|
24
|
+
* The configuration type inferred from the merged schema.
|
|
25
|
+
*/
|
|
26
|
+
type Config<T extends z.ZodRawShape = {}> = z.infer<ReturnType<typeof baseSchema.extend<T>>>;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { Config, baseSchema, defineConfig };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{z as e}from"zod";const t=e.object({APP_NAME:e.string().default(`AppOS`),APP_DESC:e.string().default(`The app operating system to build your business.`),APP_VERSION:e.string().default(`development`)});function n(e){let t={...e},n=new Set;function r(e,i){if(n.has(e))throw Error(`Circular reference detected in environment variable: ${e}`);n.add(e);let a=i.replace(/\{\{([^}]+)\}\}/g,(e,n)=>{let i=n.trim();if(!i)return e;let a=t[i];return a===void 0?e:a.includes(`{{`)?r(i,a):a});return n.delete(e),a}for(let[e,n]of Object.entries(t))n?.includes(`{{`)&&(t[e]=r(e,n));return t}function r(e){let r=t.extend(e.shape),i={};for(let[e,t]of Object.entries(r.shape)){let n=t;for(;n;){let t=n.def;if(t.defaultValue!==void 0){let n=typeof t.defaultValue==`function`?t.defaultValue():t.defaultValue;typeof n==`string`&&(i[e]=n);break}n=t.innerType||t.schema}}let a={...i};for(let[e,t]of Object.entries(process.env))t!==void 0&&(a[e]=t);return r.parse(n(a))}export{t as baseSchema,r as defineConfig};
|