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,396 @@
|
|
|
1
|
+
import type { ColumnOptionsType, RelationKind, PropertyConvention } from "./types";
|
|
2
|
+
import type { ValueConverter } from "./ValueConverter";
|
|
3
|
+
import { fieldSelector, type PredicateFn } from "../Query/conditions";
|
|
4
|
+
import type { Condition } from "../Query/conditions";
|
|
5
|
+
import { compileCheck, type CheckPredicate } from "../Schema/CheckExpression";
|
|
6
|
+
|
|
7
|
+
type EntityClass = new () => object;
|
|
8
|
+
|
|
9
|
+
// Standard TC39 decorators (as in validation/http): no reflect-metadata
|
|
10
|
+
// and no experimentalDecorators, which keeps bun build --compile compatible.
|
|
11
|
+
(Symbol as { metadata?: symbol }).metadata ??= Symbol.for("Symbol.metadata");
|
|
12
|
+
|
|
13
|
+
const ENTITY_META = Symbol.for("bazis:orm:entity");
|
|
14
|
+
|
|
15
|
+
/** `@Entity` options. */
|
|
16
|
+
export interface EntityOptions {
|
|
17
|
+
/** Table name (defaults to the plural of the class name). */
|
|
18
|
+
readonly table?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Soft-delete property name (`datetime`, nullable). Equivalent to `@SoftDelete()`
|
|
21
|
+
* on the column. `remove()` sets a timestamp instead of DELETE; queries filter
|
|
22
|
+
* `IS NULL` unless `ignoreQueryFilters()` is called.
|
|
23
|
+
*/
|
|
24
|
+
readonly softDelete?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** `@Column` options. */
|
|
28
|
+
export interface ColumnOptions {
|
|
29
|
+
/** Column name (defaults to the property name). */
|
|
30
|
+
readonly name?: string;
|
|
31
|
+
/** Type: physical (`text`, `datetime`, …) or semantic (`uuid`, `createdAt`, `updatedAt`). */
|
|
32
|
+
readonly type?: ColumnOptionsType;
|
|
33
|
+
/** Allow NULL (default true; `@Required` sets false). */
|
|
34
|
+
readonly nullable?: boolean;
|
|
35
|
+
/** Closed physical PostgreSQL default. It is not an application initializer or SQL fragment. */
|
|
36
|
+
readonly default?: ColumnDefaultValue;
|
|
37
|
+
}
|
|
38
|
+
export type ColumnDefaultValue = null | boolean | number | string;
|
|
39
|
+
|
|
40
|
+
/** `@Key` options. */
|
|
41
|
+
export interface KeyOptions {
|
|
42
|
+
/**
|
|
43
|
+
* Whether the database generates the value (auto-increment). Defaults to
|
|
44
|
+
* `true` for an integer key, otherwise `false` (the code sets the value,
|
|
45
|
+
* for example a GUID).
|
|
46
|
+
*/
|
|
47
|
+
readonly generated?: boolean;
|
|
48
|
+
readonly name?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** `@UUID` options. */
|
|
52
|
+
export interface UUIDOptions {
|
|
53
|
+
/**
|
|
54
|
+
* UUID version:
|
|
55
|
+
* - `v4` (default): PostgreSQL generates the key (`DEFAULT gen_random_uuid()`)
|
|
56
|
+
* and the ORM reads it through `RETURNING`;
|
|
57
|
+
* - `v7`: the ORM generates a time-ordered key (`Bun.randomUUIDv7()`) before
|
|
58
|
+
* INSERT; the column is a native `uuid` without a default, so any supported
|
|
59
|
+
* PostgreSQL version works and inserts stay close together in the index.
|
|
60
|
+
*/
|
|
61
|
+
readonly version?: "v4" | "v7";
|
|
62
|
+
readonly name?: string;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** `@Index` options (on a property). */
|
|
66
|
+
export interface IndexOptions {
|
|
67
|
+
readonly unique?: boolean;
|
|
68
|
+
readonly name?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface CompositeKeyOptions { readonly name?: string }
|
|
71
|
+
export type ReferentialAction = "noAction" | "restrict" | "cascade" | "setNull";
|
|
72
|
+
export interface CompositeForeignKeyOptions { readonly name?: string; readonly properties: readonly [string, ...string[]]; readonly onDelete?: ReferentialAction; readonly onUpdate?: ReferentialAction }
|
|
73
|
+
|
|
74
|
+
/** Navigation options. */
|
|
75
|
+
export interface RelationOptions {
|
|
76
|
+
/** Name of the foreign key property (on the dependent side). */
|
|
77
|
+
readonly foreignKey: string | readonly string[];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Raw property description accumulated by decorators. */
|
|
81
|
+
export interface RawProperty {
|
|
82
|
+
propertyName: string;
|
|
83
|
+
columnName?: string;
|
|
84
|
+
type?: ColumnOptionsType;
|
|
85
|
+
isKey?: boolean;
|
|
86
|
+
keyGenerated?: boolean;
|
|
87
|
+
required?: boolean;
|
|
88
|
+
nullable?: boolean;
|
|
89
|
+
default?: ColumnDefaultValue;
|
|
90
|
+
index?: { unique: boolean; name?: string };
|
|
91
|
+
/** `@ForeignKey(() => Principal)` on a scalar column, for the DDL FK. */
|
|
92
|
+
fkTarget?: () => EntityClass;
|
|
93
|
+
/** `@HasConversion(...)`: conversion before/after the dialect. */
|
|
94
|
+
converter?: ValueConverter;
|
|
95
|
+
/** `@UUID` / `@CreatedAt` / `@UpdatedAt`. */
|
|
96
|
+
convention?: PropertyConvention;
|
|
97
|
+
/** UUID version for `@UUID` (default v4). */
|
|
98
|
+
uuidVersion?: "v4" | "v7";
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Raw navigation relation. */
|
|
102
|
+
export interface RawRelation {
|
|
103
|
+
navigationName: string;
|
|
104
|
+
kind: RelationKind;
|
|
105
|
+
target: () => EntityClass;
|
|
106
|
+
foreignKey: string | readonly string[];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Raw entity metadata before conventions are applied. */
|
|
110
|
+
export interface RawEntity {
|
|
111
|
+
isEntity: boolean;
|
|
112
|
+
table?: string;
|
|
113
|
+
schema?: string;
|
|
114
|
+
properties: Map<string, RawProperty>;
|
|
115
|
+
relations: RawRelation[];
|
|
116
|
+
queryFilters?: Condition[];
|
|
117
|
+
/** Soft-delete property name (see `@SoftDelete` / `@Entity({ softDelete })`). */
|
|
118
|
+
softDeleteProperty?: string;
|
|
119
|
+
keyDeclaration?: { properties: readonly string[]; name?: string; anchor: string; composite: boolean };
|
|
120
|
+
indexes?: Array<{ properties: readonly string[]; unique: boolean; name?: string }>;
|
|
121
|
+
foreignKeys?: Array<{ properties: readonly string[]; target: () => EntityClass; name?: string; onDelete?: ReferentialAction; onUpdate?: ReferentialAction }>;
|
|
122
|
+
checks?: Array<{ name: string; expression: import("../Schema/CheckExpression").CheckAst }>;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface MetadataCarrier {
|
|
126
|
+
[ENTITY_META]?: RawEntity;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function emptyRaw(): RawEntity {
|
|
130
|
+
return { isEntity: false, properties: new Map(), relations: [] };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function cloneRaw(source: RawEntity): RawEntity {
|
|
134
|
+
const properties = new Map<string, RawProperty>();
|
|
135
|
+
for (const [name, prop] of source.properties) {
|
|
136
|
+
properties.set(name, { ...prop, index: prop.index ? { ...prop.index } : undefined });
|
|
137
|
+
}
|
|
138
|
+
return { ...source, properties, relations: source.relations.map((relation) => ({ ...relation })), keyDeclaration: source.keyDeclaration && { ...source.keyDeclaration, properties: [...source.keyDeclaration.properties] }, indexes: source.indexes?.map((index) => ({ ...index, properties: [...index.properties] })), foreignKeys: source.foreignKeys?.map((foreignKey) => ({ ...foreignKey, properties: [...foreignKey.properties] })), checks: source.checks?.map((check) => ({ ...check })), queryFilters: source.queryFilters?.map(cloneCondition) };
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function cloneCondition(condition: Condition): Condition {
|
|
142
|
+
switch (condition.kind) {
|
|
143
|
+
case "and":
|
|
144
|
+
case "or":
|
|
145
|
+
return { kind: condition.kind, left: cloneCondition(condition.left), right: cloneCondition(condition.right) };
|
|
146
|
+
case "not":
|
|
147
|
+
return { kind: "not", inner: cloneCondition(condition.inner) };
|
|
148
|
+
default:
|
|
149
|
+
return { ...condition };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Own (copy-on-write) entity metadata of the decorated class. TC39 decorator
|
|
155
|
+
* metadata is inherited prototypically: the first write in a subclass copies
|
|
156
|
+
* the inherited state.
|
|
157
|
+
*/
|
|
158
|
+
function ownRaw(metadata: object): RawEntity {
|
|
159
|
+
const carrier = metadata as MetadataCarrier;
|
|
160
|
+
if (!Object.prototype.hasOwnProperty.call(carrier, ENTITY_META)) {
|
|
161
|
+
const inherited = carrier[ENTITY_META];
|
|
162
|
+
carrier[ENTITY_META] = inherited ? cloneRaw(inherited) : emptyRaw();
|
|
163
|
+
}
|
|
164
|
+
return carrier[ENTITY_META]!;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function ownProperty(metadata: object, name: string): RawProperty {
|
|
168
|
+
const raw = ownRaw(metadata);
|
|
169
|
+
let prop = raw.properties.get(name);
|
|
170
|
+
if (!prop) {
|
|
171
|
+
prop = { propertyName: name };
|
|
172
|
+
raw.properties.set(name, prop);
|
|
173
|
+
}
|
|
174
|
+
return prop;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
type FieldContext = ClassFieldDecoratorContext | ClassGetterDecoratorContext | ClassAccessorDecoratorContext;
|
|
178
|
+
|
|
179
|
+
function fieldName(context: FieldContext): string {
|
|
180
|
+
if (context.static || context.private) {
|
|
181
|
+
throw new Error(`@Column/@Key support public instance properties only ("${String(context.name)}").`);
|
|
182
|
+
}
|
|
183
|
+
return String(context.name);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Marks a class as an entity (a table). */
|
|
187
|
+
export function Entity(options: EntityOptions = {}) {
|
|
188
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
189
|
+
const raw = ownRaw(context.metadata);
|
|
190
|
+
raw.isEntity = true;
|
|
191
|
+
raw.table = options.table;
|
|
192
|
+
if (options.softDelete) {
|
|
193
|
+
raw.softDeleteProperty = options.softDelete;
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* PostgreSQL schema of the table. Without the decorator or with an empty name
|
|
200
|
+
* the table goes to `public` and no `CREATE SCHEMA` runs. With a name the
|
|
201
|
+
* migrator creates the schema (`CREATE SCHEMA IF NOT EXISTS`) before the table.
|
|
202
|
+
*/
|
|
203
|
+
export function Schema(name?: string) {
|
|
204
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
205
|
+
const trimmed = name?.trim();
|
|
206
|
+
if (trimmed !== undefined && trimmed.length > 0) {
|
|
207
|
+
ownRaw(context.metadata).schema = trimmed;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/** Primary key. Auto-increment by default for an integer key. */
|
|
213
|
+
export function Key(options?: KeyOptions): (value: undefined, context: ClassFieldDecoratorContext) => void;
|
|
214
|
+
export function Key(properties: readonly [string, string, ...string[]], options?: CompositeKeyOptions): (value: undefined, context: ClassFieldDecoratorContext) => void;
|
|
215
|
+
export function Key(first: KeyOptions | readonly [string, string, ...string[]] = {}, options: CompositeKeyOptions = {}) {
|
|
216
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
217
|
+
const prop = ownProperty(context.metadata, fieldName(context));
|
|
218
|
+
const raw = ownRaw(context.metadata);
|
|
219
|
+
if (raw.keyDeclaration) throw new Error("Only one @Key declaration is allowed.");
|
|
220
|
+
if (Array.isArray(first)) { raw.keyDeclaration = { properties: [...first], name: options.name, anchor: prop.propertyName, composite: true }; prop.isKey = true; return; }
|
|
221
|
+
raw.keyDeclaration = { properties: [prop.propertyName], name: (first as KeyOptions).name, anchor: prop.propertyName, composite: false };
|
|
222
|
+
prop.isKey = true;
|
|
223
|
+
prop.keyGenerated = (first as KeyOptions).generated;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
export function Check<T extends object>(name: string, predicate: CheckPredicate<T>) {
|
|
227
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
228
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(name)) throw new Error("Invalid CHECK constraint name.");
|
|
229
|
+
(ownRaw(context.metadata).checks ??= []).push({ name, expression: compileCheck(predicate) });
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* UUID primary key. By default PostgreSQL generates a v4 value
|
|
235
|
+
* (`DEFAULT gen_random_uuid()`) and the ORM reads it through `RETURNING`;
|
|
236
|
+
* `@UUID({ version: "v7" })` makes the ORM assign a v7 value before INSERT.
|
|
237
|
+
* With v7 a key already set by the application is kept; with v4 INSERT omits
|
|
238
|
+
* the key column and the database value always wins.
|
|
239
|
+
*/
|
|
240
|
+
|
|
241
|
+
export function UUID(options: UUIDOptions = {}) {
|
|
242
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
243
|
+
const prop = ownProperty(context.metadata, fieldName(context));
|
|
244
|
+
const raw = ownRaw(context.metadata); if (raw.keyDeclaration) throw new Error("@UUID cannot be combined with @Key."); raw.keyDeclaration = { properties: [prop.propertyName], name: options.name, anchor: prop.propertyName, composite: false };
|
|
245
|
+
prop.isKey = true;
|
|
246
|
+
prop.type = "uuid";
|
|
247
|
+
prop.keyGenerated = false;
|
|
248
|
+
prop.convention = "uuid"; prop.uuidVersion = options.version ?? "v4";
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Creation timestamp (`datetime`). Set on the first insert.
|
|
254
|
+
* Equivalent to `@Column({ type: "createdAt" })`.
|
|
255
|
+
*/
|
|
256
|
+
export function CreatedAt() {
|
|
257
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
258
|
+
ownProperty(context.metadata, fieldName(context)).type = "createdAt";
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Update timestamp (`datetime`). Set on insert and on every UPDATE.
|
|
264
|
+
* Equivalent to `@Column({ type: "updatedAt" })`.
|
|
265
|
+
*/
|
|
266
|
+
export function UpdatedAt() {
|
|
267
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
268
|
+
ownProperty(context.metadata, fieldName(context)).type = "updatedAt";
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** Mapped column. The type is not inferred from the TS type (no reflection); it is set here. */
|
|
273
|
+
export function Column(options: ColumnOptions = {}) {
|
|
274
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
275
|
+
const prop = ownProperty(context.metadata, fieldName(context));
|
|
276
|
+
prop.columnName = options.name;
|
|
277
|
+
prop.type = options.type;
|
|
278
|
+
prop.default = options.default;
|
|
279
|
+
if (options.nullable !== undefined) {
|
|
280
|
+
prop.nullable = options.nullable;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** NOT NULL. */
|
|
286
|
+
export function Required() {
|
|
287
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
288
|
+
ownProperty(context.metadata, fieldName(context)).required = true;
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/** Index on the property's column. */
|
|
293
|
+
export function Index(options?: IndexOptions): (value: undefined, context: ClassFieldDecoratorContext) => void;
|
|
294
|
+
export function Index(properties: readonly [string, ...string[]], options?: IndexOptions): (value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext) => void;
|
|
295
|
+
export function Index(first: IndexOptions | readonly [string, ...string[]] = {}, options: IndexOptions = {}) {
|
|
296
|
+
if (Array.isArray(first)) {
|
|
297
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
298
|
+
(ownRaw(context.metadata).indexes ??= []).push({ properties: [...first], unique: options.unique === true, name: options.name });
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
const propertyOptions = first as IndexOptions;
|
|
302
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
303
|
+
ownProperty(context.metadata, fieldName(context)).index = { unique: propertyOptions.unique === true, name: propertyOptions.name };
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Marks a scalar column as a foreign key to `target` (for the DDL constraint).
|
|
309
|
+
* Use it when there is no navigation property; otherwise the FK is inferred
|
|
310
|
+
* from `@ManyToOne`.
|
|
311
|
+
*/
|
|
312
|
+
export function ForeignKey(target: () => EntityClass): (value: undefined, context: ClassFieldDecoratorContext) => void;
|
|
313
|
+
export function ForeignKey(target: () => EntityClass, options: CompositeForeignKeyOptions): (value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext) => void;
|
|
314
|
+
export function ForeignKey(target: () => EntityClass, options?: CompositeForeignKeyOptions) {
|
|
315
|
+
if (options) {
|
|
316
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
317
|
+
(ownRaw(context.metadata).foreignKeys ??= []).push({ properties: [...options.properties], target, name: options.name, onDelete: options.onDelete, onUpdate: options.onUpdate });
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => { ownProperty(context.metadata, fieldName(context)).fkTarget = target; };
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Reference navigation (many-to-one): the foreign key is on this entity.
|
|
325
|
+
*
|
|
326
|
+
* ```ts
|
|
327
|
+
* @Column({ type: "integer" }) authorId = 0;
|
|
328
|
+
* @ManyToOne(() => User, { foreignKey: "authorId" }) author?: User;
|
|
329
|
+
* ```
|
|
330
|
+
*/
|
|
331
|
+
export function ManyToOne(target: () => EntityClass, options: RelationOptions) {
|
|
332
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
333
|
+
ownRaw(context.metadata).relations.push({
|
|
334
|
+
navigationName: fieldName(context),
|
|
335
|
+
kind: "reference",
|
|
336
|
+
target,
|
|
337
|
+
foreignKey: Array.isArray(options.foreignKey) ? [...options.foreignKey] : options.foreignKey,
|
|
338
|
+
});
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Collection navigation (one-to-many): the foreign key is on the target entity.
|
|
344
|
+
*
|
|
345
|
+
* ```ts
|
|
346
|
+
* @OneToMany(() => Post, { foreignKey: "authorId" }) posts: Post[] = [];
|
|
347
|
+
* ```
|
|
348
|
+
*/
|
|
349
|
+
export function OneToMany(target: () => EntityClass, options: RelationOptions) {
|
|
350
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
351
|
+
ownRaw(context.metadata).relations.push({
|
|
352
|
+
navigationName: fieldName(context),
|
|
353
|
+
kind: "collection",
|
|
354
|
+
target,
|
|
355
|
+
foreignKey: Array.isArray(options.foreignKey) ? [...options.foreignKey] : options.foreignKey,
|
|
356
|
+
});
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/** Column value converter (encryption, serialization). */
|
|
361
|
+
export function HasConversion(converter: ValueConverter) {
|
|
362
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
363
|
+
ownProperty(context.metadata, fieldName(context)).converter = converter;
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Global query filter for the entity (multi-tenant, flags and so on).
|
|
369
|
+
* Applied automatically; disabled with `ignoreQueryFilters()`.
|
|
370
|
+
*/
|
|
371
|
+
export function QueryFilter<T extends object>(predicate: PredicateFn<T>) {
|
|
372
|
+
return (_value: abstract new (...args: never[]) => unknown, context: ClassDecoratorContext): void => {
|
|
373
|
+
const raw = ownRaw(context.metadata);
|
|
374
|
+
const node = predicate(fieldSelector<T>()).node;
|
|
375
|
+
raw.queryFilters = [...(raw.queryFilters ?? []), node];
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
/** Marks a soft-delete column: `remove()` sets a timestamp instead of DELETE. */
|
|
380
|
+
export function SoftDelete() {
|
|
381
|
+
return (_value: undefined, context: ClassFieldDecoratorContext): void => {
|
|
382
|
+
const name = fieldName(context);
|
|
383
|
+
ownProperty(context.metadata, name).type = "datetime";
|
|
384
|
+
ownProperty(context.metadata, name).nullable = true;
|
|
385
|
+
ownRaw(context.metadata).softDeleteProperty = name;
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/** Reads the raw entity metadata (or undefined if the class is not an entity). */
|
|
390
|
+
export function readRawEntity(ctor: object): RawEntity | undefined {
|
|
391
|
+
const metadata = (ctor as { [key: symbol]: unknown })[Symbol.metadata as unknown as symbol] as
|
|
392
|
+
| MetadataCarrier
|
|
393
|
+
| undefined;
|
|
394
|
+
const raw = metadata?.[ENTITY_META];
|
|
395
|
+
return raw?.isEntity ? raw : undefined;
|
|
396
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { Condition } from "../Query/conditions";
|
|
2
|
+
import type { ValueConverter } from "./ValueConverter";
|
|
3
|
+
import type { CheckAst } from "../Schema/CheckExpression";
|
|
4
|
+
import type { CanonicalDefault } from "../Schema/introspection";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Physical column type in the database (DDL, encode/decode). The provider
|
|
8
|
+
* dialect maps it to the types of a concrete DBMS (`SqlDialect.columnType`).
|
|
9
|
+
*/
|
|
10
|
+
export type StorageColumnType = "integer" | "real" | "text" | "boolean" | "datetime" | "json";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Semantic `@Column({ type })` types with automatic behavior on `SaveChanges`.
|
|
14
|
+
* In the model they split into `StorageColumnType` + `PropertyConvention`.
|
|
15
|
+
*/
|
|
16
|
+
export type SemanticColumnType = "uuid" | "createdAt" | "updatedAt";
|
|
17
|
+
|
|
18
|
+
/** Type in the `@Column({ type })` options. */
|
|
19
|
+
export type ColumnOptionsType = StorageColumnType | SemanticColumnType;
|
|
20
|
+
|
|
21
|
+
/** Physical type in a compiled `PropertyModel`. */
|
|
22
|
+
export type ColumnType = StorageColumnType;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Primary key value generation strategy:
|
|
26
|
+
* - `identity`: the database assigns an integer (`GENERATED BY DEFAULT AS IDENTITY`);
|
|
27
|
+
* - `uuid`: the database assigns a UUID v4 (`DEFAULT gen_random_uuid()`);
|
|
28
|
+
* - `uuidV7`: the ORM assigns a UUID v7 before INSERT (`Bun.randomUUIDv7()`);
|
|
29
|
+
* - `none`: the application code sets the key.
|
|
30
|
+
*/
|
|
31
|
+
export type KeyGeneration = "identity" | "uuid" | "uuidV7" | "none";
|
|
32
|
+
|
|
33
|
+
/** Whether the database assigns the key, so INSERT omits it and reads it back through `RETURNING`. */
|
|
34
|
+
export function isDatabaseGenerated(generation: KeyGeneration): boolean {
|
|
35
|
+
return generation === "identity" || generation === "uuid";
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Whether the key column is a native PostgreSQL `uuid`. */
|
|
39
|
+
export function isUuidKeyGeneration(generation: KeyGeneration): boolean {
|
|
40
|
+
return generation === "uuid" || generation === "uuidV7";
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Automatic column conventions (`@UUID`, `@CreatedAt`, `@UpdatedAt`). */
|
|
44
|
+
export type PropertyConvention = "uuid" | "createdAt" | "updatedAt";
|
|
45
|
+
|
|
46
|
+
/** Compiled model of one entity column/property. */
|
|
47
|
+
export interface PropertyModel {
|
|
48
|
+
/** Property name in the class. */
|
|
49
|
+
readonly propertyName: string;
|
|
50
|
+
/** Column name in the table. */
|
|
51
|
+
readonly columnName: string;
|
|
52
|
+
/** Storage type. */
|
|
53
|
+
readonly type: ColumnType;
|
|
54
|
+
/** Part of the primary key. */
|
|
55
|
+
readonly isKey: boolean;
|
|
56
|
+
/** How the key is generated (see {@link KeyGeneration}). */
|
|
57
|
+
readonly generation: KeyGeneration;
|
|
58
|
+
/** NOT NULL. */
|
|
59
|
+
readonly required: boolean;
|
|
60
|
+
/** Optional value converter (encryption, serialization and so on). */
|
|
61
|
+
readonly converter?: ValueConverter;
|
|
62
|
+
/** Automatic value on save (see `@UUID`, `@CreatedAt`, `@UpdatedAt`). */
|
|
63
|
+
readonly convention?: PropertyConvention;
|
|
64
|
+
/** UUID version for `@UUID` (default v4). */
|
|
65
|
+
readonly uuidVersion?: "v4" | "v7";
|
|
66
|
+
/** Closed physical database default; it never affects entity initialization. */
|
|
67
|
+
readonly databaseDefault: CanonicalDefault;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Compiled index model. */
|
|
71
|
+
export interface IndexModel {
|
|
72
|
+
readonly name: string;
|
|
73
|
+
readonly columns: readonly string[];
|
|
74
|
+
readonly unique: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface CheckModel { readonly name: string; readonly expression: CheckAst }
|
|
77
|
+
|
|
78
|
+
/** Navigation kind: a reference (many-to-one) or a collection (one-to-many). */
|
|
79
|
+
export type RelationKind = "reference" | "collection";
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Compiled navigation relation model.
|
|
83
|
+
*
|
|
84
|
+
* - `reference`: the `foreignKey` is on THIS entity and points to the target's
|
|
85
|
+
* primary key.
|
|
86
|
+
* - `collection`: the `foreignKey` is on the TARGET entity and points to this
|
|
87
|
+
* entity's primary key.
|
|
88
|
+
*
|
|
89
|
+
* `target` is a lazy thunk (to break circular imports between entities).
|
|
90
|
+
*/
|
|
91
|
+
export interface RelationModel {
|
|
92
|
+
readonly navigationName: string;
|
|
93
|
+
readonly kind: RelationKind;
|
|
94
|
+
readonly target: () => new () => object;
|
|
95
|
+
/** Name of the foreign key property (on the dependent side). */
|
|
96
|
+
readonly foreignKey: string | readonly string[];
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** Foreign key for a DDL constraint (from `@ForeignKey` or a reference relation). */
|
|
100
|
+
export interface ForeignKeyModel {
|
|
101
|
+
/** Name of the foreign key property on this entity. */
|
|
102
|
+
readonly property: string;
|
|
103
|
+
readonly properties: readonly string[];
|
|
104
|
+
readonly name?: string;
|
|
105
|
+
readonly onDelete: "noAction" | "restrict" | "cascade" | "setNull";
|
|
106
|
+
readonly onUpdate: "noAction" | "restrict" | "cascade" | "setNull";
|
|
107
|
+
readonly target: () => new () => object;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Compiled entity (table) model. */
|
|
111
|
+
export interface EntityModel {
|
|
112
|
+
/** Entity class constructor. */
|
|
113
|
+
readonly ctor: new () => object;
|
|
114
|
+
/** Entity name (the class name). */
|
|
115
|
+
readonly name: string;
|
|
116
|
+
/** Table name (physical, without the schema). */
|
|
117
|
+
readonly tableName: string;
|
|
118
|
+
/** PostgreSQL database schema. */
|
|
119
|
+
readonly schema?: string;
|
|
120
|
+
/** All mapped properties in declaration order. */
|
|
121
|
+
readonly properties: readonly PropertyModel[];
|
|
122
|
+
/** The sole ordered primary-key authority. */
|
|
123
|
+
readonly key: readonly [PropertyModel, ...PropertyModel[]];
|
|
124
|
+
/** Physical name of the sole primary-key constraint, if declared explicitly. */
|
|
125
|
+
readonly keyName?: string;
|
|
126
|
+
readonly indexes: readonly IndexModel[];
|
|
127
|
+
readonly checks: readonly CheckModel[];
|
|
128
|
+
/** Navigation relations. */
|
|
129
|
+
readonly relations: readonly RelationModel[];
|
|
130
|
+
/** Foreign keys for DDL constraints. */
|
|
131
|
+
readonly foreignKeys: readonly ForeignKeyModel[];
|
|
132
|
+
/** Global query filters (`@QueryFilter`), applied to every SELECT. */
|
|
133
|
+
readonly queryFilters: readonly Condition[];
|
|
134
|
+
/** Soft-delete property name (NULL = not deleted). `@SoftDelete` / `@Entity({ softDelete })`. */
|
|
135
|
+
readonly softDeleteProperty?: string;
|
|
136
|
+
/** Property by name. */
|
|
137
|
+
propertyByName(name: string): PropertyModel | undefined;
|
|
138
|
+
/** Navigation by name. */
|
|
139
|
+
relationByName(name: string): RelationModel | undefined;
|
|
140
|
+
}
|