alepha 0.14.2 → 0.14.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/audits/index.browser.js +5 -5
- package/dist/api/audits/index.browser.js.map +1 -1
- package/dist/api/audits/index.d.ts +784 -784
- 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 +57 -57
- 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 +165 -165
- 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 +583 -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 +281 -276
- 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 +1137 -1123
- 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 +13 -13
- 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 +137 -112
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +371 -259
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +45 -5
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +97 -17
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +14 -18
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +14 -18
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +14 -18
- 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/mcp/index.d.ts.map +1 -1
- package/dist/orm/index.d.ts +32 -32
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +12 -12
- 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/compress/index.d.ts.map +1 -1
- package/dist/server/compress/index.js +2 -0
- package/dist/server/compress/index.js.map +1 -1
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +1 -1
- 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/security/index.d.ts +9 -9
- 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 +8 -3
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +12 -4
- 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 -4
- package/src/cli/commands/dev.ts +19 -7
- 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/openapi.ts +71 -0
- package/src/cli/commands/gen.ts +18 -0
- package/src/cli/commands/init.ts +2 -0
- package/src/cli/commands/root.ts +12 -3
- package/src/cli/commands/typecheck.ts +5 -0
- package/src/cli/index.ts +2 -1
- package/src/cli/services/AlephaCliUtils.ts +71 -32
- 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/primitives/$command.spec.ts +1588 -0
- package/src/command/providers/CliProvider.ts +74 -24
- package/src/core/Alepha.ts +45 -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/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/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/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 +378 -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 +942 -0
- package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
- package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
- 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/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 +3 -1
- 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/swagger/__tests__/ui.spec.ts +52 -0
- package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
- 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/plugins/viteAlephaDev.ts +16 -4
- 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
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { Alepha } from "../Alepha.ts";
|
|
4
|
+
import { AlsProvider } from "../providers/AlsProvider.ts";
|
|
5
|
+
import { StateManager } from "../providers/StateManager.ts";
|
|
6
|
+
|
|
7
|
+
// Set up AsyncLocalStorage for tests
|
|
8
|
+
AlsProvider.create = () => new AsyncLocalStorage();
|
|
9
|
+
|
|
10
|
+
// Test with custom state interface
|
|
11
|
+
interface TestState {
|
|
12
|
+
name?: string;
|
|
13
|
+
age?: number;
|
|
14
|
+
active?: boolean;
|
|
15
|
+
config?: {
|
|
16
|
+
theme: string;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe("StateManager", () => {
|
|
21
|
+
let stateManager: StateManager;
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
stateManager = Alepha.create().inject(StateManager);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
describe("Basic Operations", () => {
|
|
28
|
+
it("should set and get values with proper typing", () => {
|
|
29
|
+
const alepha = new Alepha();
|
|
30
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
31
|
+
|
|
32
|
+
typedManager.set("name", "John");
|
|
33
|
+
typedManager.set("age", 30);
|
|
34
|
+
typedManager.set("active", true);
|
|
35
|
+
|
|
36
|
+
expect(typedManager.get("name")).toBe("John");
|
|
37
|
+
expect(typedManager.get("age")).toBe(30);
|
|
38
|
+
expect(typedManager.get("active")).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should return undefined for non-existent keys", () => {
|
|
42
|
+
expect(stateManager.get("nonExistent" as any)).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("should check if keys exist", () => {
|
|
46
|
+
const alepha = new Alepha();
|
|
47
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
48
|
+
typedManager.set("name", "John");
|
|
49
|
+
|
|
50
|
+
expect(typedManager.has("name")).toBe(true);
|
|
51
|
+
expect(typedManager.has("age")).toBe(false);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should handle different data types", () => {
|
|
55
|
+
const alepha = new Alepha();
|
|
56
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
57
|
+
typedManager.set("name", "hello");
|
|
58
|
+
typedManager.set("age", 42);
|
|
59
|
+
typedManager.set("active", true);
|
|
60
|
+
typedManager.set("config", { theme: "dark" });
|
|
61
|
+
|
|
62
|
+
expect(typedManager.get("name")).toBe("hello");
|
|
63
|
+
expect(typedManager.get("age")).toBe(42);
|
|
64
|
+
expect(typedManager.get("active")).toBe(true);
|
|
65
|
+
expect(typedManager.get("config")).toEqual({ theme: "dark" });
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("should clear all state", () => {
|
|
69
|
+
const typedManager = Alepha.create().inject(StateManager<TestState>);
|
|
70
|
+
|
|
71
|
+
typedManager.set("name", "John");
|
|
72
|
+
typedManager.set("age", 30);
|
|
73
|
+
|
|
74
|
+
typedManager.clear();
|
|
75
|
+
|
|
76
|
+
expect(typedManager.has("name")).toBe(false);
|
|
77
|
+
expect(typedManager.has("age")).toBe(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("should return all keys", () => {
|
|
81
|
+
const alepha = new Alepha();
|
|
82
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
83
|
+
typedManager.set("name", "John");
|
|
84
|
+
typedManager.set("age", 30);
|
|
85
|
+
|
|
86
|
+
const keys = typedManager.keys();
|
|
87
|
+
expect(keys).toEqual(expect.arrayContaining(["name", "age"]));
|
|
88
|
+
expect(keys.length).toBe(2);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
describe("Mutation Listeners", () => {
|
|
93
|
+
it("should call listeners when values change", () => {
|
|
94
|
+
const alepha = new Alepha();
|
|
95
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
96
|
+
const listener = vi.fn();
|
|
97
|
+
|
|
98
|
+
alepha.events.on("state:mutate", listener);
|
|
99
|
+
typedManager.set("name", "John");
|
|
100
|
+
|
|
101
|
+
expect(listener).toHaveBeenCalledWith({
|
|
102
|
+
key: "name",
|
|
103
|
+
value: "John",
|
|
104
|
+
prevValue: undefined,
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("should call listeners with previous values", () => {
|
|
109
|
+
const alepha = new Alepha();
|
|
110
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
111
|
+
|
|
112
|
+
typedManager.set("name", "initial");
|
|
113
|
+
|
|
114
|
+
const listener = vi.fn();
|
|
115
|
+
alepha.events.on("state:mutate", listener);
|
|
116
|
+
|
|
117
|
+
typedManager.set("name", "updated");
|
|
118
|
+
|
|
119
|
+
expect(listener).toHaveBeenCalledWith({
|
|
120
|
+
key: "name",
|
|
121
|
+
value: "updated",
|
|
122
|
+
prevValue: "initial",
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("should return unsubscribe function", () => {
|
|
127
|
+
const alepha = new Alepha();
|
|
128
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
129
|
+
const listener = vi.fn();
|
|
130
|
+
|
|
131
|
+
const unsubscribe = alepha.events.on("state:mutate", listener);
|
|
132
|
+
|
|
133
|
+
typedManager.set("name", "value1");
|
|
134
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
135
|
+
|
|
136
|
+
unsubscribe();
|
|
137
|
+
|
|
138
|
+
typedManager.set("name", "value2");
|
|
139
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it("should support multiple listeners for same key", async () => {
|
|
143
|
+
const alepha = new Alepha();
|
|
144
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
145
|
+
const listener1 = vi.fn();
|
|
146
|
+
const listener2 = vi.fn();
|
|
147
|
+
|
|
148
|
+
alepha.events.on("state:mutate", listener1);
|
|
149
|
+
alepha.events.on("state:mutate", listener2);
|
|
150
|
+
|
|
151
|
+
typedManager.set("name", "value");
|
|
152
|
+
|
|
153
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
154
|
+
|
|
155
|
+
expect(listener1).toHaveBeenCalledTimes(1);
|
|
156
|
+
expect(listener2).toHaveBeenCalledTimes(1);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
describe("Chaining", () => {
|
|
161
|
+
it("should support method chaining", () => {
|
|
162
|
+
const alepha = new Alepha();
|
|
163
|
+
const typedManager = alepha.inject(StateManager<TestState>);
|
|
164
|
+
|
|
165
|
+
const result = typedManager.set("name", "John").set("age", 30).clear();
|
|
166
|
+
|
|
167
|
+
expect(result).toBe(typedManager);
|
|
168
|
+
expect(typedManager.has("name")).toBe(false);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe("AsyncLocalStorage Integration", () => {
|
|
173
|
+
let alepha: Alepha;
|
|
174
|
+
let stateManager: StateManager<TestState>;
|
|
175
|
+
|
|
176
|
+
beforeEach(() => {
|
|
177
|
+
alepha = new Alepha();
|
|
178
|
+
stateManager = alepha.store as unknown as StateManager<TestState>;
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("should use ALS when available and context exists", async () => {
|
|
182
|
+
// Set up ALS context with some initial state
|
|
183
|
+
const testValue = alepha.context.run(
|
|
184
|
+
() => {
|
|
185
|
+
return stateManager.get("name");
|
|
186
|
+
},
|
|
187
|
+
{ name: "ALS Value", context: "test-context" },
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
expect(testValue).toBe("ALS Value");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("should set and get values within ALS context", async () => {
|
|
194
|
+
const result = alepha.context.run(
|
|
195
|
+
() => {
|
|
196
|
+
stateManager.set("name", "ALS Value");
|
|
197
|
+
return stateManager.get("name");
|
|
198
|
+
},
|
|
199
|
+
{ context: "test-context" },
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
expect(result).toBe("ALS Value");
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it("should use local store when ALS context doesn't exist", () => {
|
|
206
|
+
// Outside of ALS context, should use local store
|
|
207
|
+
stateManager.set("name", "Local Value");
|
|
208
|
+
expect(stateManager.get("name")).toBe("Local Value");
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should set values in ALS when context exists", async () => {
|
|
212
|
+
const store: any = { context: "test-context" };
|
|
213
|
+
alepha.context.run(() => {
|
|
214
|
+
stateManager.set("name", "ALS Value");
|
|
215
|
+
}, store);
|
|
216
|
+
|
|
217
|
+
expect(store.name).toBe("ALS Value");
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
it("should set values in local store when no ALS context", () => {
|
|
221
|
+
// Outside ALS context, values go to local store
|
|
222
|
+
stateManager.set("name", "Local Value");
|
|
223
|
+
expect(stateManager.get("name")).toBe("Local Value");
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it("should emit events when setting values through ALS", async () => {
|
|
227
|
+
const listener = vi.fn();
|
|
228
|
+
alepha.events.on("state:mutate", listener);
|
|
229
|
+
|
|
230
|
+
const store = { context: "test-context" };
|
|
231
|
+
alepha.context.run(() => {
|
|
232
|
+
stateManager.set("name", "ALS Value");
|
|
233
|
+
}, store);
|
|
234
|
+
|
|
235
|
+
expect(listener).toHaveBeenCalledWith({
|
|
236
|
+
key: "name",
|
|
237
|
+
value: "ALS Value",
|
|
238
|
+
prevValue: undefined,
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
it("should emit events with previous ALS values", async () => {
|
|
243
|
+
const listener = vi.fn();
|
|
244
|
+
alepha.events.on("state:mutate", listener);
|
|
245
|
+
|
|
246
|
+
const store = { name: "Initial ALS", context: "test-context" };
|
|
247
|
+
alepha.context.run(() => {
|
|
248
|
+
stateManager.set("name", "Updated ALS");
|
|
249
|
+
}, store);
|
|
250
|
+
|
|
251
|
+
expect(listener).toHaveBeenCalledWith({
|
|
252
|
+
key: "name",
|
|
253
|
+
value: "Updated ALS",
|
|
254
|
+
prevValue: "Initial ALS",
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it("should handle state manager without ALS provider", () => {
|
|
259
|
+
const typedManager = Alepha.create().inject(StateManager<TestState>);
|
|
260
|
+
|
|
261
|
+
typedManager.set("name", "Value");
|
|
262
|
+
expect(typedManager.get("name")).toBe("Value");
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it("should prefer ALS values over local store when both exist", async () => {
|
|
266
|
+
// Set value in local store first
|
|
267
|
+
stateManager.set("name", "Local Value");
|
|
268
|
+
|
|
269
|
+
// In ALS context, ALS values should take priority
|
|
270
|
+
const store: any = { context: "test-context" };
|
|
271
|
+
const result = alepha.context.run(() => {
|
|
272
|
+
stateManager.set("name", "ALS Priority");
|
|
273
|
+
return stateManager.get("name");
|
|
274
|
+
}, store);
|
|
275
|
+
|
|
276
|
+
expect(result).toBe("ALS Priority");
|
|
277
|
+
expect(store.name).toBe("ALS Priority");
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("should not skip event emission when values are the same", async () => {
|
|
281
|
+
const listener = vi.fn();
|
|
282
|
+
alepha.events.on("state:mutate", listener);
|
|
283
|
+
|
|
284
|
+
const store = { name: "Same Value", context: "test-context" };
|
|
285
|
+
alepha.context.run(() => {
|
|
286
|
+
// Setting the same value should not emit event
|
|
287
|
+
stateManager.set("name", "Same Value");
|
|
288
|
+
}, store);
|
|
289
|
+
|
|
290
|
+
expect(listener).not.toHaveBeenCalled();
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it("should delete values from ALS when context exists", async () => {
|
|
294
|
+
const store = { name: "To Delete", context: "test-context" };
|
|
295
|
+
alepha.context.run(() => {
|
|
296
|
+
stateManager.del("name");
|
|
297
|
+
}, store);
|
|
298
|
+
|
|
299
|
+
expect(store.name).toBeUndefined();
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
it("should clear only local store, not ALS", async () => {
|
|
303
|
+
// Set value in local store
|
|
304
|
+
stateManager.set("age", 25);
|
|
305
|
+
|
|
306
|
+
// Clear local store
|
|
307
|
+
stateManager.clear();
|
|
308
|
+
|
|
309
|
+
// ALS value should still be accessible within ALS context
|
|
310
|
+
const store = { name: "ALS Value", context: "test-context" };
|
|
311
|
+
const result = alepha.context.run(() => {
|
|
312
|
+
return stateManager.get("name");
|
|
313
|
+
}, store);
|
|
314
|
+
|
|
315
|
+
expect(result).toBe("ALS Value");
|
|
316
|
+
// Local value should be gone
|
|
317
|
+
expect(stateManager.get("age")).toBeUndefined();
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
describe("Mixed ALS and Local Store Scenarios", () => {
|
|
322
|
+
let alepha: Alepha;
|
|
323
|
+
let stateManager: StateManager<TestState>;
|
|
324
|
+
|
|
325
|
+
beforeEach(() => {
|
|
326
|
+
alepha = new Alepha();
|
|
327
|
+
stateManager = alepha.store as unknown as StateManager<TestState>;
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
it("should handle transitions between ALS and non-ALS contexts", async () => {
|
|
331
|
+
// Start with no ALS context
|
|
332
|
+
stateManager.set("name", "Local Value");
|
|
333
|
+
expect(stateManager.get("name")).toBe("Local Value");
|
|
334
|
+
|
|
335
|
+
// Switch to ALS context
|
|
336
|
+
const store = { context: "test-context" };
|
|
337
|
+
const alsResult = alepha.context.run(() => {
|
|
338
|
+
stateManager.set("name", "ALS Value");
|
|
339
|
+
return stateManager.get("name");
|
|
340
|
+
}, store);
|
|
341
|
+
expect(alsResult).toBe("ALS Value");
|
|
342
|
+
|
|
343
|
+
// Outside ALS context, should see local value again
|
|
344
|
+
expect(stateManager.get("name")).toBe("Local Value");
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
it("should handle has() method with local store", () => {
|
|
348
|
+
// Set in local store
|
|
349
|
+
stateManager.set("name", "Local");
|
|
350
|
+
|
|
351
|
+
// has() checks local store
|
|
352
|
+
expect(stateManager.has("name")).toBe(true);
|
|
353
|
+
expect(stateManager.has("age")).toBe(false);
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
it("should handle keys() method with local store", () => {
|
|
357
|
+
// Set in local store
|
|
358
|
+
stateManager.set("active", true);
|
|
359
|
+
|
|
360
|
+
// keys() returns local store keys
|
|
361
|
+
const keys = alepha.store.keys();
|
|
362
|
+
expect(keys).toEqual(["active"]);
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
});
|