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,209 @@
|
|
|
1
|
+
import type { EntityModel } from "./Metadata/types";
|
|
2
|
+
import type { OrmModel } from "./Metadata/OrmModel";
|
|
3
|
+
import type { DatabaseProvider, DbExecutor, ExecuteResult, ForeignKeyConstraint, Row, SqlParam } from "./Providers/types";
|
|
4
|
+
import { Migrator, type MigrationResult } from "./Schema/Migrator";
|
|
5
|
+
import { MigrationRunner, type Migration, type VersionedMigrationResult } from "./Schema/MigrationRunner";
|
|
6
|
+
import { SchemaDiffer } from "./Schema/SchemaDiffer";
|
|
7
|
+
import { SchemaAdmissionEngine } from "./Schema/SchemaAdmission";
|
|
8
|
+
import { SchemaAdmissionError } from "./errors";
|
|
9
|
+
import { physicalColumnTypes } from "./Schema/physicalColumnTypes";
|
|
10
|
+
import { bindResolvedForeignKey } from "./Providers/resolvedForeignKey";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Management of the database itself: schema creation, raw SQL, transactions, ping.
|
|
14
|
+
* Available as `dbContext.database`.
|
|
15
|
+
*/
|
|
16
|
+
export class DatabaseFacade {
|
|
17
|
+
constructor(
|
|
18
|
+
private readonly provider: DatabaseProvider,
|
|
19
|
+
private readonly models: OrmModel,
|
|
20
|
+
) {}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* PostgreSQL admission compiles the explicit entity/decorator unit, acquires
|
|
24
|
+
* sorted schema advisory locks and uses one reserved-session transaction:
|
|
25
|
+
* preflight exact-verifies existing tables, creates only missing schemas and
|
|
26
|
+
* whole tables, then exact-verifies again before commit. Existing tables are
|
|
27
|
+
* never altered or repaired.
|
|
28
|
+
*/
|
|
29
|
+
async ensureCreated(): Promise<void> {
|
|
30
|
+
if (this.provider.name === "postgres") {
|
|
31
|
+
await new SchemaAdmissionEngine(this.provider, this.models).ensureCreated();
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// The physical default contract belongs exclusively to exact PostgreSQL
|
|
35
|
+
// admission. Other providers must reject it rather than silently ignore it.
|
|
36
|
+
if (this.models.entities.some((model) => model.properties.some((property) => property.generation === "none" && property.databaseDefault.kind !== "none"))) {
|
|
37
|
+
throw new SchemaAdmissionError("ORM_SCHEMA_PROVIDER_UNSUPPORTED", "Database defaults in exact schema admission require PostgreSQL.");
|
|
38
|
+
}
|
|
39
|
+
const dialect = this.provider.dialect;
|
|
40
|
+
// Create tables in FK dependency order: databases with strict FKs (PostgreSQL)
|
|
41
|
+
// require the referenced table to exist already.
|
|
42
|
+
for (const model of this.orderByDependencies(this.models.entities)) {
|
|
43
|
+
await this.provider.execute(dialect.createTableSql(model, this.foreignKeysFor(model)), []);
|
|
44
|
+
for (const indexSql of dialect.createIndexSql(model)) {
|
|
45
|
+
await this.provider.execute(indexSql, []);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Additive auto-migration of the schema for all context entities (enabled in
|
|
52
|
+
* the module: `ormBazis: { migrateOnStart: true }`): introspects the database,
|
|
53
|
+
* compares it with the model and applies the missing tables/columns/indexes in
|
|
54
|
+
* one transaction. Destructive differences are not applied; they are
|
|
55
|
+
* returned as `warnings`.
|
|
56
|
+
*/
|
|
57
|
+
async migrate(): Promise<MigrationResult> {
|
|
58
|
+
this.assertNoPostgresOnlyDefaults();
|
|
59
|
+
const work = () => this.migrateCore();
|
|
60
|
+
return this.provider.withMigrationLock ? this.provider.withMigrationLock(work) : work();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private assertNoPostgresOnlyDefaults(): void {
|
|
64
|
+
if (this.models.entities.some((model) => model.properties.some((property) => property.generation === "none" && property.databaseDefault.kind !== "none"))) {
|
|
65
|
+
throw new SchemaAdmissionError("ORM_SCHEMA_PROVIDER_UNSUPPORTED", "Database defaults in exact schema admission require PostgreSQL.");
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private async migrateCore(): Promise<MigrationResult> {
|
|
70
|
+
// The diff orders createTable by FK dependencies (referenced -> dependent).
|
|
71
|
+
const targets = this.orderByDependencies(this.models.entities);
|
|
72
|
+
const types = this.provider.dialect.name === "postgres" ? physicalColumnTypes(this.models.entities) : undefined;
|
|
73
|
+
const foreignKeys = new Map(targets.map((model) => [model, this.foreignKeysFor(model, types)]));
|
|
74
|
+
const schema = await this.provider.introspect();
|
|
75
|
+
const { operations, warnings } = new SchemaDiffer().diff(targets, schema);
|
|
76
|
+
const migrator = new Migrator(this.provider, (model) => foreignKeys.get(model)!);
|
|
77
|
+
const applied = await migrator.apply(operations);
|
|
78
|
+
return { applied: applied.length, operations: applied, warnings };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Topological sort of entities: the model referenced by an FK comes before
|
|
83
|
+
* the dependent one. Self-references are ignored; cycles (rare, through
|
|
84
|
+
* nullable FKs) do not loop the traversal, their order is arbitrary.
|
|
85
|
+
*/
|
|
86
|
+
private orderByDependencies(models: readonly EntityModel[]): EntityModel[] {
|
|
87
|
+
const set = new Set(models);
|
|
88
|
+
const ordered: EntityModel[] = [];
|
|
89
|
+
const done = new Set<EntityModel>();
|
|
90
|
+
const onStack = new Set<EntityModel>();
|
|
91
|
+
|
|
92
|
+
const visit = (model: EntityModel): void => {
|
|
93
|
+
if (done.has(model) || onStack.has(model)) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
onStack.add(model);
|
|
97
|
+
for (const fk of model.foreignKeys) {
|
|
98
|
+
const target = this.tryTargetModel(fk.target);
|
|
99
|
+
if (target && target !== model && set.has(target)) {
|
|
100
|
+
visit(target);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
onStack.delete(model);
|
|
104
|
+
done.add(model);
|
|
105
|
+
ordered.push(model);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
for (const model of models) {
|
|
109
|
+
visit(model);
|
|
110
|
+
}
|
|
111
|
+
return ordered;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
private tryTargetModel(target: () => new () => object): EntityModel | undefined {
|
|
115
|
+
try {
|
|
116
|
+
return this.models.targetModel(target);
|
|
117
|
+
} catch {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Resolves the model's FK metadata into column/table names for DDL. */
|
|
123
|
+
private foreignKeysFor(model: EntityModel, types?: ReturnType<typeof physicalColumnTypes>): ForeignKeyConstraint[] {
|
|
124
|
+
const constraints: ForeignKeyConstraint[] = [];
|
|
125
|
+
for (const fk of model.foreignKeys) {
|
|
126
|
+
const columns = fk.properties.map((name) => model.propertyByName(name));
|
|
127
|
+
if (columns.some((column) => !column)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const target = this.models.targetModel(fk.target);
|
|
131
|
+
const constraint: ForeignKeyConstraint = {
|
|
132
|
+
column: columns[0]!.columnName,
|
|
133
|
+
columns: columns.map((column) => column!.columnName),
|
|
134
|
+
name: fk.name,
|
|
135
|
+
referencedTable: this.referencedTableName(target),
|
|
136
|
+
referencedColumn: target.key[0].columnName,
|
|
137
|
+
referencedColumns: target.key.map((property) => property.columnName),
|
|
138
|
+
onDelete: fk.onDelete,
|
|
139
|
+
onUpdate: fk.onUpdate,
|
|
140
|
+
columnType: types?.get(columns[0]!),
|
|
141
|
+
};
|
|
142
|
+
if (types) bindResolvedForeignKey(constraint, {
|
|
143
|
+
target,
|
|
144
|
+
columnTypes: new Map(columns.map((column) => [column!.columnName, types.get(column!)!])),
|
|
145
|
+
});
|
|
146
|
+
constraints.push(constraint);
|
|
147
|
+
}
|
|
148
|
+
return constraints;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Table name for FK/DDL: PostgreSQL uses `schema.table`. */
|
|
152
|
+
private referencedTableName(model: EntityModel): string {
|
|
153
|
+
if (this.provider.dialect.name === "postgres" && model.schema !== undefined) {
|
|
154
|
+
return `${model.schema}.${model.tableName}`;
|
|
155
|
+
}
|
|
156
|
+
return model.tableName;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Runs raw modifying SQL with safe parameter substitution through the
|
|
161
|
+
* `{0}`, `{1}`, ... placeholders: values go into parameters, not into the string.
|
|
162
|
+
*
|
|
163
|
+
* ```ts
|
|
164
|
+
* await ctx.database.executeSqlRaw("UPDATE Users SET active = {0} WHERE id = {1}", false, id);
|
|
165
|
+
* ```
|
|
166
|
+
*/
|
|
167
|
+
executeSqlRaw(sql: string, ...params: SqlParam[]): Promise<ExecuteResult> {
|
|
168
|
+
return this.provider.execute(this.rewritePlaceholders(sql, params.length), params);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Raw SELECT with safe `{0}` parameter substitution. */
|
|
172
|
+
querySqlRaw(sql: string, ...params: SqlParam[]): Promise<Row[]> {
|
|
173
|
+
return this.provider.query(this.rewritePlaceholders(sql, params.length), params);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Applies versioned migrations with history (`__BazisMigrations`).
|
|
178
|
+
* Compile-safe: migrations are passed as an explicit array.
|
|
179
|
+
*/
|
|
180
|
+
migrateVersioned(migrations: readonly Migration[]): Promise<VersionedMigrationResult> {
|
|
181
|
+
return new MigrationRunner(this.provider, migrations).migrate();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/** Rolls back the last `steps` versioned migrations (requires `down`). */
|
|
185
|
+
rollbackVersioned(migrations: readonly Migration[], steps = 1): Promise<VersionedMigrationResult> {
|
|
186
|
+
return new MigrationRunner(this.provider, migrations).rollback(steps);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** Runs work in a database transaction (the callback gets the transaction executor). */
|
|
190
|
+
transaction<T>(work: (tx: DbExecutor) => Promise<T>): Promise<T> {
|
|
191
|
+
return this.provider.transaction(work);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Connection check. */
|
|
195
|
+
canConnect(): Promise<boolean> {
|
|
196
|
+
return this.provider.ping();
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private rewritePlaceholders(sql: string, count: number): string {
|
|
200
|
+
const dialect = this.provider.dialect;
|
|
201
|
+
return sql.replace(/\{(\d+)\}/g, (_match, raw: string) => {
|
|
202
|
+
const index = Number(raw);
|
|
203
|
+
if (index >= count) {
|
|
204
|
+
throw new RangeError(`Raw SQL references {${index}} but only ${count} parameter(s) were provided.`);
|
|
205
|
+
}
|
|
206
|
+
return dialect.parameter(index);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { DatabaseFacade } from "./DatabaseFacade";
|
|
2
|
+
import type { DbContextOptions } from "./DbContextOptions";
|
|
3
|
+
import { EntityNotMappedError } from "./errors";
|
|
4
|
+
import { DbSet } from "./Query/DbSet";
|
|
5
|
+
import type { DbContextRuntime } from "./runtime";
|
|
6
|
+
import { SaveExecutor } from "./Saving/SaveExecutor";
|
|
7
|
+
import { ChangeTracker } from "./Tracking/ChangeTracker";
|
|
8
|
+
import { EntityState } from "./Tracking/EntityState";
|
|
9
|
+
import { monitorImmediateOperation, monitorWholeOperation, observedProvider, transactionScope } from "./Transactions/TransactionScopeCoordinator";
|
|
10
|
+
import { OrmTransaction, type OrmTransactionScopeOptions } from "./Transactions/OrmTransaction";
|
|
11
|
+
|
|
12
|
+
type EntityClass<T extends object> = new () => T;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Base class of a database context (a scoped DI service). A subclass declares the sets:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* class AppDbContext extends DbContext {
|
|
19
|
+
* readonly users = this.set(User);
|
|
20
|
+
* readonly posts = this.set(Post);
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* Holds the ChangeTracker and the `database` facade and provides SaveChanges in a transaction.
|
|
25
|
+
*/
|
|
26
|
+
export abstract class DbContext {
|
|
27
|
+
/** Change tracker of this context. */
|
|
28
|
+
readonly changeTracker: ChangeTracker;
|
|
29
|
+
/** Database management (schema, raw SQL, transactions). */
|
|
30
|
+
readonly database: DatabaseFacade;
|
|
31
|
+
|
|
32
|
+
readonly #options: DbContextOptions;
|
|
33
|
+
readonly #runtime: DbContextRuntime;
|
|
34
|
+
|
|
35
|
+
constructor(options: DbContextOptions) {
|
|
36
|
+
this.#options = options;
|
|
37
|
+
this.changeTracker = new ChangeTracker();
|
|
38
|
+
const provider = observedProvider(this, options.provider);
|
|
39
|
+
this.#runtime = { provider, models: options.model, tracker: this.changeTracker, runImmediateOperation: (operation) => monitorImmediateOperation(this, operation) };
|
|
40
|
+
this.database = new DatabaseFacade(provider, options.model);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Creates a set for an entity. Called in the subclass's field initializers. */
|
|
44
|
+
protected set<T extends object>(entity: EntityClass<T>): DbSet<T> {
|
|
45
|
+
return this.setOf(entity);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Public access to a `DbSet` by entity class (for `Repository<T>` and generic scenarios). */
|
|
49
|
+
setOf<T extends object>(entity: EntityClass<T>): DbSet<T> {
|
|
50
|
+
return new DbSet<T>(this.#options.model.requireByCtor(entity), this.#runtime);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* `DbSet` for an entity registered in the model by name (with no static class
|
|
55
|
+
* in the code), the basis for dynamic tables built at runtime. The model must
|
|
56
|
+
* be registered beforehand (`OrmModel.registerModel`), otherwise
|
|
57
|
+
* `EntityNotMappedError`.
|
|
58
|
+
*/
|
|
59
|
+
setByName(name: string): DbSet<Record<string, unknown>> {
|
|
60
|
+
const model = this.#options.model.tryByName(name);
|
|
61
|
+
if (!model) {
|
|
62
|
+
throw new EntityNotMappedError(name);
|
|
63
|
+
}
|
|
64
|
+
return new DbSet<Record<string, unknown>>(model, this.#runtime);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
add<T extends object>(entity: T): T {
|
|
68
|
+
this.changeTracker.add(entity, this.#options.model.requireForInstance(entity));
|
|
69
|
+
return entity;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
update<T extends object>(entity: T): T {
|
|
73
|
+
this.changeTracker.update(entity, this.#options.model.requireForInstance(entity));
|
|
74
|
+
return entity;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
remove<T extends object>(entity: T): T {
|
|
78
|
+
this.changeTracker.remove(entity, this.#options.model.requireForInstance(entity));
|
|
79
|
+
return entity;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
attach<T extends object>(entity: T): T {
|
|
83
|
+
this.changeTracker.attach(entity, this.#options.model.requireForInstance(entity));
|
|
84
|
+
return entity;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
stateOf(entity: object): EntityState {
|
|
88
|
+
return this.changeTracker.stateOf(entity);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Applies all pending changes in one transaction and returns the number of
|
|
93
|
+
* processed entities. DetectChanges runs before saving, and (if enabled)
|
|
94
|
+
* Added/Modified entities are validated.
|
|
95
|
+
*/
|
|
96
|
+
saveChanges(): Promise<number> {
|
|
97
|
+
return monitorWholeOperation(this, () => new SaveExecutor(this.#runtime.provider, this.changeTracker, {
|
|
98
|
+
validateOnSave: this.#options.validateOnSave,
|
|
99
|
+
executionStrategy: this.#options.executionStrategy,
|
|
100
|
+
}).save());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Executes a composable ORM transaction scope for this provider identity. */
|
|
104
|
+
transactionScope<TResult>(work: (transaction: OrmTransaction) => Promise<TResult>, options?: OrmTransactionScopeOptions): Promise<TResult> {
|
|
105
|
+
return transactionScope(this, this.#options.provider, work, options);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DbContext } from "./DbContext";
|
|
2
|
+
import type { DbContextOptions } from "./DbContextOptions";
|
|
3
|
+
|
|
4
|
+
type ContextClass<TContext extends DbContext> = new (options: DbContextOptions) => TContext;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Context factory for scenarios outside a DI scope (background tasks, scripts,
|
|
8
|
+
* parallel processing). Each `create()` returns a new context with its own
|
|
9
|
+
* ChangeTracker on top of the shared provider/model.
|
|
10
|
+
*
|
|
11
|
+
* ```ts
|
|
12
|
+
* const factory = new DbContextFactory(AppDbContext, options);
|
|
13
|
+
* const ctx = factory.create();
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class DbContextFactory<TContext extends DbContext> {
|
|
17
|
+
constructor(
|
|
18
|
+
private readonly contextType: ContextClass<TContext>,
|
|
19
|
+
private readonly options: DbContextOptions,
|
|
20
|
+
) {}
|
|
21
|
+
|
|
22
|
+
create(): TContext {
|
|
23
|
+
return new this.contextType(this.options);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ExecutionStrategyOptions } from "./Saving/ExecutionStrategy";
|
|
2
|
+
import { OrmModel } from "./Metadata/OrmModel";
|
|
3
|
+
import type { DatabaseProvider } from "./Providers/types";
|
|
4
|
+
|
|
5
|
+
type EntityClass = new () => object;
|
|
6
|
+
|
|
7
|
+
export interface DbContextOptionsConfig {
|
|
8
|
+
readonly provider: DatabaseProvider;
|
|
9
|
+
readonly entities: readonly EntityClass[];
|
|
10
|
+
/** Validate entities before SaveChanges (default true). */
|
|
11
|
+
readonly validateOnSave?: boolean;
|
|
12
|
+
/** Retries on transient database errors (`EnableRetryOnFailure`). */
|
|
13
|
+
readonly executionStrategy?: ExecutionStrategyOptions;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Immutable context options: the database provider, the compiled model and
|
|
18
|
+
* behavior flags. Created once (the model is built from `entities`) and reused
|
|
19
|
+
* by all scoped `DbContext` instances.
|
|
20
|
+
*/
|
|
21
|
+
export class DbContextOptions {
|
|
22
|
+
readonly provider: DatabaseProvider;
|
|
23
|
+
readonly model: OrmModel;
|
|
24
|
+
readonly validateOnSave: boolean;
|
|
25
|
+
readonly executionStrategy?: ExecutionStrategyOptions;
|
|
26
|
+
|
|
27
|
+
constructor(config: DbContextOptionsConfig) {
|
|
28
|
+
this.provider = config.provider;
|
|
29
|
+
this.model = new OrmModel(config.entities);
|
|
30
|
+
this.validateOnSave = config.validateOnSave ?? true;
|
|
31
|
+
this.executionStrategy = config.executionStrategy;
|
|
32
|
+
}
|
|
33
|
+
}
|