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,146 @@
|
|
|
1
|
+
import type { DatabaseProvider, DbExecutor, Row, SqlParam } from "../Providers/types";
|
|
2
|
+
|
|
3
|
+
/** Execution context of a versioned migration. */
|
|
4
|
+
export interface MigrationContext {
|
|
5
|
+
/** Runs modifying SQL with `{0}` or `$1` parameters. */
|
|
6
|
+
execute(sql: string, ...params: SqlParam[]): Promise<void>;
|
|
7
|
+
/** SELECT with parameters. */
|
|
8
|
+
query<T extends Row = Row>(sql: string, ...params: SqlParam[]): Promise<T[]>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Versioned migration with `up` and an optional `down`. */
|
|
12
|
+
export interface Migration {
|
|
13
|
+
/** Unique identifier (usually timestamp_name). */
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly up: (ctx: MigrationContext) => Promise<void>;
|
|
16
|
+
readonly down?: (ctx: MigrationContext) => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface VersionedMigrationResult {
|
|
20
|
+
readonly applied: readonly string[];
|
|
21
|
+
readonly rolledBack: readonly string[];
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const HISTORY_TABLE = "__BazisMigrations";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Applies the registered migrations with history in the `__BazisMigrations` table.
|
|
28
|
+
* Compile-safe: migrations are passed as an explicit array (no dynamic import,
|
|
29
|
+
* which keeps `bun build --compile` working).
|
|
30
|
+
*/
|
|
31
|
+
export class MigrationRunner {
|
|
32
|
+
constructor(
|
|
33
|
+
private readonly provider: DatabaseProvider,
|
|
34
|
+
private readonly migrations: readonly Migration[],
|
|
35
|
+
) {}
|
|
36
|
+
|
|
37
|
+
async migrate(): Promise<VersionedMigrationResult> {
|
|
38
|
+
// A cross-process PostgreSQL advisory lock keeps two starting instances
|
|
39
|
+
// from racing to apply migrations.
|
|
40
|
+
return this.withMigrationLock(() => this.migrateCore());
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
private async migrateCore(): Promise<VersionedMigrationResult> {
|
|
44
|
+
await this.ensureHistory();
|
|
45
|
+
const appliedSet = await this.loadApplied();
|
|
46
|
+
const pending = this.migrations.filter((migration) => !appliedSet.has(migration.id));
|
|
47
|
+
const applied: string[] = [];
|
|
48
|
+
|
|
49
|
+
for (const migration of pending) {
|
|
50
|
+
await this.provider.transaction(async (tx) => {
|
|
51
|
+
await migration.up(this.context(tx));
|
|
52
|
+
await tx.execute(
|
|
53
|
+
`INSERT INTO ${this.quote(HISTORY_TABLE)} (${this.quote("MigrationId")}, ${this.quote("AppliedAt")}) VALUES (${this.param(0)}, ${this.param(1)})`,
|
|
54
|
+
[migration.id, new Date().toISOString()],
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
applied.push(migration.id);
|
|
58
|
+
}
|
|
59
|
+
return { applied, rolledBack: [] };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Rolls back the last `steps` migrations (requires `down`). */
|
|
63
|
+
async rollback(steps = 1): Promise<VersionedMigrationResult> {
|
|
64
|
+
if (!Number.isSafeInteger(steps) || steps < 0) {
|
|
65
|
+
throw new RangeError(`Migration rollback steps must be a non-negative safe integer; received ${String(steps)}.`);
|
|
66
|
+
}
|
|
67
|
+
if (steps === 0) {
|
|
68
|
+
return { applied: [], rolledBack: [] };
|
|
69
|
+
}
|
|
70
|
+
return this.withMigrationLock(() => this.rollbackCore(steps));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private async rollbackCore(steps: number): Promise<VersionedMigrationResult> {
|
|
74
|
+
await this.ensureHistory();
|
|
75
|
+
const applied = await this.loadAppliedOrdered();
|
|
76
|
+
const toRollback = applied.slice(-steps).reverse();
|
|
77
|
+
const rolledBack: string[] = [];
|
|
78
|
+
|
|
79
|
+
for (const id of toRollback) {
|
|
80
|
+
const migration = this.migrations.find((m) => m.id === id);
|
|
81
|
+
if (!migration?.down) {
|
|
82
|
+
throw new Error(`Migration "${id}" has no down() method.`);
|
|
83
|
+
}
|
|
84
|
+
await this.provider.transaction(async (tx) => {
|
|
85
|
+
await migration.down!(this.context(tx));
|
|
86
|
+
await tx.execute(`DELETE FROM ${this.quote(HISTORY_TABLE)} WHERE ${this.quote("MigrationId")} = ${this.param(0)}`, [
|
|
87
|
+
id,
|
|
88
|
+
]);
|
|
89
|
+
});
|
|
90
|
+
rolledBack.push(id);
|
|
91
|
+
}
|
|
92
|
+
return { applied: [], rolledBack };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private withMigrationLock<T>(work: () => Promise<T>): Promise<T> {
|
|
96
|
+
return this.provider.withMigrationLock ? this.provider.withMigrationLock(work) : work();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private context(tx: DbExecutor): MigrationContext {
|
|
100
|
+
return {
|
|
101
|
+
execute: async (sql, ...params) => {
|
|
102
|
+
await tx.execute(this.rewrite(sql, params.length), params);
|
|
103
|
+
},
|
|
104
|
+
query: async <T extends Row = Row>(sql: string, ...params: SqlParam[]) =>
|
|
105
|
+
tx.query(this.rewrite(sql, params.length), params) as Promise<T[]>,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private async ensureHistory(): Promise<void> {
|
|
110
|
+
await this.provider.execute(
|
|
111
|
+
`CREATE TABLE IF NOT EXISTS ${this.quote(HISTORY_TABLE)} (${this.quote("MigrationId")} TEXT PRIMARY KEY, ${this.quote("AppliedAt")} TEXT NOT NULL)`,
|
|
112
|
+
[],
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
private async loadApplied(): Promise<Set<string>> {
|
|
117
|
+
const rows = await this.provider.query(`SELECT ${this.quote("MigrationId")} AS id FROM ${this.quote(HISTORY_TABLE)}`, []);
|
|
118
|
+
return new Set(rows.map((row) => String(row.id)));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
private async loadAppliedOrdered(): Promise<string[]> {
|
|
122
|
+
const rows = await this.provider.query(
|
|
123
|
+
`SELECT ${this.quote("MigrationId")} AS id FROM ${this.quote(HISTORY_TABLE)} ORDER BY ${this.quote("AppliedAt")} ASC`,
|
|
124
|
+
[],
|
|
125
|
+
);
|
|
126
|
+
return rows.map((row) => String(row.id));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private quote(name: string): string {
|
|
130
|
+
return this.provider.dialect.quoteId(name);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private param(index: number): string {
|
|
134
|
+
return this.provider.dialect.parameter(index);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private rewrite(sql: string, count: number): string {
|
|
138
|
+
return sql.replace(/\{(\d+)\}/g, (_match, raw: string) => {
|
|
139
|
+
const index = Number(raw);
|
|
140
|
+
if (index >= count) {
|
|
141
|
+
throw new RangeError(`Migration SQL references {${index}} but only ${count} parameter(s) provided.`);
|
|
142
|
+
}
|
|
143
|
+
return this.param(index);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { EntityModel } from "../Metadata/types";
|
|
2
|
+
import type { DatabaseProvider, ForeignKeyConstraint } from "../Providers/types";
|
|
3
|
+
import type { AdditiveSchemaOperation } from "./SchemaDiffer";
|
|
4
|
+
import { physicalTableIdentity } from "./tableKey";
|
|
5
|
+
|
|
6
|
+
/** Schema migration outcome. */
|
|
7
|
+
export interface MigrationResult {
|
|
8
|
+
/** Number of applied operations. */
|
|
9
|
+
readonly applied: number;
|
|
10
|
+
/** Human-readable description of the applied operations. */
|
|
11
|
+
readonly operations: readonly string[];
|
|
12
|
+
/** Destructive differences left untouched. */
|
|
13
|
+
readonly warnings: readonly string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Applies additive schema change operations in one transaction.
|
|
18
|
+
* FK constraints for `createTable` are computed by the given resolver
|
|
19
|
+
* (column/table names already resolved).
|
|
20
|
+
*/
|
|
21
|
+
export class Migrator {
|
|
22
|
+
constructor(
|
|
23
|
+
private readonly provider: DatabaseProvider,
|
|
24
|
+
private readonly foreignKeysFor: (model: EntityModel) => readonly ForeignKeyConstraint[],
|
|
25
|
+
) {}
|
|
26
|
+
|
|
27
|
+
async apply(operations: readonly AdditiveSchemaOperation[]): Promise<string[]> {
|
|
28
|
+
if (operations.length === 0) {
|
|
29
|
+
return [];
|
|
30
|
+
}
|
|
31
|
+
const log: string[] = [];
|
|
32
|
+
|
|
33
|
+
await this.provider.transaction(async (tx) => {
|
|
34
|
+
for (const operation of operations) {
|
|
35
|
+
const schema = physicalTableIdentity(operation.model).schema;
|
|
36
|
+
if (operation.kind === "createTable" && schema !== undefined && this.provider.dialect.name === "postgres") {
|
|
37
|
+
await tx.execute(
|
|
38
|
+
`CREATE SCHEMA IF NOT EXISTS ${this.provider.dialect.quoteId(schema)}`,
|
|
39
|
+
[],
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
const sql = this.render(operation);
|
|
43
|
+
await tx.execute(sql, []);
|
|
44
|
+
log.push(this.describe(operation));
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
return log;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private render(operation: AdditiveSchemaOperation): string {
|
|
51
|
+
const dialect = this.provider.dialect;
|
|
52
|
+
switch (operation.kind) {
|
|
53
|
+
case "createTable":
|
|
54
|
+
return dialect.createTableSql(operation.model, this.foreignKeysFor(operation.model));
|
|
55
|
+
case "addColumn":
|
|
56
|
+
return dialect.addColumnSql(operation.model, operation.property,
|
|
57
|
+
this.foreignKeysFor(operation.model).find((fk) => (fk.columns ?? [fk.column]).includes(operation.property.columnName)));
|
|
58
|
+
case "createIndex":
|
|
59
|
+
return dialect.createIndexSqlOne(operation.model, operation.index);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
private describe(operation: AdditiveSchemaOperation): string {
|
|
64
|
+
switch (operation.kind) {
|
|
65
|
+
case "createTable":
|
|
66
|
+
return `create table ${operation.model.tableName}`;
|
|
67
|
+
case "addColumn":
|
|
68
|
+
return `add column ${operation.model.tableName}.${operation.property.columnName}`;
|
|
69
|
+
case "createIndex":
|
|
70
|
+
return `create index ${operation.index.name}`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { types } from "node:util";
|
|
2
|
+
import { OrmOwnedStoreAdmissionError } from "../errors";
|
|
3
|
+
|
|
4
|
+
export interface OrmCatalogScopeV1 {
|
|
5
|
+
readonly schema: string;
|
|
6
|
+
readonly tablePrefix: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface OrmOwnedStoreDefinitionV1 {
|
|
10
|
+
readonly contract: "bazis.orm-owned-store/v1";
|
|
11
|
+
readonly storeKey: string;
|
|
12
|
+
readonly formatVersion: number;
|
|
13
|
+
readonly ownedScope: OrmCatalogScopeV1;
|
|
14
|
+
readonly rejectIfPresent?: readonly OrmCatalogScopeV1[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const IDENTITY_MISMATCH = "ORM_OWNED_STORE_IDENTITY_MISMATCH";
|
|
18
|
+
const OWNERSHIP_CONFLICT = "ORM_OWNED_STORE_OWNERSHIP_CONFLICT";
|
|
19
|
+
const CONTRACT = "bazis.orm-owned-store/v1" as const;
|
|
20
|
+
const maxRejectScopes = 64;
|
|
21
|
+
const canonicalDefinitions = new WeakSet<object>();
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Takes a hostile-input-safe snapshot of an owned-store descriptor. This is
|
|
25
|
+
* deliberately a nominal boundary only; its private identity is installed by
|
|
26
|
+
* later lifecycle work, never on the caller's object.
|
|
27
|
+
*/
|
|
28
|
+
export function defineOrmOwnedStoreV1(definition: OrmOwnedStoreDefinitionV1): Readonly<OrmOwnedStoreDefinitionV1> {
|
|
29
|
+
try {
|
|
30
|
+
rejectProxy(definition);
|
|
31
|
+
const root = closedRecord(definition, ["contract", "storeKey", "formatVersion", "ownedScope", "rejectIfPresent"], ["contract", "storeKey", "formatVersion", "ownedScope"]);
|
|
32
|
+
const contract = root.contract;
|
|
33
|
+
const storeKey = root.storeKey;
|
|
34
|
+
const formatVersion = root.formatVersion;
|
|
35
|
+
if (contract !== CONTRACT || !validString(storeKey, 128) || typeof formatVersion !== "number" || !Number.isSafeInteger(formatVersion) || formatVersion <= 0) throw identity();
|
|
36
|
+
const ownedScope = readScope(root.ownedScope);
|
|
37
|
+
const rejectIfPresent = root.rejectIfPresent === undefined ? [] : readScopes(root.rejectIfPresent);
|
|
38
|
+
if (rejectIfPresent.some((scope) => sameScope(scope, ownedScope))) throw ownership();
|
|
39
|
+
const canonicalRejects = uniqueSortedScopes(rejectIfPresent);
|
|
40
|
+
const result: OrmOwnedStoreDefinitionV1 = canonicalRejects.length === 0
|
|
41
|
+
? { contract: CONTRACT, storeKey, formatVersion, ownedScope }
|
|
42
|
+
: { contract: CONTRACT, storeKey, formatVersion, ownedScope, rejectIfPresent: canonicalRejects };
|
|
43
|
+
const frozen = deepFreeze(result);
|
|
44
|
+
canonicalDefinitions.add(frozen);
|
|
45
|
+
return frozen;
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error instanceof OrmOwnedStoreAdmissionError) throw error;
|
|
48
|
+
throw identity();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Private nominal check for the later core lifecycle; intentionally not barrel-exported. */
|
|
53
|
+
export function isDefinedOrmOwnedStoreV1(value: unknown): value is Readonly<OrmOwnedStoreDefinitionV1> {
|
|
54
|
+
return value !== null && typeof value === "object" && canonicalDefinitions.has(value);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function readScopes(value: unknown): readonly OrmCatalogScopeV1[] {
|
|
58
|
+
rejectProxy(value);
|
|
59
|
+
if (!Array.isArray(value) || Object.getPrototypeOf(value) !== Array.prototype) throw identity();
|
|
60
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
61
|
+
if (Object.getOwnPropertySymbols(value).length !== 0) throw identity();
|
|
62
|
+
if (value.length > maxRejectScopes) throw identity();
|
|
63
|
+
const expected = new Set(["length", ...Array.from({ length: value.length }, (_, index) => String(index))]);
|
|
64
|
+
if (Object.keys(descriptors).some((key) => !expected.has(key))) throw identity();
|
|
65
|
+
const scopes: OrmCatalogScopeV1[] = [];
|
|
66
|
+
for (let index = 0; index < value.length; index++) {
|
|
67
|
+
const descriptor = descriptors[String(index)];
|
|
68
|
+
if (!descriptor || !("value" in descriptor)) throw identity();
|
|
69
|
+
scopes.push(readScope(descriptor.value));
|
|
70
|
+
}
|
|
71
|
+
return scopes;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function readScope(value: unknown): OrmCatalogScopeV1 {
|
|
75
|
+
const record = closedRecord(value, ["schema", "tablePrefix"], ["schema", "tablePrefix"]);
|
|
76
|
+
if (!validString(record.schema, 63) || !validString(record.tablePrefix, 63)) throw identity();
|
|
77
|
+
return { schema: record.schema, tablePrefix: record.tablePrefix };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function closedRecord(value: unknown, allowed: readonly string[], required: readonly string[]): Record<string, unknown> {
|
|
81
|
+
rejectProxy(value);
|
|
82
|
+
if (value === null || typeof value !== "object") throw identity();
|
|
83
|
+
const prototype = Object.getPrototypeOf(value);
|
|
84
|
+
if (prototype !== Object.prototype && prototype !== null) throw identity();
|
|
85
|
+
if (Object.getOwnPropertySymbols(value).length !== 0) throw identity();
|
|
86
|
+
const descriptors = Object.getOwnPropertyDescriptors(value);
|
|
87
|
+
for (const key of Object.keys(descriptors)) {
|
|
88
|
+
if (!allowed.includes(key)) throw identity();
|
|
89
|
+
const descriptor = descriptors[key]!;
|
|
90
|
+
if (!("value" in descriptor) || descriptor.value === undefined) throw identity();
|
|
91
|
+
}
|
|
92
|
+
for (const key of required) if (!Object.hasOwn(descriptors, key)) throw identity();
|
|
93
|
+
return Object.fromEntries(Object.entries(descriptors).map(([key, descriptor]) => [key, (descriptor as PropertyDescriptor & { value: unknown }).value]));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function validString(value: unknown, maxBytes: number): value is string {
|
|
97
|
+
if (typeof value !== "string") return false;
|
|
98
|
+
if (Buffer.byteLength(value, "utf8") < 1 || Buffer.byteLength(value, "utf8") > maxBytes) return false;
|
|
99
|
+
for (let index = 0; index < value.length; index++) {
|
|
100
|
+
const unit = value.charCodeAt(index);
|
|
101
|
+
if (unit >= 0xd800 && unit <= 0xdbff) {
|
|
102
|
+
const next = value.charCodeAt(index + 1);
|
|
103
|
+
if (!Number.isInteger(next) || next < 0xdc00 || next > 0xdfff) return false;
|
|
104
|
+
index++;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if ((unit >= 0xdc00 && unit <= 0xdfff) || unit <= 0x1f || (unit >= 0x7f && unit <= 0x9f)) return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function uniqueSortedScopes(scopes: readonly OrmCatalogScopeV1[]): readonly OrmCatalogScopeV1[] {
|
|
113
|
+
const result = [...scopes].sort(compareScope);
|
|
114
|
+
return result.filter((scope, index) => index === 0 || !sameScope(scope, result[index - 1]!)).map((scope) => ({ ...scope }));
|
|
115
|
+
}
|
|
116
|
+
function compareScope(left: OrmCatalogScopeV1, right: OrmCatalogScopeV1): number {
|
|
117
|
+
return Buffer.compare(Buffer.from(left.schema, "utf8"), Buffer.from(right.schema, "utf8")) || Buffer.compare(Buffer.from(left.tablePrefix, "utf8"), Buffer.from(right.tablePrefix, "utf8"));
|
|
118
|
+
}
|
|
119
|
+
function sameScope(left: OrmCatalogScopeV1, right: OrmCatalogScopeV1): boolean { return left.schema === right.schema && left.tablePrefix === right.tablePrefix; }
|
|
120
|
+
function rejectProxy(value: unknown): void { if (value !== null && (typeof value === "object" || typeof value === "function") && types.isProxy(value)) throw identity(); }
|
|
121
|
+
function identity(): OrmOwnedStoreAdmissionError { return new OrmOwnedStoreAdmissionError(IDENTITY_MISMATCH, IDENTITY_MISMATCH); }
|
|
122
|
+
function ownership(): OrmOwnedStoreAdmissionError { return new OrmOwnedStoreAdmissionError(OWNERSHIP_CONFLICT, OWNERSHIP_CONFLICT); }
|
|
123
|
+
function deepFreeze<T>(value: T): T { if (value && typeof value === "object") { for (const child of Object.values(value)) deepFreeze(child); Object.freeze(value); } return value; }
|