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,315 @@
|
|
|
1
|
+
import { Alepha } from "alepha";
|
|
2
|
+
import { cliOptions } from "alepha/command";
|
|
3
|
+
import {
|
|
4
|
+
LogDestinationProvider,
|
|
5
|
+
MemoryDestinationProvider,
|
|
6
|
+
} from "alepha/logger";
|
|
7
|
+
import { describe, expect, test } from "vitest";
|
|
8
|
+
import {
|
|
9
|
+
ChangelogCommand,
|
|
10
|
+
changelogOptions,
|
|
11
|
+
GitMessageParser,
|
|
12
|
+
GitProvider,
|
|
13
|
+
} from "./changelog.ts";
|
|
14
|
+
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// MOCK GIT PROVIDER
|
|
17
|
+
// =============================================================================
|
|
18
|
+
|
|
19
|
+
let currentMockResponses: Map<string, string> | null = null;
|
|
20
|
+
|
|
21
|
+
class MockGitProvider extends GitProvider {
|
|
22
|
+
override async exec(cmd: string, _cwd: string): Promise<string> {
|
|
23
|
+
if (!currentMockResponses) {
|
|
24
|
+
throw new Error("No git mocks configured");
|
|
25
|
+
}
|
|
26
|
+
const response = currentMockResponses.get(cmd);
|
|
27
|
+
if (response === undefined) {
|
|
28
|
+
throw new Error(`Unmocked git command: ${cmd}`);
|
|
29
|
+
}
|
|
30
|
+
return response;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function setMockGitResponses(
|
|
35
|
+
mocks: Array<{ cmd: string; response: string }>,
|
|
36
|
+
): void {
|
|
37
|
+
currentMockResponses = new Map<string, string>();
|
|
38
|
+
for (const { cmd, response } of mocks) {
|
|
39
|
+
currentMockResponses.set(cmd, response);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// =============================================================================
|
|
44
|
+
// TESTS
|
|
45
|
+
// =============================================================================
|
|
46
|
+
|
|
47
|
+
describe("changelog", () => {
|
|
48
|
+
describe("GitMessageParser.parseCommit", () => {
|
|
49
|
+
const defaultConfig = { ignore: ["chore", "ci", "build", "test"] };
|
|
50
|
+
|
|
51
|
+
const getParser = () => {
|
|
52
|
+
const alepha = Alepha.create();
|
|
53
|
+
return alepha.inject(GitMessageParser);
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
test("should parse conventional commit with scope", () => {
|
|
57
|
+
const parser = getParser();
|
|
58
|
+
const result = parser.parseCommit(
|
|
59
|
+
"abc12345 feat(ui): add button component",
|
|
60
|
+
defaultConfig,
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
expect(result).toEqual({
|
|
64
|
+
hash: "abc12345",
|
|
65
|
+
type: "feat",
|
|
66
|
+
scope: "ui",
|
|
67
|
+
description: "add button component",
|
|
68
|
+
breaking: false,
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test("should ignore conventional commit without scope", () => {
|
|
73
|
+
const parser = getParser();
|
|
74
|
+
const result = parser.parseCommit(
|
|
75
|
+
"def45678 fix: resolve memory leak",
|
|
76
|
+
defaultConfig,
|
|
77
|
+
);
|
|
78
|
+
expect(result).toBeNull();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test("should detect breaking change with ! marker", () => {
|
|
82
|
+
const parser = getParser();
|
|
83
|
+
const result = parser.parseCommit(
|
|
84
|
+
"aaa78901 feat(api)!: remove deprecated endpoint",
|
|
85
|
+
defaultConfig,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
expect(result).toEqual({
|
|
89
|
+
hash: "aaa78901",
|
|
90
|
+
type: "feat",
|
|
91
|
+
scope: "api",
|
|
92
|
+
description: "remove deprecated endpoint",
|
|
93
|
+
breaking: true,
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
test("should detect breaking change in description", () => {
|
|
98
|
+
const parser = getParser();
|
|
99
|
+
const result = parser.parseCommit(
|
|
100
|
+
"bbb01234 feat(auth): breaking change to token format",
|
|
101
|
+
defaultConfig,
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
expect(result).toEqual({
|
|
105
|
+
hash: "bbb01234",
|
|
106
|
+
type: "feat",
|
|
107
|
+
scope: "auth",
|
|
108
|
+
description: "breaking change to token format",
|
|
109
|
+
breaking: true,
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test("should ignore commits with ignored scope", () => {
|
|
114
|
+
const parser = getParser();
|
|
115
|
+
const result = parser.parseCommit(
|
|
116
|
+
"ccc34567 feat(chore): update deps",
|
|
117
|
+
defaultConfig,
|
|
118
|
+
);
|
|
119
|
+
expect(result).toBeNull();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("should ignore commits with nested ignored scope", () => {
|
|
123
|
+
const parser = getParser();
|
|
124
|
+
const result = parser.parseCommit(
|
|
125
|
+
"ddd67890 feat(test/unit): add tests",
|
|
126
|
+
defaultConfig,
|
|
127
|
+
);
|
|
128
|
+
expect(result).toBeNull();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("should ignore module-style commits (no type)", () => {
|
|
132
|
+
const parser = getParser();
|
|
133
|
+
const result = parser.parseCommit("eee90123 cli: add new command", {});
|
|
134
|
+
expect(result).toBeNull();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("should return null for non-matching commits", () => {
|
|
138
|
+
const parser = getParser();
|
|
139
|
+
const result = parser.parseCommit(
|
|
140
|
+
"fff78901 random commit message",
|
|
141
|
+
defaultConfig,
|
|
142
|
+
);
|
|
143
|
+
expect(result).toBeNull();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
test("should truncate hash to 8 characters", () => {
|
|
147
|
+
const parser = getParser();
|
|
148
|
+
const result = parser.parseCommit(
|
|
149
|
+
"abcdef1234567890 feat(core): something",
|
|
150
|
+
defaultConfig,
|
|
151
|
+
);
|
|
152
|
+
expect(result?.hash).toBe("abcdef12");
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test("should parse all supported types", () => {
|
|
156
|
+
const parser = getParser();
|
|
157
|
+
const types = ["feat", "fix", "docs", "refactor", "perf", "revert"];
|
|
158
|
+
|
|
159
|
+
for (const type of types) {
|
|
160
|
+
const result = parser.parseCommit(
|
|
161
|
+
`abc12345 ${type}(core): test`,
|
|
162
|
+
defaultConfig,
|
|
163
|
+
);
|
|
164
|
+
expect(result?.type).toBe(type);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
test("should handle nested scopes", () => {
|
|
169
|
+
const parser = getParser();
|
|
170
|
+
const result = parser.parseCommit(
|
|
171
|
+
"abc12345 feat(api/users): add endpoint",
|
|
172
|
+
defaultConfig,
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
expect(result).toEqual({
|
|
176
|
+
hash: "abc12345",
|
|
177
|
+
type: "feat",
|
|
178
|
+
scope: "api/users",
|
|
179
|
+
description: "add endpoint",
|
|
180
|
+
breaking: false,
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe("changelogOptions atom", () => {
|
|
186
|
+
test("should have default ignore list", async () => {
|
|
187
|
+
const alepha = Alepha.create();
|
|
188
|
+
await alepha.start();
|
|
189
|
+
|
|
190
|
+
const config = alepha.store.get(changelogOptions);
|
|
191
|
+
expect(config.ignore).toContain("chore");
|
|
192
|
+
expect(config.ignore).toContain("ci");
|
|
193
|
+
expect(config.ignore).toContain("build");
|
|
194
|
+
expect(config.ignore).toContain("test");
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
test("should allow custom configuration", async () => {
|
|
198
|
+
const alepha = Alepha.create();
|
|
199
|
+
alepha.set(changelogOptions, {
|
|
200
|
+
ignore: ["custom", "internal"],
|
|
201
|
+
});
|
|
202
|
+
await alepha.start();
|
|
203
|
+
|
|
204
|
+
const config = alepha.store.get(changelogOptions);
|
|
205
|
+
expect(config.ignore).toEqual(["custom", "internal"]);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe("changelog command", () => {
|
|
210
|
+
const setupCommand = async (
|
|
211
|
+
gitMocks: { cmd: string; response: string }[],
|
|
212
|
+
argv: string[] = ["changelog"],
|
|
213
|
+
options?: { ignore?: string[] },
|
|
214
|
+
) => {
|
|
215
|
+
setMockGitResponses(gitMocks);
|
|
216
|
+
|
|
217
|
+
const alepha = Alepha.create()
|
|
218
|
+
.with({
|
|
219
|
+
provide: LogDestinationProvider,
|
|
220
|
+
use: MemoryDestinationProvider,
|
|
221
|
+
})
|
|
222
|
+
.with({ provide: GitProvider, use: MockGitProvider })
|
|
223
|
+
.with(ChangelogCommand);
|
|
224
|
+
|
|
225
|
+
alepha.store.mut(cliOptions, (old) => ({
|
|
226
|
+
...old,
|
|
227
|
+
argv,
|
|
228
|
+
}));
|
|
229
|
+
|
|
230
|
+
if (options) {
|
|
231
|
+
alepha.set(changelogOptions, options);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
await alepha.start();
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
alepha,
|
|
238
|
+
logger: alepha.inject(MemoryDestinationProvider),
|
|
239
|
+
};
|
|
240
|
+
};
|
|
241
|
+
|
|
242
|
+
test("should show changes since latest tag", async () => {
|
|
243
|
+
await setupCommand([
|
|
244
|
+
{ cmd: "tag --sort=-version:refname", response: "1.0.0\n0.9.0\n" },
|
|
245
|
+
{
|
|
246
|
+
cmd: "log 1.0.0..HEAD --oneline",
|
|
247
|
+
response: [
|
|
248
|
+
"abc12345 feat(ui): add dashboard",
|
|
249
|
+
"def56789 fix(core): resolve crash",
|
|
250
|
+
].join("\n"),
|
|
251
|
+
},
|
|
252
|
+
]);
|
|
253
|
+
// Outputs to stdout - test verifies no error
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test("should show changes from specified version", async () => {
|
|
257
|
+
await setupCommand(
|
|
258
|
+
[
|
|
259
|
+
{
|
|
260
|
+
cmd: "log 0.5.0..HEAD --oneline",
|
|
261
|
+
response: "abc12345 feat(api): new feature",
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
["changelog", "--from=0.5.0"],
|
|
265
|
+
);
|
|
266
|
+
// Outputs to stdout - test verifies no error
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
test("should handle no tags found", async () => {
|
|
270
|
+
await setupCommand([
|
|
271
|
+
{ cmd: "tag --sort=-version:refname", response: "" },
|
|
272
|
+
]);
|
|
273
|
+
// Should output "No version tags found" - no error
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
test("should handle no changes since tag", async () => {
|
|
277
|
+
await setupCommand([
|
|
278
|
+
{ cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
|
|
279
|
+
{ cmd: "log 1.0.0..HEAD --oneline", response: "" },
|
|
280
|
+
]);
|
|
281
|
+
// Should output "No changes since 1.0.0" - no error
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
test("should filter commits by ignore list", async () => {
|
|
285
|
+
await setupCommand(
|
|
286
|
+
[
|
|
287
|
+
{ cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
|
|
288
|
+
{
|
|
289
|
+
cmd: "log 1.0.0..HEAD --oneline",
|
|
290
|
+
response: [
|
|
291
|
+
"abc12345 feat(ui): add dashboard",
|
|
292
|
+
"def56789 feat(internal): should be filtered",
|
|
293
|
+
].join("\n"),
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
["changelog"],
|
|
297
|
+
{ ignore: ["internal"] },
|
|
298
|
+
);
|
|
299
|
+
// "feat(internal)" is filtered out
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
test("should use -f alias for --from", async () => {
|
|
303
|
+
await setupCommand(
|
|
304
|
+
[
|
|
305
|
+
{
|
|
306
|
+
cmd: "log 0.8.0..HEAD --oneline",
|
|
307
|
+
response: "abc12345 feat(cli): new command",
|
|
308
|
+
},
|
|
309
|
+
],
|
|
310
|
+
["changelog", "-f=0.8.0"],
|
|
311
|
+
);
|
|
312
|
+
// Outputs to stdout - test verifies no error
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
@@ -3,15 +3,15 @@ import { promisify } from "node:util";
|
|
|
3
3
|
import { $inject, $use, t } from "alepha";
|
|
4
4
|
import { $command } from "alepha/command";
|
|
5
5
|
import { $logger } from "alepha/logger";
|
|
6
|
-
import { changelogOptions } from "
|
|
7
|
-
import { GitMessageParser } from "
|
|
6
|
+
import { changelogOptions } from "../../atoms/changelogOptions.ts";
|
|
7
|
+
import { GitMessageParser } from "../../services/GitMessageParser.ts";
|
|
8
8
|
|
|
9
9
|
export {
|
|
10
10
|
type ChangelogOptions,
|
|
11
11
|
changelogOptions,
|
|
12
12
|
DEFAULT_IGNORE,
|
|
13
|
-
} from "
|
|
14
|
-
export { GitMessageParser } from "
|
|
13
|
+
} from "../../atoms/changelogOptions.ts";
|
|
14
|
+
export { GitMessageParser } from "../../services/GitMessageParser.ts";
|
|
15
15
|
|
|
16
16
|
const execAsync = promisify(exec);
|
|
17
17
|
|
|
@@ -55,10 +55,10 @@ interface ChangelogEntry {
|
|
|
55
55
|
* Changelog command for generating release notes from git commits.
|
|
56
56
|
*
|
|
57
57
|
* Usage:
|
|
58
|
-
* - `alepha changelog` - Show unreleased changes since latest tag to HEAD
|
|
59
|
-
* - `alepha changelog --from=1.0.0` - Show changes from version to HEAD
|
|
60
|
-
* - `alepha changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
|
|
61
|
-
* - `alepha changelog | tee -a CHANGELOG.md` - Append to file
|
|
58
|
+
* - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD
|
|
59
|
+
* - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD
|
|
60
|
+
* - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
|
|
61
|
+
* - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file
|
|
62
62
|
*/
|
|
63
63
|
export class ChangelogCommand {
|
|
64
64
|
protected readonly log = $logger();
|
|
@@ -166,7 +166,7 @@ export class ChangelogCommand {
|
|
|
166
166
|
// COMMAND
|
|
167
167
|
// ---------------------------------------------------------------------------
|
|
168
168
|
|
|
169
|
-
public readonly
|
|
169
|
+
public readonly command = $command({
|
|
170
170
|
name: "changelog",
|
|
171
171
|
description:
|
|
172
172
|
"Generate changelog from conventional commits (outputs to stdout)",
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { $inject, t } from "alepha";
|
|
2
|
+
import { $command } from "alepha/command";
|
|
3
|
+
import { FileSystemProvider } from "alepha/file";
|
|
4
|
+
import { $logger } from "alepha/logger";
|
|
5
|
+
import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
|
|
6
|
+
|
|
7
|
+
export class GenEnvCommand {
|
|
8
|
+
protected readonly log = $logger();
|
|
9
|
+
protected readonly utils = $inject(AlephaCliUtils);
|
|
10
|
+
protected readonly fs = $inject(FileSystemProvider);
|
|
11
|
+
|
|
12
|
+
public readonly command = $command({
|
|
13
|
+
name: "env",
|
|
14
|
+
description: "Extract environment variables from server entry file",
|
|
15
|
+
flags: t.object({
|
|
16
|
+
out: t.optional(
|
|
17
|
+
t.text({
|
|
18
|
+
aliases: ["o"],
|
|
19
|
+
description: "Output file path (e.g., .env)",
|
|
20
|
+
}),
|
|
21
|
+
),
|
|
22
|
+
}),
|
|
23
|
+
handler: async ({ root, flags }) => {
|
|
24
|
+
const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
const { env } = alepha.dump();
|
|
28
|
+
|
|
29
|
+
let dotEnvFile = "";
|
|
30
|
+
for (const [key, value] of Object.entries(env)) {
|
|
31
|
+
if (value.description) {
|
|
32
|
+
dotEnvFile += `# ${value.description.split("\n").join("\n# ")}\n`;
|
|
33
|
+
}
|
|
34
|
+
if (value.required && !value.default) {
|
|
35
|
+
dotEnvFile += `# (required)\n`;
|
|
36
|
+
}
|
|
37
|
+
if (value.enum) {
|
|
38
|
+
dotEnvFile += `# Possible values: ${value.enum.join(", ")}\n`;
|
|
39
|
+
}
|
|
40
|
+
dotEnvFile += `${key}=${value.default || ""}\n\n`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (flags.out) {
|
|
44
|
+
await this.fs.writeFile(this.fs.join(root, flags.out), dotEnvFile);
|
|
45
|
+
} else {
|
|
46
|
+
this.log.info(dotEnvFile);
|
|
47
|
+
}
|
|
48
|
+
} catch (err) {
|
|
49
|
+
this.log.error("Failed to extract environment variables", err);
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { $inject, t } from "alepha";
|
|
2
|
+
import { $command } from "alepha/command";
|
|
3
|
+
import { FileSystemProvider } from "alepha/file";
|
|
4
|
+
import { $logger } from "alepha/logger";
|
|
5
|
+
import { ServerSwaggerProvider } from "alepha/server/swagger";
|
|
6
|
+
import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
|
|
7
|
+
|
|
8
|
+
export class OpenApiCommand {
|
|
9
|
+
protected readonly log = $logger();
|
|
10
|
+
protected readonly utils = $inject(AlephaCliUtils);
|
|
11
|
+
protected readonly fs = $inject(FileSystemProvider);
|
|
12
|
+
|
|
13
|
+
public readonly command = $command({
|
|
14
|
+
name: "openapi",
|
|
15
|
+
description: "Generate OpenAPI specification from actions",
|
|
16
|
+
flags: t.object({
|
|
17
|
+
out: t.optional(
|
|
18
|
+
t.text({
|
|
19
|
+
aliases: ["o"],
|
|
20
|
+
description: "Output file path",
|
|
21
|
+
}),
|
|
22
|
+
),
|
|
23
|
+
}),
|
|
24
|
+
handler: async ({ root, flags }) => {
|
|
25
|
+
const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
const openapiProvider = alepha.inject(
|
|
29
|
+
ServerSwaggerProvider,
|
|
30
|
+
) as ServerSwaggerProvider;
|
|
31
|
+
|
|
32
|
+
await alepha.events.emit("configure", alepha);
|
|
33
|
+
|
|
34
|
+
let json: any = openapiProvider.json;
|
|
35
|
+
|
|
36
|
+
if (!json) {
|
|
37
|
+
json = openapiProvider.generateSwaggerDoc({
|
|
38
|
+
info: {
|
|
39
|
+
title: "API Documentation",
|
|
40
|
+
version: "1.0.0",
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (!json) {
|
|
46
|
+
this.log.error("No actions found to generate OpenAPI specification.");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (flags.out) {
|
|
51
|
+
await this.fs.writeFile(
|
|
52
|
+
this.fs.join(root, flags.out),
|
|
53
|
+
JSON.stringify(json, null, 2),
|
|
54
|
+
);
|
|
55
|
+
} else {
|
|
56
|
+
this.log.info(JSON.stringify(json, null, 2));
|
|
57
|
+
}
|
|
58
|
+
} catch (err) {
|
|
59
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
60
|
+
if (message.includes("Service not found")) {
|
|
61
|
+
this.log.error(
|
|
62
|
+
"Missing $swagger() primitive in your server configuration.",
|
|
63
|
+
);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
this.log.error(`OpenAPI generation failed - ${message}`, err);
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TODO:
|
|
3
|
+
*
|
|
4
|
+
* alepha gen resource <name>
|
|
5
|
+
*
|
|
6
|
+
* will generate:
|
|
7
|
+
*
|
|
8
|
+
* src/api/controllers/<name>Controller.ts
|
|
9
|
+
* src/api/entity/<name>Entity.ts
|
|
10
|
+
* (maybe) src/api/services/<name>Service.ts
|
|
11
|
+
* (maybe) src/api/repositories/<name>Repository.ts
|
|
12
|
+
*
|
|
13
|
+
* Each file will contain a basic scaffold for the respective component.
|
|
14
|
+
*
|
|
15
|
+
*/
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { $inject } from "alepha";
|
|
2
|
+
import { $command } from "alepha/command";
|
|
3
|
+
import { ChangelogCommand } from "./gen/changelog.ts";
|
|
4
|
+
import { GenEnvCommand } from "./gen/env.ts";
|
|
5
|
+
import { OpenApiCommand } from "./gen/openapi.ts";
|
|
6
|
+
|
|
7
|
+
export class GenCommand {
|
|
8
|
+
protected readonly changelog = $inject(ChangelogCommand);
|
|
9
|
+
protected readonly openapi = $inject(OpenApiCommand);
|
|
10
|
+
protected readonly genEnv = $inject(GenEnvCommand);
|
|
11
|
+
|
|
12
|
+
public readonly gen = $command({
|
|
13
|
+
name: "gen",
|
|
14
|
+
description: "Generate code, documentation, ...",
|
|
15
|
+
children: [
|
|
16
|
+
this.changelog.command,
|
|
17
|
+
this.openapi.command,
|
|
18
|
+
this.genEnv.command,
|
|
19
|
+
],
|
|
20
|
+
handler: async ({ help }) => {
|
|
21
|
+
help();
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
package/src/cli/commands/init.ts
CHANGED
|
@@ -43,7 +43,6 @@ export class InitCommand {
|
|
|
43
43
|
tsconfigJson: true,
|
|
44
44
|
packageJson: flags,
|
|
45
45
|
biomeJson: true,
|
|
46
|
-
viteConfigTs: !isExpo,
|
|
47
46
|
editorconfig: true,
|
|
48
47
|
indexHtml: !!flags.react && !isExpo,
|
|
49
48
|
});
|
|
@@ -61,6 +60,8 @@ export class InitCommand {
|
|
|
61
60
|
if (pm === "yarn") {
|
|
62
61
|
await this.utils.ensureYarn(root);
|
|
63
62
|
await run("yarn set version stable");
|
|
63
|
+
} else if (pm === "bun") {
|
|
64
|
+
await this.utils.ensureBun(root);
|
|
64
65
|
} else if (pm === "pnpm") {
|
|
65
66
|
await this.utils.ensurePnpm(root);
|
|
66
67
|
} else {
|
package/src/cli/commands/root.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { $inject, t } from "alepha";
|
|
1
|
+
import { $inject, Alepha, t } from "alepha";
|
|
2
2
|
import { $command, CliProvider } from "alepha/command";
|
|
3
|
-
import { $logger } from "alepha/logger";
|
|
3
|
+
import { $logger, ConsoleColorProvider } from "alepha/logger";
|
|
4
4
|
import { version } from "../version.ts";
|
|
5
5
|
|
|
6
6
|
export class RootCommand {
|
|
7
7
|
protected readonly log = $logger();
|
|
8
8
|
protected readonly cli = $inject(CliProvider);
|
|
9
|
+
protected readonly alepha = $inject(Alepha);
|
|
10
|
+
protected readonly color = $inject(ConsoleColorProvider);
|
|
9
11
|
|
|
10
12
|
/**
|
|
11
13
|
* Called when no command is provided
|
|
@@ -22,7 +24,14 @@ export class RootCommand {
|
|
|
22
24
|
}),
|
|
23
25
|
handler: async ({ flags }) => {
|
|
24
26
|
if (flags.version) {
|
|
25
|
-
this.log.info(version);
|
|
27
|
+
this.log.info(this.color.set("WHITE_BOLD", `Alepha v${version}`));
|
|
28
|
+
if (this.alepha.isBun()) {
|
|
29
|
+
this.log.info(this.color.set("GREY_DARK", `└─ Bun v${Bun.version}`));
|
|
30
|
+
} else {
|
|
31
|
+
this.log.info(
|
|
32
|
+
this.color.set("GREY_DARK", `└─ Node ${process.version}`),
|
|
33
|
+
);
|
|
34
|
+
}
|
|
26
35
|
return;
|
|
27
36
|
}
|
|
28
37
|
|
package/src/cli/commands/test.ts
CHANGED
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { $inject } from "alepha";
|
|
2
2
|
import { $command } from "alepha/command";
|
|
3
|
+
import { $logger } from "alepha/logger";
|
|
3
4
|
import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
|
|
4
5
|
|
|
5
6
|
export class TypecheckCommand {
|
|
6
7
|
protected readonly utils = $inject(AlephaCliUtils);
|
|
8
|
+
protected readonly log = $logger();
|
|
7
9
|
|
|
8
10
|
/**
|
|
9
11
|
* Run TypeScript type checking across the codebase with no emit.
|
|
10
12
|
*/
|
|
11
13
|
public readonly typecheck = $command({
|
|
12
14
|
name: "typecheck",
|
|
15
|
+
aliases: ["tc"],
|
|
13
16
|
description: "Check TypeScript types across the codebase",
|
|
14
17
|
handler: async ({ root }) => {
|
|
18
|
+
this.log.info("Starting TypeScript type checking...");
|
|
15
19
|
await this.utils.ensureDependency(root, "typescript");
|
|
16
20
|
await this.utils.exec("tsc --noEmit");
|
|
21
|
+
this.log.info("TypeScript type checking completed successfully.");
|
|
17
22
|
},
|
|
18
23
|
});
|
|
19
24
|
}
|
package/src/cli/defineConfig.ts
CHANGED
|
@@ -1,19 +1,61 @@
|
|
|
1
1
|
import type { Alepha } from "alepha";
|
|
2
2
|
import type { CommandPrimitive } from "alepha/command";
|
|
3
|
+
import { type BuildOptions, buildOptions } from "./atoms/buildOptions.ts";
|
|
3
4
|
|
|
4
|
-
export
|
|
5
|
+
export interface AlephaCliConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Add custom commands to the Alepha CLI.
|
|
8
|
+
*
|
|
9
|
+
* You can override 'deploy', 'build', 'dev', 'start' commands this way.
|
|
10
|
+
* But you can also add your own commands and run them via `alepha <command>`.
|
|
11
|
+
*/
|
|
5
12
|
commands?: Record<string, CommandPrimitive>;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Register more services to the Alepha CLI (enhancements, commands, etc.).
|
|
16
|
+
*/
|
|
6
17
|
services?: Array<any>;
|
|
7
|
-
};
|
|
8
18
|
|
|
9
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Configure Alepha build command.
|
|
21
|
+
*/
|
|
22
|
+
build?: BuildOptions;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Environment variables to set before running commands.
|
|
26
|
+
*
|
|
27
|
+
* Always use .env files by default, this is only for dynamic values.
|
|
28
|
+
*/
|
|
29
|
+
env?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export type AlephaCliConfigFn = (alepha: Alepha) => AlephaCliConfig;
|
|
33
|
+
|
|
34
|
+
export const defineConfig = (
|
|
35
|
+
runConfig: AlephaCliConfig | AlephaCliConfigFn,
|
|
36
|
+
) => {
|
|
10
37
|
return (alepha: Alepha) => {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
38
|
+
const config =
|
|
39
|
+
typeof runConfig === "function" ? runConfig(alepha) : runConfig;
|
|
40
|
+
|
|
41
|
+
if (config.services) {
|
|
42
|
+
for (const it of config.services) {
|
|
43
|
+
alepha.with(it);
|
|
44
|
+
}
|
|
14
45
|
}
|
|
46
|
+
|
|
47
|
+
if (config.env) {
|
|
48
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
49
|
+
process.env[key] = String(value);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (config.build) {
|
|
54
|
+
alepha.set(buildOptions, config.build);
|
|
55
|
+
}
|
|
56
|
+
|
|
15
57
|
return {
|
|
16
|
-
...commands,
|
|
58
|
+
...config.commands,
|
|
17
59
|
};
|
|
18
60
|
};
|
|
19
61
|
};
|