alepha 0.14.2 → 0.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api/audits/index.browser.js +5 -5
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +706 -785
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/audits/index.js +13 -13
- package/dist/api/audits/index.js.map +1 -1
- package/dist/api/files/index.browser.js +5 -5
- package/dist/api/files/index.browser.js.map +1 -1
- package/dist/api/files/index.d.ts +58 -137
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +71 -71
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.browser.js +5 -5
- package/dist/api/jobs/index.browser.js.map +1 -1
- package/dist/api/jobs/index.d.ts +29 -108
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +10 -10
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/notifications/index.browser.js +10 -10
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +504 -171
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +12 -12
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.browser.js +163 -10
- package/dist/api/parameters/index.browser.js.map +1 -1
- package/dist/api/parameters/index.d.ts +277 -351
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +196 -91
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +19 -19
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +787 -852
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +827 -596
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.browser.js +6 -6
- package/dist/api/verifications/index.browser.js.map +1 -1
- package/dist/api/verifications/index.d.ts +128 -128
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +6 -6
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/bin/index.d.ts +1 -2
- package/dist/bin/index.js +0 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/cli/index.d.ts +252 -131
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +595 -395
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +46 -11
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +99 -19
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +40 -22
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +45 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +40 -22
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +40 -22
- package/dist/core/index.native.js.map +1 -1
- package/dist/fake/index.js +195 -168
- package/dist/fake/index.js.map +1 -1
- package/dist/file/index.d.ts +8 -0
- package/dist/file/index.d.ts.map +1 -1
- package/dist/file/index.js +3 -0
- package/dist/file/index.js.map +1 -1
- package/dist/logger/index.d.ts +1 -1
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +12 -2
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.d.ts +59 -195
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +201 -430
- package/dist/orm/index.js.map +1 -1
- package/dist/security/index.d.ts +1 -1
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +1 -1
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +171 -155
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +0 -1
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cache/index.d.ts +12 -0
- package/dist/server/cache/index.d.ts.map +1 -1
- package/dist/server/cache/index.js +55 -2
- package/dist/server/cache/index.js.map +1 -1
- package/dist/server/compress/index.d.ts +6 -0
- package/dist/server/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +38 -1
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/core/index.browser.js +2 -2
- package/dist/server/core/index.browser.js.map +1 -1
- package/dist/server/core/index.d.ts +10 -10
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +7 -4
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js +22 -6
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +46 -44
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +24 -41
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/static/index.js +4 -0
- package/dist/server/static/index.js.map +1 -1
- package/dist/server/swagger/index.d.ts +2 -1
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +9 -5
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/vite/index.d.ts +101 -106
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +574 -503
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.d.ts +7 -7
- package/package.json +7 -7
- package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
- package/src/api/audits/entities/audits.ts +5 -5
- package/src/api/audits/index.browser.ts +1 -1
- package/src/api/audits/index.ts +3 -3
- package/src/api/audits/primitives/$audit.spec.ts +276 -0
- package/src/api/audits/services/AuditService.spec.ts +495 -0
- package/src/api/files/__tests__/$bucket.spec.ts +91 -0
- package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
- package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
- package/src/api/files/controllers/FileController.spec.ts +558 -0
- package/src/api/files/controllers/FileController.ts +4 -5
- package/src/api/files/entities/files.ts +5 -5
- package/src/api/files/index.browser.ts +1 -1
- package/src/api/files/index.ts +4 -4
- package/src/api/files/jobs/FileJobs.spec.ts +52 -0
- package/src/api/files/services/FileService.spec.ts +109 -0
- package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
- package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
- package/src/api/jobs/entities/jobExecutions.ts +5 -5
- package/src/api/jobs/index.ts +3 -3
- package/src/api/jobs/primitives/$job.spec.ts +476 -0
- package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
- package/src/api/notifications/entities/notifications.ts +5 -5
- package/src/api/notifications/index.browser.ts +1 -1
- package/src/api/notifications/index.ts +4 -4
- package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
- package/src/api/parameters/entities/parameters.ts +7 -17
- package/src/api/parameters/index.ts +3 -3
- package/src/api/parameters/primitives/$config.spec.ts +356 -0
- package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
- package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
- package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
- package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
- package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
- package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
- package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
- package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
- package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
- package/src/api/parameters/schemas/index.ts +15 -0
- package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
- package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
- package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
- package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
- package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
- package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
- package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
- package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
- package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
- package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
- package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
- package/src/api/users/controllers/AdminUserController.ts +116 -0
- package/src/api/users/controllers/UserController.ts +4 -107
- package/src/api/users/controllers/UserRealmController.ts +3 -0
- package/src/api/users/entities/identities.ts +6 -6
- package/src/api/users/entities/sessions.ts +6 -6
- package/src/api/users/entities/users.ts +9 -9
- package/src/api/users/index.ts +9 -6
- package/src/api/users/primitives/$userRealm.ts +13 -8
- package/src/api/users/services/CredentialService.spec.ts +509 -0
- package/src/api/users/services/CredentialService.ts +46 -0
- package/src/api/users/services/IdentityService.ts +15 -0
- package/src/api/users/services/RegistrationService.spec.ts +630 -0
- package/src/api/users/services/RegistrationService.ts +18 -0
- package/src/api/users/services/SessionService.spec.ts +301 -0
- package/src/api/users/services/SessionService.ts +110 -1
- package/src/api/users/services/UserService.ts +67 -2
- package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
- package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
- package/src/api/verifications/entities/verifications.ts +6 -6
- package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
- package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
- package/src/batch/primitives/$batch.spec.ts +766 -0
- package/src/batch/providers/BatchProvider.spec.ts +786 -0
- package/src/bin/index.ts +0 -1
- package/src/bucket/__tests__/shared.ts +194 -0
- package/src/bucket/primitives/$bucket.spec.ts +104 -0
- package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
- package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
- package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
- package/src/cache/core/__tests__/shared.ts +377 -0
- package/src/cache/core/primitives/$cache.spec.ts +111 -0
- package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
- package/src/cli/apps/AlephaCli.ts +25 -6
- package/src/cli/atoms/buildOptions.ts +88 -0
- package/src/cli/commands/build.ts +32 -69
- package/src/cli/commands/db.ts +0 -4
- package/src/cli/commands/dev.ts +34 -10
- package/src/cli/commands/gen/changelog.spec.ts +315 -0
- package/src/cli/commands/{changelog.ts → gen/changelog.ts} +9 -9
- package/src/cli/commands/gen/env.ts +53 -0
- package/src/cli/commands/gen/openapi.ts +71 -0
- package/src/cli/commands/gen/resource.ts +15 -0
- package/src/cli/commands/gen.ts +24 -0
- package/src/cli/commands/init.ts +2 -1
- package/src/cli/commands/root.ts +12 -3
- package/src/cli/commands/test.ts +0 -1
- package/src/cli/commands/typecheck.ts +5 -0
- package/src/cli/commands/verify.ts +1 -1
- package/src/cli/defineConfig.ts +49 -7
- package/src/cli/index.ts +2 -2
- package/src/cli/services/AlephaCliUtils.ts +105 -55
- package/src/cli/services/GitMessageParser.ts +1 -1
- package/src/command/helpers/Asker.spec.ts +127 -0
- package/src/command/helpers/Runner.spec.ts +126 -0
- package/src/command/helpers/Runner.ts +1 -1
- package/src/command/primitives/$command.spec.ts +1588 -0
- package/src/command/primitives/$command.ts +0 -6
- package/src/command/providers/CliProvider.ts +75 -27
- package/src/core/Alepha.ts +87 -0
- package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
- package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
- package/src/core/__tests__/Alepha-has.spec.ts +41 -0
- package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
- package/src/core/__tests__/Alepha-register.spec.ts +81 -0
- package/src/core/__tests__/Alepha-start.spec.ts +176 -0
- package/src/core/__tests__/Alepha-with.spec.ts +14 -0
- package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
- package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
- package/src/core/__tests__/descriptor.spec.ts +34 -0
- package/src/core/__tests__/fixtures/A.ts +5 -0
- package/src/core/__tests__/pagination.spec.ts +77 -0
- package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
- package/src/core/primitives/$atom.spec.ts +43 -0
- package/src/core/primitives/$hook.spec.ts +130 -0
- package/src/core/primitives/$inject.spec.ts +175 -0
- package/src/core/primitives/$module.spec.ts +115 -0
- package/src/core/providers/CodecManager.spec.ts +740 -0
- package/src/core/providers/EventManager.spec.ts +762 -0
- package/src/core/providers/EventManager.ts +4 -0
- package/src/core/providers/StateManager.spec.ts +365 -0
- package/src/core/providers/TypeProvider.spec.ts +1607 -0
- package/src/core/providers/TypeProvider.ts +20 -26
- package/src/datetime/primitives/$interval.spec.ts +103 -0
- package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
- package/src/email/primitives/$email.spec.ts +175 -0
- package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
- package/src/fake/__tests__/keyName.example.ts +40 -0
- package/src/fake/__tests__/keyName.spec.ts +152 -0
- package/src/fake/__tests__/module.example.ts +32 -0
- package/src/fake/providers/FakeProvider.spec.ts +438 -0
- package/src/file/providers/FileSystemProvider.ts +8 -0
- package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
- package/src/file/providers/NodeFileSystemProvider.ts +5 -0
- package/src/file/services/FileDetector.spec.ts +591 -0
- package/src/lock/core/__tests__/shared.ts +190 -0
- package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
- package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
- package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
- package/src/logger/index.ts +15 -3
- package/src/logger/primitives/$logger.spec.ts +108 -0
- package/src/logger/services/Logger.spec.ts +295 -0
- package/src/mcp/__tests__/errors.spec.ts +175 -0
- package/src/mcp/__tests__/integration.spec.ts +450 -0
- package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
- package/src/mcp/primitives/$prompt.spec.ts +468 -0
- package/src/mcp/primitives/$resource.spec.ts +390 -0
- package/src/mcp/primitives/$tool.spec.ts +406 -0
- package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
- package/src/mcp/transports/StdioMcpTransport.ts +1 -1
- package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
- package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
- package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
- package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
- package/src/orm/__tests__/$repository-save.spec.ts +37 -0
- package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
- package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
- package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
- package/src/orm/__tests__/delete-returning.spec.ts +256 -0
- package/src/orm/__tests__/deletedAt.spec.ts +80 -0
- package/src/orm/__tests__/enums.spec.ts +315 -0
- package/src/orm/__tests__/execute.spec.ts +72 -0
- package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
- package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
- package/src/orm/__tests__/joins.spec.ts +1114 -0
- package/src/orm/__tests__/page.spec.ts +287 -0
- package/src/orm/__tests__/primaryKey.spec.ts +87 -0
- package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
- package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
- package/src/orm/__tests__/references.spec.ts +102 -0
- package/src/orm/__tests__/security.spec.ts +710 -0
- package/src/orm/__tests__/sqlite.spec.ts +111 -0
- package/src/orm/__tests__/string-operators.spec.ts +429 -0
- package/src/orm/__tests__/timestamps.spec.ts +388 -0
- package/src/orm/__tests__/validation.spec.ts +183 -0
- package/src/orm/__tests__/version.spec.ts +64 -0
- package/src/orm/helpers/parseQueryString.spec.ts +196 -0
- package/src/orm/index.ts +2 -8
- package/src/orm/primitives/$repository.spec.ts +137 -0
- package/src/orm/primitives/$sequence.spec.ts +29 -0
- package/src/orm/primitives/$transaction.spec.ts +82 -0
- package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
- package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
- package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
- package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
- package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
- package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
- package/src/orm/services/ModelBuilder.spec.ts +575 -0
- package/src/orm/services/Repository.spec.ts +137 -0
- package/src/queue/core/__tests__/shared.ts +143 -0
- package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
- package/src/queue/core/providers/WorkerProvider.spec.ts +394 -0
- package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
- package/src/redis/__tests__/redis.spec.ts +58 -0
- package/src/retry/primitives/$retry.spec.ts +234 -0
- package/src/retry/providers/RetryProvider.spec.ts +438 -0
- package/src/router/__tests__/match.spec.ts +252 -0
- package/src/router/providers/RouterProvider.spec.ts +197 -0
- package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
- package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
- package/src/scheduler/__tests__/shared.ts +77 -0
- package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
- package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
- package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
- package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
- package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
- package/src/security/primitives/$permission.spec.ts +30 -0
- package/src/security/primitives/$permission.ts +2 -2
- package/src/security/primitives/$realm.spec.ts +101 -0
- package/src/security/primitives/$role.spec.ts +52 -0
- package/src/security/primitives/$serviceAccount.spec.ts +61 -0
- package/src/security/providers/SecurityProvider.spec.ts +350 -0
- package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
- package/src/server/cache/providers/ServerCacheProvider.spec.ts +1125 -0
- package/src/server/cache/providers/ServerCacheProvider.ts +94 -9
- package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
- package/src/server/compress/providers/ServerCompressProvider.ts +63 -2
- package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
- package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
- package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
- package/src/server/core/helpers/ServerReply.ts +2 -2
- package/src/server/core/primitives/$action.spec.ts +191 -0
- package/src/server/core/primitives/$route.spec.ts +65 -0
- package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
- package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
- package/src/server/core/providers/ServerProvider.ts +14 -2
- package/src/server/core/services/HttpClient.spec.ts +123 -0
- package/src/server/core/services/UserAgentParser.spec.ts +111 -0
- package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
- package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
- package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
- package/src/server/links/__tests__/$action.spec.ts +238 -0
- package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
- package/src/server/links/__tests__/requestId.spec.ts +120 -0
- package/src/server/links/primitives/$remote.spec.ts +228 -0
- package/src/server/links/providers/LinkProvider.spec.ts +54 -0
- package/src/server/links/providers/LinkProvider.ts +49 -3
- package/src/server/links/providers/ServerLinksProvider.ts +1 -53
- package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
- package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
- package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
- package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
- package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
- package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
- package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
- package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
- package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
- package/src/server/static/primitives/$serve.spec.ts +193 -0
- package/src/server/static/providers/ServerStaticProvider.ts +10 -0
- package/src/server/swagger/__tests__/ui.spec.ts +52 -0
- package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +19 -12
- package/src/sms/primitives/$sms.spec.ts +165 -0
- package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
- package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
- package/src/thread/primitives/$thread.spec.ts +186 -0
- package/src/topic/core/__tests__/shared.ts +144 -0
- package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
- package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
- package/src/vite/helpers/importViteReact.ts +13 -0
- package/src/vite/index.ts +1 -21
- package/src/vite/plugins/viteAlephaDev.ts +32 -5
- package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
- package/src/vite/tasks/buildClient.ts +11 -0
- package/src/vite/tasks/buildServer.ts +47 -3
- package/src/vite/tasks/devServer.ts +69 -0
- package/src/vite/tasks/index.ts +2 -1
- package/src/vite/tasks/runAlepha.ts +7 -1
- package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
- package/src/websocket/primitives/$channel.spec.ts +30 -0
- package/src/cli/assets/viteConfigTs.ts +0 -14
- package/src/cli/commands/run.ts +0 -24
- package/src/vite/plugins/viteAlepha.ts +0 -37
- package/src/vite/plugins/viteAlephaBuild.ts +0 -281
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Activate config body schema.
|
|
5
|
+
*/
|
|
6
|
+
export const activateConfigBodySchema = t.object({
|
|
7
|
+
version: t.integer({ description: "Version number to activate" }),
|
|
8
|
+
creatorId: t.optional(t.uuid()),
|
|
9
|
+
creatorName: t.optional(t.text()),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export type ActivateConfigBody = Static<typeof activateConfigBodySchema>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { t } from "alepha";
|
|
2
|
+
import { parameterResponseSchema } from "./parameterResponseSchema.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Current config response schema.
|
|
6
|
+
*/
|
|
7
|
+
export const configCurrentResponseSchema = t.object({
|
|
8
|
+
current: t.optional(parameterResponseSchema),
|
|
9
|
+
next: t.optional(parameterResponseSchema),
|
|
10
|
+
defaultValue: t.optional(t.json()),
|
|
11
|
+
currentValue: t.optional(t.json()),
|
|
12
|
+
schema: t.optional(t.json()),
|
|
13
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tree node schema for configuration tree navigation.
|
|
5
|
+
*/
|
|
6
|
+
export const configTreeNodeSchema = t.object({
|
|
7
|
+
name: t.text(),
|
|
8
|
+
path: t.text(),
|
|
9
|
+
isLeaf: t.boolean(),
|
|
10
|
+
children: t.array(t.any()),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export type ConfigTreeNode = Static<typeof configTreeNodeSchema>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Create config version body schema.
|
|
5
|
+
*/
|
|
6
|
+
export const createConfigVersionBodySchema = t.object({
|
|
7
|
+
content: t.json({ description: "New configuration content" }),
|
|
8
|
+
schemaHash: t.text({
|
|
9
|
+
description: "Hash of the schema for migration detection",
|
|
10
|
+
}),
|
|
11
|
+
activationDate: t.optional(
|
|
12
|
+
t.datetime({ description: "When to activate (default: now)" }),
|
|
13
|
+
),
|
|
14
|
+
changeDescription: t.optional(
|
|
15
|
+
t.text({ description: "Description of changes" }),
|
|
16
|
+
),
|
|
17
|
+
tags: t.optional(t.array(t.text())),
|
|
18
|
+
creatorId: t.optional(t.uuid()),
|
|
19
|
+
creatorName: t.optional(t.text()),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export type CreateConfigVersionBody = Static<
|
|
23
|
+
typeof createConfigVersionBodySchema
|
|
24
|
+
>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export * from "./activateConfigBodySchema.ts";
|
|
2
|
+
export * from "./checkScheduledResponseSchema.ts";
|
|
3
|
+
export * from "./configCurrentResponseSchema.ts";
|
|
4
|
+
export * from "./configHistoryResponseSchema.ts";
|
|
5
|
+
export * from "./configNameParamSchema.ts";
|
|
6
|
+
export * from "./configNamesResponseSchema.ts";
|
|
7
|
+
export * from "./configsByStatusResponseSchema.ts";
|
|
8
|
+
export * from "./configTreeNodeSchema.ts";
|
|
9
|
+
export * from "./configVersionParamSchema.ts";
|
|
10
|
+
export * from "./configVersionResponseSchema.ts";
|
|
11
|
+
export * from "./createConfigVersionBodySchema.ts";
|
|
12
|
+
export * from "./parameterResponseSchema.ts";
|
|
13
|
+
export * from "./parameterStatusSchema.ts";
|
|
14
|
+
export * from "./rollbackConfigBodySchema.ts";
|
|
15
|
+
export * from "./statusParamSchema.ts";
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
import { parameterStatusSchema } from "./parameterStatusSchema.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Parameter response schema for API responses.
|
|
6
|
+
*/
|
|
7
|
+
export const parameterResponseSchema = t.object({
|
|
8
|
+
id: t.uuid(),
|
|
9
|
+
createdAt: t.datetime(),
|
|
10
|
+
updatedAt: t.datetime(),
|
|
11
|
+
name: t.text(),
|
|
12
|
+
content: t.json(),
|
|
13
|
+
schemaHash: t.text(),
|
|
14
|
+
status: parameterStatusSchema,
|
|
15
|
+
activationDate: t.datetime(),
|
|
16
|
+
expiredAt: t.optional(t.datetime()),
|
|
17
|
+
version: t.integer(),
|
|
18
|
+
changeDescription: t.optional(t.text()),
|
|
19
|
+
tags: t.optional(t.array(t.text())),
|
|
20
|
+
creatorId: t.optional(t.uuid()),
|
|
21
|
+
creatorName: t.optional(t.text()),
|
|
22
|
+
previousContent: t.optional(t.json()),
|
|
23
|
+
migrationLog: t.optional(t.text()),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
export type ParameterResponse = Static<typeof parameterResponseSchema>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Parameter status enum schema.
|
|
5
|
+
*/
|
|
6
|
+
export const parameterStatusSchema = t.enum([
|
|
7
|
+
"expired",
|
|
8
|
+
"current",
|
|
9
|
+
"next",
|
|
10
|
+
"future",
|
|
11
|
+
]);
|
|
12
|
+
|
|
13
|
+
export type ParameterStatus = Static<typeof parameterStatusSchema>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Static, t } from "alepha";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Rollback config body schema.
|
|
5
|
+
*/
|
|
6
|
+
export const rollbackConfigBodySchema = t.object({
|
|
7
|
+
targetVersion: t.integer({
|
|
8
|
+
description: "Version number to rollback to",
|
|
9
|
+
}),
|
|
10
|
+
changeDescription: t.optional(t.text()),
|
|
11
|
+
creatorId: t.optional(t.uuid()),
|
|
12
|
+
creatorName: t.optional(t.text()),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export type RollbackConfigBody = Static<typeof rollbackConfigBodySchema>;
|
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { AlephaApiVerification } from "alepha/api/verifications";
|
|
3
|
+
import { DateTimeProvider } from "alepha/datetime";
|
|
4
|
+
import { AlephaEmail, MemoryEmailProvider } from "alepha/email";
|
|
5
|
+
import { AlephaSecurity } from "alepha/security";
|
|
6
|
+
import { BadRequestError } from "alepha/server";
|
|
7
|
+
import { describe, it } from "vitest";
|
|
8
|
+
import { AlephaApiUsers, UserController, UserService } from "../index.ts";
|
|
9
|
+
|
|
10
|
+
const setup = async () => {
|
|
11
|
+
const alepha = Alepha.create({
|
|
12
|
+
env: { LOG_LEVEL: "error" },
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
alepha.with(AlephaSecurity);
|
|
16
|
+
alepha.with(AlephaEmail);
|
|
17
|
+
alepha.with(AlephaApiVerification);
|
|
18
|
+
alepha.with(AlephaApiUsers);
|
|
19
|
+
|
|
20
|
+
await alepha.start();
|
|
21
|
+
|
|
22
|
+
const emailProvider = alepha.inject(MemoryEmailProvider);
|
|
23
|
+
emailProvider.records = [];
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
alepha,
|
|
27
|
+
userService: alepha.inject(UserService),
|
|
28
|
+
dateTimeProvider: alepha.inject(DateTimeProvider),
|
|
29
|
+
emailProvider,
|
|
30
|
+
actions: alepha.inject(UserController),
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// Helper to extract code from email
|
|
35
|
+
const extractCode = (emailBody: string): string => {
|
|
36
|
+
// Code is displayed in the email body as a 6-digit number
|
|
37
|
+
const match = emailBody.match(/(\d{6})/);
|
|
38
|
+
if (!match) throw new Error("Code not found in email");
|
|
39
|
+
return match[1];
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
describe("alepha/api/users - Email Verification", () => {
|
|
43
|
+
it("should successfully request email verification and send email", async ({
|
|
44
|
+
expect,
|
|
45
|
+
}) => {
|
|
46
|
+
const { userService, emailProvider, actions } = await setup();
|
|
47
|
+
|
|
48
|
+
// Create a test user
|
|
49
|
+
const user = await userService.users().create({
|
|
50
|
+
username: "testuser",
|
|
51
|
+
email: "test@example.com",
|
|
52
|
+
roles: ["user"],
|
|
53
|
+
emailVerified: false,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Request email verification
|
|
57
|
+
const result = await actions.requestEmailVerification({
|
|
58
|
+
body: {
|
|
59
|
+
email: "test@example.com",
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
expect(result.success).toBe(true);
|
|
64
|
+
expect(result.message).toContain("verification code has been sent");
|
|
65
|
+
|
|
66
|
+
// Verify email was sent via verification service
|
|
67
|
+
await expect.poll(() => emailProvider.records.length).toBe(1);
|
|
68
|
+
const email = emailProvider.records[0];
|
|
69
|
+
expect(email.to).toBe("test@example.com");
|
|
70
|
+
expect(email.subject).toBe("Verify your email address");
|
|
71
|
+
// Check for 6-digit code in email
|
|
72
|
+
expect(email.body).toMatch(/\d{6}/);
|
|
73
|
+
expect(email.body).toContain("5 minutes"); // Default code verification expiration
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("should not reveal if email does not exist", async ({ expect }) => {
|
|
77
|
+
const { emailProvider, actions } = await setup();
|
|
78
|
+
|
|
79
|
+
// Request email verification for non-existent email
|
|
80
|
+
const result = await actions.requestEmailVerification({
|
|
81
|
+
body: {
|
|
82
|
+
email: "nonexistent@example.com",
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Should return success to prevent email enumeration
|
|
87
|
+
expect(result.success).toBe(true);
|
|
88
|
+
expect(result.message).toContain("verification code has been sent");
|
|
89
|
+
|
|
90
|
+
// But no email should be sent
|
|
91
|
+
expect(emailProvider.records).toHaveLength(0);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("should not send email if already verified", async ({ expect }) => {
|
|
95
|
+
const { userService, emailProvider, actions } = await setup();
|
|
96
|
+
|
|
97
|
+
// Create a user with already verified email
|
|
98
|
+
await userService.users().create({
|
|
99
|
+
username: "verifieduser",
|
|
100
|
+
email: "verified@example.com",
|
|
101
|
+
roles: ["user"],
|
|
102
|
+
emailVerified: true,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Request email verification
|
|
106
|
+
const result = await actions.requestEmailVerification({
|
|
107
|
+
body: {
|
|
108
|
+
email: "verified@example.com",
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Should return success but not send email
|
|
113
|
+
expect(result.success).toBe(true);
|
|
114
|
+
expect(emailProvider.records).toHaveLength(0);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("should successfully verify email with valid token", async ({
|
|
118
|
+
expect,
|
|
119
|
+
}) => {
|
|
120
|
+
const { userService, emailProvider, actions } = await setup();
|
|
121
|
+
|
|
122
|
+
// Create a test user
|
|
123
|
+
const user = await userService.users().create({
|
|
124
|
+
username: "testuser",
|
|
125
|
+
email: "test@example.com",
|
|
126
|
+
roles: ["user"],
|
|
127
|
+
emailVerified: false,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Request email verification
|
|
131
|
+
await userService.requestEmailVerification("test@example.com");
|
|
132
|
+
|
|
133
|
+
// Extract code from email
|
|
134
|
+
await expect.poll(() => emailProvider.records.length).toBe(1);
|
|
135
|
+
const token = extractCode(emailProvider.records[0].body);
|
|
136
|
+
|
|
137
|
+
// Verify email
|
|
138
|
+
const result = await actions.verifyEmail({
|
|
139
|
+
body: {
|
|
140
|
+
email: "test@example.com",
|
|
141
|
+
token,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
expect(result.success).toBe(true);
|
|
146
|
+
expect(result.message).toContain("Email has been verified successfully");
|
|
147
|
+
|
|
148
|
+
// Check that emailVerified is now true
|
|
149
|
+
const updatedUser = await userService.users().findOne({
|
|
150
|
+
where: { id: { eq: user.id } },
|
|
151
|
+
});
|
|
152
|
+
expect(updatedUser.emailVerified).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it("should reject invalid verification token", async ({ expect }) => {
|
|
156
|
+
const { userService, actions } = await setup();
|
|
157
|
+
|
|
158
|
+
// Create a test user
|
|
159
|
+
await userService.users().create({
|
|
160
|
+
username: "testuser",
|
|
161
|
+
email: "test@example.com",
|
|
162
|
+
roles: ["user"],
|
|
163
|
+
emailVerified: false,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
// Attempt to verify with invalid token
|
|
167
|
+
await expect(
|
|
168
|
+
actions.verifyEmail({
|
|
169
|
+
body: {
|
|
170
|
+
email: "test@example.com",
|
|
171
|
+
token: "550e8400-e29b-41d4-a716-446655440000",
|
|
172
|
+
},
|
|
173
|
+
}),
|
|
174
|
+
).rejects.toThrowError(BadRequestError);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("should reject expired verification token", async ({ expect }) => {
|
|
178
|
+
const { userService, dateTimeProvider, emailProvider, actions } =
|
|
179
|
+
await setup();
|
|
180
|
+
|
|
181
|
+
// Create a test user
|
|
182
|
+
await userService.users().create({
|
|
183
|
+
username: "testuser",
|
|
184
|
+
email: "test@example.com",
|
|
185
|
+
roles: ["user"],
|
|
186
|
+
emailVerified: false,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Request email verification
|
|
190
|
+
await userService.requestEmailVerification("test@example.com");
|
|
191
|
+
|
|
192
|
+
// Extract code
|
|
193
|
+
await expect.poll(() => emailProvider.records.length).toBe(1);
|
|
194
|
+
const token = extractCode(emailProvider.records[0].body);
|
|
195
|
+
|
|
196
|
+
// Travel forward in time to expire the token (default expiration is 5 minutes for code verification)
|
|
197
|
+
dateTimeProvider.travel(6, "minutes");
|
|
198
|
+
|
|
199
|
+
// Attempt to verify with expired token
|
|
200
|
+
await expect(
|
|
201
|
+
actions.verifyEmail({
|
|
202
|
+
body: {
|
|
203
|
+
email: "test@example.com",
|
|
204
|
+
token,
|
|
205
|
+
},
|
|
206
|
+
}),
|
|
207
|
+
).rejects.toThrowError(BadRequestError);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it("should not allow token reuse after successful verification", async ({
|
|
211
|
+
expect,
|
|
212
|
+
}) => {
|
|
213
|
+
const { userService, emailProvider, actions } = await setup();
|
|
214
|
+
|
|
215
|
+
// Create a test user
|
|
216
|
+
await userService.users().create({
|
|
217
|
+
username: "testuser",
|
|
218
|
+
email: "test@example.com",
|
|
219
|
+
roles: ["user"],
|
|
220
|
+
emailVerified: false,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// Request email verification
|
|
224
|
+
await userService.requestEmailVerification("test@example.com");
|
|
225
|
+
|
|
226
|
+
// Extract code
|
|
227
|
+
await expect.poll(() => emailProvider.records.length).toBe(1);
|
|
228
|
+
const token = extractCode(emailProvider.records[0].body);
|
|
229
|
+
|
|
230
|
+
// Verify email
|
|
231
|
+
await actions.verifyEmail({
|
|
232
|
+
body: {
|
|
233
|
+
email: "test@example.com",
|
|
234
|
+
token,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
// Attempt to use the same token again should fail
|
|
239
|
+
await expect(
|
|
240
|
+
actions.verifyEmail({
|
|
241
|
+
body: {
|
|
242
|
+
email: "test@example.com",
|
|
243
|
+
token,
|
|
244
|
+
},
|
|
245
|
+
}),
|
|
246
|
+
).rejects.toThrowError(BadRequestError);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("should check email verification status", async ({ expect }) => {
|
|
250
|
+
const { userService, actions } = await setup();
|
|
251
|
+
|
|
252
|
+
// Create a test user with unverified email
|
|
253
|
+
await userService.users().create({
|
|
254
|
+
username: "unverifieduser",
|
|
255
|
+
email: "unverified@example.com",
|
|
256
|
+
roles: ["user"],
|
|
257
|
+
emailVerified: false,
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Create a test user with verified email
|
|
261
|
+
await userService.users().create({
|
|
262
|
+
username: "verifieduser",
|
|
263
|
+
email: "verified@example.com",
|
|
264
|
+
roles: ["user"],
|
|
265
|
+
emailVerified: true,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
// Check unverified email
|
|
269
|
+
const unverifiedResult = await actions.checkEmailVerification({
|
|
270
|
+
query: { email: "unverified@example.com" },
|
|
271
|
+
});
|
|
272
|
+
expect(unverifiedResult.verified).toBe(false);
|
|
273
|
+
|
|
274
|
+
// Check verified email
|
|
275
|
+
const verifiedResult = await actions.checkEmailVerification({
|
|
276
|
+
query: { email: "verified@example.com" },
|
|
277
|
+
});
|
|
278
|
+
expect(verifiedResult.verified).toBe(true);
|
|
279
|
+
|
|
280
|
+
// Check non-existent email
|
|
281
|
+
const nonExistentResult = await actions.checkEmailVerification({
|
|
282
|
+
query: { email: "nonexistent@example.com" },
|
|
283
|
+
});
|
|
284
|
+
expect(nonExistentResult.verified).toBe(false);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("should respect rate limiting on verification requests", async ({
|
|
288
|
+
expect,
|
|
289
|
+
}) => {
|
|
290
|
+
const { userService, dateTimeProvider, emailProvider, actions } =
|
|
291
|
+
await setup();
|
|
292
|
+
|
|
293
|
+
// Create a test user
|
|
294
|
+
await userService.users().create({
|
|
295
|
+
username: "testuser",
|
|
296
|
+
email: "test@example.com",
|
|
297
|
+
roles: ["user"],
|
|
298
|
+
emailVerified: false,
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
// Request email verification multiple times within cooldown period
|
|
302
|
+
await actions.requestEmailVerification({
|
|
303
|
+
body: {
|
|
304
|
+
email: "test@example.com",
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
await expect.poll(() => emailProvider.records.length).toBe(1);
|
|
309
|
+
|
|
310
|
+
// Second request should be silently ignored (cooldown)
|
|
311
|
+
await actions.requestEmailVerification({
|
|
312
|
+
body: {
|
|
313
|
+
email: "test@example.com",
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
// Still only 1 email
|
|
318
|
+
expect(emailProvider.records.length).toBe(1);
|
|
319
|
+
|
|
320
|
+
// Wait for cooldown to pass (90 seconds default)
|
|
321
|
+
dateTimeProvider.travel(91, "seconds");
|
|
322
|
+
|
|
323
|
+
// Now should work
|
|
324
|
+
await actions.requestEmailVerification({
|
|
325
|
+
body: {
|
|
326
|
+
email: "test@example.com",
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
await expect.poll(() => emailProvider.records.length).toBe(2);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it("should correctly identify verified vs unverified users using isEmailVerified", async ({
|
|
334
|
+
expect,
|
|
335
|
+
}) => {
|
|
336
|
+
const { userService } = await setup();
|
|
337
|
+
|
|
338
|
+
// Create users with different verification statuses
|
|
339
|
+
await userService.users().create({
|
|
340
|
+
username: "unverifieduser",
|
|
341
|
+
email: "unverified@example.com",
|
|
342
|
+
roles: ["user"],
|
|
343
|
+
emailVerified: false,
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
await userService.users().create({
|
|
347
|
+
username: "verifieduser",
|
|
348
|
+
email: "verified@example.com",
|
|
349
|
+
roles: ["user"],
|
|
350
|
+
emailVerified: true,
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// Check verification status
|
|
354
|
+
const unverifiedStatus = await userService.isEmailVerified(
|
|
355
|
+
"unverified@example.com",
|
|
356
|
+
);
|
|
357
|
+
expect(unverifiedStatus).toBe(false);
|
|
358
|
+
|
|
359
|
+
const verifiedStatus = await userService.isEmailVerified(
|
|
360
|
+
"verified@example.com",
|
|
361
|
+
);
|
|
362
|
+
expect(verifiedStatus).toBe(true);
|
|
363
|
+
|
|
364
|
+
const nonExistentStatus = await userService.isEmailVerified(
|
|
365
|
+
"nonexistent@example.com",
|
|
366
|
+
);
|
|
367
|
+
expect(nonExistentStatus).toBe(false);
|
|
368
|
+
});
|
|
369
|
+
});
|