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,439 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { $serviceAccount } from "../index.ts";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Bug #4: Missing HTTP Response Validation in OAuth2 Service Account
|
|
7
|
+
*
|
|
8
|
+
* Issue: The OAuth2 token fetching code didn't:
|
|
9
|
+
* 1. Check HTTP response.ok or status codes
|
|
10
|
+
* 2. Handle JSON parsing errors
|
|
11
|
+
* 3. Handle network errors properly
|
|
12
|
+
* 4. Provide meaningful error messages
|
|
13
|
+
*
|
|
14
|
+
* Expected: All failure modes should throw clear errors instead of crashing.
|
|
15
|
+
*/
|
|
16
|
+
describe("Bug #4: Missing HTTP Response Validation in OAuth2", () => {
|
|
17
|
+
// Helper to create a service account within Alepha context
|
|
18
|
+
const createServiceAccount = (
|
|
19
|
+
url: string,
|
|
20
|
+
clientId: string,
|
|
21
|
+
clientSecret: string,
|
|
22
|
+
gracePeriod?: number,
|
|
23
|
+
) => {
|
|
24
|
+
const alepha = Alepha.create();
|
|
25
|
+
|
|
26
|
+
class TestService {
|
|
27
|
+
serviceAccount = $serviceAccount({
|
|
28
|
+
oauth2: {
|
|
29
|
+
url,
|
|
30
|
+
clientId,
|
|
31
|
+
clientSecret,
|
|
32
|
+
},
|
|
33
|
+
gracePeriod,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const service = alepha.inject(TestService);
|
|
38
|
+
return service.serviceAccount;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Helper to create a mock fetch response
|
|
42
|
+
const createMockResponse = (
|
|
43
|
+
status: number,
|
|
44
|
+
body: any,
|
|
45
|
+
options: { isJson?: boolean; throwOnJson?: boolean } = {},
|
|
46
|
+
): Response => {
|
|
47
|
+
const { isJson = true, throwOnJson = false } = options;
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
ok: status >= 200 && status < 300,
|
|
51
|
+
status,
|
|
52
|
+
statusText:
|
|
53
|
+
status === 200
|
|
54
|
+
? "OK"
|
|
55
|
+
: status === 400
|
|
56
|
+
? "Bad Request"
|
|
57
|
+
: status === 401
|
|
58
|
+
? "Unauthorized"
|
|
59
|
+
: status === 500
|
|
60
|
+
? "Internal Server Error"
|
|
61
|
+
: "Error",
|
|
62
|
+
json: async () => {
|
|
63
|
+
if (throwOnJson) {
|
|
64
|
+
throw new Error("Invalid JSON");
|
|
65
|
+
}
|
|
66
|
+
return isJson ? body : Promise.reject(new Error("Not JSON"));
|
|
67
|
+
},
|
|
68
|
+
text: async () =>
|
|
69
|
+
typeof body === "string" ? body : JSON.stringify(body),
|
|
70
|
+
} as Response;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
it("should successfully fetch and cache token", async () => {
|
|
74
|
+
const mockToken = "mock-access-token";
|
|
75
|
+
const mockResponse = {
|
|
76
|
+
access_token: mockToken,
|
|
77
|
+
expires_in: 3600,
|
|
78
|
+
token_type: "Bearer",
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
(global as any).fetch = vi
|
|
82
|
+
.fn()
|
|
83
|
+
.mockResolvedValue(createMockResponse(200, mockResponse));
|
|
84
|
+
|
|
85
|
+
const serviceAccount = createServiceAccount(
|
|
86
|
+
"https://auth.example.com/token",
|
|
87
|
+
"test-client",
|
|
88
|
+
"test-secret",
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
const token = await serviceAccount.token();
|
|
92
|
+
expect(token).toBe(mockToken);
|
|
93
|
+
|
|
94
|
+
// Verify fetch was called correctly
|
|
95
|
+
expect((global as any).fetch).toHaveBeenCalledWith(
|
|
96
|
+
"https://auth.example.com/token",
|
|
97
|
+
expect.objectContaining({
|
|
98
|
+
method: "POST",
|
|
99
|
+
headers: {
|
|
100
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
101
|
+
},
|
|
102
|
+
body: expect.any(URLSearchParams),
|
|
103
|
+
}),
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("should throw error on network failure", async () => {
|
|
108
|
+
(global as any).fetch = vi
|
|
109
|
+
.fn()
|
|
110
|
+
.mockRejectedValue(new Error("Network error"));
|
|
111
|
+
|
|
112
|
+
const serviceAccount = createServiceAccount(
|
|
113
|
+
"https://auth.example.com/token",
|
|
114
|
+
"test-client",
|
|
115
|
+
"test-secret",
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
119
|
+
/Failed to fetch access token from.*Network error/,
|
|
120
|
+
);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
it("should throw error on HTTP 400 Bad Request", async () => {
|
|
124
|
+
const errorBody = {
|
|
125
|
+
error: "invalid_request",
|
|
126
|
+
error_description: "Missing parameter",
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
(global as any).fetch = vi
|
|
130
|
+
.fn()
|
|
131
|
+
.mockResolvedValue(createMockResponse(400, errorBody));
|
|
132
|
+
|
|
133
|
+
const serviceAccount = createServiceAccount(
|
|
134
|
+
"https://auth.example.com/token",
|
|
135
|
+
"test-client",
|
|
136
|
+
"test-secret",
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
140
|
+
/HTTP 400 Bad Request/,
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("should throw error on HTTP 401 Unauthorized", async () => {
|
|
145
|
+
const errorBody = { error: "invalid_client" };
|
|
146
|
+
|
|
147
|
+
(global as any).fetch = vi
|
|
148
|
+
.fn()
|
|
149
|
+
.mockResolvedValue(createMockResponse(401, errorBody));
|
|
150
|
+
|
|
151
|
+
const serviceAccount = createServiceAccount(
|
|
152
|
+
"https://auth.example.com/token",
|
|
153
|
+
"wrong-client",
|
|
154
|
+
"wrong-secret",
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
158
|
+
/HTTP 401 Unauthorized/,
|
|
159
|
+
);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("should throw error on HTTP 500 Internal Server Error", async () => {
|
|
163
|
+
(global as any).fetch = vi
|
|
164
|
+
.fn()
|
|
165
|
+
.mockResolvedValue(createMockResponse(500, "Internal Server Error"));
|
|
166
|
+
|
|
167
|
+
const serviceAccount = createServiceAccount(
|
|
168
|
+
"https://auth.example.com/token",
|
|
169
|
+
"test-client",
|
|
170
|
+
"test-secret",
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
174
|
+
/HTTP 500 Internal Server Error/,
|
|
175
|
+
);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("should throw error when response is not JSON", async () => {
|
|
179
|
+
(global as any).fetch = vi
|
|
180
|
+
.fn()
|
|
181
|
+
.mockResolvedValue(
|
|
182
|
+
createMockResponse(200, "Not a JSON response", { throwOnJson: true }),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
const serviceAccount = createServiceAccount(
|
|
186
|
+
"https://auth.example.com/token",
|
|
187
|
+
"test-client",
|
|
188
|
+
"test-secret",
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
192
|
+
/Failed to parse access token response as JSON/,
|
|
193
|
+
);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("should throw error when response is missing access_token", async () => {
|
|
197
|
+
const invalidResponse = {
|
|
198
|
+
// Missing access_token
|
|
199
|
+
expires_in: 3600,
|
|
200
|
+
token_type: "Bearer",
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
(global as any).fetch = vi
|
|
204
|
+
.fn()
|
|
205
|
+
.mockResolvedValue(createMockResponse(200, invalidResponse));
|
|
206
|
+
|
|
207
|
+
const serviceAccount = createServiceAccount(
|
|
208
|
+
"https://auth.example.com/token",
|
|
209
|
+
"test-client",
|
|
210
|
+
"test-secret",
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
214
|
+
/Invalid access token response: missing access_token or expires_in/,
|
|
215
|
+
);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it("should throw error when response is missing expires_in", async () => {
|
|
219
|
+
const invalidResponse = {
|
|
220
|
+
access_token: "token123",
|
|
221
|
+
// Missing expires_in
|
|
222
|
+
token_type: "Bearer",
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
(global as any).fetch = vi
|
|
226
|
+
.fn()
|
|
227
|
+
.mockResolvedValue(createMockResponse(200, invalidResponse));
|
|
228
|
+
|
|
229
|
+
const serviceAccount = createServiceAccount(
|
|
230
|
+
"https://auth.example.com/token",
|
|
231
|
+
"test-client",
|
|
232
|
+
"test-secret",
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
236
|
+
/Invalid access token response: missing access_token or expires_in/,
|
|
237
|
+
);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
it("should throw error when response has null access_token", async () => {
|
|
241
|
+
const invalidResponse = {
|
|
242
|
+
access_token: null,
|
|
243
|
+
expires_in: 3600,
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
(global as any).fetch = vi
|
|
247
|
+
.fn()
|
|
248
|
+
.mockResolvedValue(createMockResponse(200, invalidResponse));
|
|
249
|
+
|
|
250
|
+
const serviceAccount = createServiceAccount(
|
|
251
|
+
"https://auth.example.com/token",
|
|
252
|
+
"test-client",
|
|
253
|
+
"test-secret",
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
257
|
+
/Invalid access token response: missing access_token or expires_in/,
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
it("should throw error when response has empty string access_token", async () => {
|
|
262
|
+
const invalidResponse = {
|
|
263
|
+
access_token: "",
|
|
264
|
+
expires_in: 3600,
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
(global as any).fetch = vi
|
|
268
|
+
.fn()
|
|
269
|
+
.mockResolvedValue(createMockResponse(200, invalidResponse));
|
|
270
|
+
|
|
271
|
+
const serviceAccount = createServiceAccount(
|
|
272
|
+
"https://auth.example.com/token",
|
|
273
|
+
"test-client",
|
|
274
|
+
"test-secret",
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
278
|
+
/Invalid access token response: missing access_token or expires_in/,
|
|
279
|
+
);
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
it("should use cached token instead of fetching again", async () => {
|
|
283
|
+
const mockToken = "cached-token";
|
|
284
|
+
const mockResponse = {
|
|
285
|
+
access_token: mockToken,
|
|
286
|
+
expires_in: 3600,
|
|
287
|
+
token_type: "Bearer",
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
const fetchMock = vi
|
|
291
|
+
.fn()
|
|
292
|
+
.mockResolvedValue(createMockResponse(200, mockResponse));
|
|
293
|
+
(global as any).fetch = fetchMock;
|
|
294
|
+
|
|
295
|
+
const serviceAccount = createServiceAccount(
|
|
296
|
+
"https://auth.example.com/token",
|
|
297
|
+
"test-client",
|
|
298
|
+
"test-secret",
|
|
299
|
+
30,
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
// First call should fetch
|
|
303
|
+
const token1 = await serviceAccount.token();
|
|
304
|
+
expect(token1).toBe(mockToken);
|
|
305
|
+
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
306
|
+
|
|
307
|
+
// Second call should use cache
|
|
308
|
+
const token2 = await serviceAccount.token();
|
|
309
|
+
expect(token2).toBe(mockToken);
|
|
310
|
+
expect(fetchMock).toHaveBeenCalledTimes(1); // Still 1, not called again
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
it("should include error body in error message for non-200 responses", async () => {
|
|
314
|
+
const errorBody = {
|
|
315
|
+
error: "invalid_scope",
|
|
316
|
+
error_description: "The requested scope is invalid",
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
(global as any).fetch = vi
|
|
320
|
+
.fn()
|
|
321
|
+
.mockResolvedValue(createMockResponse(400, errorBody));
|
|
322
|
+
|
|
323
|
+
const serviceAccount = createServiceAccount(
|
|
324
|
+
"https://auth.example.com/token",
|
|
325
|
+
"test-client",
|
|
326
|
+
"test-secret",
|
|
327
|
+
);
|
|
328
|
+
|
|
329
|
+
try {
|
|
330
|
+
await serviceAccount.token();
|
|
331
|
+
expect.fail("Should have thrown");
|
|
332
|
+
} catch (error) {
|
|
333
|
+
expect(error).toBeInstanceOf(Error);
|
|
334
|
+
expect((error as Error).message).toContain("HTTP 400 Bad Request");
|
|
335
|
+
expect((error as Error).message).toContain("invalid_scope");
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
it("should handle HTML error responses gracefully", async () => {
|
|
340
|
+
const htmlError =
|
|
341
|
+
"<html><body><h1>500 Internal Server Error</h1></body></html>";
|
|
342
|
+
|
|
343
|
+
(global as any).fetch = vi
|
|
344
|
+
.fn()
|
|
345
|
+
.mockResolvedValue(
|
|
346
|
+
createMockResponse(500, htmlError, { throwOnJson: true }),
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const serviceAccount = createServiceAccount(
|
|
350
|
+
"https://auth.example.com/token",
|
|
351
|
+
"test-client",
|
|
352
|
+
"test-secret",
|
|
353
|
+
);
|
|
354
|
+
|
|
355
|
+
await expect(serviceAccount.token()).rejects.toThrow(/HTTP 500/);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it("should handle fetch timeout or abort", async () => {
|
|
359
|
+
(global as any).fetch = vi
|
|
360
|
+
.fn()
|
|
361
|
+
.mockRejectedValue(new Error("The operation was aborted"));
|
|
362
|
+
|
|
363
|
+
const serviceAccount = createServiceAccount(
|
|
364
|
+
"https://auth.example.com/token",
|
|
365
|
+
"test-client",
|
|
366
|
+
"test-secret",
|
|
367
|
+
);
|
|
368
|
+
|
|
369
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
370
|
+
/Failed to fetch access token.*aborted/,
|
|
371
|
+
);
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it("should handle DNS resolution failure", async () => {
|
|
375
|
+
(global as any).fetch = vi
|
|
376
|
+
.fn()
|
|
377
|
+
.mockRejectedValue(
|
|
378
|
+
new Error("getaddrinfo ENOTFOUND invalid-domain.example"),
|
|
379
|
+
);
|
|
380
|
+
|
|
381
|
+
const serviceAccount = createServiceAccount(
|
|
382
|
+
"https://invalid-domain.example/token",
|
|
383
|
+
"test-client",
|
|
384
|
+
"test-secret",
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
await expect(serviceAccount.token()).rejects.toThrow(/ENOTFOUND/);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
it("should handle response with unexpected structure", async () => {
|
|
391
|
+
const weirdResponse = {
|
|
392
|
+
data: {
|
|
393
|
+
token: "nested-token",
|
|
394
|
+
},
|
|
395
|
+
// Missing top-level access_token
|
|
396
|
+
};
|
|
397
|
+
|
|
398
|
+
(global as any).fetch = vi
|
|
399
|
+
.fn()
|
|
400
|
+
.mockResolvedValue(createMockResponse(200, weirdResponse));
|
|
401
|
+
|
|
402
|
+
const serviceAccount = createServiceAccount(
|
|
403
|
+
"https://auth.example.com/token",
|
|
404
|
+
"test-client",
|
|
405
|
+
"test-secret",
|
|
406
|
+
);
|
|
407
|
+
|
|
408
|
+
await expect(serviceAccount.token()).rejects.toThrow(
|
|
409
|
+
/Invalid access token response/,
|
|
410
|
+
);
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
it("should properly format URLSearchParams in request body", async () => {
|
|
414
|
+
const mockResponse = {
|
|
415
|
+
access_token: "token",
|
|
416
|
+
expires_in: 3600,
|
|
417
|
+
};
|
|
418
|
+
|
|
419
|
+
const fetchMock = vi
|
|
420
|
+
.fn()
|
|
421
|
+
.mockResolvedValue(createMockResponse(200, mockResponse));
|
|
422
|
+
(global as any).fetch = fetchMock;
|
|
423
|
+
|
|
424
|
+
const serviceAccount = createServiceAccount(
|
|
425
|
+
"https://auth.example.com/token",
|
|
426
|
+
"my-client-id",
|
|
427
|
+
"my-secret",
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
await serviceAccount.token();
|
|
431
|
+
|
|
432
|
+
const callArgs = fetchMock.mock.calls[0];
|
|
433
|
+
const body = callArgs[1].body as URLSearchParams;
|
|
434
|
+
|
|
435
|
+
expect(body.get("grant_type")).toBe("client_credentials");
|
|
436
|
+
expect(body.get("client_id")).toBe("my-client-id");
|
|
437
|
+
expect(body.get("client_secret")).toBe("my-secret");
|
|
438
|
+
});
|
|
439
|
+
});
|