alepha 0.19.0 → 0.19.2
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/LICENSE +1 -1
- package/README.md +6 -9
- package/dist/api/audits/index.d.ts +378 -346
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +216 -184
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/files/index.js +5 -1
- package/dist/api/files/index.js.map +1 -1
- package/dist/api/jobs/index.d.ts +528 -496
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +3 -3
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +202 -202
- package/dist/api/keys/index.d.ts.map +1 -1
- package/dist/api/notifications/index.d.ts +152 -152
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/organizations/index.browser.js +48 -0
- package/dist/api/organizations/index.browser.js.map +1 -0
- package/dist/api/organizations/index.d.ts +516 -0
- package/dist/api/organizations/index.d.ts.map +1 -0
- package/dist/api/organizations/index.js +202 -0
- package/dist/api/organizations/index.js.map +1 -0
- package/dist/api/parameters/index.d.ts +391 -358
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/parameters/index.js +5 -1
- package/dist/api/parameters/index.js.map +1 -1
- package/dist/api/users/index.browser.js +7 -5
- package/dist/api/users/index.browser.js.map +1 -1
- package/dist/api/users/index.d.ts +989 -931
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +292 -146
- package/dist/api/users/index.js.map +1 -1
- package/dist/api/verifications/index.d.ts +132 -132
- package/dist/api/verifications/index.d.ts.map +1 -1
- package/dist/api/verifications/index.js +2 -2
- package/dist/api/verifications/index.js.map +1 -1
- package/dist/batch/index.d.ts +6 -6
- package/dist/batch/index.d.ts.map +1 -1
- package/dist/billing/index.d.ts +1048 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +713 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/bin/index.js +0 -2
- package/dist/bin/index.js.map +1 -1
- package/dist/bucket/index.d.ts +10 -10
- package/dist/bucket/index.d.ts.map +1 -1
- package/dist/bucket/index.js +2 -2
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/core/index.d.ts +9 -9
- package/dist/cache/core/index.d.ts.map +1 -1
- package/dist/cache/core/index.js +2 -2
- package/dist/cache/core/index.js.map +1 -1
- package/dist/cache/core/index.workerd.js +2 -2
- package/dist/cache/core/index.workerd.js.map +1 -1
- package/dist/cache/redis/index.d.ts +6 -6
- package/dist/cache/redis/index.d.ts.map +1 -1
- package/dist/cache/redis/index.js +2 -2
- package/dist/cache/redis/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +12 -2
- package/dist/cli/config/index.d.ts.map +1 -1
- package/dist/cli/config/index.js +4 -0
- package/dist/cli/config/index.js.map +1 -1
- package/dist/cli/core/index.d.ts +183 -139
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +283 -86
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/devtools/index.d.ts +45 -0
- package/dist/cli/devtools/index.d.ts.map +1 -0
- package/dist/cli/devtools/index.js +170 -0
- package/dist/cli/devtools/index.js.map +1 -0
- package/dist/cli/platform/index.d.ts +383 -492
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +42 -511
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/cli/vendor/index.d.ts +196 -0
- package/dist/cli/vendor/index.d.ts.map +1 -0
- package/dist/cli/vendor/index.js +384 -0
- package/dist/cli/vendor/index.js.map +1 -0
- package/dist/command/index.d.ts +18 -18
- package/dist/command/index.d.ts.map +1 -1
- package/dist/command/index.js +2 -2
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +4 -4
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +10 -10
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +4 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +4 -4
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +4 -4
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +7 -7
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/datetime/index.d.ts +4 -4
- package/dist/datetime/index.d.ts.map +1 -1
- package/dist/email/brevo/index.d.ts +4 -4
- package/dist/email/brevo/index.d.ts.map +1 -1
- package/dist/email/core/index.d.ts +15 -11
- package/dist/email/core/index.d.ts.map +1 -1
- package/dist/email/core/index.js +12 -35
- package/dist/email/core/index.js.map +1 -1
- package/dist/email/smtp/index.d.ts +12 -12
- package/dist/email/smtp/index.d.ts.map +1 -1
- package/dist/email/smtp/index.js +7 -4
- package/dist/email/smtp/index.js.map +1 -1
- package/dist/fake/index.d.ts +4 -8
- package/dist/fake/index.d.ts.map +1 -1
- package/dist/fake/index.js +55 -889
- package/dist/fake/index.js.map +1 -1
- package/dist/lock/core/index.d.ts +13 -13
- package/dist/lock/core/index.d.ts.map +1 -1
- package/dist/lock/core/index.js +2 -2
- package/dist/lock/core/index.js.map +1 -1
- package/dist/lock/redis/index.d.ts +4 -4
- package/dist/lock/redis/index.d.ts.map +1 -1
- package/dist/logger/index.d.ts +16 -15
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +5 -2
- package/dist/logger/index.js.map +1 -1
- package/dist/mcp/index.d.ts +11 -11
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +11 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +53 -16
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +95 -51
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +55 -14
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +17 -11
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +21 -15
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +19 -13
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/queue/core/index.d.ts +14 -14
- package/dist/queue/core/index.d.ts.map +1 -1
- package/dist/queue/core/index.js +2 -2
- package/dist/queue/core/index.js.map +1 -1
- package/dist/queue/core/index.workerd.js +2 -2
- package/dist/queue/core/index.workerd.js.map +1 -1
- package/dist/queue/redis/index.d.ts +4 -4
- package/dist/queue/redis/index.d.ts.map +1 -1
- package/dist/queue/redis/index.js +2 -2
- package/dist/queue/redis/index.js.map +1 -1
- package/dist/react/auth/index.d.ts +9 -9
- package/dist/react/auth/index.d.ts.map +1 -1
- package/dist/react/core/index.d.ts +6 -6
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +5 -4
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +4 -4
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/head/index.d.ts +4 -4
- package/dist/react/head/index.d.ts.map +1 -1
- package/dist/react/i18n/index.d.ts +9 -9
- package/dist/react/i18n/index.d.ts.map +1 -1
- package/dist/react/intro/index.d.ts +2 -2
- package/dist/react/intro/index.d.ts.map +1 -1
- package/dist/react/intro/index.js +3 -4
- package/dist/react/intro/index.js.map +1 -1
- package/dist/react/router/index.browser.js +4 -5
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +215 -215
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +6 -7
- package/dist/react/router/index.js.map +1 -1
- package/dist/react/testing/index.d.ts +2 -2
- package/dist/react/testing/index.d.ts.map +1 -1
- package/dist/react/testing/index.js +2 -4
- package/dist/react/testing/index.js.map +1 -1
- package/dist/redis/index.d.ts +19 -19
- package/dist/redis/index.d.ts.map +1 -1
- package/dist/retry/index.d.ts +4 -4
- package/dist/retry/index.d.ts.map +1 -1
- package/dist/scheduler/index.d.ts +13 -13
- package/dist/scheduler/index.d.ts.map +1 -1
- package/dist/scheduler/index.js +2 -2
- package/dist/scheduler/index.js.map +1 -1
- package/dist/scheduler/index.workerd.js +2 -2
- package/dist/scheduler/index.workerd.js.map +1 -1
- package/dist/security/index.browser.js +1 -1
- package/dist/security/index.browser.js.map +1 -1
- package/dist/security/index.d.ts +47 -47
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +9 -12
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +170 -169
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +16 -2
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -7
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/core/index.d.ts +76 -76
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +23 -17
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/cors/index.d.ts +13 -13
- package/dist/server/cors/index.d.ts.map +1 -1
- package/dist/server/cors/index.js +2 -2
- package/dist/server/cors/index.js.map +1 -1
- package/dist/server/etag/index.d.ts +9 -9
- package/dist/server/etag/index.d.ts.map +1 -1
- package/dist/server/health/index.d.ts +20 -20
- package/dist/server/health/index.d.ts.map +1 -1
- package/dist/server/links/index.browser.js +2 -2
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +66 -66
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +4 -4
- package/dist/server/links/index.js.map +1 -1
- package/dist/server/metrics/index.d.ts +7 -7
- package/dist/server/metrics/index.d.ts.map +1 -1
- package/dist/server/proxy/index.d.ts +5 -5
- package/dist/server/proxy/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.d.ts +12 -12
- package/dist/server/rate-limit/index.d.ts.map +1 -1
- package/dist/server/rate-limit/index.js +2 -2
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/static/index.d.ts +5 -5
- package/dist/server/static/index.d.ts.map +1 -1
- package/dist/server/swagger/index.d.ts +7 -7
- package/dist/server/swagger/index.d.ts.map +1 -1
- package/dist/server/swagger/index.js +2 -2
- package/dist/server/swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +11 -7
- package/dist/sms/index.d.ts.map +1 -1
- package/dist/sms/index.js +9 -15
- package/dist/sms/index.js.map +1 -1
- package/dist/system/index.d.ts +4 -4
- package/dist/system/index.d.ts.map +1 -1
- package/dist/topic/core/index.d.ts +6 -6
- package/dist/topic/core/index.d.ts.map +1 -1
- package/dist/topic/redis/index.d.ts +7 -7
- package/dist/topic/redis/index.d.ts.map +1 -1
- package/dist/topic/redis/index.js +2 -2
- package/dist/topic/redis/index.js.map +1 -1
- package/dist/websocket/index.d.ts +36 -36
- package/dist/websocket/index.d.ts.map +1 -1
- package/dist/websocket/index.js +2 -2
- package/dist/websocket/index.js.map +1 -1
- package/package.json +37 -32
- package/src/api/files/{controllers → __tests__}/FileController.spec.ts +189 -143
- package/src/api/files/{services → __tests__}/FileService.spec.ts +50 -30
- package/src/api/files/controllers/FileController.ts +6 -0
- package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
- package/src/api/jobs/providers/JobProvider.ts +3 -3
- package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
- package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
- package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
- package/src/api/organizations/entities/organizations.ts +20 -0
- package/src/api/organizations/index.browser.ts +10 -0
- package/src/api/organizations/index.ts +31 -0
- package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
- package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
- package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
- package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
- package/src/api/organizations/services/OrganizationService.ts +75 -0
- package/src/api/parameters/services/ParameterProvider.ts +6 -1
- package/src/api/users/__tests__/$realm.spec.ts +191 -0
- package/src/api/users/__tests__/RealmProvider.spec.ts +53 -0
- package/src/api/users/__tests__/SessionService.spec.ts +778 -0
- package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +24 -0
- package/src/api/users/controllers/RealmController.ts +5 -11
- package/src/api/users/entities/users.ts +9 -3
- package/src/api/users/index.ts +23 -3
- package/src/api/users/primitives/$realm.ts +23 -11
- package/src/api/users/providers/RealmProvider.ts +23 -3
- package/src/api/users/services/RegistrationService.ts +3 -2
- package/src/api/users/services/SessionService.ts +249 -8
- package/src/api/users/services/UserService.ts +1 -1
- package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
- package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
- package/src/billing/__tests__/BillingService.spec.ts +136 -0
- package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
- package/src/billing/controllers/AdminBillingController.ts +149 -0
- package/src/billing/controllers/BillingController.ts +108 -0
- package/src/billing/entities/paymentIntents.ts +34 -0
- package/src/billing/entities/paymentMethods.ts +24 -0
- package/src/billing/entities/refunds.ts +22 -0
- package/src/billing/errors/BillingError.ts +5 -0
- package/src/billing/index.ts +76 -0
- package/src/billing/providers/BillingProvider.ts +79 -0
- package/src/billing/providers/MemoryBillingProvider.ts +139 -0
- package/src/billing/schemas/intentSchemas.ts +60 -0
- package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
- package/src/billing/schemas/refundSchemas.ts +6 -0
- package/src/billing/services/BillingService.ts +325 -0
- package/src/billing/services/PaymentMethodService.ts +82 -0
- package/src/bin/index.ts +0 -2
- package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
- package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
- package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
- package/src/cache/core/primitives/$cache.ts +2 -2
- package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
- package/src/cli/config/defineConfig.ts +20 -0
- package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
- package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
- package/src/cli/core/{commands → __tests__}/init.spec.ts +4 -12
- package/src/cli/core/assets.ts +0 -1
- package/src/cli/core/atoms/devOptions.ts +0 -5
- package/src/cli/core/commands/build.ts +2 -2
- package/src/cli/core/commands/dev.ts +165 -30
- package/src/cli/core/commands/gen/changelog.ts +2 -2
- package/src/cli/core/commands/init.ts +2 -7
- package/src/cli/core/commands/verify.ts +0 -1
- package/src/cli/core/providers/AppEntryProvider.ts +2 -2
- package/src/cli/core/providers/ViteDevServerProvider.ts +53 -46
- package/src/cli/core/services/PackageManagerUtils.ts +8 -3
- package/src/cli/core/services/ProjectScaffolder.ts +20 -20
- package/src/cli/core/tasks/BuildClientTask.ts +8 -0
- package/src/cli/core/tasks/BuildServerTask.ts +17 -4
- package/src/cli/core/templates/alephaConfigTs.ts +0 -6
- package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
- package/src/cli/core/templates/webAppRouterTs.ts +85 -2
- package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
- package/src/cli/devtools/index.ts +194 -0
- package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
- package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
- package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
- package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
- package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
- package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
- package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
- package/src/cli/platform/atoms/platformOptions.ts +2 -10
- package/src/cli/platform/commands/SecretsCommand.ts +2 -2
- package/src/cli/platform/commands/platform.ts +2 -11
- package/src/cli/platform/index.ts +34 -11
- package/src/cli/platform/services/PlatformInspector.ts +2 -2
- package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
- package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
- package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
- package/src/cli/vendor/commands/VendorCommand.ts +204 -0
- package/src/cli/vendor/index.ts +43 -0
- package/src/cli/vendor/services/VendorService.ts +338 -0
- package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
- package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
- package/src/command/providers/CliProvider.ts +2 -2
- package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
- package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
- package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
- package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
- package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
- package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
- package/src/core/index.shared.ts +1 -1
- package/src/core/primitives/{$use.ts → $state.ts} +4 -4
- package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
- package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
- package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
- package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
- package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
- package/src/email/core/providers/LocalEmailProvider.ts +13 -51
- package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
- package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
- package/src/lock/core/primitives/$lock.ts +2 -2
- package/src/logger/index.ts +10 -4
- package/src/mcp/transports/SseMcpTransport.ts +2 -2
- package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
- package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
- package/src/orm/__tests__/organization-tests.ts +200 -0
- package/src/orm/__tests__/organization.spec.ts +103 -0
- package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
- package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
- package/src/orm/core/index.shared.ts +1 -0
- package/src/orm/core/primitives/$entity.ts +31 -0
- package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
- package/src/orm/core/services/ModelBuilder.ts +11 -0
- package/src/orm/core/services/QueryManager.ts +16 -2
- package/src/orm/core/services/Repository.ts +70 -10
- package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
- package/src/orm/postgres/services/PostgresModelBuilder.ts +9 -1
- package/src/queue/core/providers/WorkerProvider.ts +2 -2
- package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
- package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
- package/src/react/core/hooks/useAction.ts +7 -6
- package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
- package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
- package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
- package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
- package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +3 -6
- package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
- package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
- package/src/react/router/providers/ReactPageProvider.ts +2 -2
- package/src/react/router/providers/ReactServerProvider.ts +3 -3
- package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
- package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
- package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
- package/src/scheduler/primitives/$scheduler.ts +2 -2
- package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
- package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
- package/src/security/primitives/$issuer.ts +1 -1
- package/src/security/providers/JwtProvider.ts +6 -10
- package/src/security/providers/SecurityProvider.ts +6 -11
- package/src/security/schemas/userAccountInfoSchema.ts +3 -3
- package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
- package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
- package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
- package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
- package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
- package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
- package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
- package/src/server/core/primitives/$action.ts +2 -2
- package/src/server/core/primitives/$sse.ts +2 -2
- package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
- package/src/server/core/providers/ServerCompressProvider.ts +2 -2
- package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
- package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
- package/src/server/core/providers/ServerRouterProvider.ts +1 -5
- package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
- package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
- package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
- package/src/server/links/providers/LinkProvider.ts +2 -2
- package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
- package/src/server/links/providers/ServerLinksProvider.ts +2 -2
- package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
- package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
- package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
- package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
- package/src/sms/providers/LocalSmsProvider.ts +13 -24
- package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
- package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
- package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
- package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
- package/tsconfig.base.json +1 -0
- package/assets/devtools-ui/200.html +0 -10
- package/assets/devtools-ui/200.html.br +0 -0
- package/assets/devtools-ui/404.html +0 -10
- package/assets/devtools-ui/404.html.br +0 -0
- package/assets/devtools-ui/CNAME +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css +0 -1
- package/assets/devtools-ui/asset.CHpVij2M.css.br +0 -0
- package/assets/devtools-ui/asset.DJ-i0UDz.css +0 -1
- package/assets/devtools-ui/asset.DJ-i0UDz.css.br +0 -0
- package/assets/devtools-ui/chunk.1jwpJORo.js +0 -1
- package/assets/devtools-ui/chunk.1jwpJORo.js.br +0 -0
- package/assets/devtools-ui/chunk.B0r2wfUL.js +0 -1
- package/assets/devtools-ui/chunk.B0r2wfUL.js.br +0 -0
- package/assets/devtools-ui/chunk.BScN4dVR.js +0 -84
- package/assets/devtools-ui/chunk.BScN4dVR.js.br +0 -0
- package/assets/devtools-ui/chunk.BispuoY4.js +0 -1
- package/assets/devtools-ui/chunk.BispuoY4.js.br +0 -0
- package/assets/devtools-ui/chunk.BtrPUUd7.js +0 -2
- package/assets/devtools-ui/chunk.BtrPUUd7.js.br +0 -0
- package/assets/devtools-ui/chunk.C-KMHgqf.js +0 -1
- package/assets/devtools-ui/chunk.C-KMHgqf.js.br +0 -0
- package/assets/devtools-ui/chunk.C2zQ3CF6.js +0 -7
- package/assets/devtools-ui/chunk.C2zQ3CF6.js.br +0 -0
- package/assets/devtools-ui/chunk.C619McpO.js +0 -1
- package/assets/devtools-ui/chunk.C619McpO.js.br +0 -0
- package/assets/devtools-ui/chunk.C9OsYsVl.js +0 -1
- package/assets/devtools-ui/chunk.C9OsYsVl.js.br +0 -3
- package/assets/devtools-ui/chunk.CAC_-151.js +0 -1
- package/assets/devtools-ui/chunk.CAC_-151.js.br +0 -0
- package/assets/devtools-ui/chunk.CCmesWfx.js +0 -1
- package/assets/devtools-ui/chunk.CCmesWfx.js.br +0 -0
- package/assets/devtools-ui/chunk.CFQDmrcV.js +0 -1
- package/assets/devtools-ui/chunk.CFQDmrcV.js.br +0 -0
- package/assets/devtools-ui/chunk.CgM71Zau.js +0 -1
- package/assets/devtools-ui/chunk.CgM71Zau.js.br +0 -0
- package/assets/devtools-ui/chunk.CmHq336a.js +0 -1
- package/assets/devtools-ui/chunk.CmHq336a.js.br +0 -0
- package/assets/devtools-ui/chunk.CthNMCar.js +0 -1
- package/assets/devtools-ui/chunk.CthNMCar.js.br +0 -0
- package/assets/devtools-ui/chunk.D2brVJP1.js +0 -1
- package/assets/devtools-ui/chunk.D2brVJP1.js.br +0 -0
- package/assets/devtools-ui/chunk.DgBKGkiw.js +0 -1
- package/assets/devtools-ui/chunk.DgBKGkiw.js.br +0 -0
- package/assets/devtools-ui/chunk.NNHHCQsa.js +0 -1
- package/assets/devtools-ui/chunk.NNHHCQsa.js.br +0 -0
- package/assets/devtools-ui/chunk._CDKKWMo.js +0 -1
- package/assets/devtools-ui/chunk._CDKKWMo.js.br +0 -0
- package/assets/devtools-ui/entry.B_nOjAod.js +0 -2
- package/assets/devtools-ui/entry.B_nOjAod.js.br +0 -0
- package/assets/devtools-ui/index.html +0 -10
- package/assets/devtools-ui/index.html.br +0 -0
- package/dist/devtools/index.browser.js +0 -224
- package/dist/devtools/index.browser.js.map +0 -1
- package/dist/devtools/index.d.ts +0 -499
- package/dist/devtools/index.d.ts.map +0 -1
- package/dist/devtools/index.js +0 -782
- package/dist/devtools/index.js.map +0 -1
- package/dist/mqtt/index.d.ts +0 -164
- package/dist/mqtt/index.d.ts.map +0 -1
- package/dist/mqtt/index.js +0 -214
- package/dist/mqtt/index.js.map +0 -1
- package/dist/topic/mqtt/index.d.ts +0 -87
- package/dist/topic/mqtt/index.d.ts.map +0 -1
- package/dist/topic/mqtt/index.js +0 -88
- package/dist/topic/mqtt/index.js.map +0 -1
- package/src/api/users/parameters/UserParameters.ts +0 -23
- package/src/api/users/services/SessionService.spec.ts +0 -303
- package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
- package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
- package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
- package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
- package/src/cli/platform/services/DockerSshService.ts +0 -61
- package/src/devtools/__tests__/DevCollectorProvider.spec.ts +0 -7
- package/src/devtools/assets.ts +0 -6
- package/src/devtools/entities/logs.ts +0 -21
- package/src/devtools/index.browser.ts +0 -11
- package/src/devtools/index.shared.ts +0 -15
- package/src/devtools/index.ts +0 -39
- package/src/devtools/providers/DevToolsMetadataProvider.ts +0 -459
- package/src/devtools/providers/DevToolsProvider.ts +0 -280
- package/src/devtools/schemas/DevActionMetadata.ts +0 -30
- package/src/devtools/schemas/DevAtomMetadata.ts +0 -26
- package/src/devtools/schemas/DevBucketMetadata.ts +0 -11
- package/src/devtools/schemas/DevCacheMetadata.ts +0 -10
- package/src/devtools/schemas/DevEntityMetadata.ts +0 -60
- package/src/devtools/schemas/DevEnvMetadata.ts +0 -22
- package/src/devtools/schemas/DevMetadata.ts +0 -47
- package/src/devtools/schemas/DevModuleMetadata.ts +0 -8
- package/src/devtools/schemas/DevPageMetadata.ts +0 -24
- package/src/devtools/schemas/DevProviderMetadata.ts +0 -10
- package/src/devtools/schemas/DevQueueMetadata.ts +0 -10
- package/src/devtools/schemas/DevRealmMetadata.ts +0 -19
- package/src/devtools/schemas/DevRouteMetadata.ts +0 -8
- package/src/devtools/schemas/DevSchedulerMetadata.ts +0 -11
- package/src/devtools/schemas/DevTopicMetadata.ts +0 -11
- package/src/mqtt/index.ts +0 -32
- package/src/mqtt/providers/MqttClientProvider.ts +0 -63
- package/src/mqtt/providers/MqttJsClientProvider.spec.ts +0 -165
- package/src/mqtt/providers/MqttJsClientProvider.ts +0 -309
- package/src/topic/mqtt/index.ts +0 -30
- package/src/topic/mqtt/providers/MqttTopicProvider.spec.ts +0 -160
- package/src/topic/mqtt/providers/MqttTopicProvider.ts +0 -146
- /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
- /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
- /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
- /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
- /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
- /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
- /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
- /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
- /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
- /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
- /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
- /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
- /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
- /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
- /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
- /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
- /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
- /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
- /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
- /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
- /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
- /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
- /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
- /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
- /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
- /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
- /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
- /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
- /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
- /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
- /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
- /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
- /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
- /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
- /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
- /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
- /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
- /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
- /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
- /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
- /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
- /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
- /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
- /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
- /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
- /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
- /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
- /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
- /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
- /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
- /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
- /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
- /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
- /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
- /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
- /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
- /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
- /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
- /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
- /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
- /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
- /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
- /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
- /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
- /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
- /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { AsyncFn, Middleware, Primitive, Static } from "alepha";
|
|
3
|
-
import * as alepha_topic0 from "alepha/topic";
|
|
3
|
+
import * as _$alepha_topic0 from "alepha/topic";
|
|
4
4
|
import { TopicProvider } from "alepha/topic";
|
|
5
5
|
import { DateTime, DateTimeProvider, DurationLike, Timeout } from "alepha/datetime";
|
|
6
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
7
|
-
import * as dayjs_plugin_duration_js0 from "dayjs/plugin/duration.js";
|
|
6
|
+
import * as _$alepha_logger0 from "alepha/logger";
|
|
7
|
+
import * as _$dayjs_plugin_duration_js0 from "dayjs/plugin/duration.js";
|
|
8
8
|
|
|
9
9
|
//#region ../../src/lock/core/providers/LockProvider.d.ts
|
|
10
10
|
/**
|
|
@@ -271,8 +271,8 @@ interface LockPrimitiveOptions<TFunc extends AsyncFn> {
|
|
|
271
271
|
/**
|
|
272
272
|
* Lock configuration atom.
|
|
273
273
|
*/
|
|
274
|
-
declare const lockOptions: alepha.Atom<alepha.TObject<{
|
|
275
|
-
prefixKey: alepha.TString;
|
|
274
|
+
declare const lockOptions: _$alepha.Atom<_$alepha.TObject<{
|
|
275
|
+
prefixKey: _$alepha.TString;
|
|
276
276
|
}>, "alepha.lock.options">;
|
|
277
277
|
type LockAtomOptions = Static<typeof lockOptions.schema>;
|
|
278
278
|
declare module "alepha" {
|
|
@@ -281,7 +281,7 @@ declare module "alepha" {
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimitiveOptions<TFunc>> {
|
|
284
|
-
protected readonly log: alepha_logger0.Logger;
|
|
284
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
285
285
|
protected readonly provider: LockProvider;
|
|
286
286
|
protected readonly settings: Readonly<{
|
|
287
287
|
prefixKey: string;
|
|
@@ -293,10 +293,10 @@ declare class LockPrimitive<TFunc extends AsyncFn> extends Primitive<LockPrimiti
|
|
|
293
293
|
*/
|
|
294
294
|
protected _id?: string;
|
|
295
295
|
protected get id(): string;
|
|
296
|
-
readonly maxDuration: dayjs_plugin_duration_js0.Duration;
|
|
297
|
-
protected readonly topicLockEnd: alepha_topic0.TopicPrimitive<{
|
|
298
|
-
payload: alepha.TObject<{
|
|
299
|
-
name: alepha.TString;
|
|
296
|
+
readonly maxDuration: _$dayjs_plugin_duration_js0.Duration;
|
|
297
|
+
protected readonly topicLockEnd: _$alepha_topic0.TopicPrimitive<{
|
|
298
|
+
payload: _$alepha.TObject<{
|
|
299
|
+
name: _$alepha.TString;
|
|
300
300
|
}>;
|
|
301
301
|
}>;
|
|
302
302
|
run(...args: Parameters<TFunc>): Promise<void>;
|
|
@@ -325,7 +325,7 @@ declare abstract class LockTopicProvider extends TopicProvider {}
|
|
|
325
325
|
*/
|
|
326
326
|
declare class MemoryLockProvider implements LockProvider {
|
|
327
327
|
protected readonly dateTimeProvider: DateTimeProvider;
|
|
328
|
-
protected readonly log: alepha_logger0.Logger;
|
|
328
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
329
329
|
/**
|
|
330
330
|
* The in-memory store.
|
|
331
331
|
*/
|
|
@@ -352,7 +352,7 @@ declare class MemoryLockProvider implements LockProvider {
|
|
|
352
352
|
*
|
|
353
353
|
* @module alepha.lock
|
|
354
354
|
*/
|
|
355
|
-
declare const AlephaLock: alepha.Service<alepha.Module>;
|
|
355
|
+
declare const AlephaLock: _$alepha.Service<_$alepha.Module>;
|
|
356
356
|
//#endregion
|
|
357
357
|
export { $lock, AlephaLock, LockAtomOptions, LockMiddlewareOptions, LockPrimitive, LockPrimitiveOptions, LockProvider, LockResult, LockTopicProvider, MemoryLockProvider, lockOptions };
|
|
358
358
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":";;;;;;;;;;;;uBAGsB,YAAA;;;;;;AAAtB;;;WASkB,GAAA,CACd,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EALa;;;;;EAAA,SAYA,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;;;;AArB1C;;;;;;;cCkCa,KAAA,GAAS,OAAA,EAAS,qBAAA,KAAwB,UAAA;;;;UAyFtC,qBAAA;EDtGyB;;;;EC2GxC,IAAA,gBAAoB,IAAA;;AA9FtB;;;;EAqGE,IAAA;EArGoB;;;;AAyFtB;EAmBE,WAAA,GAAc,YAAA;AAAA;AAAA,UAKC,oBAAA,eAAmC,OAAA;EAnBlD;;;;;;;AAmBF;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCE,OAAA,EAAS,KAAA;EA2KiB;;;;;AAS5B;;;;;;;;;;;;;;AAaA;;;;;;;;;AAAgE;;;;;;;;EA3J9D,IAAA;EA+JoC;;;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAzHE,IAAA,iBAAqB,IAAA,EAAM,UAAA,CAAW,KAAA;EA8HnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAtFnB,WAAA,GAAc,YAAA;EAkNS;;;;;;;AA+BzB;;;;;;;;;;;;;;;ACliBA;;;;;;;;ACMA;;;;;;;;;;;;;;;;EF2VE,WAAA,QACS,IAAA,EAAM,UAAA,CAAW,KAAA,MAAW,YAAA,gBACjC,YAAA;AAAA;;;;cAQO,WAAA,EAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/index.ts"],"mappings":"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"}
|
package/dist/lock/core/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $atom, $context, $inject, $module, $
|
|
1
|
+
import { $atom, $context, $inject, $module, $state, AlephaError, Primitive, createMiddleware, t } from "alepha";
|
|
2
2
|
import { $topic, MemoryTopicProvider, TopicProvider } from "alepha/topic";
|
|
3
3
|
import { DateTimeProvider } from "alepha/datetime";
|
|
4
4
|
import { $logger } from "alepha/logger";
|
|
@@ -122,7 +122,7 @@ const lockOptions = $atom({
|
|
|
122
122
|
var LockPrimitive = class extends Primitive {
|
|
123
123
|
log = $logger();
|
|
124
124
|
provider = $inject(LockProvider);
|
|
125
|
-
settings = $
|
|
125
|
+
settings = $state(lockOptions);
|
|
126
126
|
dateTimeProvider = $inject(DateTimeProvider);
|
|
127
127
|
/**
|
|
128
128
|
* Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/errors/LockAcquireError.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n protected ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class LockAcquireError extends AlephaError {\n constructor(name: string) {\n super(`$lock: could not acquire lock '${name}'`);\n }\n}\n","import {\n $atom,\n $context,\n $inject,\n $use,\n AlephaError,\n type AsyncFn,\n createMiddleware,\n type Middleware,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\nimport { LockAcquireError } from \"../errors/LockAcquireError.ts\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Distributed lock middleware for `use` arrays in `$action`, `$job`, `$page`, `$pipeline`.\n *\n * Acquires a distributed lock before the handler runs and releases it after completion.\n * Throws `LockAcquireError` if the lock cannot be acquired (unless `wait: true`).\n *\n * ```ts\n * processOrder = $action({\n * use: [$lock({ name: \"process-order\" })],\n * handler: async ({ body }) => { ... },\n * });\n * ```\n */\nexport const $lock = (options: LockMiddlewareOptions): Middleware => {\n const { alepha } = $context();\n const lockProvider = alepha.inject(LockProvider);\n const dateTimeProvider = alepha.inject(DateTimeProvider);\n\n return createMiddleware({\n name: \"$lock\",\n options: options as unknown as Record<string, unknown>,\n handler: ({ next }) => {\n const id = crypto.randomUUID();\n const maxDurationMs = dateTimeProvider\n .duration(options.maxDuration ?? [5, \"minutes\"])\n .asMilliseconds();\n\n return async (...args: any[]) => {\n const name =\n typeof options.name === \"function\"\n ? options.name(...args)\n : options.name;\n if (!name) {\n throw new AlephaError(\n \"$lock middleware requires a name option (no class context available)\",\n );\n }\n\n const value = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n\n const [lockId, _createdAtStr, endedAtStr] = value.split(\",\");\n\n // Lock already ended (grace period active)\n if (endedAtStr) {\n throw new LockAcquireError(name);\n }\n\n // Lock held by someone else\n if (lockId !== id) {\n if (options.wait) {\n // Poll until lock is released\n const start = dateTimeProvider.nowMillis();\n while (dateTimeProvider.nowMillis() - start < maxDurationMs) {\n await dateTimeProvider.wait(500);\n const current = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [currentId] = current.split(\",\");\n if (currentId === id) {\n break;\n }\n }\n // Check if we got the lock\n const final = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [finalId] = final.split(\",\");\n if (finalId !== id) {\n throw new LockAcquireError(name);\n }\n } else {\n throw new LockAcquireError(name);\n }\n }\n\n // We hold the lock — execute handler\n try {\n return await next(...args);\n } finally {\n await lockProvider.del(name);\n }\n };\n },\n });\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Options for $lock in middleware mode (no handler).\n */\nexport interface LockMiddlewareOptions {\n /**\n * Lock key name. Required in middleware mode (no class context available).\n * Can be a static string or a function that derives the key from handler args.\n */\n name: string | ((...args: any[]) => string);\n\n /**\n * Whether to wait for the lock to become available.\n *\n * @default false\n */\n wait?: boolean;\n\n /**\n * Maximum duration the lock can be held before automatic expiration.\n *\n * @default [5, \"minutes\"]\n */\n maxDuration?: DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Lock configuration atom.\n */\nexport const lockOptions = $atom({\n name: \"alepha.lock.options\",\n schema: t.object({\n prefixKey: t.text({\n default: \"\",\n description: \"Prefix for all lock keys.\",\n }),\n }),\n default: {\n prefixKey: \"\",\n },\n});\n\nexport type LockAtomOptions = Static<typeof lockOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [lockOptions.key]: LockAtomOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly settings = $use(lockOptions);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n /**\n * Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.\n * Cloudflare Workers doesn't allow random value generation during initialization.\n */\n protected _id?: string;\n protected get id(): string {\n if (!this._id) {\n this._id = crypto.randomUUID();\n }\n return this._id;\n }\n\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.settings.prefixKey}lock:end`,\n provider: LockTopicProvider,\n schema: {\n payload: t.object({\n name: t.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n // Poll until the lock is released, then re-attempt\n const start = this.dateTimeProvider.nowMillis();\n const maxMs = this.maxDuration.as(\"milliseconds\");\n let acquired = false;\n while (this.dateTimeProvider.nowMillis() - start < maxMs) {\n await this.dateTimeProvider.wait(500);\n const current = await this.lock(key);\n if (current.id === this.id || !current.id || current.endedAt) {\n acquired = true;\n break;\n }\n }\n if (acquired) {\n return this.run(...args);\n }\n this.log.warn(`Lock wait timeout for '${key}', giving up`);\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.settings.prefixKey}${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n services: [LockProvider, MemoryLockProvider, LockTopicProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/lock/core/providers/LockProvider.ts","../../../src/lock/core/providers/LockTopicProvider.ts","../../../src/lock/core/providers/MemoryLockProvider.ts","../../../src/lock/core/errors/LockAcquireError.ts","../../../src/lock/core/primitives/$lock.ts","../../../src/lock/core/index.ts"],"sourcesContent":["/**\n * Store Provider Interface\n */\nexport abstract class LockProvider {\n /**\n * Set the string value of a key.\n *\n * @param key The key of the value to set.\n * @param value The value to set.\n * @param nx If set to true, the key will only be set if it does not already exist.\n * @param px Set the specified expire time, in milliseconds.\n */\n public abstract set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string>;\n\n /**\n * Remove the specified keys.\n *\n * @param keys The keys to delete.\n */\n public abstract del(...keys: string[]): Promise<void>;\n}\n","import { TopicProvider } from \"alepha/topic\";\n\nexport abstract class LockTopicProvider extends TopicProvider {}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Timeout } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport type { LockProvider } from \"./LockProvider.ts\";\n\n/**\n * A simple in-memory store provider.\n */\nexport class MemoryLockProvider implements LockProvider {\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n protected readonly log = $logger();\n\n /**\n * The in-memory store.\n */\n protected store: Record<string, string> = {};\n\n /**\n * Timeouts used to expire keys.\n */\n protected storeTimeout: Record<string, Timeout> = {};\n\n public async set(\n key: string,\n value: string,\n nx?: boolean,\n px?: number,\n ): Promise<string> {\n if (nx && this.store[key] != null) {\n return this.store[key];\n }\n\n if (px) {\n this.ttl(key, px);\n }\n\n this.store[key] = value;\n\n return this.store[key];\n }\n\n public async del(...keys: string[]): Promise<void> {\n for (const key of keys) {\n delete this.store[key];\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n }\n }\n\n protected ttl(key: string, ms: number): void {\n if (this.storeTimeout[key] != null) {\n this.storeTimeout[key].clear();\n delete this.storeTimeout[key];\n }\n\n this.storeTimeout[key] = this.dateTimeProvider.createTimeout(() => {\n delete this.store[key];\n delete this.storeTimeout[key];\n }, ms);\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class LockAcquireError extends AlephaError {\n constructor(name: string) {\n super(`$lock: could not acquire lock '${name}'`);\n }\n}\n","import {\n $atom,\n $context,\n $inject,\n $state,\n AlephaError,\n type AsyncFn,\n createMiddleware,\n type Middleware,\n Primitive,\n type Static,\n t,\n} from \"alepha\";\nimport {\n type DateTime,\n DateTimeProvider,\n type DurationLike,\n} from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { $topic } from \"alepha/topic\";\nimport { LockAcquireError } from \"../errors/LockAcquireError.ts\";\nimport { LockProvider } from \"../providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"../providers/LockTopicProvider.ts\";\n\n/**\n * Distributed lock middleware for `use` arrays in `$action`, `$job`, `$page`, `$pipeline`.\n *\n * Acquires a distributed lock before the handler runs and releases it after completion.\n * Throws `LockAcquireError` if the lock cannot be acquired (unless `wait: true`).\n *\n * ```ts\n * processOrder = $action({\n * use: [$lock({ name: \"process-order\" })],\n * handler: async ({ body }) => { ... },\n * });\n * ```\n */\nexport const $lock = (options: LockMiddlewareOptions): Middleware => {\n const { alepha } = $context();\n const lockProvider = alepha.inject(LockProvider);\n const dateTimeProvider = alepha.inject(DateTimeProvider);\n\n return createMiddleware({\n name: \"$lock\",\n options: options as unknown as Record<string, unknown>,\n handler: ({ next }) => {\n const id = crypto.randomUUID();\n const maxDurationMs = dateTimeProvider\n .duration(options.maxDuration ?? [5, \"minutes\"])\n .asMilliseconds();\n\n return async (...args: any[]) => {\n const name =\n typeof options.name === \"function\"\n ? options.name(...args)\n : options.name;\n if (!name) {\n throw new AlephaError(\n \"$lock middleware requires a name option (no class context available)\",\n );\n }\n\n const value = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n\n const [lockId, _createdAtStr, endedAtStr] = value.split(\",\");\n\n // Lock already ended (grace period active)\n if (endedAtStr) {\n throw new LockAcquireError(name);\n }\n\n // Lock held by someone else\n if (lockId !== id) {\n if (options.wait) {\n // Poll until lock is released\n const start = dateTimeProvider.nowMillis();\n while (dateTimeProvider.nowMillis() - start < maxDurationMs) {\n await dateTimeProvider.wait(500);\n const current = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [currentId] = current.split(\",\");\n if (currentId === id) {\n break;\n }\n }\n // Check if we got the lock\n const final = await lockProvider.set(\n name,\n `${id},${dateTimeProvider.nowISOString()}`,\n true,\n maxDurationMs,\n );\n const [finalId] = final.split(\",\");\n if (finalId !== id) {\n throw new LockAcquireError(name);\n }\n } else {\n throw new LockAcquireError(name);\n }\n }\n\n // We hold the lock — execute handler\n try {\n return await next(...args);\n } finally {\n await lockProvider.del(name);\n }\n };\n },\n });\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Options for $lock in middleware mode (no handler).\n */\nexport interface LockMiddlewareOptions {\n /**\n * Lock key name. Required in middleware mode (no class context available).\n * Can be a static string or a function that derives the key from handler args.\n */\n name: string | ((...args: any[]) => string);\n\n /**\n * Whether to wait for the lock to become available.\n *\n * @default false\n */\n wait?: boolean;\n\n /**\n * Maximum duration the lock can be held before automatic expiration.\n *\n * @default [5, \"minutes\"]\n */\n maxDuration?: DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface LockPrimitiveOptions<TFunc extends AsyncFn> {\n /**\n * The function to execute when the lock is successfully acquired.\n *\n * This function:\n * - Only executes on the instance that successfully acquires the lock\n * - Has exclusive access to the protected resource during execution\n * - Should contain the critical section logic that must not run concurrently\n * - Can be async and perform any operations needed\n * - Will automatically release the lock upon completion or error\n * - Has access to the full Alepha dependency injection container\n *\n * **Handler Design Guidelines**:\n * - Keep critical sections as short as possible to minimize lock contention\n * - Include proper error handling to ensure locks are released\n * - Use timeouts for external operations to prevent deadlocks\n * - Log important operations for debugging and monitoring\n * - Consider idempotency for handlers that might be retried\n *\n * @param ...args - The arguments passed to the lock execution\n * @returns Promise that resolves when the protected operation is complete\n *\n * @example\n * ```ts\n * handler: async (batchId: string) => {\n * console.log(`Processing batch ${batchId} - only one instance will run this`);\n *\n * const batch = await this.getBatchData(batchId);\n * const results = await this.processBatchItems(batch.items);\n * await this.saveBatchResults(batchId, results);\n *\n * console.log(`Batch ${batchId} completed successfully`);\n * }\n * ```\n */\n handler: TFunc;\n\n /**\n * Whether the lock should wait for other instances to complete before giving up.\n *\n * **wait = false (default)**:\n * - Non-blocking behavior - if lock is held, immediately return without executing\n * - Perfect for scheduled tasks where you only want one execution per trigger\n * - Use when multiple triggers are acceptable but concurrent execution is not\n * - Examples: periodic cleanup, cron jobs, background maintenance\n *\n * **wait = true**:\n * - Blocking behavior - wait for the current lock holder to finish\n * - All instances will eventually execute (one after another)\n * - Perfect for initialization tasks where all instances need the work completed\n * - Examples: database migrations, cache warming, resource initialization\n *\n * **Trade-offs**:\n * - Non-waiting: Better performance, may miss executions if timing is off\n * - Waiting: Guaranteed execution order, slower overall throughput\n *\n * @default false\n *\n * @example\n * ```ts\n * // Scheduled task - don't wait, just skip if already running\n * scheduledCleanup = $lock({\n * wait: false, // Skip if cleanup already running\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Migration - wait for completion before proceeding\n * migration = $lock({\n * wait: true, // All instances wait for migration to complete\n * handler: async () => { } // perform migration\n * });\n * ```\n */\n wait?: boolean;\n\n /**\n * The unique identifier for the lock.\n *\n * Can be either:\n * - **Static string**: A fixed identifier for the lock\n * - **Dynamic function**: A function that generates the lock key based on arguments\n *\n * **Dynamic Lock Keys**:\n * - Enable per-resource locking (e.g., per-user, per-file, per-product)\n * - Allow fine-grained concurrency control\n * - Prevent unnecessary blocking between unrelated operations\n *\n * **Key Design Guidelines**:\n * - Use descriptive names that indicate the protected resource\n * - Include relevant identifiers for dynamic keys\n * - Keep keys reasonably short but unique\n * - Consider using hierarchical naming (e.g., \"service:operation:resource\")\n *\n * If not provided, defaults to `{serviceName}:{propertyKey}`.\n *\n * @example \"user-migration\"\n * @example \"daily-report-generation\"\n * @example (userId: string) => `user-profile-update:${userId}`\n * @example (fileId: string, operation: string) => `file-${operation}:${fileId}`\n *\n * @example\n * ```ts\n * // Static lock key - all instances compete for the same lock\n * globalCleanup = $lock({\n * name: \"system-cleanup\",\n * handler: async () => { } // perform cleanup\n * });\n *\n * // Dynamic lock key - per-user locks, users don't block each other\n * updateUserProfile = $lock({\n * name: (userId: string) => `user-update:${userId}`,\n * handler: async (userId: string, data: UserData) => {\n * // Only one update per user at a time, but different users can update concurrently\n * }\n * });\n * ```\n */\n name?: string | ((...args: Parameters<TFunc>) => string);\n\n /**\n * Maximum duration the lock can be held before it expires automatically.\n *\n * This prevents deadlocks when a process dies while holding a lock or when\n * operations take longer than expected. The lock will be automatically released\n * after this duration, allowing other instances to proceed.\n *\n * **Duration Guidelines**:\n * - Set based on expected operation duration plus safety margin\n * - Too short: Operations may be interrupted by early expiration\n * - Too long: Failed processes block others for extended periods\n * - Consider worst-case scenarios and external dependency timeouts\n *\n * **Typical Values**:\n * - Quick operations: 30 seconds - 2 minutes\n * - Database operations: 5 - 15 minutes\n * - File processing: 10 - 30 minutes\n * - Large migrations: 30 minutes - 2 hours\n *\n * @default [5, \"minutes\"]\n *\n * @example [30, \"seconds\"] // Quick operations\n * @example [10, \"minutes\"] // Database migrations\n * @example [1, \"hour\"] // Long-running batch jobs\n *\n * @example\n * ```ts\n * quickTask = $lock({\n * maxDuration: [2, \"minutes\"], // Quick timeout for fast operations\n * handler: async () => { } // perform quick task\n * });\n *\n * heavyProcessing = $lock({\n * maxDuration: [30, \"minutes\"], // Longer timeout for heavy work\n * handler: async () => { } // perform heavy processing\n * });\n * ```\n */\n maxDuration?: DurationLike;\n\n /**\n * Additional time to keep the lock active after the handler completes successfully.\n *\n * This provides a \"cooling off\" period that can be useful for:\n * - Preventing immediate re-execution of the same operation\n * - Giving time for related systems to process the results\n * - Avoiding race conditions with dependent operations\n * - Providing a buffer for cleanup operations\n *\n * Can be either:\n * - **Static duration**: Fixed grace period for all executions\n * - **Dynamic function**: Grace period determined by execution arguments\n * - **undefined**: No grace period, lock released immediately after completion\n *\n * **Grace Period Use Cases**:\n * - File processing: Prevent immediate reprocessing of uploaded files\n * - Cache updates: Allow time for cache propagation\n * - Batch operations: Prevent overlapping batch processing\n * - External API calls: Respect rate limiting requirements\n *\n * @default undefined (no grace period)\n *\n * @example [5, \"minutes\"] // Fixed 5-minute grace period\n * @example [30, \"seconds\"] // Short grace for quick operations\n * @example (userId: string) => userId.startsWith(\"premium\") ? [10, \"minutes\"] : [2, \"minutes\"]\n *\n * @example\n * ```ts\n * fileProcessor = $lock({\n * gracePeriod: [10, \"minutes\"], // Prevent reprocessing same file immediately\n * handler: async (filePath: string) => {\n * await this.processFile(filePath);\n * }\n * });\n *\n * userOperation = $lock({\n * gracePeriod: (userId: string, operation: string) => {\n * // Dynamic grace based on operation type\n * return operation === 'migration' ? [30, \"minutes\"] : [5, \"minutes\"];\n * },\n * handler: async (userId: string, operation: string) => {\n * await this.performUserOperation(userId, operation);\n * }\n * });\n * ```\n */\n gracePeriod?:\n | ((...args: Parameters<TFunc>) => DurationLike | undefined)\n | DurationLike;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Lock configuration atom.\n */\nexport const lockOptions = $atom({\n name: \"alepha.lock.options\",\n schema: t.object({\n prefixKey: t.text({\n default: \"\",\n description: \"Prefix for all lock keys.\",\n }),\n }),\n default: {\n prefixKey: \"\",\n },\n});\n\nexport type LockAtomOptions = Static<typeof lockOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [lockOptions.key]: LockAtomOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class LockPrimitive<TFunc extends AsyncFn> extends Primitive<\n LockPrimitiveOptions<TFunc>\n> {\n protected readonly log = $logger();\n protected readonly provider = $inject(LockProvider);\n protected readonly settings = $state(lockOptions);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n /**\n * Lazy-initialized UUID to avoid calling crypto.randomUUID() in global scope.\n * Cloudflare Workers doesn't allow random value generation during initialization.\n */\n protected _id?: string;\n protected get id(): string {\n if (!this._id) {\n this._id = crypto.randomUUID();\n }\n return this._id;\n }\n\n public readonly maxDuration = this.dateTimeProvider.duration(\n this.options.maxDuration ?? [5, \"minutes\"],\n );\n\n protected readonly topicLockEnd = $topic({\n name: `${this.settings.prefixKey}lock:end`,\n provider: LockTopicProvider,\n schema: {\n payload: t.object({\n name: t.text(),\n }),\n },\n });\n\n public async run(...args: Parameters<TFunc>): Promise<void> {\n const key = this.key(...args);\n const handler = this.options.handler;\n\n const lock = await this.lock(key);\n if (lock.endedAt) {\n return;\n }\n\n if (lock.id !== this.id) {\n if (this.options.wait) {\n // Poll until the lock is released, then re-attempt\n const start = this.dateTimeProvider.nowMillis();\n const maxMs = this.maxDuration.as(\"milliseconds\");\n let acquired = false;\n while (this.dateTimeProvider.nowMillis() - start < maxMs) {\n await this.dateTimeProvider.wait(500);\n const current = await this.lock(key);\n if (current.id === this.id || !current.id || current.endedAt) {\n acquired = true;\n break;\n }\n }\n if (acquired) {\n return this.run(...args);\n }\n this.log.warn(`Lock wait timeout for '${key}', giving up`);\n }\n\n return;\n }\n\n this.log.debug(`Lock '${key}' ...`);\n\n try {\n await handler(...args);\n } finally {\n await this.topicLockEnd.publish({\n name: key,\n });\n\n await this.setGracePeriod(key, lock, ...args);\n\n this.log.debug(`Lock '${key}' OK`);\n }\n }\n\n /**\n * Set the lock for the given key.\n */\n protected async lock(key: string): Promise<LockResult> {\n const value = await this.provider.set(\n key,\n `${this.id},${this.dateTimeProvider.nowISOString()}`,\n true,\n this.maxDuration.as(\"milliseconds\"),\n );\n\n return this.parse(value);\n }\n\n protected async setGracePeriod(\n key: string,\n lock: LockResult,\n ...args: Parameters<TFunc>\n ): Promise<void> {\n const gracePeriod = this.options.gracePeriod\n ? this.dateTimeProvider.isDurationLike(this.options.gracePeriod)\n ? this.options.gracePeriod\n : this.options.gracePeriod(...args)\n : undefined;\n\n if (gracePeriod) {\n await this.provider.set(\n key,\n `${this.id},${lock.createdAt.toISOString()},${this.dateTimeProvider.nowISOString()}`,\n false,\n this.dateTimeProvider.duration(gracePeriod).as(\"milliseconds\"),\n );\n } else {\n await this.provider.del(key);\n }\n }\n\n protected async wait(key: string, maxDuration: DurationLike): Promise<void> {\n this.log.debug(`Wait for lock '${key}' ...`);\n\n await this.topicLockEnd.wait({\n filter: (message) => message.payload.name === key,\n timeout: maxDuration,\n });\n\n this.log.debug(`Wait for lock '${key}' OK`);\n }\n\n protected key(...args: Parameters<TFunc>) {\n let base = \"\";\n\n if (this.options.name) {\n if (typeof this.options.name === \"string\") {\n base = this.options.name;\n } else {\n base = this.options.name(...args);\n }\n } else {\n base = `${this.config.service.name}:${this.config.propertyKey}`;\n }\n\n return `${this.settings.prefixKey}${base}`;\n }\n\n protected parse(value: string): LockResult {\n const [id, createdAtStr, endedAtStr] = value.split(\",\");\n const createdAt = this.dateTimeProvider.of(createdAtStr);\n const endedAt = endedAtStr\n ? this.dateTimeProvider.of(endedAtStr)\n : undefined;\n\n return {\n id,\n createdAt,\n endedAt,\n };\n }\n}\n\nexport interface LockResult {\n id: string;\n createdAt: DateTime;\n endedAt?: DateTime;\n response?: string;\n}\n","import { $module } from \"alepha\";\nimport { MemoryTopicProvider } from \"alepha/topic\";\nimport { LockProvider } from \"./providers/LockProvider.ts\";\nimport { LockTopicProvider } from \"./providers/LockTopicProvider.ts\";\nimport { MemoryLockProvider } from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$lock.ts\";\nexport * from \"./providers/LockProvider.ts\";\nexport * from \"./providers/LockTopicProvider.ts\";\nexport * from \"./providers/MemoryLockProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Resource locking for distributed systems.\n *\n * **Features:**\n * - Distributed locks with timeout\n * - Time-based lock expiration\n * - Automatic release on scope exit\n * - Distributed coordination via Redis\n * - Providers: Memory (dev), Redis (production)\n *\n * @module alepha.lock\n */\nexport const AlephaLock = $module({\n name: \"alepha.lock\",\n services: [LockProvider, MemoryLockProvider, LockTopicProvider],\n register: (alepha) =>\n alepha\n .with({\n optional: true,\n provide: LockTopicProvider,\n use: MemoryTopicProvider,\n })\n .with({\n optional: true,\n provide: LockProvider,\n use: MemoryLockProvider,\n }),\n});\n"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { LockProvider } from "alepha/lock";
|
|
3
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
3
|
+
import * as _$alepha_logger0 from "alepha/logger";
|
|
4
4
|
import { RedisProvider } from "alepha/redis";
|
|
5
5
|
|
|
6
6
|
//#region ../../src/lock/redis/providers/RedisLockProvider.d.ts
|
|
7
7
|
declare class RedisLockProvider implements LockProvider {
|
|
8
|
-
protected readonly log: alepha_logger0.Logger;
|
|
8
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
9
9
|
protected readonly redisProvider: RedisProvider;
|
|
10
10
|
set(key: string, value: string, nx?: boolean, px?: number): Promise<string>;
|
|
11
11
|
del(...keys: string[]): Promise<void>;
|
|
@@ -18,7 +18,7 @@ declare class RedisLockProvider implements LockProvider {
|
|
|
18
18
|
* @see {@link RedisLockProvider}
|
|
19
19
|
* @module alepha.lock.redis
|
|
20
20
|
*/
|
|
21
|
-
declare const AlephaLockRedis: alepha.Service<alepha.Module>;
|
|
21
|
+
declare const AlephaLockRedis: _$alepha.Service<_$alepha.Module>;
|
|
22
22
|
//#endregion
|
|
23
23
|
export { AlephaLockRedis, RedisLockProvider };
|
|
24
24
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"mappings":";;;;;;cAKa,iBAAA,YAA6B,YAAA;EAAA,mBACrB,GAAA,EADU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/lock/redis/providers/RedisLockProvider.ts","../../../src/lock/redis/index.ts"],"mappings":";;;;;;cAKa,iBAAA,YAA6B,YAAA;EAAA,mBACrB,GAAA,EADU,gBAAA,CACP,MAAA;EAAA,mBACH,aAAA,EAAa,aAAA;EAEnB,GAAA,CACX,GAAA,UACA,KAAA,UACA,EAAA,YACA,EAAA,YACC,OAAA;EAqBU,GAAA,CAAA,GAAO,IAAA,aAAiB,OAAA;AAAA;;;;;;;;AA9BvC;cCYa,eAAA,EAAe,QAAA,CAAA,OAAA,CAgB1B,QAAA,CAhB0B,MAAA"}
|
package/dist/logger/index.d.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { Alepha, KIND, LogLevel, LoggerInterface, Static } from "alepha";
|
|
3
3
|
import { DateTimeProvider } from "alepha/datetime";
|
|
4
4
|
|
|
5
5
|
//#region ../../src/logger/schemas/logEntrySchema.d.ts
|
|
6
|
-
declare const logEntrySchema: alepha.TObject<{
|
|
7
|
-
level: alepha.TUnsafe<"SILENT" | "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR">;
|
|
8
|
-
message: alepha.TString;
|
|
9
|
-
service: alepha.TString;
|
|
10
|
-
module: alepha.TString;
|
|
11
|
-
context: alepha.TOptional<alepha.TString>;
|
|
12
|
-
app: alepha.TOptional<alepha.TString>;
|
|
13
|
-
data: alepha.TOptional<alepha.TAny>;
|
|
14
|
-
timestamp: alepha.TNumber;
|
|
6
|
+
declare const logEntrySchema: _$alepha.TObject<{
|
|
7
|
+
level: _$alepha.TUnsafe<"SILENT" | "TRACE" | "DEBUG" | "INFO" | "WARN" | "ERROR">;
|
|
8
|
+
message: _$alepha.TString;
|
|
9
|
+
service: _$alepha.TString;
|
|
10
|
+
module: _$alepha.TString;
|
|
11
|
+
context: _$alepha.TOptional<_$alepha.TString>;
|
|
12
|
+
app: _$alepha.TOptional<_$alepha.TString>;
|
|
13
|
+
data: _$alepha.TOptional<_$alepha.TAny>;
|
|
14
|
+
timestamp: _$alepha.TNumber;
|
|
15
15
|
}>;
|
|
16
16
|
type LogEntry = Static<typeof logEntrySchema>;
|
|
17
17
|
//#endregion
|
|
@@ -180,17 +180,18 @@ declare class PrettyFormatterProvider extends LogFormatterProvider {
|
|
|
180
180
|
*
|
|
181
181
|
* @module alepha.logger
|
|
182
182
|
*/
|
|
183
|
-
declare const AlephaLogger: alepha.Service<alepha.Module>;
|
|
184
|
-
declare const envSchema: alepha.TObject<{
|
|
183
|
+
declare const AlephaLogger: _$alepha.Service<_$alepha.Module>;
|
|
184
|
+
declare const envSchema: _$alepha.TObject<{
|
|
185
185
|
/**
|
|
186
186
|
* Enable debug logging for specific modules using the `debug` package convention.
|
|
187
187
|
*
|
|
188
188
|
* @example
|
|
189
|
+
* DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty
|
|
189
190
|
* DEBUG=alepha:* # Enable debug logging for all alepha modules
|
|
190
191
|
* DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
|
|
191
192
|
* DEBUG=* # Enable debug logging for all modules
|
|
192
193
|
*/
|
|
193
|
-
DEBUG: alepha.TOptional<alepha.TString>;
|
|
194
|
+
DEBUG: _$alepha.TOptional<_$alepha.TString>;
|
|
194
195
|
/**
|
|
195
196
|
* Default log level for the application.
|
|
196
197
|
*
|
|
@@ -207,14 +208,14 @@ declare const envSchema: alepha.TObject<{
|
|
|
207
208
|
* LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules
|
|
208
209
|
* LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules
|
|
209
210
|
*/
|
|
210
|
-
LOG_LEVEL: alepha.TOptional<alepha.TString>;
|
|
211
|
+
LOG_LEVEL: _$alepha.TOptional<_$alepha.TString>;
|
|
211
212
|
/**
|
|
212
213
|
* Built-in log formats.
|
|
213
214
|
* - "json" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}
|
|
214
215
|
* - "pretty" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}
|
|
215
216
|
* - "raw" - Raw format, no formatting, just the message. {@link RawFormatterProvider}
|
|
216
217
|
*/
|
|
217
|
-
LOG_FORMAT: alepha.TOptional<alepha.TUnsafe<"json" | "pretty" | "raw">>;
|
|
218
|
+
LOG_FORMAT: _$alepha.TOptional<_$alepha.TUnsafe<"json" | "pretty" | "raw">>;
|
|
218
219
|
}>;
|
|
219
220
|
declare module "alepha" {
|
|
220
221
|
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":";;;;;cAEa,cAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/logger/schemas/logEntrySchema.ts","../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/index.ts"],"mappings":"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"}
|
package/dist/logger/index.js
CHANGED
|
@@ -406,8 +406,11 @@ const AlephaLogger = $module({
|
|
|
406
406
|
let logLevel = env.LOG_LEVEL;
|
|
407
407
|
let logFormat = env.LOG_FORMAT;
|
|
408
408
|
if (env.DEBUG) {
|
|
409
|
-
|
|
410
|
-
|
|
409
|
+
if (env.DEBUG === "1" || env.DEBUG === "true") logLevel ??= "trace";
|
|
410
|
+
else {
|
|
411
|
+
const patterns = env.DEBUG.split(",").map((p) => p.trim().replaceAll(":", ".")).filter(Boolean);
|
|
412
|
+
logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
|
|
413
|
+
}
|
|
411
414
|
logFormat ??= "pretty";
|
|
412
415
|
}
|
|
413
416
|
const getLogDestinationProvider = () => {
|
package/dist/logger/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ?? (alepha.isTest() ? \"trace\" : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":";;;AAEA,IAAsB,yBAAtB,MAA6C;;;ACA7C,IAAsB,uBAAtB,MAA2C;;;ACU3C,IAAa,SAAb,MAA+C;CAC7C,SAA4B,QAAQ,OAAO;CAC3C,YAA+B,QAAQ,qBAAqB;CAC5D,cAAiC,QAAQ,uBAAuB;CAChE,mBAAsC,QAAQ,iBAAiB;CAE/D,SAAoD;EAClD,QAAQ;EACR,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;EACR;CAED;CACA;CACA;CAEA,cAAgC;CAChC,WAA+B;CAE/B,YAAY,SAAiB,QAAgB;AAC3C,OAAK,UAAU;AACf,OAAK,SAAS;AACd,OAAK,MAAM,KAAK,OAAO,IAAI;;CAG7B,IAAW,UAA8B;AACvC,SAAO,KAAK,OAAO,QAAQ,IAAY,UAAU;;CAGnD,IAAW,QAAgB;EACzB,MAAM,gBAAgB,KAAK,OAAO,MAAM,IAAI,sBAAsB;AAClE,MAAI,iBAAiB,kBAAkB,KAAK,aAAa;AACvD,QAAK,cAAc;AACnB,QAAK,WAAW,KAAK,WAAW,KAAK,aAAa,KAAK,OAAO;;AAEhE,SAAO,KAAK;;CAGd,WAAkB,OAAe,KAAuB;EACtD,MAAM,QAAQ,MAAM,aAAa,CAAC,MAAM,OAAO;AAG/C,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,cAAc,KAAK,MAAM;AAC/B,OAAI,CAAC,YAAa;AAElB,OAAI,YAAY,SAAS,IAAI,IAAI,YAAY,SAAS,IAAI,EAAE;IAC1D,MAAM,CAAC,eAAe,cAAc,YAAY,MAAM,OAAO;IAC7D,MAAM,gBAAgB,cAAc,MAAM;IAC1C,MAAM,eAAe,YAAY,MAAM;AAEvC,QAAI,CAAC,aAAc;AAEnB,QAAI,KAAK,eAAe,KAAK,cAAc,CACzC,KAAI;AACF,YAAO,KAAK,WAAW,aAAa;aAC7B,OAAO;AACd,WAAM,IAAI,YACR,sBAAsB,YAAY,MAAM,CAAC,wBAAwB,cAAc,GAChF;;;;AAOT,OAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,cAAc,KAAK,MAAM;AAC/B,OAAI,CAAC,YAAa;AAElB,OAAI,CAAC,YAAY,SAAS,IAAI,IAAI,CAAC,YAAY,SAAS,IAAI,CAC1D,KAAI;AACF,WAAO,KAAK,WAAW,YAAY;YAC5B,OAAO;AACd,UAAM,IAAI,YAAY,6BAA6B,YAAY,GAAG;;;AAKxE,SAAO;;CAGT,eAAyB,YAAoB,SAA0B;AACrE,MAAI,QAAQ,SAAS,IAAI,EAAE;GAEzB,MAAM,eAAe,QAAQ,QAAQ,OAAO,MAAM,CAAC,QAAQ,OAAO,KAAK;AACvE,UAAO,IAAI,OAAO,IAAI,eAAe,CAAC,KAAK,WAAW;;AAIxD,SAAO,WAAW,WAAW,QAAQ;;CAGvC,WAAkB,WAA6B;EAC7C,MAAM,QAAQ,UAAU,MAAM,CAAC,aAAa;AAC5C,MAAI,KAAK,OAAO,WAAW,KAAA,EACzB,QAAO;AAGT,QAAM,IAAI,YAAY,sBAAsB,YAAY;;CAK1D,MAAa,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,KAAY,SAAiB,MAAsB;AACjD,OAAK,IAAI,QAAQ,SAAS,KAAK;;CAGjC,KAAY,SAAiB,MAAsB;AACjD,OAAK,IAAI,QAAQ,SAAS,KAAK;;CAGjC,MAAa,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,MAAa,SAAiB,MAAsB;AAClD,OAAK,IAAI,SAAS,SAAS,KAAK;;CAGlC,IAAc,OAAiB,SAAiB,MAAsB;EACpE,IAAI,WAAW;AACf,MAAI,OAAO,YAAY,SACrB,YAAW;WACF,OAAO,SAAS,SACzB,YAAW;EAGb,IAAI;AACJ,MAAI,OAAO,SAAS,YAAY,CAAC,CAAC,KAChC,SAAQ;WACC,OAAO,YAAY,YAAY,QACxC,SAAQ;EAGV,MAAM,WAAqB;GACzB;GACA,SAAS;GACT,MAAM;GACN,SAAS,KAAK;GACd,SAAS,KAAK;GACd,QAAQ,KAAK;GACb,KAAK,KAAK;GACV,WAAW,KAAK,iBAAiB,WAAW;GAC7C;AAED,MAAI,KAAK,OAAO,SAAS,KAAK,OAAO,KAAK,QAAQ;AAChD,QAAK,KAAK,SAAS;AACnB;;EAGF,MAAM,YAAY,KAAK,UAAU,OAAO,SAAS;AAEjD,OAAK,KAAK,UAAU,UAAU;AAE9B,OAAK,YAAY,MAAM,WAAW,SAAS;;CAG7C,KAAe,OAAiB,SAAkB;AAChD,OAAK,OAAO,OACT,KACC,OACA;GACE;GACA;GACD,EACD,EACE,OAAO,MACR,CACF,CACA,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;ACvKxB,MAAa,WAAW,UAAkC,EAAE,KAAa;CACvE,MAAM,EAAE,QAAQ,SAAS,WAAW,UAAU;AAE9C,QAAO,QAAQ,QAAQ;EACrB,UAAU;EACV,MAAM,CACJ,QAAQ,QAAQ,SAAS,QAAQ,QACjC,QAAQ,QAAQ,OAAO,IAAI,eAAe,MAC3C;EACF,CAAC;;AAOJ,QAAQ,QAAQ;;;ACpChB,IAAa,uBAAb,MAAa,qBAAqB;CAChC,OAAgB,SAAS;EACvB,OAAO;EACP,OAAO;EACP,KAAK;EACL,OAAO;EACP,QAAQ;EACR,MAAM;EACN,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,iBAAiB;EACjB,WAAW;EACX,gBAAgB;EAChB,OAAO;EACP,YAAY;EAEZ,KAAK;EACL,MAAM;EACN,SAAS;EAET,QAAQ;EACR,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;EACP,OAAO;EACR;CAED,SAA4B,QAAQ,OAAO;CAE3C,UAAoB;CAEpB,cAAc;AACZ,OAAK,UAAU,KAAK,WAAW;;CAGjC,YAA4B;AAC1B,MAAI,KAAK,OAAO,IAAI,SAClB,QAAO;AAGT,MAAI,KAAK,OAAO,IAAI,YAClB,QAAO;AAGT,MAAI,KAAK,OAAO,WAAW,IAAI,CAAC,UAAU,UAAU,SAAS,SAAS,CACpE,QAAO;AAGT,SAAO,CAAC,KAAK,OAAO,cAAc;;CAGpC,IACE,OACA,MACA,QAAgB,qBAAqB,OAAO,OACpC;AACR,MAAI,CAAC,KAAK,QACR,QAAO;AAGT,SAAO,GAAG,qBAAqB,OAAO,SAAS,OAAO;;;;;AC9D1D,IAAa,6BAAb,cAAgD,uBAAuB;CACrE,MAAa,SAAuB;AAClC,UAAQ,IAAI,QAAQ;;;;;ACDxB,IAAa,wBAAb,cAA2C,qBAAqB;CAC9D,OAAc,OAAyB;EACrC,MAAM,OAA4B;GAChC,OAAO,MAAM;GACb,SAAS,MAAM;GACf,SAAS,MAAM;GACf,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,KAAK,MAAM;GACX,MAAM,MAAM;GACb;AAED,MAAI,MAAM,gBAAgB,MACxB,MAAK,QAAQ,KAAK,gBAAgB,MAAM,KAAK;MAE7C,MAAK,OAAO,MAAM;AAGpB,SAAO,KAAK,UAAU,KAAK;;CAG7B,gBAAuB,OAAsB;AAC3C,SAAO;GACL,MAAM,MAAM;GACZ,SAAS,MAAM;GACf,OAAO,MAAM;GACb,OACE,MAAM,iBAAiB,QACnB,KAAK,gBAAgB,MAAM,MAAM,GACjC,KAAA;GACP;;;;;AC9BL,IAAa,4BAAb,cAA+C,uBAAuB;CACpE,UAA6D,EAAE;CAE/D,UAA0B,EACxB,YAAY,KACb;CAED,MAAa,WAAmB,OAAuB;AACrD,OAAK,QAAQ,KAAK;GAAE,GAAG;GAAO;GAAW,CAAC;AAE1C,MAAI,KAAK,QAAQ,SAAS,KAAK,QAAQ,WACrC,MAAK,UAAU,KAAK,QAAQ,MAC1B,CAAC,KAAK,MAAM,KAAK,QAAQ,aAAa,GAAI,CAC3C;;CAIL,IAAW,OAAO;AAChB,SAAO,CAAC,GAAG,KAAK,QAAQ;;CAG1B,QAAqB;AACnB,OAAK,UAAU,EAAE;;;;;ACpBrB,IAAa,0BAAb,cAA6C,qBAAqB;CAChE,QAAkB,QAAQ,qBAAqB;CAC/C,SAAmB,QAAQ,OAAO;CAElC,OAAc,OAAyB;EACrC,MAAM,EAAE,MAAM,cAAc;EAE5B,IAAI,SAAS;EACb,IAAI,UAAU;EAEd,MAAM,UAAU,gBAAgB;AAChC,MAAI,QACF,WAAU,KAAK,YAAY,KAAK;WACvB,MAAM;GACf,IAAI,QAAQ;GACZ,IAAI,WAAW;AACf,OAAI,WAAW,QAAQ,KAAK,iBAAiB,OAAO;AAClD,YAAQ,KAAK,YAAY,KAAK,MAAM;IACpC,MAAM,EAAE,OAAO,GAAG,GAAG,SAAS;AAC9B,eAAW;;AAGb,OAAI,OAAO,KAAK,SAAS,CAAC,SAAS,EACjC,KAAI;AACF,cAAU,KAAK,UAAU,SAAS;WAC5B;AACN,cAAU;;AAId,OAAI,MACF,YAAW,KAAK;;AAIpB,YAAU,KAAK,MAAM,IACnB,aACA,IAAI,KAAK,gBAAgB,UAAU,CAAC,GACrC;AACD,YAAU;AAEV,YAAU,KAAK,MAAM,IAAI,MAAM,OAAO,MAAM,MAAM,aAAa,CAAC;AAChE,YAAU;AAEV,MAAI,MAAM,KAAK;AACb,aAAU,KAAK,MAAM,IAAI,aAAa,GAAG,MAAM,MAAM;AACrD,aAAU;;AAGZ,MAAI,MAAM,SAAS;AACjB,aAAU,KAAK,MAAM,IACnB,aACA,IAAI,KAAK,cAAc,MAAM,QAAQ,CAAC,GACvC;AACD,aAAU;;EAGZ,MAAM,SAAS,KAAK,MAAM,IAAI,cAAc,GAAG,MAAM,OAAO,GAAG;EAC/D,MAAM,UAAU,KAAK,MAAM,IACzB,KAAK,OAAO,WAAW,GAAG,UAAU,SACpC,MAAM,QACP;AAED,YAAU,IAAI,SAAS,QAAQ;AAE/B,MAAI,MAAM,QACR,WAAU,KAAK,KAAK,MAAM,IAAI,QAAQ,MAAM,QAAQ;MAEpD,WAAU;AAGZ,MAAI,QACF,KAAI,QACF,WAAU,MAAM;MAEhB,WAAU,IAAI,KAAK,MAAM,IAAI,aAAa,QAAQ;AAItD,SAAO;;CAGT,gBAAuB,WAA2B;EAChD,MAAM,IAAI,IAAI,KAAK,UAAU;EAC7B,MAAM,IAAI,EAAE,UAAU;EACtB,MAAM,IAAI,EAAE,YAAY;EACxB,MAAM,IAAI,EAAE,YAAY;EACxB,MAAM,KAAK,EAAE,iBAAiB;AAE9B,SAAO,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,GAAG,KAAK,KAAK,GAAG;;CAGzE,QAAkB,OAAe,IAAI,KAAK,MAAM,MAAM;CACtD,QAAkB,MAChB,IAAI,KAAK,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG;;;;CAK7C,cAAwB,SAAyB;AAC/C,MAAI,KAAK,OAAO,cAAc,CAC5B,QAAO;AAGT,SAAO,QAAQ,MAAM,GAAG,EAAE;;CAG5B,YAAsB,OAAsB;AAG1C,MAAI,KAAK,OAAO,WAAW,EAAE;AAE3B,oBAAiB;AACf,YAAQ,MAAM,MAAM;KACpB;AACF,UAAO;;EAIT,MAAM,OAAO,KAAK,OAAO,MAAM,IAAI,qBAAqB;AAMxD,QAAM,iBAAiB,MAAM;EAE7B,IAAI,MAAM,MAAM,SAAS,MAAM;EAE/B,IAAI,eAAgB,MAAc;AAClC,SAAO,gBAAgB,wBAAwB,OAAO;AACpD,SAAM,iBAAiB,aAAa;AAEpC,UAAO,gBAAgB,aAAa,SAAS,aAAa;AAC1D,kBAAe,aAAa;;AAG9B,SAAO;;;;;AC3IX,IAAa,uBAAb,cAA0C,qBAAqB;CAC7D,OAAc,OAAyB;EACrC,IAAI,SAAS;AAEb,YAAU,GAAG,MAAM;AAEnB,MAAI,MAAM,gBAAgB,OAAO;AAC/B,aAAU,KAAK,MAAM,KAAK;GAC1B,IAAI,QAAQ,MAAM,KAAK;AACvB,UAAO,iBAAiB,OAAO;AAC7B,cAAU,gBAAgB,MAAM;AAChC,YAAQ,MAAM;;;AAIlB,SAAO;;;;;AChBX,MAAa,iBAAiB,EAAE,OAAO;CACrC,OAAO,EAAE,KAAK;EAAC;EAAU;EAAS;EAAS;EAAQ;EAAQ;EAAQ,CAAC;CACpE,SAAS,EAAE,KAAK,EACd,MAAM,QACP,CAAC;CACF,SAAS,EAAE,MAAM;CACjB,QAAQ,EAAE,MAAM;CAChB,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;CAC7B,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC;CACzB,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC;CACzB,WAAW,EAAE,QAAQ;CACtB,CAAC;;;;;;;;;;;;;;;;;;AC8BF,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,YAAY,CAAC,QAAQ;CACrB,UAAU;EACR;EACA;EACA;EACA;EACA;EACA;EACA;EACD;CACD,WAAW,WAAW;EACpB,MAAM,MAAM,OAAO,SAAS,UAAU;EAItC,IAAI,WAAW,IAAI;EACnB,IAAI,YAAY,IAAI;AACpB,MAAI,IAAI,OAAO;GACb,MAAM,WAAW,IAAI,MAAM,MAAM,IAAI,CAClC,KAAK,MAAM,EAAE,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,CACzC,OAAO,QAAQ;AAClB,gBAAa,GAAG,SAAS,KAAK,MAAM,GAAG,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC5D,iBAAc;;EAGhB,MAAM,kCAAkC;AAGtC,OAAI,OAAO,QAAQ,IAAI,CAAC,UAAU;IAChC,MAAM,gBAAgB,OAAY;AAChC,SAAI,GAAG,MAAM,QAAQ,UAAU,QAAQ;MACrC,MAAM,SAAS,OAAO,OAAO,0BAA0B;AACvD,WAAK,MAAM,OAAO,OAAO,KACvB,SAAQ,IAAI,IAAI,UAAU;;;AAKhC,QAAI;AACF,YAAO,MAAM,IAAI,wBAAwB,GAAG,aAAa;AACzD,YAAO,MAAM,IAAI,6BAA6B,GAAG,aAAa;YACxD;AAIR,WAAO;;AAGT,UAAO;;EAGT,MAAM,gCAAgC;AACpC,OAAI,WAAW;AACb,QAAI,cAAc,OAChB,QAAO;AAET,QAAI,cAAc,MAChB,QAAO;AAET,WAAO;;AAGT,OAAI,OAAO,cAAc,IAAI,CAAC,OAAO,WAAW,CAC9C,QAAO;AAGT,UAAO;;AAGT,SAAO,KAAK;GACV,UAAU;GACV,SAAS;GACT,KAAK,2BAA2B;GACjC,CAAC;AAEF,SAAO,KAAK;GACV,UAAU;GACV,SAAS;GACT,KAAK,yBAAyB;GAC/B,CAAC;AAEF,SAAO,MAAM,IACX,iBACA,OAAO,OAAO,QAAQ;GACpB,UAAU;GACV,MAAM,CAAC,UAAU,cAAc;GAChC,CAAC,CACH;AAED,SAAO,MAAM,IACX,uBACA,aAAa,OAAO,QAAQ,GAAG,UAAU,QAC1C;;CAEJ,CAAC;AAIF,MAAM,YAAY,EAAE,OAAO;CASzB,OAAO,EAAE,SACP,EAAE,KAAK,EACL,aACE,yGACH,CAAC,CACH;CAkBD,WAAW,EAAE,SACX,EAAE,KAAK;EACL,aAAa;;;;;EAKb,WAAW;EACZ,CAAC,CACH;CAQD,YAAY,EAAE,SACZ,EAAE,KAAK;EAAC;EAAQ;EAAU;EAAM,EAAE;EAChC,aAAa;EACb,WAAW;EACZ,CAAC,CACH;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/logger/providers/LogDestinationProvider.ts","../../src/logger/providers/LogFormatterProvider.ts","../../src/logger/services/Logger.ts","../../src/logger/primitives/$logger.ts","../../src/logger/providers/ConsoleColorProvider.ts","../../src/logger/providers/ConsoleDestinationProvider.ts","../../src/logger/providers/JsonFormatterProvider.ts","../../src/logger/providers/MemoryDestinationProvider.ts","../../src/logger/providers/PrettyFormatterProvider.ts","../../src/logger/providers/RawFormatterProvider.ts","../../src/logger/schemas/logEntrySchema.ts","../../src/logger/index.ts"],"sourcesContent":["import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogDestinationProvider {\n public abstract write(message: string, entry: LogEntry): void;\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport abstract class LogFormatterProvider {\n public abstract format(entry: LogEntry): string;\n}\n","import {\n $inject,\n Alepha,\n AlephaError,\n type LoggerInterface,\n type LogLevel,\n} from \"alepha\";\nimport { DateTimeProvider } from \"alepha/datetime\";\nimport { LogDestinationProvider } from \"../providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"../providers/LogFormatterProvider.ts\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\n\nexport class Logger implements LoggerInterface {\n protected readonly alepha = $inject(Alepha);\n protected readonly formatter = $inject(LogFormatterProvider);\n protected readonly destination = $inject(LogDestinationProvider);\n protected readonly dateTimeProvider = $inject(DateTimeProvider);\n\n protected readonly levels: Record<string, number> = {\n SILENT: -1,\n ERROR: 0,\n WARN: 1,\n INFO: 2,\n DEBUG: 3,\n TRACE: 4,\n };\n\n protected readonly service: string;\n protected readonly module: string;\n protected readonly app?: string;\n\n protected appLogLevel: string = \"INFO\";\n protected logLevel: LogLevel = \"INFO\";\n\n constructor(service: string, module: string) {\n this.service = service;\n this.module = module;\n this.app = this.alepha.env.APP_NAME;\n }\n\n public get context(): string | undefined {\n return this.alepha.context.get<string>(\"context\");\n }\n\n public get level(): string {\n const stateLogLevel = this.alepha.store.get(\"alepha.logger.level\");\n if (stateLogLevel && stateLogLevel !== this.appLogLevel) {\n this.appLogLevel = stateLogLevel;\n this.logLevel = this.parseLevel(this.appLogLevel, this.module);\n }\n return this.logLevel;\n }\n\n public parseLevel(level: string, app: string): LogLevel {\n const parts = level.toLowerCase().split(/[,;]/);\n\n // First pass: check for module-specific configurations\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (trimmedPart.includes(\":\") || trimmedPart.includes(\"=\")) {\n const [modulePattern, levelValue] = trimmedPart.split(/[:=]/);\n const trimmedModule = modulePattern.trim();\n const trimmedLevel = levelValue?.trim();\n\n if (!trimmedLevel) continue; // Skip if no level specified\n\n if (this.matchesPattern(app, trimmedModule)) {\n try {\n return this.asLogLevel(trimmedLevel);\n } catch (error) {\n throw new AlephaError(\n `Invalid log level '${levelValue?.trim()}' for module pattern '${trimmedModule}'`,\n );\n }\n }\n }\n }\n\n // Second pass: look for global level\n for (const part of parts) {\n const trimmedPart = part.trim();\n if (!trimmedPart) continue; // Skip empty parts\n\n if (!trimmedPart.includes(\":\") && !trimmedPart.includes(\"=\")) {\n try {\n return this.asLogLevel(trimmedPart);\n } catch (error) {\n throw new AlephaError(`Invalid global log level \"${trimmedPart}\"`);\n }\n }\n }\n\n return \"INFO\";\n }\n\n protected matchesPattern(moduleName: string, pattern: string): boolean {\n if (pattern.includes(\"*\")) {\n // Convert wildcard pattern to regex\n const regexPattern = pattern.replace(/\\./g, \"\\\\.\").replace(/\\*/g, \".*\");\n return new RegExp(`^${regexPattern}`).test(moduleName);\n }\n\n // Exact prefix match (existing behavior)\n return moduleName.startsWith(pattern);\n }\n\n public asLogLevel(something: string): LogLevel {\n const level = something.trim().toUpperCase();\n if (this.levels[level] !== undefined) {\n return level as LogLevel;\n }\n\n throw new AlephaError(`Invalid log level: ${something}`);\n }\n\n // -------------------------------------------------------------------------------------------------------------------\n\n public error(message: string, data?: unknown): void {\n this.log(\"ERROR\", message, data);\n }\n\n public warn(message: string, data?: unknown): void {\n this.log(\"WARN\", message, data);\n }\n\n public info(message: string, data?: unknown): void {\n this.log(\"INFO\", message, data);\n }\n\n public debug(message: string, data?: unknown): void {\n this.log(\"DEBUG\", message, data);\n }\n\n public trace(message: string, data?: unknown): void {\n this.log(\"TRACE\", message, data);\n }\n\n protected log(level: LogLevel, message: string, data?: unknown): void {\n let _message = \"\";\n if (typeof message === \"string\") {\n _message = message;\n } else if (typeof data === \"string\") {\n _message = data;\n }\n\n let _data: object | Error | undefined;\n if (typeof data === \"object\" && !!data) {\n _data = data;\n } else if (typeof message === \"object\" && message) {\n _data = message;\n }\n\n const logEntry: LogEntry = {\n level,\n message: _message,\n data: _data,\n context: this.context,\n service: this.service,\n module: this.module,\n app: this.app,\n timestamp: this.dateTimeProvider.nowMillis(),\n };\n\n if (this.levels[level] > this.levels[this.level]) {\n this.emit(logEntry);\n return;\n }\n\n const formatted = this.formatter.format(logEntry);\n\n this.emit(logEntry, formatted);\n\n this.destination.write(formatted, logEntry);\n }\n\n protected emit(entry: LogEntry, message?: string) {\n this.alepha.events\n .emit(\n \"log\",\n {\n message,\n entry,\n },\n {\n catch: true,\n },\n )\n .catch(() => null);\n }\n}\n","import { $context, $inject, KIND } from \"alepha\";\nimport { Logger } from \"../services/Logger.ts\";\n\n/**\n * Create a logger.\n *\n * `name` is optional, by default it will use the name of the service.\n *\n * @example\n * ```ts\n * import { $logger } from \"alepha\";\n *\n * class MyService {\n * \tlog = $logger();\n *\n * constructor() {\n * this.log.info(\"Service initialized\");\n * // print something like '[23:45:53.326] INFO <app.MyService>: Service initialized'\n * }\n * }\n * ```\n */\nexport const $logger = (options: LoggerPrimitiveOptions = {}): Logger => {\n const { alepha, service, module } = $context();\n\n return $inject(Logger, {\n lifetime: \"transient\",\n args: [\n options.name ?? service?.name ?? \"Func\",\n module?.name ?? alepha.env.MODULE_NAME ?? \"app\",\n ],\n });\n};\n\nexport interface LoggerPrimitiveOptions {\n name?: string;\n}\n\n$logger[KIND] = Logger;\n","import { $inject, Alepha } from \"alepha\";\n\nexport class ConsoleColorProvider {\n static readonly COLORS = {\n RESET: \"\\x1b[0m\",\n BLACK: \"\\x1b[30m\",\n RED: \"\\x1b[31m\",\n GREEN: \"\\x1b[32m\",\n ORANGE: \"\\x1b[33m\", // using yellow for orange-ish\n BLUE: \"\\x1b[34m\",\n PURPLE: \"\\x1b[35m\",\n CYAN: \"\\x1b[36m\",\n GREY_LIGHT: \"\\x1b[37m\",\n GREY_LIGHT_BOLD: \"\\x1b[1;37m\",\n GREY_DARK: \"\\x1b[90m\",\n GREY_DARK_BOLD: \"\\x1b[1;90m\",\n WHITE: \"\\x1b[97m\",\n WHITE_BOLD: \"\\x1b[1;97m\",\n // modifiers\n DIM: \"\\x1b[2m\",\n BOLD: \"\\x1b[1m\",\n INVERSE: \"\\x1b[7m\",\n // levels\n SILENT: \"\",\n ERROR: \"\\x1b[31m\",\n WARN: \"\\x1b[33m\",\n INFO: \"\\x1b[32m\",\n DEBUG: \"\\x1b[34m\",\n TRACE: \"\\x1b[90m\",\n };\n\n protected readonly alepha = $inject(Alepha);\n\n protected enabled = true;\n\n constructor() {\n this.enabled = this.isEnabled();\n }\n\n public isEnabled(): boolean {\n if (this.alepha.env.NO_COLOR) {\n return false;\n }\n\n if (this.alepha.env.FORCE_COLOR) {\n return true;\n }\n\n if (this.alepha.isBrowser() && !navigator.userAgent.includes(\"Chrome\")) {\n return false;\n }\n\n return !this.alepha.isProduction();\n }\n\n public set(\n color: keyof typeof ConsoleColorProvider.COLORS,\n text: string,\n reset: string = ConsoleColorProvider.COLORS.RESET,\n ): string {\n if (!this.enabled) {\n return text;\n }\n\n return `${ConsoleColorProvider.COLORS[color]}${text}${reset}`;\n }\n}\n","import { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class ConsoleDestinationProvider extends LogDestinationProvider {\n public write(message: string): void {\n console.log(message);\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class JsonFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n const json: Record<string, any> = {\n level: entry.level,\n message: entry.message,\n context: entry.context,\n service: entry.service,\n module: entry.module,\n app: entry.app,\n time: entry.timestamp,\n };\n\n if (entry.data instanceof Error) {\n json.error = this.formatJsonError(entry.data);\n } else {\n json.data = entry.data;\n }\n\n return JSON.stringify(json);\n }\n\n public formatJsonError(error: Error): object {\n return {\n name: error.name,\n message: error.message,\n stack: error.stack,\n cause:\n error.cause instanceof Error\n ? this.formatJsonError(error.cause)\n : undefined,\n };\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogDestinationProvider } from \"./LogDestinationProvider.ts\";\n\nexport class MemoryDestinationProvider extends LogDestinationProvider {\n protected entries: Array<LogEntry & { formatted: string }> = [];\n\n public readonly options = {\n maxEntries: 10_000,\n };\n\n public write(formatted: string, entry: LogEntry): void {\n this.entries.push({ ...entry, formatted });\n\n if (this.entries.length > this.options.maxEntries) {\n this.entries = this.entries.slice(\n -Math.floor(this.options.maxEntries * 0.8),\n );\n }\n }\n\n public get logs() {\n return [...this.entries];\n }\n\n public clear(): void {\n this.entries = [];\n }\n}\n","import { $inject, Alepha } from \"alepha\";\nimport type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { ConsoleColorProvider } from \"./ConsoleColorProvider.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class PrettyFormatterProvider extends LogFormatterProvider {\n protected color = $inject(ConsoleColorProvider);\n protected alepha = $inject(Alepha);\n\n public format(entry: LogEntry): string {\n const { data, timestamp } = entry;\n\n let output = \"\";\n let details = \"\";\n\n const isError = data instanceof Error;\n if (isError) {\n details = this.formatError(data);\n } else if (data) {\n let error = \"\";\n let jsonData = data;\n if (\"error\" in data && data.error instanceof Error) {\n error = this.formatError(data.error);\n const { error: _, ...rest } = data;\n jsonData = rest;\n }\n\n if (Object.keys(jsonData).length > 0) {\n try {\n details = JSON.stringify(jsonData);\n } catch {\n details = \"[Unserializable Object]\";\n }\n }\n\n if (error) {\n details += `\\n${error}`;\n }\n }\n\n output += this.color.set(\n \"GREY_DARK\",\n `[${this.formatTimestamp(timestamp)}]`,\n );\n output += \" \";\n\n output += this.color.set(entry.level, entry.level.toUpperCase());\n output += \" \";\n\n if (entry.app) {\n output += this.color.set(\"GREY_DARK\", `${entry.app}`);\n output += \" \";\n }\n\n if (entry.context) {\n output += this.color.set(\n \"GREY_DARK\",\n `(${this.formatContext(entry.context)})`,\n );\n output += \" \";\n }\n\n const module = this.color.set(\"GREY_LIGHT\", `${entry.module}.`);\n const service = this.color.set(\n this.alepha.isBrowser() ? \"RESET\" : \"WHITE\",\n entry.service,\n );\n\n output += `<${module}${service}>`;\n\n if (entry.message) {\n output += `: ${this.color.set(\"CYAN\", entry.message)}`;\n } else {\n output += \":\";\n }\n\n if (details) {\n if (isError) {\n output += ` \\n${details}`;\n } else {\n output += ` ${this.color.set(\"GREY_DARK\", details)}`;\n }\n }\n\n return output;\n }\n\n public formatTimestamp(timestamp: number): string {\n const d = new Date(timestamp);\n const h = d.getHours();\n const m = d.getMinutes();\n const s = d.getSeconds();\n const ms = d.getMilliseconds();\n\n return `${this.pad2(h)}:${this.pad2(m)}:${this.pad2(s)}.${this.pad3(ms)}`;\n }\n\n protected pad2 = (n: number) => (n < 10 ? \"0\" : \"\") + n;\n protected pad3 = (n: number) =>\n n < 10 ? `00${n}` : n < 100 ? `0${n}` : `${n}`;\n\n /**\n * Avoid to display the whole UUID in development mode\n */\n protected formatContext(context: string): string {\n if (this.alepha.isProduction()) {\n return context;\n }\n\n return context.slice(0, 8);\n }\n\n protected formatError(error: Error): string {\n // Chrome does not like stack traces with ASCII colors\n // so we remove the stack trace from log and just print with console.error\n if (this.alepha.isBrowser()) {\n // call console.error in a separate tick to avoid messing with log order\n setTimeout(() => {\n console.error(error);\n });\n return \"\";\n }\n\n // hack: use vite's stack trace formatter if available\n const vite = this.alepha.store.get(\"alepha.vite.server\") as\n | {\n ssrFixStacktrace: (error: Error) => void;\n }\n | undefined;\n\n vite?.ssrFixStacktrace(error);\n\n let str = error.stack ?? error.message;\n\n let currentCause = (error as any).cause;\n while (currentCause && currentCause instanceof Error) {\n vite?.ssrFixStacktrace(currentCause);\n\n str += `\\nCaused by: ${currentCause.stack ?? currentCause.message}`;\n currentCause = currentCause.cause;\n }\n\n return str;\n }\n}\n","import type { LogEntry } from \"../schemas/logEntrySchema.ts\";\nimport { LogFormatterProvider } from \"./LogFormatterProvider.ts\";\n\nexport class RawFormatterProvider extends LogFormatterProvider {\n public format(entry: LogEntry): string {\n let output = \"\";\n\n output += `${entry.message}`;\n\n if (entry.data instanceof Error) {\n output += `\\n${entry.data.message}`;\n let cause = entry.data.cause;\n while (cause instanceof Error) {\n output += `\\nCaused by: ${cause.message}`;\n cause = cause.cause;\n }\n }\n\n return output;\n }\n}\n","import { type Static, t } from \"alepha\";\n\nexport const logEntrySchema = t.object({\n level: t.enum([\"SILENT\", \"TRACE\", \"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"]),\n message: t.text({\n size: \"rich\",\n }),\n service: t.text(),\n module: t.text(),\n context: t.optional(t.text()),\n app: t.optional(t.text()),\n data: t.optional(t.any()),\n timestamp: t.number(),\n});\n\nexport type LogEntry = Static<typeof logEntrySchema>;\n","import { $module, type Static, t } from \"alepha\";\nimport { $logger } from \"./primitives/$logger.ts\";\nimport { ConsoleColorProvider } from \"./providers/ConsoleColorProvider.ts\";\nimport { ConsoleDestinationProvider } from \"./providers/ConsoleDestinationProvider.ts\";\nimport { JsonFormatterProvider } from \"./providers/JsonFormatterProvider.ts\";\nimport { LogDestinationProvider } from \"./providers/LogDestinationProvider.ts\";\nimport { LogFormatterProvider } from \"./providers/LogFormatterProvider.ts\";\nimport { MemoryDestinationProvider } from \"./providers/MemoryDestinationProvider.ts\";\nimport { PrettyFormatterProvider } from \"./providers/PrettyFormatterProvider.ts\";\nimport { RawFormatterProvider } from \"./providers/RawFormatterProvider.ts\";\nimport type { LogEntry } from \"./schemas/logEntrySchema.ts\";\nimport { Logger } from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./primitives/$logger.ts\";\nexport * from \"./providers/ConsoleColorProvider.ts\";\nexport * from \"./providers/ConsoleDestinationProvider.ts\";\nexport * from \"./providers/JsonFormatterProvider.ts\";\nexport * from \"./providers/LogDestinationProvider.ts\";\nexport * from \"./providers/LogFormatterProvider.ts\";\nexport * from \"./providers/MemoryDestinationProvider.ts\";\nexport * from \"./providers/PrettyFormatterProvider.ts\";\nexport * from \"./schemas/logEntrySchema.ts\";\nexport * from \"./services/Logger.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Configurable logging with multiple outputs.\n *\n * **Features:**\n * - Global logger access\n * - JSON format\n * - Pretty colored output\n * - Raw text format\n * - Console destination\n * - Memory destination (for devtools)\n * - Custom handlers\n * - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`\n *\n * @module alepha.logger\n */\nexport const AlephaLogger = $module({\n name: \"alepha.logger\",\n primitives: [$logger],\n services: [\n Logger,\n ConsoleDestinationProvider,\n MemoryDestinationProvider,\n JsonFormatterProvider,\n PrettyFormatterProvider,\n RawFormatterProvider,\n ConsoleColorProvider,\n ],\n register: (alepha) => {\n const env = alepha.parseEnv(envSchema);\n\n // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.\n // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty\n // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty\n let logLevel = env.LOG_LEVEL;\n let logFormat = env.LOG_FORMAT;\n if (env.DEBUG) {\n if (env.DEBUG === \"1\" || env.DEBUG === \"true\") {\n logLevel ??= \"trace\";\n } else {\n const patterns = env.DEBUG.split(\",\")\n .map((p) => p.trim().replaceAll(\":\", \".\"))\n .filter(Boolean);\n logLevel ??= `${patterns.map((p) => `${p}:debug`).join(\",\")},info`;\n }\n logFormat ??= \"pretty\";\n }\n\n const getLogDestinationProvider = () => {\n // in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.\n // logs will be printed to console only if the test fails.\n if (alepha.isTest() && !logLevel) {\n const printOnError = (ev: any) => {\n if (ev.task?.result?.state === \"fail\") {\n const output = alepha.inject(MemoryDestinationProvider);\n for (const log of output.logs) {\n console.log(log.formatted);\n }\n }\n };\n\n try {\n alepha.store.get(\"alepha.test.afterEach\")?.(printOnError);\n alepha.store.get(\"alepha.test.onTestFinished\")?.(printOnError);\n } catch {\n // ignore\n }\n\n return MemoryDestinationProvider;\n }\n\n return ConsoleDestinationProvider;\n };\n\n const getLogFormatterProvider = () => {\n if (logFormat) {\n if (logFormat === \"json\") {\n return JsonFormatterProvider;\n }\n if (logFormat === \"raw\") {\n return RawFormatterProvider;\n }\n return PrettyFormatterProvider;\n }\n\n if (alepha.isProduction() && !alepha.isBrowser()) {\n return JsonFormatterProvider;\n }\n\n return PrettyFormatterProvider;\n };\n\n alepha.with({\n optional: true,\n provide: LogDestinationProvider,\n use: getLogDestinationProvider(),\n });\n\n alepha.with({\n optional: true,\n provide: LogFormatterProvider,\n use: getLogFormatterProvider(),\n });\n\n alepha.store.set(\n \"alepha.logger\",\n alepha.inject(Logger, {\n lifetime: \"transient\",\n args: [\"Alepha\", \"alepha.core\"],\n }),\n );\n\n alepha.store.set(\n \"alepha.logger.level\",\n logLevel ?? (alepha.isTest() ? \"trace\" : \"info\"),\n );\n },\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n /**\n * Enable debug logging for specific modules using the `debug` package convention.\n *\n * @example\n * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty\n * DEBUG=alepha:* # Enable debug logging for all alepha modules\n * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules\n * DEBUG=* # Enable debug logging for all modules\n */\n DEBUG: t.optional(\n t.text({\n description:\n \"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*\",\n }),\n ),\n\n /**\n * Default log level for the application.\n *\n * Default by environment:\n * - dev = info\n * - prod = info\n * - test = error\n *\n * Levels are: \"trace\" | \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\"\n *\n * Level can be set for a specific module:\n *\n * @example\n * LOG_LEVEL=my.module.name:debug,info # Set debug level for my.module.name and info for all other modules\n * LOG_LEVEL=alepha:trace, info # Set trace level for all alepha modules and info for all other modules\n */\n LOG_LEVEL: t.optional(\n t.text({\n description: `Application log level on startup.\nLevels are: trace, debug, info, warn, error, silent\nLevel can be set for a specific module:\n\"my.module.name:debug,info\" -> Set debug level for my.module.name and info for all other modules\n\"alepha:trace,info\" -> Set trace level for all alepha modules and info for all other modules`,\n lowercase: true,\n }),\n ),\n\n /**\n * Built-in log formats.\n * - \"json\" - JSON format, useful for structured logging and log aggregation. {@link JsonFormatterProvider}\n * - \"pretty\" - Simple text format, human-readable, with colors. {@link PrettyFormatterProvider}\n * - \"raw\" - Raw format, no formatting, just the message. {@link RawFormatterProvider}\n */\n LOG_FORMAT: t.optional(\n t.enum([\"json\", \"pretty\", \"raw\"], {\n description: \"Default log format for the application.\",\n lowercase: true,\n }),\n ),\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"alepha\" {\n export interface Env extends Partial<Static<typeof envSchema>> {}\n\n export interface State {\n /**\n * Current log level for the application or specific modules.\n */\n \"alepha.logger.level\"?: string;\n }\n\n export interface Hooks {\n log: {\n message?: string;\n entry: LogEntry;\n };\n }\n}\n"],"mappings":"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"}
|
package/dist/mcp/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as alepha from "alepha";
|
|
1
|
+
import * as _$alepha from "alepha";
|
|
2
2
|
import { Alepha, AlephaError, Async, KIND, Primitive, Static, TObject, TSchema } from "alepha";
|
|
3
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
4
|
-
import * as alepha_server0 from "alepha/server";
|
|
3
|
+
import * as _$alepha_logger0 from "alepha/logger";
|
|
4
|
+
import * as _$alepha_server0 from "alepha/server";
|
|
5
5
|
|
|
6
6
|
//#region ../../src/mcp/errors/McpError.d.ts
|
|
7
7
|
/**
|
|
@@ -494,7 +494,7 @@ declare class ToolPrimitive<T extends ToolPrimitiveSchema> extends Primitive<Too
|
|
|
494
494
|
* transport providers like StdioMcpTransport or SseMcpTransport.
|
|
495
495
|
*/
|
|
496
496
|
declare class McpServerProvider {
|
|
497
|
-
protected readonly log: alepha_logger0.Logger;
|
|
497
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
498
498
|
protected readonly alepha: Alepha;
|
|
499
499
|
protected readonly tools: Map<string, ToolPrimitive<any>>;
|
|
500
500
|
protected readonly resources: Map<string, ResourcePrimitive>;
|
|
@@ -685,11 +685,11 @@ declare class PromptPrimitive<T extends TObject> extends Primitive<PromptPrimiti
|
|
|
685
685
|
}
|
|
686
686
|
//#endregion
|
|
687
687
|
//#region ../../src/mcp/transports/SseMcpTransport.d.ts
|
|
688
|
-
declare const mcpSseOptions: alepha.Atom<alepha.TObject<{
|
|
688
|
+
declare const mcpSseOptions: _$alepha.Atom<_$alepha.TObject<{
|
|
689
689
|
/**
|
|
690
690
|
* Path for the MCP SSE endpoint.
|
|
691
691
|
*/
|
|
692
|
-
path: alepha.TString;
|
|
692
|
+
path: _$alepha.TString;
|
|
693
693
|
}>, "alepha.mcp.sse.options">;
|
|
694
694
|
/**
|
|
695
695
|
* SSE (Server-Sent Events) transport for MCP communication.
|
|
@@ -721,7 +721,7 @@ declare const mcpSseOptions: alepha.Atom<alepha.TObject<{
|
|
|
721
721
|
* ```
|
|
722
722
|
*/
|
|
723
723
|
declare class SseMcpTransport {
|
|
724
|
-
protected readonly log: alepha_logger0.Logger;
|
|
724
|
+
protected readonly log: _$alepha_logger0.Logger;
|
|
725
725
|
protected readonly options: Readonly<{
|
|
726
726
|
path: string;
|
|
727
727
|
}>;
|
|
@@ -732,12 +732,12 @@ declare class SseMcpTransport {
|
|
|
732
732
|
* Returns a text/event-stream response with server capabilities
|
|
733
733
|
* and keeps the connection open for notifications.
|
|
734
734
|
*/
|
|
735
|
-
sse: alepha_server0.RoutePrimitive<alepha_server0.RequestConfigSchema>;
|
|
735
|
+
sse: _$alepha_server0.RoutePrimitive<_$alepha_server0.RequestConfigSchema>;
|
|
736
736
|
/**
|
|
737
737
|
* POST endpoint for client-to-server JSON-RPC messages.
|
|
738
738
|
*/
|
|
739
|
-
message: alepha_server0.RoutePrimitive<{
|
|
740
|
-
body: alepha.TRecord<string, alepha.TAny>;
|
|
739
|
+
message: _$alepha_server0.RoutePrimitive<{
|
|
740
|
+
body: _$alepha.TRecord<string, _$alepha.TAny>;
|
|
741
741
|
}>;
|
|
742
742
|
/**
|
|
743
743
|
* Format a message as an SSE event.
|
|
@@ -758,7 +758,7 @@ declare class SseMcpTransport {
|
|
|
758
758
|
*
|
|
759
759
|
* @module alepha.mcp
|
|
760
760
|
*/
|
|
761
|
-
declare const AlephaMcp: alepha.Service<alepha.Module>;
|
|
761
|
+
declare const AlephaMcp: _$alepha.Service<_$alepha.Module>;
|
|
762
762
|
//#endregion
|
|
763
763
|
export { $prompt, $resource, $tool, AlephaMcp, JSONRPC_VERSION, type JsonRpcError, JsonRpcErrorCodes, type JsonRpcNotification, JsonRpcParseError, type JsonRpcRequest, type JsonRpcResponse, MCP_PROTOCOL_VERSION, type McpCapabilities, type McpClientInfo, type McpContent, type McpContext, McpError, McpErrorCodes, McpForbiddenError, type McpInitializeParams, type McpInitializeResult, McpInvalidParamsError, type McpJsonSchema, McpMethodNotFoundError, type McpPromptArgument, type McpPromptContent, type McpPromptDescriptor, type McpPromptGetParams, type McpPromptGetResult, type McpPromptMessage, McpPromptNotFoundError, type McpResourceContent, type McpResourceDescriptor, McpResourceNotFoundError, type McpResourceReadParams, type McpResourceReadResult, type McpServerInfo, McpServerProvider, type McpToolCallParams, type McpToolCallResult, type McpToolDescriptor, McpToolNotFoundError, McpUnauthorizedError, type PromptHandler, type PromptHandlerArgs, type PromptMessage, PromptPrimitive, type PromptPrimitiveOptions, type ResourceContent, type ResourceHandler, type ResourceHandlerArgs, ResourcePrimitive, type ResourcePrimitiveOptions, SseMcpTransport, type ToolHandler, type ToolHandlerArgs, type ToolHandlerResult, ToolPrimitive, type ToolPrimitiveOptions, type ToolPrimitiveSchema, createErrorResponse, createInternalError, createInvalidParamsError, createInvalidRequestError, createMethodNotFoundError, createNotification, createParseError, createResponse, isNotification, isValidJsonRpcRequest, mcpSseOptions, parseMessage };
|
|
764
764
|
//# sourceMappingURL=index.d.ts.map
|