alepha 0.14.1 → 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/README.md +3 -3
- 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 +778 -764
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +831 -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 +125 -125
- 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/batch/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/cache/core/index.js.map +1 -1
- package/dist/cli/index.d.ts +249 -218
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +951 -821
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +40 -0
- 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 +21 -24
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +21 -24
- package/dist/core/index.native.js.map +1 -1
- package/dist/datetime/index.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/lock/redis/index.js.map +1 -1
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/index.browser.js +26 -5
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.d.ts +146 -121
- package/dist/orm/index.d.ts.map +1 -1
- package/dist/orm/index.js +49 -24
- package/dist/orm/index.js.map +1 -1
- package/dist/redis/index.js.map +1 -1
- package/dist/retry/index.js.map +1 -1
- package/dist/router/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +6 -6
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +29 -29
- 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.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/cookies/index.browser.js.map +1 -1
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.browser.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/health/index.d.ts +17 -17
- package/dist/server/helmet/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/multipart/index.js.map +1 -1
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/security/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 +8 -3
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/core/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.browser.js.map +1 -1
- package/dist/websocket/index.js.map +1 -1
- 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 +13 -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 +54 -16
- package/src/cli/apps/AlephaPackageBuilderCli.ts +2 -1
- package/src/cli/assets/appRouterTs.ts +1 -1
- package/src/cli/commands/{ViteCommands.ts → build.ts} +2 -105
- package/src/cli/commands/clean.ts +14 -0
- package/src/cli/commands/{DrizzleCommands.ts → db.ts} +10 -117
- package/src/cli/commands/{DeployCommands.ts → deploy.ts} +1 -1
- package/src/cli/commands/dev.ts +69 -0
- package/src/cli/commands/format.ts +17 -0
- package/src/cli/commands/gen/changelog.spec.ts +315 -0
- package/src/cli/commands/{ChangelogCommands.ts → gen/changelog.ts} +16 -31
- package/src/cli/commands/gen/openapi.ts +71 -0
- package/src/cli/commands/gen.ts +18 -0
- package/src/cli/commands/{CoreCommands.ts → init.ts} +4 -40
- package/src/cli/commands/lint.ts +17 -0
- package/src/cli/commands/root.ts +41 -0
- package/src/cli/commands/run.ts +24 -0
- package/src/cli/commands/test.ts +42 -0
- package/src/cli/commands/typecheck.ts +24 -0
- package/src/cli/commands/{VerifyCommands.ts → verify.ts} +1 -13
- package/src/cli/defineConfig.ts +10 -1
- package/src/cli/index.ts +17 -7
- 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 +52 -4
- 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/index.browser.ts +1 -1
- package/src/orm/index.ts +10 -6
- 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/{PostgresTypeProvider.ts → DatabaseTypeProvider.ts} +25 -3
- 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
- package/src/cli/commands/BiomeCommands.ts +0 -29
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
import * as fs from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
|
+
import { EmailError } from "../errors/EmailError.ts";
|
|
5
|
+
import { LocalEmailProvider } from "../providers/LocalEmailProvider.ts";
|
|
6
|
+
|
|
7
|
+
// Mock fs and path modules
|
|
8
|
+
vi.mock("node:fs/promises");
|
|
9
|
+
vi.mock("node:path");
|
|
10
|
+
|
|
11
|
+
// Mock logger
|
|
12
|
+
vi.mock("alepha/logger", () => ({
|
|
13
|
+
$logger: () => ({
|
|
14
|
+
debug: vi.fn(),
|
|
15
|
+
info: vi.fn(),
|
|
16
|
+
error: vi.fn(),
|
|
17
|
+
}),
|
|
18
|
+
}));
|
|
19
|
+
|
|
20
|
+
const mockedFs = vi.mocked(fs);
|
|
21
|
+
const mockedPath = vi.mocked(path);
|
|
22
|
+
|
|
23
|
+
describe("LocalEmailProvider", () => {
|
|
24
|
+
let provider: LocalEmailProvider;
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.clearAllMocks();
|
|
28
|
+
// Setup default path.join mock
|
|
29
|
+
mockedPath.join.mockImplementation((...args) => args.join("/"));
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("send", () => {
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
provider = new LocalEmailProvider({ directory: "test-emails" });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("should successfully send email to local file", async () => {
|
|
38
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
39
|
+
mockedFs.writeFile.mockResolvedValue();
|
|
40
|
+
|
|
41
|
+
const to = "test@example.com";
|
|
42
|
+
const subject = "Test Subject";
|
|
43
|
+
const body = "<p>Test body</p>";
|
|
44
|
+
|
|
45
|
+
await provider.send({
|
|
46
|
+
to,
|
|
47
|
+
subject,
|
|
48
|
+
body,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
expect(mockedFs.mkdir).toHaveBeenCalledWith("test-emails", {
|
|
52
|
+
recursive: true,
|
|
53
|
+
});
|
|
54
|
+
expect(mockedFs.writeFile).toHaveBeenCalledWith(
|
|
55
|
+
expect.stringContaining("test@example.com"),
|
|
56
|
+
expect.stringContaining(subject),
|
|
57
|
+
"utf8",
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("should create proper filename with sanitized email and timestamp", async () => {
|
|
62
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
63
|
+
mockedFs.writeFile.mockResolvedValue();
|
|
64
|
+
|
|
65
|
+
const to = "user+test@example.com";
|
|
66
|
+
const subject = "Test Subject";
|
|
67
|
+
const body = "<p>Test body</p>";
|
|
68
|
+
|
|
69
|
+
// Mock Date to have predictable timestamp
|
|
70
|
+
const mockDate = new Date("2023-01-01T12:00:00.000Z");
|
|
71
|
+
vi.setSystemTime(mockDate);
|
|
72
|
+
|
|
73
|
+
await provider.send({
|
|
74
|
+
to,
|
|
75
|
+
subject,
|
|
76
|
+
body,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
expect(mockedPath.join).toHaveBeenCalledWith(
|
|
80
|
+
"test-emails",
|
|
81
|
+
"user_test@example.com+2023-01-01T12-00-00-000Z.html",
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
vi.useRealTimers();
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("should sanitize special characters in email address", async () => {
|
|
88
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
89
|
+
mockedFs.writeFile.mockResolvedValue();
|
|
90
|
+
|
|
91
|
+
const to = "user<script>@example.com";
|
|
92
|
+
const subject = "Test Subject";
|
|
93
|
+
const body = "<p>Test body</p>";
|
|
94
|
+
|
|
95
|
+
await provider.send({
|
|
96
|
+
to,
|
|
97
|
+
subject,
|
|
98
|
+
body,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
expect(mockedPath.join).toHaveBeenCalledWith(
|
|
102
|
+
"test-emails",
|
|
103
|
+
expect.stringMatching(/user_script_@example\.com\+.+\.html/),
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("should create proper HTML content", async () => {
|
|
108
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
109
|
+
mockedFs.writeFile.mockResolvedValue();
|
|
110
|
+
|
|
111
|
+
const to = "test@example.com";
|
|
112
|
+
const subject = "Test <Subject>";
|
|
113
|
+
const body = "<p>Test body with <strong>HTML</strong></p>";
|
|
114
|
+
|
|
115
|
+
await provider.send({
|
|
116
|
+
to,
|
|
117
|
+
subject,
|
|
118
|
+
body,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const writeCall = mockedFs.writeFile.mock.calls[0];
|
|
122
|
+
const htmlContent = writeCall[1] as string;
|
|
123
|
+
|
|
124
|
+
expect(htmlContent).toContain("<!DOCTYPE html>");
|
|
125
|
+
expect(htmlContent).toContain("Test <Subject>"); // escaped subject
|
|
126
|
+
expect(htmlContent).toContain("test@example.com");
|
|
127
|
+
expect(htmlContent).toContain(
|
|
128
|
+
"<p>Test body with <strong>HTML</strong></p>",
|
|
129
|
+
); // body not escaped
|
|
130
|
+
expect(htmlContent).toContain("Sent:");
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test("should throw EmailError when mkdir fails", async () => {
|
|
134
|
+
const mkdirError = new Error("Permission denied");
|
|
135
|
+
mockedFs.mkdir.mockRejectedValue(mkdirError);
|
|
136
|
+
|
|
137
|
+
const to = "test@example.com";
|
|
138
|
+
const subject = "Test Subject";
|
|
139
|
+
const body = "<p>Test body</p>";
|
|
140
|
+
|
|
141
|
+
await expect(
|
|
142
|
+
provider.send({
|
|
143
|
+
to,
|
|
144
|
+
subject,
|
|
145
|
+
body,
|
|
146
|
+
}),
|
|
147
|
+
).rejects.toThrow(EmailError);
|
|
148
|
+
await expect(
|
|
149
|
+
provider.send({
|
|
150
|
+
to,
|
|
151
|
+
subject,
|
|
152
|
+
body,
|
|
153
|
+
}),
|
|
154
|
+
).rejects.toThrow(
|
|
155
|
+
"Failed to save email to local file: Permission denied",
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("should throw EmailError when writeFile fails", async () => {
|
|
160
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
161
|
+
const writeError = new Error("Disk full");
|
|
162
|
+
mockedFs.writeFile.mockRejectedValue(writeError);
|
|
163
|
+
|
|
164
|
+
const to = "test@example.com";
|
|
165
|
+
const subject = "Test Subject";
|
|
166
|
+
const body = "<p>Test body</p>";
|
|
167
|
+
|
|
168
|
+
await expect(
|
|
169
|
+
provider.send({
|
|
170
|
+
to,
|
|
171
|
+
subject,
|
|
172
|
+
body,
|
|
173
|
+
}),
|
|
174
|
+
).rejects.toThrow(EmailError);
|
|
175
|
+
await expect(
|
|
176
|
+
provider.send({
|
|
177
|
+
to,
|
|
178
|
+
subject,
|
|
179
|
+
body,
|
|
180
|
+
}),
|
|
181
|
+
).rejects.toThrow("Failed to save email to local file: Disk full");
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test("should handle non-Error exceptions", async () => {
|
|
185
|
+
mockedFs.mkdir.mockResolvedValue(undefined);
|
|
186
|
+
mockedFs.writeFile.mockRejectedValue("String error");
|
|
187
|
+
|
|
188
|
+
const to = "test@example.com";
|
|
189
|
+
const subject = "Test Subject";
|
|
190
|
+
const body = "<p>Test body</p>";
|
|
191
|
+
|
|
192
|
+
await expect(
|
|
193
|
+
provider.send({
|
|
194
|
+
to,
|
|
195
|
+
subject,
|
|
196
|
+
body,
|
|
197
|
+
}),
|
|
198
|
+
).rejects.toThrow(EmailError);
|
|
199
|
+
await expect(
|
|
200
|
+
provider.send({
|
|
201
|
+
to,
|
|
202
|
+
subject,
|
|
203
|
+
body,
|
|
204
|
+
}),
|
|
205
|
+
).rejects.toThrow("Failed to save email to local file: String error");
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe("createEmailHtml", () => {
|
|
210
|
+
beforeEach(() => {
|
|
211
|
+
provider = new LocalEmailProvider();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test("should create proper HTML structure", () => {
|
|
215
|
+
const mockDate = new Date("2023-01-01T12:00:00.000Z");
|
|
216
|
+
vi.setSystemTime(mockDate);
|
|
217
|
+
|
|
218
|
+
const to = "test@example.com";
|
|
219
|
+
const subject = "Test Subject";
|
|
220
|
+
const body = "<p>Test body</p>";
|
|
221
|
+
|
|
222
|
+
const html = provider.createEmailHtml({
|
|
223
|
+
to,
|
|
224
|
+
subject,
|
|
225
|
+
body,
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
expect(html).toContain("<!DOCTYPE html>");
|
|
229
|
+
expect(html).toContain('<html lang="en">');
|
|
230
|
+
expect(html).toContain("<head>");
|
|
231
|
+
expect(html).toContain("<body>");
|
|
232
|
+
expect(html).toContain("Test Subject");
|
|
233
|
+
expect(html).toContain("test@example.com");
|
|
234
|
+
expect(html).toContain("<p>Test body</p>");
|
|
235
|
+
expect(html).toContain("2023-01-01T12:00:00.000Z");
|
|
236
|
+
|
|
237
|
+
vi.useRealTimers();
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("should escape HTML in subject and email address", () => {
|
|
241
|
+
const to = "test<script>@example.com";
|
|
242
|
+
const subject = "Test <Subject> & More";
|
|
243
|
+
const body = "<p>Test body</p>";
|
|
244
|
+
|
|
245
|
+
const html = provider.createEmailHtml({
|
|
246
|
+
to,
|
|
247
|
+
subject,
|
|
248
|
+
body,
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
expect(html).toContain("test<script>@example.com");
|
|
252
|
+
expect(html).toContain("Test <Subject> & More");
|
|
253
|
+
expect(html).not.toContain("test<script>@example.com");
|
|
254
|
+
expect(html).not.toContain("Test <Subject> & More");
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("should not escape HTML in body content", () => {
|
|
258
|
+
const to = "test@example.com";
|
|
259
|
+
const subject = "Test Subject";
|
|
260
|
+
const body = "<p>Test body with <strong>HTML</strong> & entities</p>";
|
|
261
|
+
|
|
262
|
+
const html = provider.createEmailHtml({
|
|
263
|
+
to,
|
|
264
|
+
subject,
|
|
265
|
+
body,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
expect(html).toContain(
|
|
269
|
+
"<p>Test body with <strong>HTML</strong> & entities</p>",
|
|
270
|
+
);
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("should include CSS styles", () => {
|
|
274
|
+
const to = "test@example.com";
|
|
275
|
+
const subject = "Test Subject";
|
|
276
|
+
const body = "<p>Test body</p>";
|
|
277
|
+
|
|
278
|
+
const html = provider.createEmailHtml({
|
|
279
|
+
to,
|
|
280
|
+
subject,
|
|
281
|
+
body,
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
expect(html).toContain("<style>");
|
|
285
|
+
expect(html).toContain("font-family: Arial, sans-serif");
|
|
286
|
+
expect(html).toContain(".email-header");
|
|
287
|
+
expect(html).toContain(".email-body");
|
|
288
|
+
expect(html).toContain(".meta");
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
describe("escapeHtml", () => {
|
|
293
|
+
beforeEach(() => {
|
|
294
|
+
provider = new LocalEmailProvider();
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("should escape ampersands", () => {
|
|
298
|
+
const result = provider.escapeHtml("Tom & Jerry");
|
|
299
|
+
expect(result).toBe("Tom & Jerry");
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
test("should escape less than signs", () => {
|
|
303
|
+
const result = provider.escapeHtml("5 < 10");
|
|
304
|
+
expect(result).toBe("5 < 10");
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
test("should escape greater than signs", () => {
|
|
308
|
+
const result = provider.escapeHtml("10 > 5");
|
|
309
|
+
expect(result).toBe("10 > 5");
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
test("should escape double quotes", () => {
|
|
313
|
+
const result = provider.escapeHtml('Say "Hello"');
|
|
314
|
+
expect(result).toBe("Say "Hello"");
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test("should escape single quotes", () => {
|
|
318
|
+
const result = provider.escapeHtml("Don't worry");
|
|
319
|
+
expect(result).toBe("Don't worry");
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test("should escape multiple special characters", () => {
|
|
323
|
+
const result = provider.escapeHtml(
|
|
324
|
+
'<script>alert("Hello & goodbye")</script>',
|
|
325
|
+
);
|
|
326
|
+
expect(result).toBe(
|
|
327
|
+
"<script>alert("Hello & goodbye")</script>",
|
|
328
|
+
);
|
|
329
|
+
});
|
|
330
|
+
|
|
331
|
+
test("should handle empty string", () => {
|
|
332
|
+
const result = provider.escapeHtml("");
|
|
333
|
+
expect(result).toBe("");
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
test("should handle string with no special characters", () => {
|
|
337
|
+
const result = provider.escapeHtml("Hello World");
|
|
338
|
+
expect(result).toBe("Hello World");
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { t } from "alepha";
|
|
2
|
+
import { FakeProvider } from "../providers/FakeProvider.ts";
|
|
3
|
+
|
|
4
|
+
// Example showing how key names influence generated data
|
|
5
|
+
const fake = new FakeProvider({ seed: 12345 });
|
|
6
|
+
|
|
7
|
+
const userSchema = t.object({
|
|
8
|
+
id: t.uuid(),
|
|
9
|
+
firstName: t.text(), // Will generate a first name (e.g. "John")
|
|
10
|
+
lastName: t.text(), // Will generate a last name (e.g. "Doe")
|
|
11
|
+
email: t.text(), // Will generate an email (e.g. "john.doe@example.com")
|
|
12
|
+
age: t.integer(), // Will generate age between 18-99
|
|
13
|
+
phone: t.text(), // Will generate a phone number
|
|
14
|
+
address: t.text(), // Will generate a street address
|
|
15
|
+
city: t.text(), // Will generate a city name
|
|
16
|
+
country: t.text(), // Will generate a country name
|
|
17
|
+
company: t.text(), // Will generate a company name
|
|
18
|
+
jobTitle: t.text(), // Will generate a job title
|
|
19
|
+
username: t.text(), // Will generate a username
|
|
20
|
+
website: t.text(), // Will generate a URL
|
|
21
|
+
avatar: t.text(), // Will generate an avatar URL
|
|
22
|
+
bio: t.text(), // Will generate a short bio
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const fakeUser = fake.generate(userSchema);
|
|
26
|
+
|
|
27
|
+
console.log("Generated user with key name intelligence:");
|
|
28
|
+
console.log(JSON.stringify(fakeUser, null, 2));
|
|
29
|
+
|
|
30
|
+
// Example with explicit formats (key names are ignored when format is set)
|
|
31
|
+
const explicitSchema = t.object({
|
|
32
|
+
id: t.uuid(), // format: uuid - generates UUID
|
|
33
|
+
email: t.email(), // format: email - generates email
|
|
34
|
+
createdAt: t.string({ format: "date-time" }), // format: date-time
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
const explicitData = fake.generate(explicitSchema);
|
|
38
|
+
|
|
39
|
+
console.log("\nGenerated data with explicit formats:");
|
|
40
|
+
console.log(JSON.stringify(explicitData, null, 2));
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { t } from "alepha";
|
|
2
|
+
import { describe, test } from "vitest";
|
|
3
|
+
import { FakeProvider } from "../providers/FakeProvider.ts";
|
|
4
|
+
|
|
5
|
+
describe("FakeProvider - Key Name Intelligence", () => {
|
|
6
|
+
test("generates contextual data based on key names", ({ expect }) => {
|
|
7
|
+
const fake = new FakeProvider({ seed: 12345 });
|
|
8
|
+
const schema = t.object({
|
|
9
|
+
firstName: t.text(),
|
|
10
|
+
lastName: t.text(),
|
|
11
|
+
email: t.text(),
|
|
12
|
+
age: t.integer(),
|
|
13
|
+
phone: t.text(),
|
|
14
|
+
address: t.text(),
|
|
15
|
+
city: t.text(),
|
|
16
|
+
company: t.text(),
|
|
17
|
+
username: t.text(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const result = fake.generate(schema);
|
|
21
|
+
|
|
22
|
+
// Verify types
|
|
23
|
+
expect(typeof result.firstName).toBe("string");
|
|
24
|
+
expect(typeof result.lastName).toBe("string");
|
|
25
|
+
expect(typeof result.email).toBe("string");
|
|
26
|
+
expect(typeof result.age).toBe("number");
|
|
27
|
+
expect(typeof result.phone).toBe("string");
|
|
28
|
+
expect(typeof result.address).toBe("string");
|
|
29
|
+
expect(typeof result.city).toBe("string");
|
|
30
|
+
expect(typeof result.company).toBe("string");
|
|
31
|
+
expect(typeof result.username).toBe("string");
|
|
32
|
+
|
|
33
|
+
// Verify email format (basic check)
|
|
34
|
+
expect(result.email).toMatch(/@/);
|
|
35
|
+
|
|
36
|
+
// Verify age is in expected range for context-aware generation
|
|
37
|
+
expect(result.age).toBeGreaterThanOrEqual(18);
|
|
38
|
+
expect(result.age).toBeLessThanOrEqual(99);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("format takes precedence over key name", ({ expect }) => {
|
|
42
|
+
const fake = new FakeProvider({ seed: 12345 });
|
|
43
|
+
const schema = t.object({
|
|
44
|
+
// Even though key is "email", format: uuid should generate UUID
|
|
45
|
+
email: t.uuid(),
|
|
46
|
+
// Even though key is "id", format: email should generate email
|
|
47
|
+
id: t.email(),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
const result = fake.generate(schema);
|
|
51
|
+
|
|
52
|
+
// email field should be UUID format
|
|
53
|
+
expect(result.email).toMatch(
|
|
54
|
+
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// id field should be email format
|
|
58
|
+
expect(result.id).toMatch(/@/);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("enum values ignore key name context", ({ expect }) => {
|
|
62
|
+
const fake = new FakeProvider({ seed: 12345 });
|
|
63
|
+
const schema = t.object({
|
|
64
|
+
// Even though key is "email", enum should pick from values
|
|
65
|
+
email: t.enum(["user1", "user2", "user3"]),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
const result = fake.generate(schema);
|
|
69
|
+
|
|
70
|
+
expect(["user1", "user2", "user3"]).toContain(result.email);
|
|
71
|
+
// Should NOT be an email format
|
|
72
|
+
expect(result.email).not.toMatch(/@/);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("generates realistic user profiles", ({ expect }) => {
|
|
76
|
+
const fake = new FakeProvider({ seed: 67890 });
|
|
77
|
+
const userSchema = t.object({
|
|
78
|
+
firstName: t.shortText(),
|
|
79
|
+
lastName: t.shortText(),
|
|
80
|
+
fullName: t.text(),
|
|
81
|
+
email: t.text(),
|
|
82
|
+
username: t.text(),
|
|
83
|
+
age: t.integer(),
|
|
84
|
+
bio: t.longText(),
|
|
85
|
+
avatar: t.text(),
|
|
86
|
+
website: t.text(),
|
|
87
|
+
jobTitle: t.text(),
|
|
88
|
+
company: t.text(),
|
|
89
|
+
address: t.text(),
|
|
90
|
+
city: t.text(),
|
|
91
|
+
state: t.text(),
|
|
92
|
+
country: t.text(),
|
|
93
|
+
zipCode: t.text(),
|
|
94
|
+
phone: t.text(),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const user = fake.generate(userSchema);
|
|
98
|
+
|
|
99
|
+
// Verify structure
|
|
100
|
+
expect(typeof user.firstName).toBe("string");
|
|
101
|
+
expect(typeof user.lastName).toBe("string");
|
|
102
|
+
expect(typeof user.fullName).toBe("string");
|
|
103
|
+
expect(typeof user.email).toBe("string");
|
|
104
|
+
expect(typeof user.username).toBe("string");
|
|
105
|
+
expect(typeof user.age).toBe("number");
|
|
106
|
+
expect(typeof user.bio).toBe("string");
|
|
107
|
+
expect(typeof user.avatar).toBe("string");
|
|
108
|
+
expect(typeof user.website).toBe("string");
|
|
109
|
+
expect(typeof user.jobTitle).toBe("string");
|
|
110
|
+
expect(typeof user.company).toBe("string");
|
|
111
|
+
expect(typeof user.address).toBe("string");
|
|
112
|
+
expect(typeof user.city).toBe("string");
|
|
113
|
+
expect(typeof user.state).toBe("string");
|
|
114
|
+
expect(typeof user.country).toBe("string");
|
|
115
|
+
expect(typeof user.zipCode).toBe("string");
|
|
116
|
+
expect(typeof user.phone).toBe("string");
|
|
117
|
+
|
|
118
|
+
// Check some specific patterns
|
|
119
|
+
expect(user.email).toMatch(/@/);
|
|
120
|
+
expect(user.website).toMatch(/^https?:\/\//);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
test("numeric key names influence generation", ({ expect }) => {
|
|
124
|
+
const fake = new FakeProvider({ seed: 12345 });
|
|
125
|
+
const schema = t.object({
|
|
126
|
+
age: t.integer(),
|
|
127
|
+
year: t.integer(),
|
|
128
|
+
month: t.integer(),
|
|
129
|
+
day: t.integer(),
|
|
130
|
+
price: t.number(),
|
|
131
|
+
amount: t.number(),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const result = fake.generate(schema);
|
|
135
|
+
|
|
136
|
+
// Age should be in realistic range
|
|
137
|
+
expect(result.age).toBeGreaterThanOrEqual(18);
|
|
138
|
+
expect(result.age).toBeLessThanOrEqual(99);
|
|
139
|
+
|
|
140
|
+
// Month should be 1-12
|
|
141
|
+
expect(result.month).toBeGreaterThanOrEqual(1);
|
|
142
|
+
expect(result.month).toBeLessThanOrEqual(12);
|
|
143
|
+
|
|
144
|
+
// Day should be 1-31
|
|
145
|
+
expect(result.day).toBeGreaterThanOrEqual(1);
|
|
146
|
+
expect(result.day).toBeLessThanOrEqual(31);
|
|
147
|
+
|
|
148
|
+
// Price/amount should be positive
|
|
149
|
+
expect(result.price).toBeGreaterThan(0);
|
|
150
|
+
expect(result.amount).toBeGreaterThan(0);
|
|
151
|
+
});
|
|
152
|
+
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { $inject, Alepha, t } from "alepha";
|
|
2
|
+
import { AlephaFake, FakeProvider } from "../index.ts";
|
|
3
|
+
|
|
4
|
+
// Example showing how to use the AlephaFake module
|
|
5
|
+
class MyApp {
|
|
6
|
+
constructor(private fake = $inject(FakeProvider)) {}
|
|
7
|
+
|
|
8
|
+
async seedDatabase() {
|
|
9
|
+
// Define your schema
|
|
10
|
+
const userSchema = t.object({
|
|
11
|
+
id: t.uuid(),
|
|
12
|
+
firstName: t.text(),
|
|
13
|
+
lastName: t.text(),
|
|
14
|
+
email: t.email(),
|
|
15
|
+
age: t.integer({ minimum: 18, maximum: 99 }),
|
|
16
|
+
createdAt: t.string({ format: "date-time" }),
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// Generate multiple fake users
|
|
20
|
+
return this.fake.generateMany(userSchema, 10);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Create Alepha instance with the fake module
|
|
25
|
+
const alepha = Alepha.create().with(AlephaFake);
|
|
26
|
+
|
|
27
|
+
const app = alepha.inject(MyApp);
|
|
28
|
+
|
|
29
|
+
// Seed the database
|
|
30
|
+
await alepha.start();
|
|
31
|
+
await app.seedDatabase();
|
|
32
|
+
await alepha.stop();
|