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,193 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { describe, test } from "vitest";
|
|
3
|
+
import { $sms, MemorySmsProvider, SmsProvider } from "../index.ts";
|
|
4
|
+
|
|
5
|
+
describe("MemorySmsProvider", () => {
|
|
6
|
+
test("should store SMS in memory", async ({ expect }) => {
|
|
7
|
+
class TestService {
|
|
8
|
+
readonly sms = $sms();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const alepha = Alepha.create();
|
|
12
|
+
const service = alepha.inject(TestService);
|
|
13
|
+
await alepha.start();
|
|
14
|
+
|
|
15
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
16
|
+
|
|
17
|
+
await service.sms.send({
|
|
18
|
+
to: "+1234567890",
|
|
19
|
+
message: "Hello World!",
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
expect(provider.records).toHaveLength(1);
|
|
23
|
+
expect(provider.records[0].to).toBe("+1234567890");
|
|
24
|
+
expect(provider.records[0].message).toBe("Hello World!");
|
|
25
|
+
expect(provider.records[0].sentAt).toBeInstanceOf(Date);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("should handle multiple recipients", async ({ expect }) => {
|
|
29
|
+
class TestService {
|
|
30
|
+
readonly sms = $sms();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const alepha = Alepha.create();
|
|
34
|
+
const service = alepha.inject(TestService);
|
|
35
|
+
await alepha.start();
|
|
36
|
+
|
|
37
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
38
|
+
|
|
39
|
+
await service.sms.send({
|
|
40
|
+
to: ["+1111111111", "+2222222222", "+3333333333"],
|
|
41
|
+
message: "Broadcast message",
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
expect(provider.records).toHaveLength(3);
|
|
45
|
+
expect(provider.records[0].to).toBe("+1111111111");
|
|
46
|
+
expect(provider.records[1].to).toBe("+2222222222");
|
|
47
|
+
expect(provider.records[2].to).toBe("+3333333333");
|
|
48
|
+
expect(
|
|
49
|
+
provider.records.every((r) => r.message === "Broadcast message"),
|
|
50
|
+
).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("should return last SMS sent", async ({ expect }) => {
|
|
54
|
+
class TestService {
|
|
55
|
+
readonly sms = $sms();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const alepha = Alepha.create();
|
|
59
|
+
const service = alepha.inject(TestService);
|
|
60
|
+
await alepha.start();
|
|
61
|
+
|
|
62
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
63
|
+
|
|
64
|
+
await service.sms.send({
|
|
65
|
+
to: "+1234567890",
|
|
66
|
+
message: "First message",
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await service.sms.send({
|
|
70
|
+
to: "+0987654321",
|
|
71
|
+
message: "Second message",
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
expect(provider.last).toBeDefined();
|
|
75
|
+
expect(provider.last?.to).toBe("+0987654321");
|
|
76
|
+
expect(provider.last?.message).toBe("Second message");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("should return undefined for last when no messages", async ({
|
|
80
|
+
expect,
|
|
81
|
+
}) => {
|
|
82
|
+
class TestService {
|
|
83
|
+
readonly sms = $sms();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const alepha = Alepha.create();
|
|
87
|
+
alepha.inject(TestService);
|
|
88
|
+
await alepha.start();
|
|
89
|
+
|
|
90
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
91
|
+
|
|
92
|
+
expect(provider.last).toBeUndefined();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("should be registered as default SmsProvider", async ({ expect }) => {
|
|
96
|
+
class TestService {
|
|
97
|
+
readonly sms = $sms();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const alepha = Alepha.create();
|
|
101
|
+
alepha.inject(TestService);
|
|
102
|
+
await alepha.start();
|
|
103
|
+
|
|
104
|
+
const provider = alepha.inject(SmsProvider);
|
|
105
|
+
|
|
106
|
+
expect(provider).toBeInstanceOf(MemorySmsProvider);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("should accumulate messages across multiple sends", async ({
|
|
110
|
+
expect,
|
|
111
|
+
}) => {
|
|
112
|
+
class TestService {
|
|
113
|
+
readonly sms = $sms();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const alepha = Alepha.create();
|
|
117
|
+
const service = alepha.inject(TestService);
|
|
118
|
+
await alepha.start();
|
|
119
|
+
|
|
120
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
121
|
+
|
|
122
|
+
await service.sms.send({ to: "+1111111111", message: "Message 1" });
|
|
123
|
+
await service.sms.send({ to: "+2222222222", message: "Message 2" });
|
|
124
|
+
await service.sms.send({ to: "+3333333333", message: "Message 3" });
|
|
125
|
+
|
|
126
|
+
expect(provider.records).toHaveLength(3);
|
|
127
|
+
expect(provider.records.map((r) => r.message)).toEqual([
|
|
128
|
+
"Message 1",
|
|
129
|
+
"Message 2",
|
|
130
|
+
"Message 3",
|
|
131
|
+
]);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("should track sentAt timestamp for each message", async ({ expect }) => {
|
|
135
|
+
class TestService {
|
|
136
|
+
readonly sms = $sms();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const alepha = Alepha.create();
|
|
140
|
+
const service = alepha.inject(TestService);
|
|
141
|
+
await alepha.start();
|
|
142
|
+
|
|
143
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
144
|
+
|
|
145
|
+
const before = new Date();
|
|
146
|
+
await service.sms.send({ to: "+1234567890", message: "Test" });
|
|
147
|
+
const after = new Date();
|
|
148
|
+
|
|
149
|
+
const sentAt = provider.records[0].sentAt;
|
|
150
|
+
expect(sentAt.getTime()).toBeGreaterThanOrEqual(before.getTime());
|
|
151
|
+
expect(sentAt.getTime()).toBeLessThanOrEqual(after.getTime());
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test("should handle empty message", async ({ expect }) => {
|
|
155
|
+
class TestService {
|
|
156
|
+
readonly sms = $sms();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const alepha = Alepha.create();
|
|
160
|
+
const service = alepha.inject(TestService);
|
|
161
|
+
await alepha.start();
|
|
162
|
+
|
|
163
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
164
|
+
|
|
165
|
+
await service.sms.send({
|
|
166
|
+
to: "+1234567890",
|
|
167
|
+
message: "",
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
expect(provider.records).toHaveLength(1);
|
|
171
|
+
expect(provider.records[0].message).toBe("");
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("should handle message with special characters", async ({ expect }) => {
|
|
175
|
+
class TestService {
|
|
176
|
+
readonly sms = $sms();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const alepha = Alepha.create();
|
|
180
|
+
const service = alepha.inject(TestService);
|
|
181
|
+
await alepha.start();
|
|
182
|
+
|
|
183
|
+
const provider = alepha.inject(MemorySmsProvider);
|
|
184
|
+
|
|
185
|
+
const specialMessage = "Hello! 🎉 Special chars: <>&\"'";
|
|
186
|
+
await service.sms.send({
|
|
187
|
+
to: "+1234567890",
|
|
188
|
+
message: specialMessage,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
expect(provider.records[0].message).toBe(specialMessage);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Alepha, t } from "alepha";
|
|
2
|
+
import { afterEach, beforeEach, describe, it } from "vitest";
|
|
3
|
+
import { $thread, AlephaThread, ThreadPrimitive } from "../index.ts";
|
|
4
|
+
|
|
5
|
+
class TestApp {
|
|
6
|
+
testThread = $thread({
|
|
7
|
+
name: "test-thread",
|
|
8
|
+
handler: async () => {
|
|
9
|
+
return { message: "Hello from thread!", timestamp: Date.now() };
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("$thread", () => {
|
|
15
|
+
let threadPrimitive: ThreadPrimitive;
|
|
16
|
+
let alepha: Alepha;
|
|
17
|
+
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
alepha = Alepha.create().with(AlephaThread).with(TestApp);
|
|
20
|
+
threadPrimitive = alepha.inject(TestApp).testThread;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(async () => {
|
|
24
|
+
if (threadPrimitive) {
|
|
25
|
+
await threadPrimitive.terminate();
|
|
26
|
+
}
|
|
27
|
+
if (alepha) {
|
|
28
|
+
await alepha.stop();
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("should create a thread primitive", ({ expect }) => {
|
|
33
|
+
expect($thread).toBeDefined();
|
|
34
|
+
expect(threadPrimitive).toBeInstanceOf(ThreadPrimitive);
|
|
35
|
+
expect(threadPrimitive.name).toBe("test-thread");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("should have correct default configuration", async ({ expect }) => {
|
|
39
|
+
class DefaultTestApp {
|
|
40
|
+
defaultThread = $thread({
|
|
41
|
+
handler: async () => "test",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const testAlepha = Alepha.create().with(AlephaThread).with(DefaultTestApp);
|
|
46
|
+
const defaultThread = testAlepha.inject(DefaultTestApp).defaultThread;
|
|
47
|
+
|
|
48
|
+
expect(defaultThread.maxPoolSize).toBeGreaterThan(0);
|
|
49
|
+
expect(defaultThread.idleTimeout).toBe(60000); // 1 minute
|
|
50
|
+
|
|
51
|
+
await testAlepha.stop();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should allow custom pool size and idle timeout", async ({ expect }) => {
|
|
55
|
+
class CustomTestApp {
|
|
56
|
+
customThread = $thread({
|
|
57
|
+
name: "custom-thread",
|
|
58
|
+
handler: async () => "test",
|
|
59
|
+
maxPoolSize: 4,
|
|
60
|
+
idleTimeout: 30000,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const testAlepha = Alepha.create().with(AlephaThread).with(CustomTestApp);
|
|
65
|
+
const customThread = testAlepha.inject(CustomTestApp).customThread;
|
|
66
|
+
|
|
67
|
+
expect(customThread.maxPoolSize).toBe(4);
|
|
68
|
+
expect(customThread.idleTimeout).toBe(30000);
|
|
69
|
+
|
|
70
|
+
await testAlepha.stop();
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("should validate data with TypeBox schema", async ({ expect }) => {
|
|
74
|
+
const schema = t.object({
|
|
75
|
+
name: t.text(),
|
|
76
|
+
age: t.number(),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Invalid data should throw validation error
|
|
80
|
+
await expect(
|
|
81
|
+
threadPrimitive.execute({ name: "John" }, schema),
|
|
82
|
+
).rejects.toThrow("Invalid data");
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it("should warm up thread pool", async ({ expect }) => {
|
|
86
|
+
await expect(threadPrimitive.create()).resolves.toBeUndefined();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should terminate thread pool", async ({ expect }) => {
|
|
90
|
+
await threadPrimitive.create();
|
|
91
|
+
await expect(threadPrimitive.terminate()).resolves.toBeUndefined();
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe("Thread primitive configuration", () => {
|
|
96
|
+
let testAlepha: Alepha;
|
|
97
|
+
|
|
98
|
+
beforeEach(async () => {
|
|
99
|
+
testAlepha = Alepha.create().with(AlephaThread);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
afterEach(async () => {
|
|
103
|
+
if (testAlepha) {
|
|
104
|
+
await testAlepha.stop();
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should handle different configuration options", async ({ expect }) => {
|
|
109
|
+
class ConfigTestApp {
|
|
110
|
+
defaultThread = $thread({
|
|
111
|
+
handler: async () => "default",
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
namedThread = $thread({
|
|
115
|
+
name: "custom-name",
|
|
116
|
+
handler: async () => "named",
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
configuredThread = $thread({
|
|
120
|
+
name: "configured",
|
|
121
|
+
handler: async () => "configured",
|
|
122
|
+
maxPoolSize: 8,
|
|
123
|
+
idleTimeout: 120000,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
testAlepha = testAlepha.with(ConfigTestApp);
|
|
128
|
+
const app = testAlepha.inject(ConfigTestApp);
|
|
129
|
+
|
|
130
|
+
// Test default configuration
|
|
131
|
+
expect(app.defaultThread.maxPoolSize).toBeGreaterThan(0);
|
|
132
|
+
expect(app.defaultThread.idleTimeout).toBe(60000);
|
|
133
|
+
|
|
134
|
+
// Test named thread
|
|
135
|
+
expect(app.namedThread.name).toBe("custom-name");
|
|
136
|
+
|
|
137
|
+
// Test configured thread
|
|
138
|
+
expect(app.configuredThread.name).toBe("configured");
|
|
139
|
+
expect(app.configuredThread.maxPoolSize).toBe(8);
|
|
140
|
+
expect(app.configuredThread.idleTimeout).toBe(120000);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("Thread pool management", () => {
|
|
145
|
+
let testAlepha: Alepha;
|
|
146
|
+
|
|
147
|
+
beforeEach(async () => {
|
|
148
|
+
testAlepha = Alepha.create().with(AlephaThread);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
afterEach(async () => {
|
|
152
|
+
if (testAlepha) {
|
|
153
|
+
await testAlepha.stop();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it("should have consistent pool instances", async ({ expect }) => {
|
|
158
|
+
class PoolTestApp {
|
|
159
|
+
thread1 = $thread({
|
|
160
|
+
name: "shared-pool",
|
|
161
|
+
handler: async () => "thread1",
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
thread2 = $thread({
|
|
165
|
+
name: "shared-pool", // Same name = shared pool
|
|
166
|
+
handler: async () => "thread2",
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
thread3 = $thread({
|
|
170
|
+
name: "different-pool",
|
|
171
|
+
handler: async () => "thread3",
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
testAlepha = testAlepha.with(PoolTestApp);
|
|
176
|
+
const app = testAlepha.inject(PoolTestApp);
|
|
177
|
+
|
|
178
|
+
// Threads with same name should share configuration
|
|
179
|
+
expect(app.thread1.name).toBe(app.thread2.name);
|
|
180
|
+
expect(app.thread3.name).not.toBe(app.thread1.name);
|
|
181
|
+
|
|
182
|
+
// Clean up
|
|
183
|
+
await app.thread1.terminate();
|
|
184
|
+
await app.thread3.terminate();
|
|
185
|
+
});
|
|
186
|
+
});
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { $inject, Alepha, type Service, t } from "alepha";
|
|
2
|
+
import {
|
|
3
|
+
$subscriber,
|
|
4
|
+
$topic,
|
|
5
|
+
AlephaTopic,
|
|
6
|
+
MemoryTopicProvider,
|
|
7
|
+
type SubscribeCallback,
|
|
8
|
+
TopicProvider,
|
|
9
|
+
} from "alepha/topic";
|
|
10
|
+
import { expect } from "vitest";
|
|
11
|
+
|
|
12
|
+
export const payloadSchema = t.object({
|
|
13
|
+
id: t.text(),
|
|
14
|
+
count: t.integer(),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const subscriptions: Record<string, SubscribeCallback[]> = {};
|
|
18
|
+
export class SharedTopicProvider extends MemoryTopicProvider {
|
|
19
|
+
subscriptions = subscriptions;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const testTopicBasic = async (provider: Service<TopicProvider>) => {
|
|
23
|
+
class TestTopic {
|
|
24
|
+
t = $topic({
|
|
25
|
+
name: "test",
|
|
26
|
+
schema: {
|
|
27
|
+
payload: payloadSchema,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
class TestSubscriber {
|
|
33
|
+
stack: string[] = [];
|
|
34
|
+
test = $inject(TestTopic);
|
|
35
|
+
s = $subscriber({
|
|
36
|
+
topic: this.test.t,
|
|
37
|
+
handler: async (m) => {
|
|
38
|
+
this.stack.push(m.payload.id + m.payload.count);
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const createApp = async <T extends object>(
|
|
44
|
+
testClass: Service<T>,
|
|
45
|
+
): Promise<{ app: Alepha; test: T }> => {
|
|
46
|
+
const app = Alepha.create();
|
|
47
|
+
|
|
48
|
+
app.with({
|
|
49
|
+
provide: TopicProvider,
|
|
50
|
+
use: provider,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const test = app.inject(testClass);
|
|
54
|
+
|
|
55
|
+
await app.start();
|
|
56
|
+
|
|
57
|
+
return { app, test };
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const { app: app1, test: test1 } = await createApp(TestTopic);
|
|
61
|
+
const { app: app2, test: test2 } = await createApp(TestTopic);
|
|
62
|
+
const { app: app3, test: test3 } = await createApp(TestSubscriber);
|
|
63
|
+
const { app: app4, test: test4 } = await createApp(TestSubscriber);
|
|
64
|
+
|
|
65
|
+
await test1.t.publish({ id: "1", count: 2 });
|
|
66
|
+
await test2.t.publish({ id: "2", count: 3 });
|
|
67
|
+
|
|
68
|
+
await Promise.all([
|
|
69
|
+
expect.poll(() => expect(test3.stack).toEqual(["12", "23"])).toBeTruthy(),
|
|
70
|
+
expect.poll(() => expect(test4.stack).toEqual(["12", "23"])).toBeTruthy(),
|
|
71
|
+
]);
|
|
72
|
+
|
|
73
|
+
await app1.stop();
|
|
74
|
+
await app2.stop();
|
|
75
|
+
await app3.stop();
|
|
76
|
+
await app4.stop();
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const testTopicAsSub = async (provider: Service<TopicProvider>) => {
|
|
80
|
+
let count = 0;
|
|
81
|
+
class A {
|
|
82
|
+
t = $topic({
|
|
83
|
+
name: "a",
|
|
84
|
+
schema: {
|
|
85
|
+
payload: t.object({ n: t.integer() }),
|
|
86
|
+
},
|
|
87
|
+
handler: async ({ payload }) => {
|
|
88
|
+
count += payload.n;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const app = Alepha.create({})
|
|
94
|
+
.with({
|
|
95
|
+
provide: TopicProvider,
|
|
96
|
+
use: provider,
|
|
97
|
+
})
|
|
98
|
+
.with(A);
|
|
99
|
+
|
|
100
|
+
await app.start();
|
|
101
|
+
|
|
102
|
+
const a = app.inject(A);
|
|
103
|
+
|
|
104
|
+
await a.t.publish({ n: 123 });
|
|
105
|
+
|
|
106
|
+
await expect.poll(() => expect(count).toBe(123)).toBeTruthy();
|
|
107
|
+
//await expect(a.t.publish({ n: 123.6 })).rejects.toThrowError(TypeBoxError);
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export const testTopicLateSubscribe = async (
|
|
111
|
+
Provider: Service<TopicProvider>,
|
|
112
|
+
) => {
|
|
113
|
+
const alepha = Alepha.create()
|
|
114
|
+
.with({
|
|
115
|
+
provide: TopicProvider,
|
|
116
|
+
use: Provider,
|
|
117
|
+
})
|
|
118
|
+
.with(AlephaTopic);
|
|
119
|
+
|
|
120
|
+
await alepha.start();
|
|
121
|
+
|
|
122
|
+
const provider = alepha.inject(TopicProvider);
|
|
123
|
+
|
|
124
|
+
// no topic created yet !
|
|
125
|
+
|
|
126
|
+
let count = 0;
|
|
127
|
+
const unsub = await provider.subscribe("inc", () => {
|
|
128
|
+
count += 1;
|
|
129
|
+
});
|
|
130
|
+
await provider.subscribe("inc10", () => {
|
|
131
|
+
count += 10;
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(count).toBe(0);
|
|
135
|
+
await provider.publish("inc", "");
|
|
136
|
+
await provider.publish("inc10", "");
|
|
137
|
+
await expect.poll(() => expect(count).toBe(11)).toBeTruthy();
|
|
138
|
+
|
|
139
|
+
await unsub();
|
|
140
|
+
|
|
141
|
+
await provider.publish("inc", "");
|
|
142
|
+
await provider.publish("inc10", "");
|
|
143
|
+
await expect.poll(() => expect(count).toBe(21)).toBeTruthy();
|
|
144
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
SharedTopicProvider,
|
|
4
|
+
testTopicAsSub,
|
|
5
|
+
testTopicBasic,
|
|
6
|
+
testTopicLateSubscribe,
|
|
7
|
+
} from "../__tests__/shared.ts";
|
|
8
|
+
|
|
9
|
+
describe("$topic - memory", () => {
|
|
10
|
+
const provider = SharedTopicProvider;
|
|
11
|
+
|
|
12
|
+
test("should subscribe and publish", async () => {
|
|
13
|
+
await testTopicBasic(provider);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("should subscribe with handler", async () => {
|
|
17
|
+
await testTopicAsSub(provider);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("should subscribe after start with provider", async () => {
|
|
21
|
+
await testTopicLateSubscribe(provider);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
import {
|
|
3
|
+
testTopicAsSub,
|
|
4
|
+
testTopicBasic,
|
|
5
|
+
testTopicLateSubscribe,
|
|
6
|
+
} from "../../core/__tests__/shared.ts";
|
|
7
|
+
import { RedisTopicProvider } from "../index.ts";
|
|
8
|
+
|
|
9
|
+
describe("$topic - redis", () => {
|
|
10
|
+
const provider = RedisTopicProvider;
|
|
11
|
+
|
|
12
|
+
test("should subscribe and publish", async () => {
|
|
13
|
+
await testTopicBasic(provider);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("should subscribe with handler", async () => {
|
|
17
|
+
await testTopicAsSub(provider);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test("should subscribe after start with provider", async () => {
|
|
21
|
+
await testTopicLateSubscribe(provider);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
|
|
3
|
+
export const importViteReact = async (): Promise<any> => {
|
|
4
|
+
// Add React plugin for JSX/TSX compilation
|
|
5
|
+
try {
|
|
6
|
+
const { default: viteReact } = createRequire(import.meta.url)(
|
|
7
|
+
"@vitejs/plugin-react",
|
|
8
|
+
);
|
|
9
|
+
return viteReact;
|
|
10
|
+
} catch {
|
|
11
|
+
// @vitejs/plugin-react not installed, skip
|
|
12
|
+
}
|
|
13
|
+
};
|
package/src/vite/index.ts
CHANGED
|
@@ -4,9 +4,8 @@ import type { Alepha } from "alepha";
|
|
|
4
4
|
export * from "./helpers/boot.ts";
|
|
5
5
|
export * from "./helpers/createBufferedLogger.ts";
|
|
6
6
|
// Plugins (public API)
|
|
7
|
-
export * from "./plugins/viteAlepha.ts";
|
|
8
|
-
export * from "./plugins/viteAlephaBuild.ts";
|
|
9
7
|
export * from "./plugins/viteAlephaDev.ts";
|
|
8
|
+
export * from "./plugins/viteAlephaSsrPreload.ts";
|
|
10
9
|
export * from "./plugins/viteCompress.ts";
|
|
11
10
|
// Tasks (for CLI integration)
|
|
12
11
|
export * from "./tasks/index.ts";
|
|
@@ -14,22 +13,3 @@ export * from "./tasks/index.ts";
|
|
|
14
13
|
declare global {
|
|
15
14
|
var __cli_alepha: Alepha;
|
|
16
15
|
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Plugin vite for Alepha framework.
|
|
20
|
-
*
|
|
21
|
-
* This module provides Vite plugins and configurations to integrate Alepha applications with Vite's build and development processes.
|
|
22
|
-
*
|
|
23
|
-
* @example
|
|
24
|
-
* ```ts
|
|
25
|
-
* import { defineConfig } from "vite";
|
|
26
|
-
* import { viteAlepha } from "alepha/vite";
|
|
27
|
-
*
|
|
28
|
-
* export default defineConfig({
|
|
29
|
-
* plugins: [viteAlepha()],
|
|
30
|
-
* // other Vite configurations...
|
|
31
|
-
* });
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @module alepha.vite
|
|
35
|
-
*/
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import type { Plugin, ResolvedConfig, UserConfig } from "vite";
|
|
2
3
|
import { boot } from "../helpers/boot.ts";
|
|
4
|
+
import { importVite } from "../helpers/importVite.ts";
|
|
3
5
|
import { createAlephaRunner, isViteInternalPath } from "../tasks/runAlepha.ts";
|
|
4
6
|
|
|
5
7
|
export interface ViteAlephaDevOptions {
|
|
@@ -43,9 +45,20 @@ export async function viteAlephaDev(
|
|
|
43
45
|
debug: options.debug,
|
|
44
46
|
});
|
|
45
47
|
|
|
48
|
+
const { loadEnv } = await importVite();
|
|
49
|
+
const env = loadEnv("development", process.cwd(), "SERVER");
|
|
50
|
+
|
|
51
|
+
const config: UserConfig = {};
|
|
52
|
+
if (env.SERVER_PORT) {
|
|
53
|
+
config.server = {
|
|
54
|
+
port: parseInt(env.SERVER_PORT, 10),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
46
58
|
return {
|
|
47
59
|
name: "alepha-dev",
|
|
48
60
|
apply: "serve",
|
|
61
|
+
config: () => config,
|
|
49
62
|
configResolved(resolvedConfig: ResolvedConfig) {
|
|
50
63
|
runner.setConfig(resolvedConfig);
|
|
51
64
|
},
|
|
@@ -102,8 +115,14 @@ export async function viteAlephaDev(
|
|
|
102
115
|
}
|
|
103
116
|
},
|
|
104
117
|
async configureServer(server) {
|
|
105
|
-
|
|
106
|
-
|
|
118
|
+
if (env.SERVER_PORT) {
|
|
119
|
+
server.config.server.port = parseInt(env.SERVER_PORT, 10);
|
|
120
|
+
}
|
|
121
|
+
const middleware = (
|
|
122
|
+
req: IncomingMessage,
|
|
123
|
+
res: ServerResponse,
|
|
124
|
+
next: any,
|
|
125
|
+
) => {
|
|
107
126
|
if (
|
|
108
127
|
runner.isStarted &&
|
|
109
128
|
runner.app &&
|
|
@@ -129,6 +148,12 @@ export async function viteAlephaDev(
|
|
|
129
148
|
});
|
|
130
149
|
}
|
|
131
150
|
next();
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
// Forward vite request to alepha server
|
|
154
|
+
server.middlewares.use((req, res, next) => {
|
|
155
|
+
// TODO: wait if restarting ?
|
|
156
|
+
middleware(req, res, next);
|
|
132
157
|
});
|
|
133
158
|
|
|
134
159
|
server.config.logger.info = (msg: string) => {
|
|
@@ -139,8 +164,10 @@ export async function viteAlephaDev(
|
|
|
139
164
|
|
|
140
165
|
// Return a function - it runs AFTER internal middlewares are set up
|
|
141
166
|
// and after buildStart has been called
|
|
142
|
-
return
|
|
143
|
-
|
|
167
|
+
return () => {
|
|
168
|
+
server.httpServer?.once("listening", () => {
|
|
169
|
+
runner.start(server);
|
|
170
|
+
});
|
|
144
171
|
};
|
|
145
172
|
},
|
|
146
173
|
async closeBundle() {
|