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,289 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process-local authoring contracts for `@UiProfile()`.
|
|
3
|
+
*
|
|
4
|
+
* These declarations deliberately keep controller and request-model class
|
|
5
|
+
* references. They are application metadata, not the JSON wire contract. A
|
|
6
|
+
* higher layer may resolve them against HTTP/OpenAPI metadata and only then
|
|
7
|
+
* produce a serializable `UiProfileV1`.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export type UiAuthoringClass<T = object> = abstract new (...args: any[]) => T;
|
|
11
|
+
export type UiControllerClass<T = object> = UiAuthoringClass<T>;
|
|
12
|
+
export type UiRequestClass<T = object> = UiAuthoringClass<T>;
|
|
13
|
+
|
|
14
|
+
export type UiControllerMethodKey<Controller extends UiControllerClass> = {
|
|
15
|
+
[Key in keyof InstanceType<Controller>]-?: InstanceType<Controller>[Key] extends
|
|
16
|
+
(...args: any[]) => unknown
|
|
17
|
+
? Key
|
|
18
|
+
: never;
|
|
19
|
+
}[keyof InstanceType<Controller>] & string;
|
|
20
|
+
|
|
21
|
+
export type UiControllerMethod<Controller extends UiControllerClass> =
|
|
22
|
+
InstanceType<Controller>[UiControllerMethodKey<Controller>] & ((...args: any[]) => unknown);
|
|
23
|
+
|
|
24
|
+
export type UiDataFieldKey<Model> = unknown extends Model
|
|
25
|
+
? string
|
|
26
|
+
: {
|
|
27
|
+
[Key in keyof Model]-?: Model[Key] extends (...args: any[]) => unknown
|
|
28
|
+
? never
|
|
29
|
+
: Key;
|
|
30
|
+
}[keyof Model] & string;
|
|
31
|
+
|
|
32
|
+
export type UiResponseReference<Response = unknown> = UiAuthoringClass<Response>;
|
|
33
|
+
|
|
34
|
+
export type UiResponseValue<Reference> = Reference extends UiAuthoringClass<infer Response>
|
|
35
|
+
? Response
|
|
36
|
+
: unknown;
|
|
37
|
+
|
|
38
|
+
export type UiRequestValue<Reference> = Reference extends UiRequestClass<infer Request>
|
|
39
|
+
? Request
|
|
40
|
+
: unknown;
|
|
41
|
+
|
|
42
|
+
export interface UiControllerMethodReference<Controller extends UiControllerClass = UiControllerClass> {
|
|
43
|
+
readonly kind: "ui-controller-method";
|
|
44
|
+
readonly controller: Controller;
|
|
45
|
+
readonly action: UiControllerMethod<Controller>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Captures exact controller-action identity for an explicit CRUD operation. */
|
|
49
|
+
export function uiOperation<Controller extends UiControllerClass>(
|
|
50
|
+
controller: Controller,
|
|
51
|
+
action: UiControllerMethod<Controller>,
|
|
52
|
+
): UiControllerMethodReference<Controller> {
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
kind: "ui-controller-method",
|
|
55
|
+
controller,
|
|
56
|
+
action,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface UiEndpointAuthoringOptions<
|
|
61
|
+
Request extends UiRequestClass | undefined = undefined,
|
|
62
|
+
Response extends UiResponseReference | undefined = undefined,
|
|
63
|
+
> {
|
|
64
|
+
readonly request?: Request;
|
|
65
|
+
readonly response?: Response;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface UiEndpointReference<
|
|
69
|
+
Controller extends UiControllerClass = UiControllerClass,
|
|
70
|
+
Request extends UiRequestClass | undefined = UiRequestClass | undefined,
|
|
71
|
+
Response extends UiResponseReference | undefined = UiResponseReference | undefined,
|
|
72
|
+
> {
|
|
73
|
+
readonly kind: "ui-endpoint";
|
|
74
|
+
readonly controller: Controller;
|
|
75
|
+
readonly action: UiControllerMethod<Controller>;
|
|
76
|
+
readonly request?: Request;
|
|
77
|
+
readonly response?: Response;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Captures exact controller-action identity plus optional nominal request and
|
|
82
|
+
* response assertions.
|
|
83
|
+
*/
|
|
84
|
+
export function uiEndpoint<
|
|
85
|
+
Controller extends UiControllerClass,
|
|
86
|
+
Request extends UiRequestClass | undefined = undefined,
|
|
87
|
+
Response extends UiResponseReference | undefined = undefined,
|
|
88
|
+
>(
|
|
89
|
+
controller: Controller,
|
|
90
|
+
action: UiControllerMethod<Controller>,
|
|
91
|
+
assertions?: UiEndpointAuthoringOptions<Request, Response>,
|
|
92
|
+
): UiEndpointReference<Controller, Request, Response>;
|
|
93
|
+
export function uiEndpoint<
|
|
94
|
+
Controller extends UiControllerClass,
|
|
95
|
+
Request extends UiRequestClass | undefined = undefined,
|
|
96
|
+
Response extends UiResponseReference | undefined = undefined,
|
|
97
|
+
>(
|
|
98
|
+
controller: Controller,
|
|
99
|
+
action: UiControllerMethod<Controller>,
|
|
100
|
+
assertions: UiEndpointAuthoringOptions<Request, Response> = {},
|
|
101
|
+
): UiEndpointReference<Controller, Request, Response> {
|
|
102
|
+
return Object.freeze({
|
|
103
|
+
kind: "ui-endpoint",
|
|
104
|
+
controller,
|
|
105
|
+
action,
|
|
106
|
+
...(assertions.request !== undefined ? { request: assertions.request } : {}),
|
|
107
|
+
...(assertions.response !== undefined ? { response: assertions.response } : {}),
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface UiProfileOperations<Controller extends UiControllerClass> {
|
|
112
|
+
readonly list?: UiControllerMethodReference<Controller>;
|
|
113
|
+
readonly read?: UiControllerMethodReference<Controller>;
|
|
114
|
+
readonly create?: UiControllerMethodReference<Controller>;
|
|
115
|
+
readonly update?: UiControllerMethodReference<Controller>;
|
|
116
|
+
readonly delete?: UiControllerMethodReference<Controller>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface UiProfileNavigationOverride {
|
|
120
|
+
readonly title?: string;
|
|
121
|
+
readonly group?: string;
|
|
122
|
+
readonly icon?: string;
|
|
123
|
+
readonly order?: number;
|
|
124
|
+
readonly hidden?: boolean;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export interface UiListFieldOverride {
|
|
128
|
+
readonly hidden?: boolean;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export interface UiFormFieldOverride {
|
|
132
|
+
readonly label?: string;
|
|
133
|
+
readonly hidden?: boolean;
|
|
134
|
+
readonly options?: Readonly<Record<string, unknown>>;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Typed field selection keyed by real response/request properties.
|
|
139
|
+
*/
|
|
140
|
+
export type UiFieldSelection<Model = unknown> = Partial<Readonly<Record<
|
|
141
|
+
UiDataFieldKey<Model>,
|
|
142
|
+
UiListFieldOverride
|
|
143
|
+
>>>;
|
|
144
|
+
|
|
145
|
+
export type UiFormFieldMap<Model = unknown> = Partial<Readonly<Record<
|
|
146
|
+
UiDataFieldKey<Model>,
|
|
147
|
+
UiFormFieldOverride
|
|
148
|
+
>>>;
|
|
149
|
+
|
|
150
|
+
export type UiSortField<Model> =
|
|
151
|
+
| UiDataFieldKey<Model>
|
|
152
|
+
| `-${UiDataFieldKey<Model>}`;
|
|
153
|
+
|
|
154
|
+
export interface UiListAuthoringOverride<
|
|
155
|
+
Response = unknown,
|
|
156
|
+
Request extends UiRequestClass | undefined = undefined,
|
|
157
|
+
> {
|
|
158
|
+
/** Optional direct list-request contract; filters/sort are typed from it. */
|
|
159
|
+
readonly request?: Request;
|
|
160
|
+
readonly title?: string;
|
|
161
|
+
readonly columns?: UiFieldSelection<Response>;
|
|
162
|
+
readonly filters?: UiFieldSelection<UiRequestValue<Request>>;
|
|
163
|
+
readonly defaultSort?: UiSortField<UiRequestValue<Request>>;
|
|
164
|
+
readonly pageSize?: number;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export interface UiFormAuthoringOverride<
|
|
168
|
+
Request extends UiRequestClass | undefined = undefined,
|
|
169
|
+
> {
|
|
170
|
+
/** Direct request contract; validation facts remain owned by this class. */
|
|
171
|
+
readonly request?: Request;
|
|
172
|
+
readonly title?: string;
|
|
173
|
+
readonly fields?: UiFormFieldMap<UiRequestValue<Request>>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export type UiActionIntentOverride = "primary" | "secondary" | "danger" | "neutral";
|
|
177
|
+
|
|
178
|
+
export type UiActionPlacementOverride =
|
|
179
|
+
| "list.header"
|
|
180
|
+
| "list.row"
|
|
181
|
+
| "detail.header";
|
|
182
|
+
|
|
183
|
+
export interface UiDeleteAuthoringOverride {
|
|
184
|
+
readonly title?: string;
|
|
185
|
+
readonly intent?: UiActionIntentOverride;
|
|
186
|
+
readonly confirm?: string;
|
|
187
|
+
readonly placements?: readonly UiActionPlacementOverride[];
|
|
188
|
+
readonly refresh?: "none" | "resource" | "page" | "all";
|
|
189
|
+
readonly hidden?: boolean;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export interface UiCustomPageBaseAuthoring {
|
|
193
|
+
readonly id: string;
|
|
194
|
+
readonly title: string;
|
|
195
|
+
readonly navigation?: UiProfileNavigationOverride;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface UiSettingsPageAuthoring extends UiCustomPageBaseAuthoring {
|
|
199
|
+
readonly kind: "settings";
|
|
200
|
+
readonly read: UiEndpointReference;
|
|
201
|
+
readonly update: UiEndpointReference;
|
|
202
|
+
readonly form?: {
|
|
203
|
+
readonly title?: string;
|
|
204
|
+
readonly fields?: UiFormFieldMap<any>;
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export interface UiDocumentPageAuthoring extends UiCustomPageBaseAuthoring {
|
|
209
|
+
readonly kind: "document";
|
|
210
|
+
readonly load: UiEndpointReference;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export interface UiDashboardBlockAuthoring {
|
|
214
|
+
readonly id: string;
|
|
215
|
+
readonly kind: "metric" | "document";
|
|
216
|
+
readonly title: string;
|
|
217
|
+
readonly load: UiEndpointReference;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export interface UiDashboardPageAuthoring extends UiCustomPageBaseAuthoring {
|
|
221
|
+
readonly kind: "dashboard";
|
|
222
|
+
readonly blocks: readonly UiDashboardBlockAuthoring[];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** Feature-owned client page. Transport remains outside the UI profile. */
|
|
226
|
+
export interface UiFeaturePageAuthoring extends UiCustomPageBaseAuthoring {
|
|
227
|
+
readonly kind: "feature";
|
|
228
|
+
readonly renderer: string;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export type UiCustomPageAuthoring =
|
|
232
|
+
| UiSettingsPageAuthoring
|
|
233
|
+
| UiDocumentPageAuthoring
|
|
234
|
+
| UiDashboardPageAuthoring
|
|
235
|
+
| UiFeaturePageAuthoring;
|
|
236
|
+
|
|
237
|
+
/** Page-only profile; feature modules keep one local profile per owner. */
|
|
238
|
+
export interface UiCustomPagesProfileAuthoringOptions {
|
|
239
|
+
readonly surface: string;
|
|
240
|
+
readonly customPages: readonly UiCustomPageAuthoring[];
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Application-facing UI profile. Everything except the process-local source
|
|
245
|
+
* references is presentation intent; transport, validation and authorization
|
|
246
|
+
* remain owned by HTTP/OpenAPI/policy layers.
|
|
247
|
+
*/
|
|
248
|
+
export interface UiProfileAuthoringOptions<
|
|
249
|
+
Controller extends UiControllerClass = UiControllerClass,
|
|
250
|
+
Response extends UiResponseReference | undefined = undefined,
|
|
251
|
+
ListRequest extends UiRequestClass | undefined = undefined,
|
|
252
|
+
CreateRequest extends UiRequestClass | undefined = undefined,
|
|
253
|
+
EditRequest extends UiRequestClass | undefined = undefined,
|
|
254
|
+
> {
|
|
255
|
+
readonly surface: string;
|
|
256
|
+
readonly controller: Controller;
|
|
257
|
+
readonly response?: Response;
|
|
258
|
+
/** Stable UI resource id; inferred from a simple controller prefix when omitted. */
|
|
259
|
+
readonly id?: string;
|
|
260
|
+
readonly title?: string;
|
|
261
|
+
readonly singularTitle?: string;
|
|
262
|
+
readonly navigation?: UiProfileNavigationOverride;
|
|
263
|
+
readonly readonly?: boolean;
|
|
264
|
+
/** Advanced overrides keyed by semantic operation name. */
|
|
265
|
+
readonly operations?: UiProfileOperations<Controller>;
|
|
266
|
+
readonly list?: UiListAuthoringOverride<UiResponseValue<Response>, ListRequest>;
|
|
267
|
+
readonly create?: UiFormAuthoringOverride<CreateRequest>;
|
|
268
|
+
readonly edit?: UiFormAuthoringOverride<EditRequest>;
|
|
269
|
+
readonly delete?: UiDeleteAuthoringOverride;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Broad runtime form used only by metadata readers. */
|
|
273
|
+
/** Broad metadata-reader shape; decorator overloads retain strict authoring types. */
|
|
274
|
+
export interface AnyUiProfileAuthoringOptions {
|
|
275
|
+
readonly surface: string;
|
|
276
|
+
readonly controller?: UiControllerClass;
|
|
277
|
+
readonly response?: UiResponseReference;
|
|
278
|
+
readonly id?: string;
|
|
279
|
+
readonly title?: string;
|
|
280
|
+
readonly singularTitle?: string;
|
|
281
|
+
readonly navigation?: UiProfileNavigationOverride;
|
|
282
|
+
readonly readonly?: boolean;
|
|
283
|
+
readonly operations?: UiProfileOperations<any>;
|
|
284
|
+
readonly list?: UiListAuthoringOverride<any, any>;
|
|
285
|
+
readonly create?: UiFormAuthoringOverride<any>;
|
|
286
|
+
readonly edit?: UiFormAuthoringOverride<any>;
|
|
287
|
+
readonly delete?: UiDeleteAuthoringOverride;
|
|
288
|
+
readonly customPages?: readonly UiCustomPageAuthoring[];
|
|
289
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { AnyUiProfileAuthoringOptions } from "./uiProfileAuthoring";
|
|
2
|
+
|
|
3
|
+
// Bun executes TC39 decorators natively, but Symbol.metadata may be absent.
|
|
4
|
+
(Symbol as { metadata?: symbol }).metadata ??= Symbol.for("Symbol.metadata");
|
|
5
|
+
|
|
6
|
+
const UI_PROFILE_AUTHORING_META = Symbol.for("bazis:ui-profile:authoring");
|
|
7
|
+
|
|
8
|
+
export interface UiProfileAuthoringMetadata {
|
|
9
|
+
readonly target: object;
|
|
10
|
+
readonly targetName: string;
|
|
11
|
+
/** The original process-local authoring object, preserved by identity. */
|
|
12
|
+
readonly profile: AnyUiProfileAuthoringOptions;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface UiProfileAuthoringCarrier {
|
|
16
|
+
[UI_PROFILE_AUTHORING_META]?: UiProfileAuthoringMetadata;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface NamedConstructor {
|
|
20
|
+
readonly name?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function classNameOf(target: object): string {
|
|
24
|
+
return (target as NamedConstructor).name?.trim() || "<anonymous UI profile>";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function readCarrier(ctor: object): UiProfileAuthoringCarrier | undefined {
|
|
28
|
+
return (ctor as { [key: symbol]: unknown })[Symbol.metadata as unknown as symbol] as
|
|
29
|
+
| UiProfileAuthoringCarrier
|
|
30
|
+
| undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function defineUiProfileAuthoringMetadata(
|
|
34
|
+
target: object,
|
|
35
|
+
metadata: object,
|
|
36
|
+
profile: AnyUiProfileAuthoringOptions,
|
|
37
|
+
): void {
|
|
38
|
+
freezeAuthoringValue(profile, new WeakSet<object>());
|
|
39
|
+
(metadata as UiProfileAuthoringCarrier)[UI_PROFILE_AUTHORING_META] = Object.freeze({
|
|
40
|
+
target,
|
|
41
|
+
targetName: classNameOf(target),
|
|
42
|
+
profile,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function freezeAuthoringValue(value: unknown, seen: WeakSet<object>): void {
|
|
47
|
+
if (value === null || typeof value !== "object" || seen.has(value)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
seen.add(value);
|
|
51
|
+
if (Array.isArray(value)) {
|
|
52
|
+
for (const item of value) {
|
|
53
|
+
freezeAuthoringValue(item, seen);
|
|
54
|
+
}
|
|
55
|
+
Object.freeze(value);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const prototype = Object.getPrototypeOf(value);
|
|
59
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
for (const item of Object.values(value as Readonly<Record<string, unknown>>)) {
|
|
63
|
+
freezeAuthoringValue(item, seen);
|
|
64
|
+
}
|
|
65
|
+
Object.freeze(value);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function uiProfileAuthoringMetadataOf(ctor: object): UiProfileAuthoringMetadata | undefined {
|
|
69
|
+
const metadata = readCarrier(ctor);
|
|
70
|
+
if (!metadata || !Object.prototype.hasOwnProperty.call(metadata, UI_PROFILE_AUTHORING_META)) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return metadata[UI_PROFILE_AUTHORING_META];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function isUiProfileAuthoringClass(value: unknown): value is object {
|
|
77
|
+
return typeof value === "function" && uiProfileAuthoringMetadataOf(value) !== undefined;
|
|
78
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parameters substituted into message placeholders.
|
|
3
|
+
* The key is the placeholder name without braces: `{min}` -> `min`.
|
|
4
|
+
*/
|
|
5
|
+
export type MessageParams = Readonly<Record<string, unknown>>;
|
|
6
|
+
|
|
7
|
+
/** Built-in default messages (English). */
|
|
8
|
+
const BUILT_IN: Readonly<Record<string, string>> = {
|
|
9
|
+
required: 'Field "{property}" is required',
|
|
10
|
+
notEmpty: 'Field "{property}" must not be empty',
|
|
11
|
+
minLength: 'Field "{property}" must be at least {min} characters long',
|
|
12
|
+
maxLength: 'Field "{property}" must be at most {max} characters long',
|
|
13
|
+
length: 'Field "{property}" must be {min} to {max} characters long',
|
|
14
|
+
contains: 'Field "{property}" must contain "{contains}"',
|
|
15
|
+
notContains: 'Field "{property}" must not contain "{contains}"',
|
|
16
|
+
pattern: 'Field "{property}" does not match the format {pattern}',
|
|
17
|
+
email: 'Field "{property}" must be a valid email address',
|
|
18
|
+
url: 'Field "{property}" must be a valid URL',
|
|
19
|
+
uuid: 'Field "{property}" must be a valid UUID',
|
|
20
|
+
type: 'Field "{property}" must be of type {expected}, got: {actual}',
|
|
21
|
+
min: 'Field "{property}" must be at least {min}',
|
|
22
|
+
max: 'Field "{property}" must be at most {max}',
|
|
23
|
+
range: 'Field "{property}" must be between {min} and {max}',
|
|
24
|
+
positive: 'Field "{property}" must be a positive number',
|
|
25
|
+
negative: 'Field "{property}" must be a negative number',
|
|
26
|
+
integer: 'Field "{property}" must be an integer',
|
|
27
|
+
mustBeTrue: 'Field "{property}" must be true',
|
|
28
|
+
mustBeFalse: 'Field "{property}" must be false',
|
|
29
|
+
enum: 'Field "{property}" must be one of: {allowed}',
|
|
30
|
+
json: 'Field "{property}" must be a valid JSON string',
|
|
31
|
+
phone: 'Field "{property}" must be a valid phone number',
|
|
32
|
+
date: 'Field "{property}" must be a valid date',
|
|
33
|
+
custom: 'Field "{property}" failed a custom check',
|
|
34
|
+
customError: 'Check of field "{property}" failed with an error: {error}',
|
|
35
|
+
asyncCustomInSyncCall:
|
|
36
|
+
'Field "{property}": an async custom check is not supported by synchronous validate(); use validateAsync()',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Russian texts for every built-in code. Apply once at startup:
|
|
41
|
+
* `MessageRegistry.setDefaults(RU_VALIDATION_MESSAGES)`.
|
|
42
|
+
*/
|
|
43
|
+
export const RU_VALIDATION_MESSAGES: Readonly<Record<string, string>> = Object.freeze({
|
|
44
|
+
required: 'Поле "{property}" обязательно для заполнения',
|
|
45
|
+
notEmpty: 'Поле "{property}" не должно быть пустым',
|
|
46
|
+
minLength: 'Поле "{property}" должно содержать не менее {min} символов',
|
|
47
|
+
maxLength: 'Поле "{property}" должно содержать не более {max} символов',
|
|
48
|
+
length: 'Поле "{property}" должно содержать от {min} до {max} символов',
|
|
49
|
+
contains: 'Поле "{property}" должно содержать "{contains}"',
|
|
50
|
+
notContains: 'Поле "{property}" не должно содержать "{contains}"',
|
|
51
|
+
pattern: 'Поле "{property}" не соответствует формату {pattern}',
|
|
52
|
+
email: 'Поле "{property}" должно быть корректным email-адресом',
|
|
53
|
+
url: 'Поле "{property}" должно быть корректным URL',
|
|
54
|
+
uuid: 'Поле "{property}" должно быть корректным UUID',
|
|
55
|
+
type: 'Поле "{property}" должно иметь тип {expected}, получено: {actual}',
|
|
56
|
+
min: 'Поле "{property}" должно быть не меньше {min}',
|
|
57
|
+
max: 'Поле "{property}" должно быть не больше {max}',
|
|
58
|
+
range: 'Поле "{property}" должно быть в диапазоне от {min} до {max}',
|
|
59
|
+
positive: 'Поле "{property}" должно быть положительным числом',
|
|
60
|
+
negative: 'Поле "{property}" должно быть отрицательным числом',
|
|
61
|
+
integer: 'Поле "{property}" должно быть целым числом',
|
|
62
|
+
mustBeTrue: 'Поле "{property}" должно быть равно true',
|
|
63
|
+
mustBeFalse: 'Поле "{property}" должно быть равно false',
|
|
64
|
+
enum: 'Поле "{property}" должно быть одним из: {allowed}',
|
|
65
|
+
json: 'Поле "{property}" должно быть корректной JSON-строкой',
|
|
66
|
+
phone: 'Поле "{property}" должно быть корректным номером телефона',
|
|
67
|
+
date: 'Поле "{property}" должно быть корректной датой',
|
|
68
|
+
custom: 'Поле "{property}" не прошло пользовательскую проверку',
|
|
69
|
+
customError: 'Проверка поля "{property}" завершилась ошибкой: {error}',
|
|
70
|
+
asyncCustomInSyncCall:
|
|
71
|
+
'Поле "{property}": асинхронная custom-проверка не поддерживается синхронным validate(), используйте validateAsync()',
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Registry of error message templates.
|
|
76
|
+
*
|
|
77
|
+
* Template priority: the decorator's local `message` > global (`setDefaults`)
|
|
78
|
+
* > built-in. `{name}` placeholders are replaced with values from the error
|
|
79
|
+
* parameters; unknown placeholders stay as is (no exceptions: resilience
|
|
80
|
+
* matters more than strictness here).
|
|
81
|
+
*/
|
|
82
|
+
export class MessageRegistry {
|
|
83
|
+
/** Current global templates: a copy of the built-in ones + overrides. */
|
|
84
|
+
private static defaults: Record<string, string> = { ...BUILT_IN };
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Overrides global messages for error codes.
|
|
88
|
+
* Unknown codes are accepted too, so messages can be set for custom codes
|
|
89
|
+
* from `custom` functions.
|
|
90
|
+
*/
|
|
91
|
+
static setDefaults(messages: Partial<Record<string, string>>): void {
|
|
92
|
+
for (const code of Object.keys(messages)) {
|
|
93
|
+
// hasOwnProperty: protection against prototype pollution through the given object.
|
|
94
|
+
if (!Object.prototype.hasOwnProperty.call(messages, code)) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const template = messages[code];
|
|
98
|
+
if (typeof template === "string") {
|
|
99
|
+
MessageRegistry.defaults[code] = template;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Resets all global overrides to the built-in messages. */
|
|
105
|
+
static reset(): void {
|
|
106
|
+
MessageRegistry.defaults = { ...BUILT_IN };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Builds the final message for an error code.
|
|
111
|
+
*
|
|
112
|
+
* @param code Rule code (for example `minLength`).
|
|
113
|
+
* @param localMessage Local `message` from the decorator options (takes priority).
|
|
114
|
+
* @param params Placeholder values.
|
|
115
|
+
*/
|
|
116
|
+
static format(code: string, localMessage: string | undefined, params: MessageParams): string {
|
|
117
|
+
const template =
|
|
118
|
+
localMessage ??
|
|
119
|
+
(Object.prototype.hasOwnProperty.call(MessageRegistry.defaults, code)
|
|
120
|
+
? MessageRegistry.defaults[code]!
|
|
121
|
+
: 'Поле "{property}" не прошло проверку ({code})');
|
|
122
|
+
return MessageRegistry.interpolate(template, params);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private static interpolate(template: string, params: MessageParams): string {
|
|
126
|
+
return template.replace(/\{(\w+)\}/g, (placeholder, key: string) => {
|
|
127
|
+
if (!Object.prototype.hasOwnProperty.call(params, key) || params[key] === undefined) {
|
|
128
|
+
return placeholder;
|
|
129
|
+
}
|
|
130
|
+
return MessageRegistry.stringify(params[key]);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
private static stringify(value: unknown): string {
|
|
135
|
+
if (typeof value === "object" && value !== null && !(value instanceof RegExp)) {
|
|
136
|
+
try {
|
|
137
|
+
return JSON.stringify(value);
|
|
138
|
+
} catch {
|
|
139
|
+
return String(value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return String(value);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# src/bazis/library/validation: class validation module
|
|
2
|
+
|
|
3
|
+
A self-contained OOP-style validation module: one `@Validator(options)` decorator
|
|
4
|
+
on class fields + the static `Validator.validate` / `Validator.validateAsync`.
|
|
5
|
+
|
|
6
|
+
The full specification (every scenario with examples, the options, error codes,
|
|
7
|
+
placeholders) is in [SPEC.md](SPEC.md).
|
|
8
|
+
|
|
9
|
+
Principles (shared by the whole framework):
|
|
10
|
+
|
|
11
|
+
- no external dependencies, only Bun APIs;
|
|
12
|
+
- no reflection: standard TC39 decorators + `Symbol.metadata`
|
|
13
|
+
(no `experimentalDecorators`, `emitDecoratorMetadata` or `reflect-metadata`);
|
|
14
|
+
- compatible with `bun build --compile`;
|
|
15
|
+
- few allocations: a class's validation plan is compiled once and cached in a
|
|
16
|
+
WeakMap, message objects are created only on the error path;
|
|
17
|
+
- resilience: exceptions in `custom`/`validateIf` are caught
|
|
18
|
+
(code `customError`), and validation continues and collects all errors.
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { Validator } from "@/library/validation";
|
|
24
|
+
|
|
25
|
+
class CreateUserDto {
|
|
26
|
+
@Validator({ required: true, minLength: 3, maxLength: 50 })
|
|
27
|
+
username!: string;
|
|
28
|
+
|
|
29
|
+
@Validator({ required: true, email: true })
|
|
30
|
+
email!: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const result = Validator.validate(dto); // ValidationResult
|
|
34
|
+
await Validator.validateAsync(dto); // awaits async custom functions
|
|
35
|
+
Validator.setDefaultMessages({ required: "{property} is required" });
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
More scenarios (complex conditions, async, nested objects) are in
|
|
39
|
+
[test/validation.test.ts](test/validation.test.ts).
|
|
40
|
+
|
|
41
|
+
## Folder map
|
|
42
|
+
|
|
43
|
+
| File | Purpose |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `Validator.ts` | public facade: the decorator + `validate`/`validateAsync`/`setDefaultMessages` |
|
|
46
|
+
| `ValidationError.ts` | one error: `property`, `value`, `message`, `code` |
|
|
47
|
+
| `ValidationResult.ts` | the outcome: `isValid`, `errors`, `getErrorsFor`, `hasErrorsFor` |
|
|
48
|
+
| `RuleEngine.ts` | the engine: one pass over the plan, sync/async, nested, cycle protection |
|
|
49
|
+
| `RuleCompiler.ts` | compiles class rules into a plan + WeakMap cache (RegExp, enum Set) |
|
|
50
|
+
| `MessageRegistry.ts` | message templates, placeholders, priority local > global > built-in; built-in texts are English, `RU_VALIDATION_MESSAGES` is a Russian set for `setDefaults` |
|
|
51
|
+
| `metadata.ts` | stores rules through `context.metadata` / `Symbol.metadata` |
|
|
52
|
+
| `types/ValidatorOptions.ts` | all decorator options |
|
|
53
|
+
| `types/ValidationCode.ts` | error codes |
|
|
54
|
+
| `test/validation.test.ts` | module tests |
|
|
55
|
+
|
|
56
|
+
## A note on `design:type`
|
|
57
|
+
|
|
58
|
+
`Reflect.getMetadata("design:type")` is deliberately not used: it requires
|
|
59
|
+
`emitDecoratorMetadata` and the external `reflect-metadata` package, which breaks
|
|
60
|
+
the "no dependencies, no reflection" principles. Instead the expected type is
|
|
61
|
+
inferred from the rules themselves (`minLength` ⇒ string, `min` ⇒ number,
|
|
62
|
+
`mustBeTrue` ⇒ boolean) or set with an explicit `type` hint.
|