bazis 0.96.1
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 +21 -0
- package/README.md +146 -0
- package/cli/build.ts +147 -0
- package/cli/codegen.ts +40 -0
- package/cli/generateModule.ts +187 -0
- package/cli/generateProject.ts +183 -0
- package/cli/main.ts +125 -0
- package/cli/moduleRegistration.ts +127 -0
- package/cli/naming.ts +124 -0
- package/cli/parseCli.ts +151 -0
- package/cli/templates/module.ts +497 -0
- package/cli/templates/pack.ts +76 -0
- package/cli/templates/passport.ts +178 -0
- package/core/agent/AgentContextBuilder.ts +567 -0
- package/core/agent/AgentDataDefinition.ts +8 -0
- package/core/agent/AgentRegistry.ts +539 -0
- package/core/agent/AgentRuntime.ts +47 -0
- package/core/agent/AgentToolExecutor.ts +2130 -0
- package/core/agent/AgentToolHooks.ts +39 -0
- package/core/agent/ModelProvider.ts +21 -0
- package/core/agent/README.md +229 -0
- package/core/agent/Tool.contract.ts +20 -0
- package/core/agent/decorators/Agent.ts +11 -0
- package/core/agent/decorators/Prompt.ts +11 -0
- package/core/agent/decorators/Task.ts +29 -0
- package/core/agent/decorators/Tool.ts +12 -0
- package/core/agent/errors.ts +43 -0
- package/core/agent/generated/catalog.ts +26 -0
- package/core/agent/index.ts +170 -0
- package/core/agent/internal/AgentExecutionDriver.ts +1497 -0
- package/core/agent/internal/AgentExecutionState.ts +775 -0
- package/core/agent/internal/AgentJsonSchema.ts +150 -0
- package/core/agent/internal/AgentModelBinding.ts +57 -0
- package/core/agent/internal/Schema.contract.ts +36 -0
- package/core/agent/internal/ToolAudit.projector.ts +163 -0
- package/core/agent/internal/ToolContract.validator.ts +102 -0
- package/core/agent/metadata.ts +398 -0
- package/core/agent/moduleContributions-v1.ts +113 -0
- package/core/agent/semantic.ts +903 -0
- package/core/agent/session/codec.ts +33 -0
- package/core/agent/session/contracts.ts +96 -0
- package/core/agent/session/entities.ts +84 -0
- package/core/agent/session/protector.ts +92 -0
- package/core/app/index.ts +5 -0
- package/core/app/runApp.ts +293 -0
- package/core/app/ui/index.ts +29 -0
- package/core/app/ui/uiProfileResolver.ts +966 -0
- package/core/app/ui/uiSurfaceHosting.ts +38 -0
- package/core/app/ui/uiSurfaceHttp.ts +476 -0
- package/core/background/BackgroundService.ts +223 -0
- package/core/background/backgroundModule.ts +42 -0
- package/core/background/decorator.ts +43 -0
- package/core/background/delay.ts +27 -0
- package/core/background/index.ts +15 -0
- package/core/cache/COMPATIBILITY.md +13 -0
- package/core/cache/ICache.ts +71 -0
- package/core/cache/MemoryCache.ts +394 -0
- package/core/cache/README.md +83 -0
- package/core/cache/SPEC.md +1355 -0
- package/core/cache/cacheModule.ts +21 -0
- package/core/cache/decorators/Cacheable.ts +38 -0
- package/core/cache/decorators/CacheableRedis.ts +39 -0
- package/core/cache/decorators/OutputCache.ts +33 -0
- package/core/cache/decorators/OutputRedisCache.ts +33 -0
- package/core/cache/decorators/cacheableMetadata.ts +78 -0
- package/core/cache/decorators/cacheableRedisMetadata.ts +81 -0
- package/core/cache/decorators/outputCacheMetadata.ts +71 -0
- package/core/cache/decorators/outputRedisCacheMetadata.ts +77 -0
- package/core/cache/di/classProviderHook.ts +26 -0
- package/core/cache/distributed/CacheCodec.ts +5 -0
- package/core/cache/distributed/DistributedCache.ts +403 -0
- package/core/cache/distributed/DistributedCacheDriver.ts +83 -0
- package/core/cache/distributed/DistributedCacheStores.ts +28 -0
- package/core/cache/distributed/IDistributedCache.ts +40 -0
- package/core/cache/distributed/NamedCacheRegistry.ts +23 -0
- package/core/cache/distributed/codecs.ts +32 -0
- package/core/cache/distributed/index.ts +19 -0
- package/core/cache/errors/CacheError.ts +16 -0
- package/core/cache/http/CachedHttpPayload.ts +213 -0
- package/core/cache/http/applyClientCacheHeaders.ts +61 -0
- package/core/cache/http/buildOutputCacheKey.ts +154 -0
- package/core/cache/http/buildRedisOutputCacheKey.ts +16 -0
- package/core/cache/http/composeOutputCache.ts +130 -0
- package/core/cache/http/outputCacheMiddleware.ts +111 -0
- package/core/cache/http/outputCacheSecurityWarning.ts +58 -0
- package/core/cache/http/outputRedisCacheMiddleware.ts +118 -0
- package/core/cache/index.ts +97 -0
- package/core/cache/internal/AutomaticCacheKey.ts +106 -0
- package/core/cache/internal/CacheKeyGuard.ts +56 -0
- package/core/cache/internal/buildCacheProviders.ts +146 -0
- package/core/cache/internal/normalizeCacheKey.ts +9 -0
- package/core/cache/internal/resolveCachePolicy.ts +32 -0
- package/core/cache/internal/resolveCacheableRedisPolicy.ts +17 -0
- package/core/cache/internal/resolveOutputRedisCachePolicy.ts +17 -0
- package/core/cache/providers/cachedProviders.ts +68 -0
- package/core/cache/services/cacheProxy.ts +243 -0
- package/core/cache/tokens/CACHE_POLICIES.ts +5 -0
- package/core/cache/tokens/DISTRIBUTED_CACHE.ts +30 -0
- package/core/cache/types/CacheEntry.ts +7 -0
- package/core/cache/types/CacheOptions.ts +60 -0
- package/core/cache/types/CachePolicy.ts +74 -0
- package/core/cache/types/CacheableRedisOptions.ts +23 -0
- package/core/cache/types/OutputRedisCacheOptions.ts +25 -0
- package/core/di/README.md +104 -0
- package/core/di/ServiceCollection.ts +185 -0
- package/core/di/ServiceProvider.ts +689 -0
- package/core/di/ServiceScope.ts +61 -0
- package/core/di/container.ts +38 -0
- package/core/di/errors/AmbiguousNamedDependencyError.ts +10 -0
- package/core/di/errors/AsyncResolutionRequiredError.ts +12 -0
- package/core/di/errors/CircularDependencyError.ts +10 -0
- package/core/di/errors/ClassDependenciesMismatchError.ts +15 -0
- package/core/di/errors/DiError.ts +6 -0
- package/core/di/errors/InvalidProviderError.ts +9 -0
- package/core/di/errors/ModuleEncapsulationError.ts +7 -0
- package/core/di/errors/ModuleOwnedProviderConflictError.ts +8 -0
- package/core/di/errors/NamedDependencyNotFoundError.ts +7 -0
- package/core/di/errors/OptionsValidationError.ts +7 -0
- package/core/di/errors/ProviderNotFoundError.ts +10 -0
- package/core/di/errors/ScopeDisposedError.ts +7 -0
- package/core/di/errors/ScopedServiceFromRootError.ts +9 -0
- package/core/di/errors/ServiceValidationError.ts +7 -0
- package/core/di/errors/index.ts +14 -0
- package/core/di/extensions/activator.ts +39 -0
- package/core/di/extensions/application.ts +117 -0
- package/core/di/extensions/hosted-service.ts +124 -0
- package/core/di/extensions/index.ts +23 -0
- package/core/di/extensions/options-reloadable.ts +137 -0
- package/core/di/extensions/options.ts +91 -0
- package/core/di/extensions/service-provider-token.ts +21 -0
- package/core/di/index.ts +97 -0
- package/core/di/internal/GraphValidator.ts +119 -0
- package/core/di/internal/HostedServicePlan.ts +158 -0
- package/core/di/internal/NamedTokenIndex.ts +55 -0
- package/core/di/internal/OpenGenericRegistration.ts +14 -0
- package/core/di/internal/ResolutionPlan.ts +18 -0
- package/core/di/internal/ResolutionScopeState.ts +19 -0
- package/core/di/internal/ResolutionTracker.ts +153 -0
- package/core/di/internal/ScopeLifecycle.ts +159 -0
- package/core/di/internal/ServiceRegistration.ts +14 -0
- package/core/di/internal/ServiceRegistry.ts +252 -0
- package/core/di/internal/classDeps.ts +38 -0
- package/core/di/internal/disposal.ts +58 -0
- package/core/di/internal/providerDeps.ts +26 -0
- package/core/di/module/DI.ts +146 -0
- package/core/di/module/Global.ts +25 -0
- package/core/di/module/Module.ts +44 -0
- package/core/di/module/ModuleRegistrar.ts +69 -0
- package/core/di/module/autoDeps.ts +39 -0
- package/core/di/module/classProviderHooks.ts +66 -0
- package/core/di/module/collectModuleConfigs.ts +57 -0
- package/core/di/module/collectModuleControllers.ts +53 -0
- package/core/di/module/collectModuleUiProfiles.ts +53 -0
- package/core/di/module/createContainer.ts +261 -0
- package/core/di/module/encapsulation.ts +416 -0
- package/core/di/module/encapsulationHooks.ts +36 -0
- package/core/di/module/generatedProviderAttachments.ts +102 -0
- package/core/di/module/index.ts +41 -0
- package/core/di/module/moduleExtensions.ts +35 -0
- package/core/di/module/moduleNameBinding.ts +136 -0
- package/core/di/module/moduleOwnedProviderContributors.ts +409 -0
- package/core/di/module/providerSelection.ts +90 -0
- package/core/di/module/shortcuts.ts +111 -0
- package/core/di/module/types/BazisModule.ts +71 -0
- package/core/di/module/types/DiRegistrar.ts +24 -0
- package/core/di/module/types/index.ts +2 -0
- package/core/di/provider/index.ts +26 -0
- package/core/di/provider/providerGuards.ts +17 -0
- package/core/di/provider/types/AsyncFactoryProvider.ts +15 -0
- package/core/di/provider/types/ClassProvider.ts +18 -0
- package/core/di/provider/types/FactoryProvider.ts +20 -0
- package/core/di/provider/types/KeyedDependency.ts +20 -0
- package/core/di/provider/types/LazyDependency.ts +31 -0
- package/core/di/provider/types/NamedDependency.ts +16 -0
- package/core/di/provider/types/Provider.ts +10 -0
- package/core/di/provider/types/ProviderDefinition.ts +11 -0
- package/core/di/provider/types/ProviderDependencyList.ts +11 -0
- package/core/di/provider/types/ProviderLifetime.ts +1 -0
- package/core/di/provider/types/ProviderOwnership.ts +7 -0
- package/core/di/provider/types/ResolvedDeps.ts +18 -0
- package/core/di/provider/types/ValueProvider.ts +6 -0
- package/core/di/provider/types/index.ts +13 -0
- package/core/di/token.ts +84 -0
- package/core/di/types/BuildServiceProviderOptions.ts +4 -0
- package/core/di/types/ServiceKey.ts +1 -0
- package/core/di/types/ServiceResolver.ts +16 -0
- package/core/di/types/index.ts +3 -0
- package/core/generatedFingerprint.ts +60 -0
- package/core/generatedRuntime.ts +187 -0
- package/core/grpc/Grpc.module.ts +23 -0
- package/core/grpc/GrpcBinding.contract.ts +35 -0
- package/core/grpc/GrpcCall.ts +73 -0
- package/core/grpc/GrpcClient.ts +172 -0
- package/core/grpc/GrpcClientCall.ts +267 -0
- package/core/grpc/GrpcError.ts +19 -0
- package/core/grpc/GrpcRequest.binding.ts +45 -0
- package/core/grpc/GrpcServer.ts +204 -0
- package/core/grpc/GrpcStatus.ts +8 -0
- package/core/grpc/GrpcTransport.ts +174 -0
- package/core/grpc/Metadata.ts +73 -0
- package/core/grpc/ProtoCodec.ts +225 -0
- package/core/grpc/ProtoParser.ts +192 -0
- package/core/grpc/ProtoReader.ts +34 -0
- package/core/grpc/ProtoSchema.ts +52 -0
- package/core/grpc/ServerCredentials.ts +30 -0
- package/core/grpc/clientContracts.ts +39 -0
- package/core/grpc/contracts.ts +45 -0
- package/core/grpc/decorators.ts +82 -0
- package/core/grpc/grpcClientProvider.ts +9 -0
- package/core/grpc/index.ts +17 -0
- package/core/grpc/moduleControllers.ts +38 -0
- package/core/grpc/protobuf.ts +80 -0
- package/core/grpc/serviceDefinition.ts +20 -0
- package/core/http/Authorization/Authorize.ts +52 -0
- package/core/http/Authorization/authorizeComposer.ts +31 -0
- package/core/http/Authorization/metadata.ts +158 -0
- package/core/http/Binding/ParameterBinder.ts +109 -0
- package/core/http/Binding/RequestModel.ts +27 -0
- package/core/http/Binding/autoBindings.ts +125 -0
- package/core/http/Binding/bindings.ts +19 -0
- package/core/http/Binding/convert.ts +48 -0
- package/core/http/Binding/generatedSpec.ts +18 -0
- package/core/http/Binding/listModelRegistry.ts +47 -0
- package/core/http/Binding/modelBinder.ts +345 -0
- package/core/http/Binding/modelValidator.ts +30 -0
- package/core/http/Binding/requestModelRegistry.ts +117 -0
- package/core/http/Decorators/attributes.ts +92 -0
- package/core/http/Decorators/controller.ts +24 -0
- package/core/http/Decorators/metadata.ts +107 -0
- package/core/http/Decorators/routes.ts +131 -0
- package/core/http/Errors/HttpError.ts +92 -0
- package/core/http/HttpContext/HttpContext.ts +148 -0
- package/core/http/HttpContext/ResponseBuilder.ts +37 -0
- package/core/http/HttpContext/inspectableRedirects.ts +47 -0
- package/core/http/HttpContext/principal.ts +24 -0
- package/core/http/HttpContext/responseLifetime.ts +45 -0
- package/core/http/HttpServer.ts +627 -0
- package/core/http/Middleware/accessLog.ts +90 -0
- package/core/http/Middleware/cors.ts +160 -0
- package/core/http/Middleware/errorHandler.ts +100 -0
- package/core/http/Middleware/pipeline.ts +21 -0
- package/core/http/Middleware/rateLimit.ts +104 -0
- package/core/http/Middleware/securityHeaders.ts +118 -0
- package/core/http/Middleware/types.ts +19 -0
- package/core/http/OpenApi/generatedOpenApiRegistry.ts +102 -0
- package/core/http/OpenApi/openApiDocs.ts +75 -0
- package/core/http/OpenApi/openApiDocument.ts +356 -0
- package/core/http/README.md +139 -0
- package/core/http/Results/HttpResult.ts +19 -0
- package/core/http/Results/normalize.ts +93 -0
- package/core/http/Results/results.ts +70 -0
- package/core/http/Routing/Router.ts +201 -0
- package/core/http/Routing/RouterBuilder.ts +184 -0
- package/core/http/Routing/template.ts +112 -0
- package/core/http/SPEC.md +981 -0
- package/core/http/Versioning/VersionReader.ts +20 -0
- package/core/http/WebSocketUpgrade.ts +29 -0
- package/core/http/composeRouteMiddlewareComposers.ts +21 -0
- package/core/http/correlation/createCorrelationIdMiddleware.ts +79 -0
- package/core/http/httpModule.ts +48 -0
- package/core/http/index.ts +140 -0
- package/core/http/middlewareTokens.ts +48 -0
- package/core/http/options.ts +134 -0
- package/core/http-client/index.ts +105 -0
- package/core/infra/Infra.ts +158 -0
- package/core/infra/InfraConnector.ts +86 -0
- package/core/infra/InfraLifecycle.ts +86 -0
- package/core/infra/cache/RedisDistributedCacheBackend.ts +88 -0
- package/core/infra/cache/RedisDistributedCacheDriver.ts +186 -0
- package/core/infra/cache/index.ts +7 -0
- package/core/infra/connectorConfig.ts +29 -0
- package/core/infra/connectorIdentity.ts +39 -0
- package/core/infra/connectors/codex/CodexAppServer.ts +146 -0
- package/core/infra/connectors/codex/CodexAppServerClient.ts +258 -0
- package/core/infra/connectors/codex/CodexPolicy.ts +114 -0
- package/core/infra/connectors/codex/CodexTurn.ts +133 -0
- package/core/infra/connectors/codex/contracts.ts +82 -0
- package/core/infra/connectors/codex.ts +26 -0
- package/core/infra/connectors/llm.ts +78 -0
- package/core/infra/connectors/llmRouter.ts +443 -0
- package/core/infra/connectors/openaiCompatible.ts +590 -0
- package/core/infra/connectors/openaiTextStream.ts +134 -0
- package/core/infra/connectors/opensearch.ts +307 -0
- package/core/infra/connectors/postgres.ts +105 -0
- package/core/infra/connectors/redis.ts +132 -0
- package/core/infra/index.ts +58 -0
- package/core/kernel/ApplicationLifetime.ts +91 -0
- package/core/kernel/Bazis.ts +73 -0
- package/core/kernel/Environment.ts +53 -0
- package/core/kernel/Kernel.ts +391 -0
- package/core/kernel/KernelBuilder.ts +172 -0
- package/core/kernel/LifecycleCoordinator.ts +204 -0
- package/core/kernel/README.md +66 -0
- package/core/kernel/SupervisedHostedService.ts +147 -0
- package/core/kernel/config/ConfigRegistry.ts +48 -0
- package/core/kernel/config/Configuration.ts +110 -0
- package/core/kernel/config/README.md +62 -0
- package/core/kernel/config/Secret.ts +29 -0
- package/core/kernel/config/addConfigOptions.ts +63 -0
- package/core/kernel/config/defineConfig.ts +211 -0
- package/core/kernel/config/sources.ts +123 -0
- package/core/kernel/correlation/requestContext.ts +57 -0
- package/core/kernel/errors/ConfigKeyMissingError.ts +7 -0
- package/core/kernel/errors/KernelError.ts +7 -0
- package/core/kernel/errors/ShutdownTimeoutError.ts +7 -0
- package/core/kernel/errors/StartupAbortedError.ts +7 -0
- package/core/kernel/errors/StartupTimeoutError.ts +7 -0
- package/core/kernel/errors/index.ts +5 -0
- package/core/kernel/events/EventBus.ts +140 -0
- package/core/kernel/events/EventToken.ts +17 -0
- package/core/kernel/events/eventSubscribers.ts +126 -0
- package/core/kernel/events/kernelEvents.ts +16 -0
- package/core/kernel/events/onEvent.ts +32 -0
- package/core/kernel/health/HealthCheckContracts.ts +42 -0
- package/core/kernel/health/HealthService.ts +93 -0
- package/core/kernel/index.ts +96 -0
- package/core/kernel/internal/awaitAbortable.ts +18 -0
- package/core/kernel/internal/awaitShutdown.ts +21 -0
- package/core/kernel/internal/reportDiagnosticFailure.ts +8 -0
- package/core/kernel/internal/validateTimeout.ts +8 -0
- package/core/kernel/lifecycleHooks.ts +18 -0
- package/core/kernel/logging/ConsoleLogger.ts +68 -0
- package/core/kernel/logging/Logger.ts +22 -0
- package/core/kernel/types/ConfigSource.ts +9 -0
- package/core/kernel/types/EnvironmentName.ts +1 -0
- package/core/kernel/types/KernelOptions.ts +23 -0
- package/core/kernel/types/LifecycleHook.ts +18 -0
- package/core/kernel/types/index.ts +4 -0
- package/core/orm/DATABASE_PROVIDER.ts +5 -0
- package/core/orm/OrmHostedPlan.validator.ts +55 -0
- package/core/orm/OrmLifecycle.ts +146 -0
- package/core/orm/OrmOwnedStoreLifecycle.ts +96 -0
- package/core/orm/buildOrmProviders.ts +152 -0
- package/core/orm/databaseConnector.ts +108 -0
- package/core/orm/encapsulationHook.ts +19 -0
- package/core/orm/index.ts +95 -0
- package/core/orm/listQuery.ts +198 -0
- package/core/orm/ormModule.ts +173 -0
- package/core/orm/ownedStoreContributions.ts +195 -0
- package/core/orm/registerRepositories.ts +27 -0
- package/core/orm/repository.ts +45 -0
- package/core/orm/strictSchemaHostedIdentity.ts +17 -0
- package/core/scripts/agent-codegen.ts +1166 -0
- package/core/scripts/di-generate-target.ts +90 -0
- package/core/scripts/di-generate.ts +1837 -0
- package/core/scripts/orm-predicate-codegen.ts +33 -0
- package/core/scripts/request-model-codegen.ts +326 -0
- package/core/websocket/DESIGN.md +297 -0
- package/core/websocket/WsRateLimiter.ts +101 -0
- package/core/websocket/adapter/adapter.interface.ts +45 -0
- package/core/websocket/adapter/in-memory.adapter.ts +190 -0
- package/core/websocket/adapter/redis-delivery-scripts.ts +135 -0
- package/core/websocket/adapter/redis-delivery-store.ts +86 -0
- package/core/websocket/adapter/redis-operations.ts +33 -0
- package/core/websocket/adapter/redis.adapter.ts +218 -0
- package/core/websocket/codec/binary.codec.ts +87 -0
- package/core/websocket/codec/json.codec.ts +34 -0
- package/core/websocket/codec/packet-codec.interface.ts +17 -0
- package/core/websocket/decorators.ts +165 -0
- package/core/websocket/explorer.ts +126 -0
- package/core/websocket/index.ts +78 -0
- package/core/websocket/middleware.ts +146 -0
- package/core/websocket/packet-codec.ts +75 -0
- package/core/websocket/reliable-delivery.ts +56 -0
- package/core/websocket/session-creation.ts +16 -0
- package/core/websocket/session-manager.ts +856 -0
- package/core/websocket/socket-wrapper.ts +314 -0
- package/core/websocket/topic-cache.ts +59 -0
- package/core/websocket/types.ts +122 -0
- package/core/websocket/websocketModule.ts +96 -0
- package/core/websocket/ws-dispatch.ts +123 -0
- package/core/websocket/ws-server.ts +1707 -0
- package/index.ts +281 -0
- package/library/boundary/diagnostics-v1.ts +136 -0
- package/library/boundary/index.ts +73 -0
- package/library/boundary/json/decodeBoundedJsonV1.ts +518 -0
- package/library/boundary/json/limits-v1.ts +46 -0
- package/library/boundary/json/normalizeBoundedJsonV1.ts +256 -0
- package/library/boundary/json/types-v1.ts +11 -0
- package/library/boundary/schema/boundarySchemaHashV1.ts +6 -0
- package/library/boundary/schema/collectBoundaryValueDiagnosticsV1.ts +325 -0
- package/library/boundary/schema/decodeBoundarySchemaV1.ts +646 -0
- package/library/boundary/schema/index.ts +8 -0
- package/library/boundary/schema/types-v1.ts +99 -0
- package/library/boundary/schema/validateBoundaryValueV1.ts +58 -0
- package/library/boundary/serialization/canonicalJsonV1.ts +66 -0
- package/library/http-client/HttpClient.ts +969 -0
- package/library/http-client/HttpClientFactory.ts +45 -0
- package/library/http-client/errors.ts +68 -0
- package/library/http-client/index.ts +43 -0
- package/library/http-client/interceptors.ts +40 -0
- package/library/http-client/progress.ts +62 -0
- package/library/http-client/redirectProtocol.ts +6 -0
- package/library/http-client/serialize.ts +133 -0
- package/library/http-client/types.ts +174 -0
- package/library/jsonapi/ListQueryError.ts +25 -0
- package/library/jsonapi/ListRequest.ts +37 -0
- package/library/jsonapi/decorators.ts +161 -0
- package/library/jsonapi/document.ts +124 -0
- package/library/jsonapi/index.ts +40 -0
- package/library/jsonapi/parseListQuery.ts +291 -0
- package/library/jsonapi/types.ts +125 -0
- package/library/jwt/JwtEncoder.ts +40 -0
- package/library/jwt/JwtKeyRing.ts +164 -0
- package/library/jwt/JwtValidator.ts +210 -0
- package/library/jwt/TokenIssuer.ts +149 -0
- package/library/jwt/TokenService.ts +51 -0
- package/library/jwt/base64url.ts +61 -0
- package/library/jwt/claims.ts +36 -0
- package/library/jwt/errors.ts +44 -0
- package/library/jwt/index.ts +59 -0
- package/library/jwt/limits.ts +8 -0
- package/library/jwt/signing/Hs256Algorithm.ts +62 -0
- package/library/jwt/signing/Rs256Algorithm.ts +133 -0
- package/library/jwt/signing/SigningAlgorithm.ts +18 -0
- package/library/jwt/signing/pem.ts +30 -0
- package/library/openapi/codegen.ts +875 -0
- package/library/openapi/document.ts +326 -0
- package/library/openapi/index.ts +13 -0
- package/library/openapi/types.ts +69 -0
- package/library/openapi/ui.ts +182 -0
- package/library/orm/DatabaseFacade.ts +209 -0
- package/library/orm/DbContext.ts +107 -0
- package/library/orm/DbContextFactory.ts +25 -0
- package/library/orm/DbContextOptions.ts +33 -0
- package/library/orm/Metadata/DynamicModelBuilder.ts +497 -0
- package/library/orm/Metadata/KeyTuple.ts +36 -0
- package/library/orm/Metadata/ModelBuilder.ts +299 -0
- package/library/orm/Metadata/OrmModel.ts +80 -0
- package/library/orm/Metadata/ValueConverter.ts +57 -0
- package/library/orm/Metadata/conventions.ts +54 -0
- package/library/orm/Metadata/decorators.ts +396 -0
- package/library/orm/Metadata/types.ts +140 -0
- package/library/orm/Providers/OwnedStoreCatalog.reader.ts +1802 -0
- package/library/orm/Providers/PostgresDialect.ts +234 -0
- package/library/orm/Providers/PostgresProvider.ts +1494 -0
- package/library/orm/Providers/PostgresSchema.decoder.ts +107 -0
- package/library/orm/Providers/limits.ts +29 -0
- package/library/orm/Providers/operationDeadline.ts +43 -0
- package/library/orm/Providers/ormOwnedStoreRuntime.ts +19 -0
- package/library/orm/Providers/ormTransactionRuntime.ts +117 -0
- package/library/orm/Providers/propertyConversion.ts +14 -0
- package/library/orm/Providers/resolvedForeignKey.ts +16 -0
- package/library/orm/Providers/transactionCallbacks.ts +45 -0
- package/library/orm/Providers/transactionOutcome.ts +82 -0
- package/library/orm/Providers/transactionScopes.ts +78 -0
- package/library/orm/Providers/types.ts +207 -0
- package/library/orm/Query/DbSet.ts +78 -0
- package/library/orm/Query/EntityQuery.ts +247 -0
- package/library/orm/Query/ImmediateMutations.ts +226 -0
- package/library/orm/Query/IncludeLoader.ts +200 -0
- package/library/orm/Query/QueryPlan.ts +55 -0
- package/library/orm/Query/SqlTranslator.ts +195 -0
- package/library/orm/Query/conditions.ts +127 -0
- package/library/orm/Query/materialize.ts +39 -0
- package/library/orm/README.md +256 -0
- package/library/orm/Repository/README.md +684 -0
- package/library/orm/Repository/Repository.ts +68 -0
- package/library/orm/Saving/CommandBuilder.ts +139 -0
- package/library/orm/Saving/ExecutionStrategy.ts +128 -0
- package/library/orm/Saving/SaveExecutor.ts +413 -0
- package/library/orm/Saving/applyConventions.ts +64 -0
- package/library/orm/Schema/CheckExpression.ts +327 -0
- package/library/orm/Schema/ExactSchemaVerifier.ts +168 -0
- package/library/orm/Schema/ExpectedSchema.ts +43 -0
- package/library/orm/Schema/MigrationRunner.ts +146 -0
- package/library/orm/Schema/Migrator.ts +73 -0
- package/library/orm/Schema/OrmOwnedStore.ts +123 -0
- package/library/orm/Schema/OwnedStoreAdmission.ts +752 -0
- package/library/orm/Schema/OwnedStoreCanonical.ts +273 -0
- package/library/orm/Schema/OwnedStoreCatalog.ts +1325 -0
- package/library/orm/Schema/SafeAdditiveSchema.ts +100 -0
- package/library/orm/Schema/SchemaAdmission.ts +62 -0
- package/library/orm/Schema/SchemaDiffer.ts +78 -0
- package/library/orm/Schema/formatSchemaDifferences.ts +62 -0
- package/library/orm/Schema/introspection.ts +52 -0
- package/library/orm/Schema/physicalColumnTypes.ts +37 -0
- package/library/orm/Schema/tableKey.ts +26 -0
- package/library/orm/Tracking/ChangeTracker.ts +448 -0
- package/library/orm/Tracking/EntityState.ts +13 -0
- package/library/orm/Transactions/OrmTransaction.ts +30 -0
- package/library/orm/Transactions/TransactionScopeCoordinator.ts +377 -0
- package/library/orm/errors.ts +190 -0
- package/library/orm/index.ts +162 -0
- package/library/orm/runtime.ts +14 -0
- package/library/redaction/index.ts +166 -0
- package/library/ui/UiProfile.ts +77 -0
- package/library/ui/compiled-v1.ts +131 -0
- package/library/ui/compiler/compileUiSurfaceV1.ts +717 -0
- package/library/ui/compiler/contracts-v1.ts +25 -0
- package/library/ui/compiler/index.ts +12 -0
- package/library/ui/compiler/openApiIndex.ts +246 -0
- package/library/ui/defineUiProfile.ts +340 -0
- package/library/ui/diagnostics-v1.ts +33 -0
- package/library/ui/index.ts +129 -0
- package/library/ui/profile-v1.ts +191 -0
- package/library/ui/serialization.ts +130 -0
- package/library/ui/uiProfileAuthoring.ts +289 -0
- package/library/ui/uiProfileAuthoringMetadata.ts +78 -0
- package/library/validation/MessageRegistry.ts +144 -0
- package/library/validation/README.md +62 -0
- package/library/validation/RuleCompiler.ts +183 -0
- package/library/validation/RuleEngine.ts +401 -0
- package/library/validation/SPEC.md +579 -0
- package/library/validation/ValidationError.ts +37 -0
- package/library/validation/ValidationResult.ts +63 -0
- package/library/validation/Validator.ts +101 -0
- package/library/validation/index.ts +16 -0
- package/library/validation/metadata.ts +69 -0
- package/library/validation/modelValidatorAdapter.ts +119 -0
- package/library/validation/types/ValidationCode.ts +69 -0
- package/library/validation/types/ValidatorOptions.ts +153 -0
- package/package.json +80 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { MessageRegistry } from "./MessageRegistry";
|
|
2
|
+
import { RuleEngine } from "./RuleEngine";
|
|
3
|
+
import type { ValidationResult } from "./ValidationResult";
|
|
4
|
+
import { registerFieldRule } from "./metadata";
|
|
5
|
+
import type { ValidatorOptions } from "./types/ValidatorOptions";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Field decorator: registers validation rules in the class metadata.
|
|
9
|
+
* Uses standard TC39 decorators (run natively by Bun), without
|
|
10
|
+
* `experimentalDecorators`, `emitDecoratorMetadata` or `reflect-metadata`,
|
|
11
|
+
* so the module compiles into a binary (`bun build --compile`).
|
|
12
|
+
*/
|
|
13
|
+
type FieldDecorator = (value: undefined, context: ClassFieldDecoratorContext) => void;
|
|
14
|
+
|
|
15
|
+
function createFieldDecorator(options: ValidatorOptions): FieldDecorator {
|
|
16
|
+
return (_value, context) => {
|
|
17
|
+
registerFieldRule(context, options);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The single entry point of the validation module.
|
|
23
|
+
*
|
|
24
|
+
* Both a decorator and a "static class":
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* class CreateUserDto {
|
|
28
|
+
* @Validator({ required: true, minLength: 3, maxLength: 50 })
|
|
29
|
+
* username!: string;
|
|
30
|
+
*
|
|
31
|
+
* @Validator({ required: true, email: true })
|
|
32
|
+
* email!: string;
|
|
33
|
+
* }
|
|
34
|
+
*
|
|
35
|
+
* const result = Validator.validate(new CreateUserDto());
|
|
36
|
+
* if (!result.isValid) console.log(result.errors);
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* Guarantees:
|
|
40
|
+
* - class rules are collected and compiled once (WeakMap cache), repeated
|
|
41
|
+
* `validate` calls rebuild nothing;
|
|
42
|
+
* - all errors are collected in one pass; validation does not stop at the first;
|
|
43
|
+
* - exceptions in `custom`/`validateIf` are caught (code `customError`) and
|
|
44
|
+
* validation continues;
|
|
45
|
+
* - values are read only by the field names declared by decorators; service
|
|
46
|
+
* keys (`__proto__` and so on) are never traversed, which protects against
|
|
47
|
+
* prototype pollution.
|
|
48
|
+
*/
|
|
49
|
+
export const Validator = Object.assign(
|
|
50
|
+
/**
|
|
51
|
+
* `@Validator(options)` goes on a class field. A field may have several
|
|
52
|
+
* decorators; all of them run.
|
|
53
|
+
*/
|
|
54
|
+
(options: ValidatorOptions): FieldDecorator => createFieldDecorator(options),
|
|
55
|
+
{
|
|
56
|
+
/**
|
|
57
|
+
* Synchronous validation of an instance.
|
|
58
|
+
*
|
|
59
|
+
* Async `custom` functions are not supported here: if a function returns a
|
|
60
|
+
* Promise, an error with the `asyncCustomInSyncCall` code is added to the
|
|
61
|
+
* result (use {@link Validator.validateAsync}).
|
|
62
|
+
*
|
|
63
|
+
* @param instance Instance of a class with `@Validator` decorators.
|
|
64
|
+
* An object without decorators is valid.
|
|
65
|
+
*/
|
|
66
|
+
validate(instance: object): ValidationResult {
|
|
67
|
+
return RuleEngine.validate(instance);
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Asynchronous validation: awaits all async `custom` functions.
|
|
72
|
+
* Synchronous rules run immediately; the error order is deterministic.
|
|
73
|
+
*/
|
|
74
|
+
validateAsync(instance: object): Promise<ValidationResult> {
|
|
75
|
+
return RuleEngine.validateAsync(instance);
|
|
76
|
+
},
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Globally overrides the standard error messages.
|
|
80
|
+
* Supported placeholders: `{property}`, `{value}`, `{min}`, `{max}`,
|
|
81
|
+
* `{pattern}`, `{contains}`, `{allowed}`, `{expected}`, `{actual}`.
|
|
82
|
+
*
|
|
83
|
+
* Priority: the decorator's local `message` > the ones set here > built-in.
|
|
84
|
+
*
|
|
85
|
+
* ```ts
|
|
86
|
+
* Validator.setDefaultMessages({
|
|
87
|
+
* required: "{property} is required",
|
|
88
|
+
* minLength: "At least {min} characters",
|
|
89
|
+
* });
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
setDefaultMessages(messages: Partial<Record<string, string>>): void {
|
|
93
|
+
MessageRegistry.setDefaults(messages);
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
/** Resets global messages to the built-in ones (handy in tests). */
|
|
97
|
+
resetDefaultMessages(): void {
|
|
98
|
+
MessageRegistry.reset();
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Class validation module of Bazis.
|
|
3
|
+
*
|
|
4
|
+
* Self-contained (Bun APIs only), with no reflection or external dependencies,
|
|
5
|
+
* compatible with binary compilation (`bun build --compile`).
|
|
6
|
+
*
|
|
7
|
+
* The entry point is {@link Validator}: a field decorator plus the static
|
|
8
|
+
* methods `validate` / `validateAsync` / `setDefaultMessages`.
|
|
9
|
+
*/
|
|
10
|
+
export { Validator } from "./Validator";
|
|
11
|
+
export { modelValidatorAdapter } from "./modelValidatorAdapter";
|
|
12
|
+
export { ValidationError } from "./ValidationError";
|
|
13
|
+
export { ValidationResult } from "./ValidationResult";
|
|
14
|
+
export { MessageRegistry, RU_VALIDATION_MESSAGES, type MessageParams } from "./MessageRegistry";
|
|
15
|
+
export { ValidationCodes, type ValidationCode } from "./types/ValidationCode";
|
|
16
|
+
export type { CustomOutcome, CustomValidator, ValidationTypeHint, ValidatorOptions } from "./types/ValidatorOptions";
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { ValidatorOptions } from "./types/ValidatorOptions";
|
|
2
|
+
|
|
3
|
+
// One-line polyfill: Bun runs standard TC39 decorators natively,
|
|
4
|
+
// but Symbol.metadata may be missing at runtime. Symbol.for gives one shared
|
|
5
|
+
// symbol for all module copies.
|
|
6
|
+
(Symbol as { metadata?: symbol }).metadata ??= Symbol.for("Symbol.metadata");
|
|
7
|
+
|
|
8
|
+
/** Key under which validation rules are stored in the class metadata. */
|
|
9
|
+
const FIELD_RULES = Symbol.for("bazis:validation:rules");
|
|
10
|
+
|
|
11
|
+
/** One registered rule: a field + the options of one decorator. */
|
|
12
|
+
export interface FieldRule {
|
|
13
|
+
readonly property: string;
|
|
14
|
+
readonly options: ValidatorOptions;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface RulesMetadata {
|
|
18
|
+
[FIELD_RULES]?: FieldRule[];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Registers a field rule in the class metadata (called by the decorator).
|
|
23
|
+
*
|
|
24
|
+
* TC39 decorator metadata is inherited prototypically: a subclass's metadata
|
|
25
|
+
* object has the parent's metadata as its prototype. So on the first write to a
|
|
26
|
+
* concrete class we copy on write: the inherited rules are copied into the
|
|
27
|
+
* class's own array without mutating the parent's.
|
|
28
|
+
*/
|
|
29
|
+
export function registerFieldRule(context: ClassFieldDecoratorContext, options: ValidatorOptions): void {
|
|
30
|
+
if (context.static) {
|
|
31
|
+
throw new Error(`@Validator: static field "${String(context.name)}" is not supported; the decorator works on instance fields only.`);
|
|
32
|
+
}
|
|
33
|
+
if (context.private) {
|
|
34
|
+
throw new Error(`@Validator: private field "${String(context.name)}" is not supported; values are read through ordinary property access.`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const metadata = context.metadata as RulesMetadata;
|
|
38
|
+
const inherited = metadata[FIELD_RULES];
|
|
39
|
+
if (!Object.prototype.hasOwnProperty.call(metadata, FIELD_RULES)) {
|
|
40
|
+
metadata[FIELD_RULES] = inherited ? [...inherited] : [];
|
|
41
|
+
}
|
|
42
|
+
metadata[FIELD_RULES]!.push({ property: String(context.name), options });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Returns the validation rules of a class (including inherited ones), or
|
|
47
|
+
* `undefined` if the class has no `@Validator` decorators.
|
|
48
|
+
*/
|
|
49
|
+
export function rulesOf(ctor: object | undefined | null): readonly FieldRule[] | undefined {
|
|
50
|
+
if (typeof ctor !== "function") {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const metadata = (ctor as unknown as { [key: symbol]: unknown })[Symbol.metadata as unknown as symbol] as
|
|
54
|
+
| RulesMetadata
|
|
55
|
+
| undefined;
|
|
56
|
+
const rules = metadata?.[FIELD_RULES];
|
|
57
|
+
return rules && rules.length > 0 ? rules : undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Whether the value's class has registered validation rules.
|
|
62
|
+
* Used to auto-detect `nested`.
|
|
63
|
+
*/
|
|
64
|
+
export function hasRules(value: unknown): boolean {
|
|
65
|
+
if (value === null || typeof value !== "object") {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return rulesOf((value as object).constructor) !== undefined;
|
|
69
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { Validator } from "./Validator";
|
|
2
|
+
import { rulesOf } from "./metadata";
|
|
3
|
+
|
|
4
|
+
interface AdapterValidationIssue {
|
|
5
|
+
readonly property: string;
|
|
6
|
+
readonly message: string;
|
|
7
|
+
readonly code?: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Pure adapter of the validation library to the structural request-model
|
|
12
|
+
* validator contract. It deliberately **does not import the kernel**: it returns
|
|
13
|
+
* an object of the shape `{ validate(instance) => { isValid, errors } }`, which is
|
|
14
|
+
* structurally compatible with the `ModelValidator` port from `bazis/core/http`.
|
|
15
|
+
*
|
|
16
|
+
* `runApp` plugs it in by default (unless `options.validator` is given). Outside
|
|
17
|
+
* `runApp`, for example in a test, wire it yourself:
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* import { useModelValidator } from "bazis/core/http";
|
|
21
|
+
* import { modelValidatorAdapter } from "bazis/library/validation";
|
|
22
|
+
*
|
|
23
|
+
* useModelValidator(modelValidatorAdapter);
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* This keeps the library independent of the kernel and the runtime, and the
|
|
27
|
+
* kernel unaware of the concrete validation engine (dependency inversion).
|
|
28
|
+
*/
|
|
29
|
+
export const modelValidatorAdapter = {
|
|
30
|
+
validate(instance: object): {
|
|
31
|
+
readonly isValid: boolean;
|
|
32
|
+
readonly errors: readonly { readonly property: string; readonly message: string; readonly code?: string }[];
|
|
33
|
+
} {
|
|
34
|
+
const result = Validator.validate(instance);
|
|
35
|
+
const nestedInstanceErrors = validateExplicitNestedInstances(instance);
|
|
36
|
+
const errors: AdapterValidationIssue[] = result.errors.map((error) => ({
|
|
37
|
+
property: error.property,
|
|
38
|
+
message: error.message,
|
|
39
|
+
code: error.code,
|
|
40
|
+
}));
|
|
41
|
+
errors.push(...nestedInstanceErrors);
|
|
42
|
+
return {
|
|
43
|
+
isValid: errors.length === 0,
|
|
44
|
+
errors,
|
|
45
|
+
};
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* `nested: true` must never silently validate a plain object with no class
|
|
51
|
+
* metadata. Generated HTTP hydration normally makes every value a DTO
|
|
52
|
+
* instance; this adapter check is the fail-closed guard for stale/missing
|
|
53
|
+
* generated metadata and DTO integrations.
|
|
54
|
+
*/
|
|
55
|
+
function validateExplicitNestedInstances(root: object): AdapterValidationIssue[] {
|
|
56
|
+
const errors: AdapterValidationIssue[] = [];
|
|
57
|
+
inspectExplicitNested(root, "", errors, new Set<object>());
|
|
58
|
+
return errors;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function inspectExplicitNested(
|
|
62
|
+
instance: object,
|
|
63
|
+
prefix: string,
|
|
64
|
+
errors: AdapterValidationIssue[],
|
|
65
|
+
seen: Set<object>,
|
|
66
|
+
): void {
|
|
67
|
+
if (seen.has(instance)) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
seen.add(instance);
|
|
71
|
+
const rules = rulesOf(instance.constructor);
|
|
72
|
+
if (rules === undefined) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const explicitProperties = new Set<string>();
|
|
76
|
+
for (const rule of rules) {
|
|
77
|
+
if (rule.options.nested === true) {
|
|
78
|
+
explicitProperties.add(rule.property);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const property of explicitProperties) {
|
|
82
|
+
const value = (instance as Record<string, unknown>)[property];
|
|
83
|
+
if (value === undefined || value === null) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const path = prefix === "" ? property : `${prefix}.${property}`;
|
|
87
|
+
if (Array.isArray(value)) {
|
|
88
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
89
|
+
inspectNestedValue(value[index], `${path}[${index}]`, errors, seen);
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
inspectNestedValue(value, path, errors, seen);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function inspectNestedValue(
|
|
98
|
+
value: unknown,
|
|
99
|
+
path: string,
|
|
100
|
+
errors: AdapterValidationIssue[],
|
|
101
|
+
seen: Set<object>,
|
|
102
|
+
): void {
|
|
103
|
+
// Validation's established optional/null semantics also apply to nullable
|
|
104
|
+
// array elements; `required` on the owning field handles the field itself.
|
|
105
|
+
if (value === null) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const prototype = typeof value === "object" ? Object.getPrototypeOf(value) as { constructor?: unknown } | null : null;
|
|
109
|
+
const constructor = prototype?.constructor;
|
|
110
|
+
if (typeof value !== "object" || typeof constructor !== "function" || rulesOf(constructor) === undefined) {
|
|
111
|
+
errors.push({
|
|
112
|
+
property: path,
|
|
113
|
+
message: `Field "${path}" must be a hydrated DTO instance`,
|
|
114
|
+
code: "nestedModel",
|
|
115
|
+
});
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
inspectExplicitNested(value, path, errors, seen);
|
|
119
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validation error codes.
|
|
3
|
+
*
|
|
4
|
+
* A code uniquely identifies the rule that failed. The message template is
|
|
5
|
+
* picked by code: the decorator's local `message` > global
|
|
6
|
+
* (`Validator.setDefaultMessages`) > the built-in default.
|
|
7
|
+
*/
|
|
8
|
+
export const ValidationCodes = {
|
|
9
|
+
/** The value is missing (`undefined` or `null`) but the field is required. */
|
|
10
|
+
required: "required",
|
|
11
|
+
/** The string is empty but the rule requires a non-empty one. */
|
|
12
|
+
notEmpty: "notEmpty",
|
|
13
|
+
/** The string is shorter than the minimum. */
|
|
14
|
+
minLength: "minLength",
|
|
15
|
+
/** The string is longer than the maximum. */
|
|
16
|
+
maxLength: "maxLength",
|
|
17
|
+
/** The string length is outside `length: [min, max]`. */
|
|
18
|
+
length: "length",
|
|
19
|
+
/** The string does not contain the required substring. */
|
|
20
|
+
contains: "contains",
|
|
21
|
+
/** The string contains a forbidden substring. */
|
|
22
|
+
notContains: "notContains",
|
|
23
|
+
/** The string does not match the regular expression. */
|
|
24
|
+
pattern: "pattern",
|
|
25
|
+
/** The string is not a valid email address. */
|
|
26
|
+
email: "email",
|
|
27
|
+
/** The string is not a valid URL. */
|
|
28
|
+
url: "url",
|
|
29
|
+
/** The string is not a valid UUID. */
|
|
30
|
+
uuid: "uuid",
|
|
31
|
+
/** The value has the wrong type (see `{expected}` / `{actual}`). */
|
|
32
|
+
type: "type",
|
|
33
|
+
/** The number is below the minimum. */
|
|
34
|
+
min: "min",
|
|
35
|
+
/** The number is above the maximum. */
|
|
36
|
+
max: "max",
|
|
37
|
+
/** The number is outside `range: [min, max]`. */
|
|
38
|
+
range: "range",
|
|
39
|
+
/** The number is not positive. */
|
|
40
|
+
positive: "positive",
|
|
41
|
+
/** The number is not negative. */
|
|
42
|
+
negative: "negative",
|
|
43
|
+
/** The number is not an integer. */
|
|
44
|
+
integer: "integer",
|
|
45
|
+
/** The boolean value is not `true`. */
|
|
46
|
+
mustBeTrue: "mustBeTrue",
|
|
47
|
+
/** The boolean value is not `false`. */
|
|
48
|
+
mustBeFalse: "mustBeFalse",
|
|
49
|
+
/** The value is not in the `enumType` enumeration. */
|
|
50
|
+
enum: "enum",
|
|
51
|
+
/** The string does not parse as JSON. */
|
|
52
|
+
json: "json",
|
|
53
|
+
/** The string is not a valid phone number. */
|
|
54
|
+
phone: "phone",
|
|
55
|
+
/** The value is not a valid date. */
|
|
56
|
+
date: "date",
|
|
57
|
+
/** The `custom` check returned `false` or a string. */
|
|
58
|
+
custom: "custom",
|
|
59
|
+
/** The `custom` check (or `validateIf`) threw an exception. */
|
|
60
|
+
customError: "customError",
|
|
61
|
+
/**
|
|
62
|
+
* An async `custom` check was called through the synchronous `validate()`.
|
|
63
|
+
* Use `Validator.validateAsync()`.
|
|
64
|
+
*/
|
|
65
|
+
asyncCustomInSyncCall: "asyncCustomInSyncCall",
|
|
66
|
+
} as const;
|
|
67
|
+
|
|
68
|
+
/** Union type of all built-in error codes. */
|
|
69
|
+
export type ValidationCode = (typeof ValidationCodes)[keyof typeof ValidationCodes];
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import type { ValidationError } from "../ValidationError";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Hint about the field value type.
|
|
5
|
+
*
|
|
6
|
+
* Optional: the module works without reflection (`emitDecoratorMetadata` and
|
|
7
|
+
* `reflect-metadata` are not used; they conflict with the "no external
|
|
8
|
+
* dependencies" principle), so the expected type is either set explicitly or
|
|
9
|
+
* inferred from the rules themselves (`minLength` implies a string, `min` a
|
|
10
|
+
* number and so on).
|
|
11
|
+
*/
|
|
12
|
+
export type ValidationTypeHint =
|
|
13
|
+
| "string"
|
|
14
|
+
| "number"
|
|
15
|
+
| "boolean"
|
|
16
|
+
| "enum"
|
|
17
|
+
| "json"
|
|
18
|
+
| "phone"
|
|
19
|
+
| "email"
|
|
20
|
+
| "date"
|
|
21
|
+
| "any";
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Result of a `custom` check:
|
|
25
|
+
* - `true` or `void`: the value is valid;
|
|
26
|
+
* - `false`: an error with the standard message (code `custom`);
|
|
27
|
+
* - `string`: an error with this message (code `custom`);
|
|
28
|
+
* - `ValidationError`: added to the result as is.
|
|
29
|
+
*/
|
|
30
|
+
export type CustomOutcome = boolean | string | void | ValidationError;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Custom check. May be synchronous or asynchronous (async checks run only
|
|
34
|
+
* through `Validator.validateAsync`).
|
|
35
|
+
*
|
|
36
|
+
* @param value Current field value.
|
|
37
|
+
* @param instance The whole instance being checked, for cross-field checks
|
|
38
|
+
* such as "if field A equals X, field B is required".
|
|
39
|
+
*/
|
|
40
|
+
export type CustomValidator = (value: unknown, instance: unknown) => CustomOutcome | Promise<CustomOutcome>;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* The rule set of one `@Validator(...)` decorator.
|
|
44
|
+
*
|
|
45
|
+
* A field may have several decorators; all of them run. Rules inside one
|
|
46
|
+
* decorator are checked in a fixed order: `validateIf` -> `required` -> the
|
|
47
|
+
* `type` hint -> string/number/boolean/enum/date rules -> `custom` -> `nested`.
|
|
48
|
+
*/
|
|
49
|
+
export interface ValidatorOptions {
|
|
50
|
+
/** Explicit value type hint. See {@link ValidationTypeHint}. */
|
|
51
|
+
type?: ValidationTypeHint;
|
|
52
|
+
|
|
53
|
+
// ── General ──────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
/** The value is required: `undefined` and `null` are errors (code `required`). */
|
|
56
|
+
required?: boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Conditional validation: if the function returns `false`, all other rules of
|
|
60
|
+
* this decorator are skipped. It gets the whole instance, so it can rely on
|
|
61
|
+
* the values of other fields.
|
|
62
|
+
*/
|
|
63
|
+
validateIf?: (instance: never) => boolean;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Custom check (synchronous or asynchronous).
|
|
67
|
+
* An exception inside the function is caught and turned into a
|
|
68
|
+
* `ValidationError` with the `customError` code; validation continues.
|
|
69
|
+
*/
|
|
70
|
+
custom?: CustomValidator;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Local error message for all rules of this decorator.
|
|
74
|
+
* Has the highest priority (above `Validator.setDefaultMessages`).
|
|
75
|
+
* Supports placeholders: `{property}`, `{value}`, `{min}`, `{max}`,
|
|
76
|
+
* `{pattern}`, `{contains}`, `{allowed}`, `{expected}`, `{actual}`.
|
|
77
|
+
*/
|
|
78
|
+
message?: string;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Recursive check of the value as a class with `@Validator` decorators.
|
|
82
|
+
* If not set, it turns on automatically when the field value is an instance
|
|
83
|
+
* of a class with registered rules. `nested: false` turns off the auto mode.
|
|
84
|
+
* Arrays are checked element by element (`items[0].name`); circular
|
|
85
|
+
* references are safely skipped.
|
|
86
|
+
*/
|
|
87
|
+
nested?: boolean;
|
|
88
|
+
|
|
89
|
+
// ── Strings ──────────────────────────────────────────────────────────────
|
|
90
|
+
|
|
91
|
+
/** The string must not be empty (`""`). */
|
|
92
|
+
notEmpty?: boolean;
|
|
93
|
+
/** Minimum string length (inclusive). */
|
|
94
|
+
minLength?: number;
|
|
95
|
+
/** Maximum string length (inclusive); exceeding it skips this decorator's content checks. */
|
|
96
|
+
maxLength?: number;
|
|
97
|
+
/** String length range `[min, max]` (inclusive); exceeding max skips this decorator's content checks. */
|
|
98
|
+
length?: readonly [number, number];
|
|
99
|
+
/** The string must contain the substring. */
|
|
100
|
+
contains?: string;
|
|
101
|
+
/** The string must not contain the substring. */
|
|
102
|
+
notContains?: string;
|
|
103
|
+
/**
|
|
104
|
+
* Regular expression (a RegExp or a source string).
|
|
105
|
+
* Compiled once on the first access to the class and cached.
|
|
106
|
+
* For untrusted input set maxLength/length in the same decorator.
|
|
107
|
+
*/
|
|
108
|
+
pattern?: RegExp | string;
|
|
109
|
+
/** The string must be a valid email address. */
|
|
110
|
+
email?: boolean;
|
|
111
|
+
/** The string must be a valid URL (checked with `URL.canParse`). */
|
|
112
|
+
url?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* The string must be a valid UUID (versions 1–8, including v4 from
|
|
115
|
+
* `crypto.randomUUID()` and v7 from `Bun.randomUUIDv7()`; the nil UUID is allowed).
|
|
116
|
+
*/
|
|
117
|
+
uuid?: boolean;
|
|
118
|
+
/** The string must parse as JSON. */
|
|
119
|
+
json?: boolean;
|
|
120
|
+
/** The string must be a phone number: an optional `+`, 7–15 digits; spaces, hyphens and parentheses are allowed. */
|
|
121
|
+
phone?: boolean;
|
|
122
|
+
|
|
123
|
+
// ── Numbers ──────────────────────────────────────────────────────────────
|
|
124
|
+
|
|
125
|
+
/** The number is not less than this value. */
|
|
126
|
+
min?: number;
|
|
127
|
+
/** The number is not greater than this value. */
|
|
128
|
+
max?: number;
|
|
129
|
+
/** The number is in the `[min, max]` range (inclusive). */
|
|
130
|
+
range?: readonly [number, number];
|
|
131
|
+
/** The number is strictly greater than zero. */
|
|
132
|
+
positive?: boolean;
|
|
133
|
+
/** The number is strictly less than zero. */
|
|
134
|
+
negative?: boolean;
|
|
135
|
+
/** The number must be an integer. */
|
|
136
|
+
integer?: boolean;
|
|
137
|
+
|
|
138
|
+
// ── Boolean ──────────────────────────────────────────────────────────────
|
|
139
|
+
|
|
140
|
+
/** The value must be exactly `true` (for example, accepting terms). */
|
|
141
|
+
mustBeTrue?: boolean;
|
|
142
|
+
/** The value must be exactly `false`. */
|
|
143
|
+
mustBeFalse?: boolean;
|
|
144
|
+
|
|
145
|
+
// ── Enum ─────────────────────────────────────────────────────────────────
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Enum object whose values must include the field value.
|
|
149
|
+
* TypeScript string and numeric enums are supported (reverse keys of numeric
|
|
150
|
+
* enums are ignored).
|
|
151
|
+
*/
|
|
152
|
+
enumType?: Record<string, string | number>;
|
|
153
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bazis",
|
|
3
|
+
"version": "0.96.1",
|
|
4
|
+
"description": "Modular backend framework for Bun in TypeScript: DI wired by codegen, HTTP, a PostgreSQL ORM, JWT, WebSocket, agents and a CLI.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Alexander Alenin",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/asus97178/bazis.git",
|
|
10
|
+
"directory": "src/bazis"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/asus97178/bazis/tree/main/src/bazis#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/asus97178/bazis/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"bun",
|
|
18
|
+
"typescript",
|
|
19
|
+
"framework",
|
|
20
|
+
"dependency-injection",
|
|
21
|
+
"orm",
|
|
22
|
+
"postgresql",
|
|
23
|
+
"http",
|
|
24
|
+
"websocket",
|
|
25
|
+
"codegen"
|
|
26
|
+
],
|
|
27
|
+
"type": "module",
|
|
28
|
+
"module": "./index.ts",
|
|
29
|
+
"exports": {
|
|
30
|
+
".": "./index.ts",
|
|
31
|
+
"./core/agent": "./core/agent/index.ts",
|
|
32
|
+
"./core/app": "./core/app/index.ts",
|
|
33
|
+
"./core/background": "./core/background/index.ts",
|
|
34
|
+
"./core/cache": "./core/cache/index.ts",
|
|
35
|
+
"./core/di": "./core/di/index.ts",
|
|
36
|
+
"./core/generatedRuntime": "./core/generatedRuntime.ts",
|
|
37
|
+
"./core/grpc": "./core/grpc/index.ts",
|
|
38
|
+
"./core/http": "./core/http/index.ts",
|
|
39
|
+
"./core/http-client": "./core/http-client/index.ts",
|
|
40
|
+
"./core/http/OpenApi/generatedOpenApiRegistry": "./core/http/OpenApi/generatedOpenApiRegistry.ts",
|
|
41
|
+
"./core/infra": "./core/infra/index.ts",
|
|
42
|
+
"./core/kernel": "./core/kernel/index.ts",
|
|
43
|
+
"./core/orm": "./core/orm/index.ts",
|
|
44
|
+
"./core/websocket": "./core/websocket/index.ts",
|
|
45
|
+
"./library/boundary": "./library/boundary/index.ts",
|
|
46
|
+
"./library/http-client": "./library/http-client/index.ts",
|
|
47
|
+
"./library/jsonapi": "./library/jsonapi/index.ts",
|
|
48
|
+
"./library/jwt": "./library/jwt/index.ts",
|
|
49
|
+
"./library/openapi": "./library/openapi/index.ts",
|
|
50
|
+
"./library/orm": "./library/orm/index.ts",
|
|
51
|
+
"./library/redaction": "./library/redaction/index.ts",
|
|
52
|
+
"./library/ui": "./library/ui/index.ts",
|
|
53
|
+
"./library/validation": "./library/validation/index.ts"
|
|
54
|
+
},
|
|
55
|
+
"bin": {
|
|
56
|
+
"bazis": "./cli/main.ts"
|
|
57
|
+
},
|
|
58
|
+
"files": [
|
|
59
|
+
"index.ts",
|
|
60
|
+
"core",
|
|
61
|
+
"library",
|
|
62
|
+
"cli",
|
|
63
|
+
"README.md",
|
|
64
|
+
"LICENSE",
|
|
65
|
+
"!**/test",
|
|
66
|
+
"!**/*.test.ts",
|
|
67
|
+
"!**/*.spec.ts",
|
|
68
|
+
"!**/MODULE.md"
|
|
69
|
+
],
|
|
70
|
+
"engines": {
|
|
71
|
+
"bun": ">=1.4.0"
|
|
72
|
+
},
|
|
73
|
+
"peerDependencies": {
|
|
74
|
+
"typescript": "^5.9.3"
|
|
75
|
+
},
|
|
76
|
+
"publishConfig": {
|
|
77
|
+
"access": "public",
|
|
78
|
+
"provenance": true
|
|
79
|
+
}
|
|
80
|
+
}
|