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.
Files changed (513) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/cli/build.ts +147 -0
  4. package/cli/codegen.ts +40 -0
  5. package/cli/generateModule.ts +187 -0
  6. package/cli/generateProject.ts +183 -0
  7. package/cli/main.ts +125 -0
  8. package/cli/moduleRegistration.ts +127 -0
  9. package/cli/naming.ts +124 -0
  10. package/cli/parseCli.ts +151 -0
  11. package/cli/templates/module.ts +497 -0
  12. package/cli/templates/pack.ts +76 -0
  13. package/cli/templates/passport.ts +178 -0
  14. package/core/agent/AgentContextBuilder.ts +567 -0
  15. package/core/agent/AgentDataDefinition.ts +8 -0
  16. package/core/agent/AgentRegistry.ts +539 -0
  17. package/core/agent/AgentRuntime.ts +47 -0
  18. package/core/agent/AgentToolExecutor.ts +2130 -0
  19. package/core/agent/AgentToolHooks.ts +39 -0
  20. package/core/agent/ModelProvider.ts +21 -0
  21. package/core/agent/README.md +229 -0
  22. package/core/agent/Tool.contract.ts +20 -0
  23. package/core/agent/decorators/Agent.ts +11 -0
  24. package/core/agent/decorators/Prompt.ts +11 -0
  25. package/core/agent/decorators/Task.ts +29 -0
  26. package/core/agent/decorators/Tool.ts +12 -0
  27. package/core/agent/errors.ts +43 -0
  28. package/core/agent/generated/catalog.ts +26 -0
  29. package/core/agent/index.ts +170 -0
  30. package/core/agent/internal/AgentExecutionDriver.ts +1497 -0
  31. package/core/agent/internal/AgentExecutionState.ts +775 -0
  32. package/core/agent/internal/AgentJsonSchema.ts +150 -0
  33. package/core/agent/internal/AgentModelBinding.ts +57 -0
  34. package/core/agent/internal/Schema.contract.ts +36 -0
  35. package/core/agent/internal/ToolAudit.projector.ts +163 -0
  36. package/core/agent/internal/ToolContract.validator.ts +102 -0
  37. package/core/agent/metadata.ts +398 -0
  38. package/core/agent/moduleContributions-v1.ts +113 -0
  39. package/core/agent/semantic.ts +903 -0
  40. package/core/agent/session/codec.ts +33 -0
  41. package/core/agent/session/contracts.ts +96 -0
  42. package/core/agent/session/entities.ts +84 -0
  43. package/core/agent/session/protector.ts +92 -0
  44. package/core/app/index.ts +5 -0
  45. package/core/app/runApp.ts +293 -0
  46. package/core/app/ui/index.ts +29 -0
  47. package/core/app/ui/uiProfileResolver.ts +966 -0
  48. package/core/app/ui/uiSurfaceHosting.ts +38 -0
  49. package/core/app/ui/uiSurfaceHttp.ts +476 -0
  50. package/core/background/BackgroundService.ts +223 -0
  51. package/core/background/backgroundModule.ts +42 -0
  52. package/core/background/decorator.ts +43 -0
  53. package/core/background/delay.ts +27 -0
  54. package/core/background/index.ts +15 -0
  55. package/core/cache/COMPATIBILITY.md +13 -0
  56. package/core/cache/ICache.ts +71 -0
  57. package/core/cache/MemoryCache.ts +394 -0
  58. package/core/cache/README.md +83 -0
  59. package/core/cache/SPEC.md +1355 -0
  60. package/core/cache/cacheModule.ts +21 -0
  61. package/core/cache/decorators/Cacheable.ts +38 -0
  62. package/core/cache/decorators/CacheableRedis.ts +39 -0
  63. package/core/cache/decorators/OutputCache.ts +33 -0
  64. package/core/cache/decorators/OutputRedisCache.ts +33 -0
  65. package/core/cache/decorators/cacheableMetadata.ts +78 -0
  66. package/core/cache/decorators/cacheableRedisMetadata.ts +81 -0
  67. package/core/cache/decorators/outputCacheMetadata.ts +71 -0
  68. package/core/cache/decorators/outputRedisCacheMetadata.ts +77 -0
  69. package/core/cache/di/classProviderHook.ts +26 -0
  70. package/core/cache/distributed/CacheCodec.ts +5 -0
  71. package/core/cache/distributed/DistributedCache.ts +403 -0
  72. package/core/cache/distributed/DistributedCacheDriver.ts +83 -0
  73. package/core/cache/distributed/DistributedCacheStores.ts +28 -0
  74. package/core/cache/distributed/IDistributedCache.ts +40 -0
  75. package/core/cache/distributed/NamedCacheRegistry.ts +23 -0
  76. package/core/cache/distributed/codecs.ts +32 -0
  77. package/core/cache/distributed/index.ts +19 -0
  78. package/core/cache/errors/CacheError.ts +16 -0
  79. package/core/cache/http/CachedHttpPayload.ts +213 -0
  80. package/core/cache/http/applyClientCacheHeaders.ts +61 -0
  81. package/core/cache/http/buildOutputCacheKey.ts +154 -0
  82. package/core/cache/http/buildRedisOutputCacheKey.ts +16 -0
  83. package/core/cache/http/composeOutputCache.ts +130 -0
  84. package/core/cache/http/outputCacheMiddleware.ts +111 -0
  85. package/core/cache/http/outputCacheSecurityWarning.ts +58 -0
  86. package/core/cache/http/outputRedisCacheMiddleware.ts +118 -0
  87. package/core/cache/index.ts +97 -0
  88. package/core/cache/internal/AutomaticCacheKey.ts +106 -0
  89. package/core/cache/internal/CacheKeyGuard.ts +56 -0
  90. package/core/cache/internal/buildCacheProviders.ts +146 -0
  91. package/core/cache/internal/normalizeCacheKey.ts +9 -0
  92. package/core/cache/internal/resolveCachePolicy.ts +32 -0
  93. package/core/cache/internal/resolveCacheableRedisPolicy.ts +17 -0
  94. package/core/cache/internal/resolveOutputRedisCachePolicy.ts +17 -0
  95. package/core/cache/providers/cachedProviders.ts +68 -0
  96. package/core/cache/services/cacheProxy.ts +243 -0
  97. package/core/cache/tokens/CACHE_POLICIES.ts +5 -0
  98. package/core/cache/tokens/DISTRIBUTED_CACHE.ts +30 -0
  99. package/core/cache/types/CacheEntry.ts +7 -0
  100. package/core/cache/types/CacheOptions.ts +60 -0
  101. package/core/cache/types/CachePolicy.ts +74 -0
  102. package/core/cache/types/CacheableRedisOptions.ts +23 -0
  103. package/core/cache/types/OutputRedisCacheOptions.ts +25 -0
  104. package/core/di/README.md +104 -0
  105. package/core/di/ServiceCollection.ts +185 -0
  106. package/core/di/ServiceProvider.ts +689 -0
  107. package/core/di/ServiceScope.ts +61 -0
  108. package/core/di/container.ts +38 -0
  109. package/core/di/errors/AmbiguousNamedDependencyError.ts +10 -0
  110. package/core/di/errors/AsyncResolutionRequiredError.ts +12 -0
  111. package/core/di/errors/CircularDependencyError.ts +10 -0
  112. package/core/di/errors/ClassDependenciesMismatchError.ts +15 -0
  113. package/core/di/errors/DiError.ts +6 -0
  114. package/core/di/errors/InvalidProviderError.ts +9 -0
  115. package/core/di/errors/ModuleEncapsulationError.ts +7 -0
  116. package/core/di/errors/ModuleOwnedProviderConflictError.ts +8 -0
  117. package/core/di/errors/NamedDependencyNotFoundError.ts +7 -0
  118. package/core/di/errors/OptionsValidationError.ts +7 -0
  119. package/core/di/errors/ProviderNotFoundError.ts +10 -0
  120. package/core/di/errors/ScopeDisposedError.ts +7 -0
  121. package/core/di/errors/ScopedServiceFromRootError.ts +9 -0
  122. package/core/di/errors/ServiceValidationError.ts +7 -0
  123. package/core/di/errors/index.ts +14 -0
  124. package/core/di/extensions/activator.ts +39 -0
  125. package/core/di/extensions/application.ts +117 -0
  126. package/core/di/extensions/hosted-service.ts +124 -0
  127. package/core/di/extensions/index.ts +23 -0
  128. package/core/di/extensions/options-reloadable.ts +137 -0
  129. package/core/di/extensions/options.ts +91 -0
  130. package/core/di/extensions/service-provider-token.ts +21 -0
  131. package/core/di/index.ts +97 -0
  132. package/core/di/internal/GraphValidator.ts +119 -0
  133. package/core/di/internal/HostedServicePlan.ts +158 -0
  134. package/core/di/internal/NamedTokenIndex.ts +55 -0
  135. package/core/di/internal/OpenGenericRegistration.ts +14 -0
  136. package/core/di/internal/ResolutionPlan.ts +18 -0
  137. package/core/di/internal/ResolutionScopeState.ts +19 -0
  138. package/core/di/internal/ResolutionTracker.ts +153 -0
  139. package/core/di/internal/ScopeLifecycle.ts +159 -0
  140. package/core/di/internal/ServiceRegistration.ts +14 -0
  141. package/core/di/internal/ServiceRegistry.ts +252 -0
  142. package/core/di/internal/classDeps.ts +38 -0
  143. package/core/di/internal/disposal.ts +58 -0
  144. package/core/di/internal/providerDeps.ts +26 -0
  145. package/core/di/module/DI.ts +146 -0
  146. package/core/di/module/Global.ts +25 -0
  147. package/core/di/module/Module.ts +44 -0
  148. package/core/di/module/ModuleRegistrar.ts +69 -0
  149. package/core/di/module/autoDeps.ts +39 -0
  150. package/core/di/module/classProviderHooks.ts +66 -0
  151. package/core/di/module/collectModuleConfigs.ts +57 -0
  152. package/core/di/module/collectModuleControllers.ts +53 -0
  153. package/core/di/module/collectModuleUiProfiles.ts +53 -0
  154. package/core/di/module/createContainer.ts +261 -0
  155. package/core/di/module/encapsulation.ts +416 -0
  156. package/core/di/module/encapsulationHooks.ts +36 -0
  157. package/core/di/module/generatedProviderAttachments.ts +102 -0
  158. package/core/di/module/index.ts +41 -0
  159. package/core/di/module/moduleExtensions.ts +35 -0
  160. package/core/di/module/moduleNameBinding.ts +136 -0
  161. package/core/di/module/moduleOwnedProviderContributors.ts +409 -0
  162. package/core/di/module/providerSelection.ts +90 -0
  163. package/core/di/module/shortcuts.ts +111 -0
  164. package/core/di/module/types/BazisModule.ts +71 -0
  165. package/core/di/module/types/DiRegistrar.ts +24 -0
  166. package/core/di/module/types/index.ts +2 -0
  167. package/core/di/provider/index.ts +26 -0
  168. package/core/di/provider/providerGuards.ts +17 -0
  169. package/core/di/provider/types/AsyncFactoryProvider.ts +15 -0
  170. package/core/di/provider/types/ClassProvider.ts +18 -0
  171. package/core/di/provider/types/FactoryProvider.ts +20 -0
  172. package/core/di/provider/types/KeyedDependency.ts +20 -0
  173. package/core/di/provider/types/LazyDependency.ts +31 -0
  174. package/core/di/provider/types/NamedDependency.ts +16 -0
  175. package/core/di/provider/types/Provider.ts +10 -0
  176. package/core/di/provider/types/ProviderDefinition.ts +11 -0
  177. package/core/di/provider/types/ProviderDependencyList.ts +11 -0
  178. package/core/di/provider/types/ProviderLifetime.ts +1 -0
  179. package/core/di/provider/types/ProviderOwnership.ts +7 -0
  180. package/core/di/provider/types/ResolvedDeps.ts +18 -0
  181. package/core/di/provider/types/ValueProvider.ts +6 -0
  182. package/core/di/provider/types/index.ts +13 -0
  183. package/core/di/token.ts +84 -0
  184. package/core/di/types/BuildServiceProviderOptions.ts +4 -0
  185. package/core/di/types/ServiceKey.ts +1 -0
  186. package/core/di/types/ServiceResolver.ts +16 -0
  187. package/core/di/types/index.ts +3 -0
  188. package/core/generatedFingerprint.ts +60 -0
  189. package/core/generatedRuntime.ts +187 -0
  190. package/core/grpc/Grpc.module.ts +23 -0
  191. package/core/grpc/GrpcBinding.contract.ts +35 -0
  192. package/core/grpc/GrpcCall.ts +73 -0
  193. package/core/grpc/GrpcClient.ts +172 -0
  194. package/core/grpc/GrpcClientCall.ts +267 -0
  195. package/core/grpc/GrpcError.ts +19 -0
  196. package/core/grpc/GrpcRequest.binding.ts +45 -0
  197. package/core/grpc/GrpcServer.ts +204 -0
  198. package/core/grpc/GrpcStatus.ts +8 -0
  199. package/core/grpc/GrpcTransport.ts +174 -0
  200. package/core/grpc/Metadata.ts +73 -0
  201. package/core/grpc/ProtoCodec.ts +225 -0
  202. package/core/grpc/ProtoParser.ts +192 -0
  203. package/core/grpc/ProtoReader.ts +34 -0
  204. package/core/grpc/ProtoSchema.ts +52 -0
  205. package/core/grpc/ServerCredentials.ts +30 -0
  206. package/core/grpc/clientContracts.ts +39 -0
  207. package/core/grpc/contracts.ts +45 -0
  208. package/core/grpc/decorators.ts +82 -0
  209. package/core/grpc/grpcClientProvider.ts +9 -0
  210. package/core/grpc/index.ts +17 -0
  211. package/core/grpc/moduleControllers.ts +38 -0
  212. package/core/grpc/protobuf.ts +80 -0
  213. package/core/grpc/serviceDefinition.ts +20 -0
  214. package/core/http/Authorization/Authorize.ts +52 -0
  215. package/core/http/Authorization/authorizeComposer.ts +31 -0
  216. package/core/http/Authorization/metadata.ts +158 -0
  217. package/core/http/Binding/ParameterBinder.ts +109 -0
  218. package/core/http/Binding/RequestModel.ts +27 -0
  219. package/core/http/Binding/autoBindings.ts +125 -0
  220. package/core/http/Binding/bindings.ts +19 -0
  221. package/core/http/Binding/convert.ts +48 -0
  222. package/core/http/Binding/generatedSpec.ts +18 -0
  223. package/core/http/Binding/listModelRegistry.ts +47 -0
  224. package/core/http/Binding/modelBinder.ts +345 -0
  225. package/core/http/Binding/modelValidator.ts +30 -0
  226. package/core/http/Binding/requestModelRegistry.ts +117 -0
  227. package/core/http/Decorators/attributes.ts +92 -0
  228. package/core/http/Decorators/controller.ts +24 -0
  229. package/core/http/Decorators/metadata.ts +107 -0
  230. package/core/http/Decorators/routes.ts +131 -0
  231. package/core/http/Errors/HttpError.ts +92 -0
  232. package/core/http/HttpContext/HttpContext.ts +148 -0
  233. package/core/http/HttpContext/ResponseBuilder.ts +37 -0
  234. package/core/http/HttpContext/inspectableRedirects.ts +47 -0
  235. package/core/http/HttpContext/principal.ts +24 -0
  236. package/core/http/HttpContext/responseLifetime.ts +45 -0
  237. package/core/http/HttpServer.ts +627 -0
  238. package/core/http/Middleware/accessLog.ts +90 -0
  239. package/core/http/Middleware/cors.ts +160 -0
  240. package/core/http/Middleware/errorHandler.ts +100 -0
  241. package/core/http/Middleware/pipeline.ts +21 -0
  242. package/core/http/Middleware/rateLimit.ts +104 -0
  243. package/core/http/Middleware/securityHeaders.ts +118 -0
  244. package/core/http/Middleware/types.ts +19 -0
  245. package/core/http/OpenApi/generatedOpenApiRegistry.ts +102 -0
  246. package/core/http/OpenApi/openApiDocs.ts +75 -0
  247. package/core/http/OpenApi/openApiDocument.ts +356 -0
  248. package/core/http/README.md +139 -0
  249. package/core/http/Results/HttpResult.ts +19 -0
  250. package/core/http/Results/normalize.ts +93 -0
  251. package/core/http/Results/results.ts +70 -0
  252. package/core/http/Routing/Router.ts +201 -0
  253. package/core/http/Routing/RouterBuilder.ts +184 -0
  254. package/core/http/Routing/template.ts +112 -0
  255. package/core/http/SPEC.md +981 -0
  256. package/core/http/Versioning/VersionReader.ts +20 -0
  257. package/core/http/WebSocketUpgrade.ts +29 -0
  258. package/core/http/composeRouteMiddlewareComposers.ts +21 -0
  259. package/core/http/correlation/createCorrelationIdMiddleware.ts +79 -0
  260. package/core/http/httpModule.ts +48 -0
  261. package/core/http/index.ts +140 -0
  262. package/core/http/middlewareTokens.ts +48 -0
  263. package/core/http/options.ts +134 -0
  264. package/core/http-client/index.ts +105 -0
  265. package/core/infra/Infra.ts +158 -0
  266. package/core/infra/InfraConnector.ts +86 -0
  267. package/core/infra/InfraLifecycle.ts +86 -0
  268. package/core/infra/cache/RedisDistributedCacheBackend.ts +88 -0
  269. package/core/infra/cache/RedisDistributedCacheDriver.ts +186 -0
  270. package/core/infra/cache/index.ts +7 -0
  271. package/core/infra/connectorConfig.ts +29 -0
  272. package/core/infra/connectorIdentity.ts +39 -0
  273. package/core/infra/connectors/codex/CodexAppServer.ts +146 -0
  274. package/core/infra/connectors/codex/CodexAppServerClient.ts +258 -0
  275. package/core/infra/connectors/codex/CodexPolicy.ts +114 -0
  276. package/core/infra/connectors/codex/CodexTurn.ts +133 -0
  277. package/core/infra/connectors/codex/contracts.ts +82 -0
  278. package/core/infra/connectors/codex.ts +26 -0
  279. package/core/infra/connectors/llm.ts +78 -0
  280. package/core/infra/connectors/llmRouter.ts +443 -0
  281. package/core/infra/connectors/openaiCompatible.ts +590 -0
  282. package/core/infra/connectors/openaiTextStream.ts +134 -0
  283. package/core/infra/connectors/opensearch.ts +307 -0
  284. package/core/infra/connectors/postgres.ts +105 -0
  285. package/core/infra/connectors/redis.ts +132 -0
  286. package/core/infra/index.ts +58 -0
  287. package/core/kernel/ApplicationLifetime.ts +91 -0
  288. package/core/kernel/Bazis.ts +73 -0
  289. package/core/kernel/Environment.ts +53 -0
  290. package/core/kernel/Kernel.ts +391 -0
  291. package/core/kernel/KernelBuilder.ts +172 -0
  292. package/core/kernel/LifecycleCoordinator.ts +204 -0
  293. package/core/kernel/README.md +66 -0
  294. package/core/kernel/SupervisedHostedService.ts +147 -0
  295. package/core/kernel/config/ConfigRegistry.ts +48 -0
  296. package/core/kernel/config/Configuration.ts +110 -0
  297. package/core/kernel/config/README.md +62 -0
  298. package/core/kernel/config/Secret.ts +29 -0
  299. package/core/kernel/config/addConfigOptions.ts +63 -0
  300. package/core/kernel/config/defineConfig.ts +211 -0
  301. package/core/kernel/config/sources.ts +123 -0
  302. package/core/kernel/correlation/requestContext.ts +57 -0
  303. package/core/kernel/errors/ConfigKeyMissingError.ts +7 -0
  304. package/core/kernel/errors/KernelError.ts +7 -0
  305. package/core/kernel/errors/ShutdownTimeoutError.ts +7 -0
  306. package/core/kernel/errors/StartupAbortedError.ts +7 -0
  307. package/core/kernel/errors/StartupTimeoutError.ts +7 -0
  308. package/core/kernel/errors/index.ts +5 -0
  309. package/core/kernel/events/EventBus.ts +140 -0
  310. package/core/kernel/events/EventToken.ts +17 -0
  311. package/core/kernel/events/eventSubscribers.ts +126 -0
  312. package/core/kernel/events/kernelEvents.ts +16 -0
  313. package/core/kernel/events/onEvent.ts +32 -0
  314. package/core/kernel/health/HealthCheckContracts.ts +42 -0
  315. package/core/kernel/health/HealthService.ts +93 -0
  316. package/core/kernel/index.ts +96 -0
  317. package/core/kernel/internal/awaitAbortable.ts +18 -0
  318. package/core/kernel/internal/awaitShutdown.ts +21 -0
  319. package/core/kernel/internal/reportDiagnosticFailure.ts +8 -0
  320. package/core/kernel/internal/validateTimeout.ts +8 -0
  321. package/core/kernel/lifecycleHooks.ts +18 -0
  322. package/core/kernel/logging/ConsoleLogger.ts +68 -0
  323. package/core/kernel/logging/Logger.ts +22 -0
  324. package/core/kernel/types/ConfigSource.ts +9 -0
  325. package/core/kernel/types/EnvironmentName.ts +1 -0
  326. package/core/kernel/types/KernelOptions.ts +23 -0
  327. package/core/kernel/types/LifecycleHook.ts +18 -0
  328. package/core/kernel/types/index.ts +4 -0
  329. package/core/orm/DATABASE_PROVIDER.ts +5 -0
  330. package/core/orm/OrmHostedPlan.validator.ts +55 -0
  331. package/core/orm/OrmLifecycle.ts +146 -0
  332. package/core/orm/OrmOwnedStoreLifecycle.ts +96 -0
  333. package/core/orm/buildOrmProviders.ts +152 -0
  334. package/core/orm/databaseConnector.ts +108 -0
  335. package/core/orm/encapsulationHook.ts +19 -0
  336. package/core/orm/index.ts +95 -0
  337. package/core/orm/listQuery.ts +198 -0
  338. package/core/orm/ormModule.ts +173 -0
  339. package/core/orm/ownedStoreContributions.ts +195 -0
  340. package/core/orm/registerRepositories.ts +27 -0
  341. package/core/orm/repository.ts +45 -0
  342. package/core/orm/strictSchemaHostedIdentity.ts +17 -0
  343. package/core/scripts/agent-codegen.ts +1166 -0
  344. package/core/scripts/di-generate-target.ts +90 -0
  345. package/core/scripts/di-generate.ts +1837 -0
  346. package/core/scripts/orm-predicate-codegen.ts +33 -0
  347. package/core/scripts/request-model-codegen.ts +326 -0
  348. package/core/websocket/DESIGN.md +297 -0
  349. package/core/websocket/WsRateLimiter.ts +101 -0
  350. package/core/websocket/adapter/adapter.interface.ts +45 -0
  351. package/core/websocket/adapter/in-memory.adapter.ts +190 -0
  352. package/core/websocket/adapter/redis-delivery-scripts.ts +135 -0
  353. package/core/websocket/adapter/redis-delivery-store.ts +86 -0
  354. package/core/websocket/adapter/redis-operations.ts +33 -0
  355. package/core/websocket/adapter/redis.adapter.ts +218 -0
  356. package/core/websocket/codec/binary.codec.ts +87 -0
  357. package/core/websocket/codec/json.codec.ts +34 -0
  358. package/core/websocket/codec/packet-codec.interface.ts +17 -0
  359. package/core/websocket/decorators.ts +165 -0
  360. package/core/websocket/explorer.ts +126 -0
  361. package/core/websocket/index.ts +78 -0
  362. package/core/websocket/middleware.ts +146 -0
  363. package/core/websocket/packet-codec.ts +75 -0
  364. package/core/websocket/reliable-delivery.ts +56 -0
  365. package/core/websocket/session-creation.ts +16 -0
  366. package/core/websocket/session-manager.ts +856 -0
  367. package/core/websocket/socket-wrapper.ts +314 -0
  368. package/core/websocket/topic-cache.ts +59 -0
  369. package/core/websocket/types.ts +122 -0
  370. package/core/websocket/websocketModule.ts +96 -0
  371. package/core/websocket/ws-dispatch.ts +123 -0
  372. package/core/websocket/ws-server.ts +1707 -0
  373. package/index.ts +281 -0
  374. package/library/boundary/diagnostics-v1.ts +136 -0
  375. package/library/boundary/index.ts +73 -0
  376. package/library/boundary/json/decodeBoundedJsonV1.ts +518 -0
  377. package/library/boundary/json/limits-v1.ts +46 -0
  378. package/library/boundary/json/normalizeBoundedJsonV1.ts +256 -0
  379. package/library/boundary/json/types-v1.ts +11 -0
  380. package/library/boundary/schema/boundarySchemaHashV1.ts +6 -0
  381. package/library/boundary/schema/collectBoundaryValueDiagnosticsV1.ts +325 -0
  382. package/library/boundary/schema/decodeBoundarySchemaV1.ts +646 -0
  383. package/library/boundary/schema/index.ts +8 -0
  384. package/library/boundary/schema/types-v1.ts +99 -0
  385. package/library/boundary/schema/validateBoundaryValueV1.ts +58 -0
  386. package/library/boundary/serialization/canonicalJsonV1.ts +66 -0
  387. package/library/http-client/HttpClient.ts +969 -0
  388. package/library/http-client/HttpClientFactory.ts +45 -0
  389. package/library/http-client/errors.ts +68 -0
  390. package/library/http-client/index.ts +43 -0
  391. package/library/http-client/interceptors.ts +40 -0
  392. package/library/http-client/progress.ts +62 -0
  393. package/library/http-client/redirectProtocol.ts +6 -0
  394. package/library/http-client/serialize.ts +133 -0
  395. package/library/http-client/types.ts +174 -0
  396. package/library/jsonapi/ListQueryError.ts +25 -0
  397. package/library/jsonapi/ListRequest.ts +37 -0
  398. package/library/jsonapi/decorators.ts +161 -0
  399. package/library/jsonapi/document.ts +124 -0
  400. package/library/jsonapi/index.ts +40 -0
  401. package/library/jsonapi/parseListQuery.ts +291 -0
  402. package/library/jsonapi/types.ts +125 -0
  403. package/library/jwt/JwtEncoder.ts +40 -0
  404. package/library/jwt/JwtKeyRing.ts +164 -0
  405. package/library/jwt/JwtValidator.ts +210 -0
  406. package/library/jwt/TokenIssuer.ts +149 -0
  407. package/library/jwt/TokenService.ts +51 -0
  408. package/library/jwt/base64url.ts +61 -0
  409. package/library/jwt/claims.ts +36 -0
  410. package/library/jwt/errors.ts +44 -0
  411. package/library/jwt/index.ts +59 -0
  412. package/library/jwt/limits.ts +8 -0
  413. package/library/jwt/signing/Hs256Algorithm.ts +62 -0
  414. package/library/jwt/signing/Rs256Algorithm.ts +133 -0
  415. package/library/jwt/signing/SigningAlgorithm.ts +18 -0
  416. package/library/jwt/signing/pem.ts +30 -0
  417. package/library/openapi/codegen.ts +875 -0
  418. package/library/openapi/document.ts +326 -0
  419. package/library/openapi/index.ts +13 -0
  420. package/library/openapi/types.ts +69 -0
  421. package/library/openapi/ui.ts +182 -0
  422. package/library/orm/DatabaseFacade.ts +209 -0
  423. package/library/orm/DbContext.ts +107 -0
  424. package/library/orm/DbContextFactory.ts +25 -0
  425. package/library/orm/DbContextOptions.ts +33 -0
  426. package/library/orm/Metadata/DynamicModelBuilder.ts +497 -0
  427. package/library/orm/Metadata/KeyTuple.ts +36 -0
  428. package/library/orm/Metadata/ModelBuilder.ts +299 -0
  429. package/library/orm/Metadata/OrmModel.ts +80 -0
  430. package/library/orm/Metadata/ValueConverter.ts +57 -0
  431. package/library/orm/Metadata/conventions.ts +54 -0
  432. package/library/orm/Metadata/decorators.ts +396 -0
  433. package/library/orm/Metadata/types.ts +140 -0
  434. package/library/orm/Providers/OwnedStoreCatalog.reader.ts +1802 -0
  435. package/library/orm/Providers/PostgresDialect.ts +234 -0
  436. package/library/orm/Providers/PostgresProvider.ts +1494 -0
  437. package/library/orm/Providers/PostgresSchema.decoder.ts +107 -0
  438. package/library/orm/Providers/limits.ts +29 -0
  439. package/library/orm/Providers/operationDeadline.ts +43 -0
  440. package/library/orm/Providers/ormOwnedStoreRuntime.ts +19 -0
  441. package/library/orm/Providers/ormTransactionRuntime.ts +117 -0
  442. package/library/orm/Providers/propertyConversion.ts +14 -0
  443. package/library/orm/Providers/resolvedForeignKey.ts +16 -0
  444. package/library/orm/Providers/transactionCallbacks.ts +45 -0
  445. package/library/orm/Providers/transactionOutcome.ts +82 -0
  446. package/library/orm/Providers/transactionScopes.ts +78 -0
  447. package/library/orm/Providers/types.ts +207 -0
  448. package/library/orm/Query/DbSet.ts +78 -0
  449. package/library/orm/Query/EntityQuery.ts +247 -0
  450. package/library/orm/Query/ImmediateMutations.ts +226 -0
  451. package/library/orm/Query/IncludeLoader.ts +200 -0
  452. package/library/orm/Query/QueryPlan.ts +55 -0
  453. package/library/orm/Query/SqlTranslator.ts +195 -0
  454. package/library/orm/Query/conditions.ts +127 -0
  455. package/library/orm/Query/materialize.ts +39 -0
  456. package/library/orm/README.md +256 -0
  457. package/library/orm/Repository/README.md +684 -0
  458. package/library/orm/Repository/Repository.ts +68 -0
  459. package/library/orm/Saving/CommandBuilder.ts +139 -0
  460. package/library/orm/Saving/ExecutionStrategy.ts +128 -0
  461. package/library/orm/Saving/SaveExecutor.ts +413 -0
  462. package/library/orm/Saving/applyConventions.ts +64 -0
  463. package/library/orm/Schema/CheckExpression.ts +327 -0
  464. package/library/orm/Schema/ExactSchemaVerifier.ts +168 -0
  465. package/library/orm/Schema/ExpectedSchema.ts +43 -0
  466. package/library/orm/Schema/MigrationRunner.ts +146 -0
  467. package/library/orm/Schema/Migrator.ts +73 -0
  468. package/library/orm/Schema/OrmOwnedStore.ts +123 -0
  469. package/library/orm/Schema/OwnedStoreAdmission.ts +752 -0
  470. package/library/orm/Schema/OwnedStoreCanonical.ts +273 -0
  471. package/library/orm/Schema/OwnedStoreCatalog.ts +1325 -0
  472. package/library/orm/Schema/SafeAdditiveSchema.ts +100 -0
  473. package/library/orm/Schema/SchemaAdmission.ts +62 -0
  474. package/library/orm/Schema/SchemaDiffer.ts +78 -0
  475. package/library/orm/Schema/formatSchemaDifferences.ts +62 -0
  476. package/library/orm/Schema/introspection.ts +52 -0
  477. package/library/orm/Schema/physicalColumnTypes.ts +37 -0
  478. package/library/orm/Schema/tableKey.ts +26 -0
  479. package/library/orm/Tracking/ChangeTracker.ts +448 -0
  480. package/library/orm/Tracking/EntityState.ts +13 -0
  481. package/library/orm/Transactions/OrmTransaction.ts +30 -0
  482. package/library/orm/Transactions/TransactionScopeCoordinator.ts +377 -0
  483. package/library/orm/errors.ts +190 -0
  484. package/library/orm/index.ts +162 -0
  485. package/library/orm/runtime.ts +14 -0
  486. package/library/redaction/index.ts +166 -0
  487. package/library/ui/UiProfile.ts +77 -0
  488. package/library/ui/compiled-v1.ts +131 -0
  489. package/library/ui/compiler/compileUiSurfaceV1.ts +717 -0
  490. package/library/ui/compiler/contracts-v1.ts +25 -0
  491. package/library/ui/compiler/index.ts +12 -0
  492. package/library/ui/compiler/openApiIndex.ts +246 -0
  493. package/library/ui/defineUiProfile.ts +340 -0
  494. package/library/ui/diagnostics-v1.ts +33 -0
  495. package/library/ui/index.ts +129 -0
  496. package/library/ui/profile-v1.ts +191 -0
  497. package/library/ui/serialization.ts +130 -0
  498. package/library/ui/uiProfileAuthoring.ts +289 -0
  499. package/library/ui/uiProfileAuthoringMetadata.ts +78 -0
  500. package/library/validation/MessageRegistry.ts +144 -0
  501. package/library/validation/README.md +62 -0
  502. package/library/validation/RuleCompiler.ts +183 -0
  503. package/library/validation/RuleEngine.ts +401 -0
  504. package/library/validation/SPEC.md +579 -0
  505. package/library/validation/ValidationError.ts +37 -0
  506. package/library/validation/ValidationResult.ts +63 -0
  507. package/library/validation/Validator.ts +101 -0
  508. package/library/validation/index.ts +16 -0
  509. package/library/validation/metadata.ts +69 -0
  510. package/library/validation/modelValidatorAdapter.ts +119 -0
  511. package/library/validation/types/ValidationCode.ts +69 -0
  512. package/library/validation/types/ValidatorOptions.ts +153 -0
  513. package/package.json +80 -0
@@ -0,0 +1,752 @@
1
+ import type { DatabaseProvider } from "../Providers/types";
2
+ import { knownExecutionStrategyBase } from "../Saving/ExecutionStrategy";
3
+ import { canonicalOwnedStoreModelHashV1, canonicalOwnedStoreRegistryLockPreimageV1, canonicalOwnedStoreScopeHashV1, canonicalOwnedStoreScopeLockPreimageV1, canonicalOwnedStoreStoreLockPreimageV1, ownedStoreAdvisoryLockV1 } from "./OwnedStoreCanonical";
4
+ import { validateCheckAst, type CheckAst, type CheckScalar } from "./CheckExpression";
5
+ import type { PropertyModel } from "../Metadata/types";
6
+ import type { CanonicalDefault, GenerationStrategy } from "./introspection";
7
+ import type { ExpectedTable, OrmExpectedSchema } from "./ExpectedSchema";
8
+ import type { OwnedStoreCatalogSemanticContextV1 } from "./OwnedStoreCatalog";
9
+ import { inspectOwnedStoreCatalogPreCreateV1, parseOwnedStoreCatalogSnapshotV1, parseOwnedStoreRegistrySnapshotV1, validateFixedRegistryShapeV1, verifyOwnedStoreCatalogAllV1 } from "./OwnedStoreCatalog";
10
+ import type { OrmCatalogScopeV1, OrmOwnedStoreDefinitionV1 } from "./OrmOwnedStore";
11
+ import { isDefinedOrmOwnedStoreV1 } from "./OrmOwnedStore";
12
+ import { failure, postgresOwnedStoreCapability, type OwnedStoreCreateOperationV1, type OwnedStoreIdentityInsertV1, type OwnedStoreSecondaryLockEntryV1 } from "../Providers/ormOwnedStoreRuntime";
13
+ import { OrmOwnedStoreAdmissionError } from "../errors";
14
+ import { types } from "node:util";
15
+ export interface PreparedOwnedStoreV1 {
16
+ readonly definition: Readonly<OrmOwnedStoreDefinitionV1>;
17
+ readonly expected: OrmExpectedSchema;
18
+ readonly ownedScopeHash: `sha256:${string}`;
19
+ readonly modelHash: `sha256:${string}`;
20
+ }
21
+ export interface OwnedStoreAdmissionRequestV1 {
22
+ readonly stores: readonly PreparedOwnedStoreV1[];
23
+ readonly signal?: AbortSignal;
24
+ }
25
+ export interface CommittedOwnedStoreAdmissionV1 {
26
+ }
27
+ export interface OwnedStoreLeaseV1 {
28
+ readonly active: boolean;
29
+ revoke(): void;
30
+ }
31
+ type Prepared = Readonly<PreparedOwnedStoreV1>;
32
+ type ReceiptState = {
33
+ readonly provider: DatabaseProvider;
34
+ readonly definitions: readonly Readonly<OrmOwnedStoreDefinitionV1>[];
35
+ state: "available" | "published" | "discarded";
36
+ };
37
+ const receipts = new WeakMap<object, ReceiptState>();
38
+ type LeaseState = {
39
+ readonly provider: DatabaseProvider;
40
+ readonly definition: Readonly<OrmOwnedStoreDefinitionV1>;
41
+ readonly graph: object;
42
+ active: boolean;
43
+ };
44
+ const leaseStates = new WeakMap<object, LeaseState>();
45
+ const leaseCounts = new WeakMap<DatabaseProvider, WeakMap<object, number>>();
46
+ const preimages = new Map<string, Buffer>();
47
+ export async function admitOwnedStoresV1(provider: DatabaseProvider, request: OwnedStoreAdmissionRequestV1): Promise<CommittedOwnedStoreAdmissionV1> {
48
+ const admitted = prepare(request);
49
+ const prepared = admitted.prepared;
50
+ const signal = admitted.signal;
51
+ if (aborted(signal))
52
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
53
+ const base = knownExecutionStrategyBase(provider);
54
+ const capability = base === undefined ? undefined : postgresOwnedStoreCapability(provider);
55
+ if (!base || !capability)
56
+ throw failure("ORM_OWNED_STORE_PROVIDER_UNSUPPORTED");
57
+ let done: object | undefined;
58
+ let marker: object | undefined;
59
+ let callbackEntries = 0;
60
+ let callbackCompletions = 0;
61
+ try {
62
+ done = await capability.withOwnedStoreAdmission(signal, async (session) => {
63
+ if (++callbackEntries !== 1)
64
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
65
+ let maximum: unknown;
66
+ try {
67
+ maximum = session.maxIdentifierLength;
68
+ }
69
+ catch {
70
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
71
+ }
72
+ if (typeof maximum !== "bigint")
73
+ throw failure("ORM_OWNED_STORE_DRIFT");
74
+ const context = Object.freeze({ maxIdentifierLength: maximum });
75
+ if (context.maxIdentifierLength < 63n)
76
+ throw failure("ORM_OWNED_STORE_PROVIDER_UNSUPPORTED");
77
+ const definitions = prepared.map(item => item.definition);
78
+ const registry = await operational(() => session.inspectRegistry()).then(snapshot => parseOwnedStoreRegistrySnapshotV1(snapshot, definitions, context));
79
+ if (registry.state.kind === "present")
80
+ validateFixedRegistryShapeV1(registry.state.shape);
81
+ assertCurrent(registry, prepared);
82
+ const rows = registry.state.kind === "present" ? registry.state.rows : [];
83
+ const catalogueScopes = scopeUnion(prepared, []);
84
+ const plan = lockPlan(prepared, rows);
85
+ const locked = await session.lockSecondary(plan);
86
+ const catalogue = await operational(() => locked.inspectCatalog(catalogueScopes)).then(snapshot => parseOwnedStoreCatalogSnapshotV1(snapshot, context));
87
+ const semantic: OwnedStoreCatalogSemanticContextV1 = Object.freeze({
88
+ stores: Object.freeze(prepared.map(item => Object.freeze({ definition: item.definition, expectedSchema: item.expected }))), requestedScopes: catalogueScopes
89
+ });
90
+ const result = inspectOwnedStoreCatalogPreCreateV1(catalogue, registry, semantic);
91
+ if (result.kind === "occupiedMissingIdentity")
92
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISSING");
93
+ const missing = result.emptyMissingIdentityStoreKeys;
94
+ let mutationAttempted = false;
95
+ if (registry.state.kind === "absent") {
96
+ try {
97
+ mutationAttempted = true;
98
+ await locked.createRegistryV1();
99
+ }
100
+ catch {
101
+ throw failure("ORM_OWNED_STORE_CREATE_FAILED");
102
+ }
103
+ try {
104
+ const reread = parseOwnedStoreRegistrySnapshotV1(await operational(() => locked.inspectRegistry()), definitions, context);
105
+ if (reread.state.kind !== "present" || reread.state.rows.length)
106
+ throw failure("ORM_OWNED_STORE_CREATE_FAILED");
107
+ validateFixedRegistryShapeV1(reread.state.shape);
108
+ }
109
+ catch (error) {
110
+ throw createFailure(error);
111
+ }
112
+ }
113
+ if (missing.length) {
114
+ try {
115
+ mutationAttempted = true;
116
+ await locked.applyCreateOperations(createPlan(prepared.filter(item => missing.includes(item.definition.storeKey)), catalogue.existingSchemas));
117
+ }
118
+ catch {
119
+ throw failure("ORM_OWNED_STORE_CREATE_FAILED");
120
+ }
121
+ try {
122
+ verifyOwnedStoreCatalogAllV1(parseOwnedStoreCatalogSnapshotV1(await operational(() => locked.inspectCatalog(catalogueScopes)), context), semantic);
123
+ }
124
+ catch (error) {
125
+ throw createFailure(error);
126
+ }
127
+ try {
128
+ mutationAttempted = true;
129
+ await locked.insertIdentities(identityRows(prepared.filter(item => missing.includes(item.definition.storeKey))));
130
+ }
131
+ catch {
132
+ throw failure("ORM_OWNED_STORE_CREATE_FAILED");
133
+ }
134
+ }
135
+ else
136
+ verifyOwnedStoreCatalogAllV1(catalogue, semantic);
137
+ let final: ReturnType<typeof parseOwnedStoreRegistrySnapshotV1>;
138
+ let finalRaw: Awaited<ReturnType<typeof locked.inspectRegistry>>;
139
+ try {
140
+ finalRaw = await operational(() => locked.inspectRegistry());
141
+ }
142
+ catch (error) {
143
+ throw mutationAttempted ? createFailure(error) : safe(error, "ORM_OWNED_STORE_LOCK_UNAVAILABLE");
144
+ }
145
+ try {
146
+ final = parseOwnedStoreRegistrySnapshotV1(finalRaw, definitions, context);
147
+ }
148
+ catch (error) {
149
+ throw mutationAttempted ? createFailure(error) : safe(error, "ORM_OWNED_STORE_DRIFT");
150
+ }
151
+ try {
152
+ if (final.state.kind !== "present")
153
+ throw failure(mutationAttempted ? "ORM_OWNED_STORE_CREATE_FAILED" : "ORM_OWNED_STORE_DRIFT");
154
+ validateFixedRegistryShapeV1(final.state.shape);
155
+ assertCurrent(final, prepared);
156
+ if (final.state.rows.filter(row => prepared.some(item => item.definition.storeKey === row.storeKey)).length !== prepared.length)
157
+ throw failure(mutationAttempted ? "ORM_OWNED_STORE_CREATE_FAILED" : "ORM_OWNED_STORE_DRIFT");
158
+ if (!final.publicSchemaExists)
159
+ throw failure(mutationAttempted ? "ORM_OWNED_STORE_CREATE_FAILED" : "ORM_OWNED_STORE_DRIFT");
160
+ }
161
+ catch (error) {
162
+ throw mutationAttempted ? createFailure(error) : safe(error, "ORM_OWNED_STORE_DRIFT");
163
+ }
164
+ if (++callbackCompletions !== 1 || callbackEntries !== 1)
165
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
166
+ marker = Object.freeze({});
167
+ return marker;
168
+ });
169
+ }
170
+ catch (error) {
171
+ throw callbackCompletions === 1 ? failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE") : safe(error, "ORM_OWNED_STORE_LOCK_UNAVAILABLE");
172
+ }
173
+ if (!done || done !== marker || callbackEntries !== 1 || callbackCompletions !== 1)
174
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
175
+ const receipt = Object.freeze({}) as CommittedOwnedStoreAdmissionV1;
176
+ receipts.set(receipt, {
177
+ provider: base, definitions: Object.freeze(prepared.map(item => item.definition)), state: "available"
178
+ });
179
+ if (aborted(signal)) {
180
+ discardOwnedStoreAdmissionV1(receipt);
181
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
182
+ }
183
+ return receipt;
184
+ }
185
+ export function publishOwnedStoreAdmissionV1(provider: DatabaseProvider, receipt: CommittedOwnedStoreAdmissionV1): readonly OwnedStoreLeaseV1[] {
186
+ const base = knownExecutionStrategyBase(provider);
187
+ if (!base)
188
+ throw failure("ORM_OWNED_STORE_PROVIDER_UNSUPPORTED");
189
+ const state = receipts.get(receipt as object);
190
+ if (!state)
191
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
192
+ if (base !== state.provider)
193
+ throw failure("ORM_OWNED_STORE_PROVIDER_UNSUPPORTED");
194
+ if (state.state !== "available")
195
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
196
+ state.state = "published";
197
+ return Object.freeze(state.definitions.map(definition => lease(base, definition, receipt as object)));
198
+ }
199
+ export function discardOwnedStoreAdmissionV1(receipt: CommittedOwnedStoreAdmissionV1): void {
200
+ const state = receipts.get(receipt as object);
201
+ if (!state || state.state !== "available")
202
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
203
+ state.state = "discarded";
204
+ }
205
+ function prepare(request: OwnedStoreAdmissionRequestV1): {
206
+ readonly prepared: readonly Prepared[];
207
+ readonly signal: AbortSignal | undefined;
208
+ } {
209
+ try {
210
+ const root = own(request, ["stores", "signal"], ["stores"]), stores = ownArray(root.stores, 128);
211
+ if (!stores.length)
212
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
213
+ const signal = root.signal === undefined ? undefined : admitSignal(root.signal);
214
+ const keys = new Set<string>();
215
+ const out = stores.map(value => {
216
+ const item = own(value, ["definition", "expected", "ownedScopeHash", "modelHash"]);
217
+ if (!isDefinedOrmOwnedStoreV1(item.definition))
218
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
219
+ const definition = item.definition as Readonly<OrmOwnedStoreDefinitionV1>;
220
+ if (keys.has(definition.storeKey))
221
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
222
+ keys.add(definition.storeKey);
223
+ if ([definition.ownedScope, ...(definition.rejectIfPresent ?? [])].some(scopeClaimsRegistry))
224
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
225
+ if ((definition.rejectIfPresent ?? []).some(scope => overlap(definition.ownedScope, scope)))
226
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
227
+ const expected = cloneExpected(item.expected as OrmExpectedSchema);
228
+ if (!expected.tables.every((table) => table.schema === definition.ownedScope.schema && table.table.startsWith(definition.ownedScope.tablePrefix)))
229
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
230
+ if (canonicalOwnedStoreScopeHashV1(definition) !== item.ownedScopeHash || canonicalOwnedStoreModelHashV1(definition, expected) !== item.modelHash)
231
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
232
+ return Object.freeze({
233
+ definition, expected, ownedScopeHash: item.ownedScopeHash as `sha256:${string}`, modelHash: item.modelHash as `sha256:${string}`
234
+ });
235
+ });
236
+ const owners = new Map<ExpectedTable, number>();
237
+ out.forEach((item, index) => item.expected.tables.forEach(table => owners.set(table, index)));
238
+ validateExpected(out.flatMap(item => item.expected.tables), owners);
239
+ for (const a of out)
240
+ for (const b of out)
241
+ if ((a !== b && overlap(a.definition.ownedScope, b.definition.ownedScope)) || [b.definition.ownedScope, ...(b.definition.rejectIfPresent ?? [])].some(scope => overlap(a.definition.ownedScope, scope) && (a !== b || scope !== a.definition.ownedScope)))
242
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
243
+ return Object.freeze({
244
+ prepared: Object.freeze(out.sort((a, b) => compareScope(a.definition.ownedScope, b.definition.ownedScope) || Buffer.compare(Buffer.from(a.definition.storeKey), Buffer.from(b.definition.storeKey)) || a.definition.formatVersion - b.definition.formatVersion)), signal
245
+ });
246
+ }
247
+ catch (error) {
248
+ throw safe(error, "ORM_OWNED_STORE_IDENTITY_MISMATCH");
249
+ }
250
+ }
251
+ function scopeClaimsRegistry(scope: OrmCatalogScopeV1): boolean {
252
+ return scope.schema === "public" && ["__bazis_orm_owned_stores_v1", "__bazis_orm_owned_stores_v1_pkey"].some(relation => relation.startsWith(scope.tablePrefix));
253
+ }
254
+ function admitSignal(value: unknown): AbortSignal {
255
+ if (value === null || (typeof value !== "object" && typeof value !== "function") || types.isProxy(value))
256
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
257
+ const getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted")?.get;
258
+ try {
259
+ if (!getter || typeof getter.call(value) !== "boolean")
260
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
261
+ }
262
+ catch {
263
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
264
+ }
265
+ return value as AbortSignal;
266
+ }
267
+ function cloneExpected(expected: OrmExpectedSchema): OrmExpectedSchema {
268
+ const charge = new SnapshotCharge();
269
+ const root = own(expected, ["tables"]), tables = ownArray(root.tables, 512);
270
+ if (!tables.length)
271
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
272
+ charge.add(4); // model record, contract, formatVersion and tables array.
273
+ const copied = Object.freeze(tables.map((value): ExpectedTable => {
274
+ charge.add(7); // table record, schema, table and the four non-PK collections.
275
+ const table = own(value, ["schema", "table", "columns", "primaryKey", "indexes", "foreignKeys", "checks"]);
276
+ const columns = Object.freeze(ownArray(table.columns, 65536).map((column): ExpectedTable["columns"][number] => {
277
+ charge.add(5); // record, column, physicalType, nullable, generation.
278
+ const item = own(column, ["property", "column", "physicalType", "nullable", "default", "generation"]);
279
+ const physicalType = item.physicalType;
280
+ if (!identifier(item.property) || !identifier(item.column) || typeof physicalType !== "string" || !["integer", "real", "text", "boolean", "datetime", "json", "uuid"].includes(physicalType) || typeof item.nullable !== "boolean")
281
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
282
+ return Object.freeze({
283
+ property: item.property, column: item.column, physicalType, nullable: item.nullable, default: cloneDefault(item.default, charge), generation: cloneGeneration(item.generation)
284
+ });
285
+ }));
286
+ const primaryKey = own(table.primaryKey, ["name", "columns"]);
287
+ if (!identifier(table.schema) || !identifier(table.table) || !identifier(primaryKey.name))
288
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
289
+ charge.add(2); // primary-key record and name; columns charges its array.
290
+ return Object.freeze({
291
+ schema: table.schema, table: table.table, columns,
292
+ primaryKey: Object.freeze({ name: primaryKey.name, columns: strings(primaryKey.columns, charge) }),
293
+ indexes: Object.freeze(ownArray(table.indexes, 65536).map((index): ExpectedTable["indexes"][number] => {
294
+ charge.add(4); // record, name, unique, method; columns charges its array.
295
+ const item = own(index, ["name", "columns", "unique", "method"]);
296
+ if (!identifier(item.name) || typeof item.unique !== "boolean" || item.method !== "btree")
297
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
298
+ return Object.freeze({ name: item.name, columns: strings(item.columns, charge), unique: item.unique, method: "btree" });
299
+ })),
300
+ foreignKeys: Object.freeze(ownArray(table.foreignKeys, 65536).map((foreignKey): ExpectedTable["foreignKeys"][number] => {
301
+ charge.add(6); // record, name, target schema/table, delete/update; arrays charge themselves.
302
+ const item = own(foreignKey, ["name", "columns", "target", "targetColumns", "onDelete", "onUpdate"]), target = own(item.target, ["schema", "table"]);
303
+ if (!identifier(item.name) || !identifier(target.schema) || !identifier(target.table) || typeof item.onDelete !== "string" || typeof item.onUpdate !== "string")
304
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
305
+ return Object.freeze({
306
+ name: item.name, columns: strings(item.columns, charge), target: Object.freeze({ schema: target.schema, table: target.table }), targetColumns: strings(item.targetColumns, charge), onDelete: item.onDelete, onUpdate: item.onUpdate
307
+ });
308
+ })),
309
+ checks: Object.freeze(ownArray(table.checks, 65536).map((check): ExpectedTable["checks"][number] => {
310
+ charge.add(2); // check record and name.
311
+ const item = own(check, ["name", "expression"]);
312
+ if (!identifier(item.name))
313
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
314
+ return Object.freeze({
315
+ name: item.name, expression: cloneCheck(item.expression, 1, { nodes: 0, active: new Set<object>() }, charge)
316
+ });
317
+ })),
318
+ });
319
+ }));
320
+ return Object.freeze({ tables: copied });
321
+ }
322
+ class SnapshotCharge {
323
+ private nodes = 0;
324
+ add(amount = 1): void {
325
+ this.nodes += amount;
326
+ if (this.nodes > 1_000_000)
327
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
328
+ }
329
+ }
330
+ function strings(value: unknown, charge: SnapshotCharge): readonly string[] {
331
+ const result = ownArray(value, 65536);
332
+ if (!result.length || result.some((entry) => !identifier(entry)) || new Set(result).size !== result.length)
333
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
334
+ charge.add(1 + result.length);
335
+ return Object.freeze(result as string[]);
336
+ }
337
+ function identifier(value: unknown): value is string {
338
+ return typeof value === "string" && Buffer.byteLength(value, "utf8") >= 1 && Buffer.byteLength(value, "utf8") <= 63 && !/[\0-\x1f\x7f-\x9f]/u.test(value) && !/[\ud800-\udfff]/u.test(value);
339
+ }
340
+ function cloneGeneration(value: unknown): GenerationStrategy {
341
+ if (value !== "none" && value !== "identityByDefault" && value !== "uuidDefault")
342
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
343
+ return value;
344
+ }
345
+ function cloneDefault(value: unknown, charge: SnapshotCharge): CanonicalDefault {
346
+ const item = own(value, ["kind", "value"], ["kind"]);
347
+ if (item.kind === "none" || item.kind === "null" || item.kind === "currentTimestamp" || item.kind === "uuidV4") {
348
+ if (Object.hasOwn(item, "value"))
349
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
350
+ charge.add(2);
351
+ return Object.freeze({ kind: item.kind });
352
+ }
353
+ if (item.kind === "boolean" && typeof item.value === "boolean") {
354
+ charge.add(3);
355
+ return Object.freeze({ kind: item.kind, value: item.value });
356
+ }
357
+ if (item.kind === "number" && typeof item.value === "number" && Number.isFinite(item.value)) {
358
+ charge.add(3);
359
+ return Object.freeze({ kind: item.kind, value: item.value });
360
+ }
361
+ if (item.kind === "string" && typeof item.value === "string" && item.value.length <= 1024 && !/[\ud800-\udfff]/u.test(item.value)) {
362
+ charge.add(3);
363
+ return Object.freeze({ kind: item.kind, value: item.value });
364
+ }
365
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
366
+ }
367
+ function scalar(value: unknown): value is CheckScalar {
368
+ return value === null || typeof value === "boolean" || (typeof value === "number" && Number.isFinite(value) && Number.isSafeInteger(value)) || (typeof value === "string" && value.length <= 1024 && !/[\ud800-\udfff]/u.test(value));
369
+ }
370
+ function cloneCheck(value: unknown, depth: number, state: {
371
+ nodes: number;
372
+ active: Set<object>;
373
+ }, charge: SnapshotCharge): CheckAst {
374
+ if (depth > 64 || ++state.nodes > 4096 || value === null || typeof value !== "object" || state.active.has(value))
375
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
376
+ state.active.add(value);
377
+ try {
378
+ const tag = kindOf(value);
379
+ if (tag.kind === "compare") {
380
+ const item = own(value, ["kind", "op", "left", "right"]);
381
+ const op = item.op;
382
+ if (!identifier(item.left) || (op !== "=" && op !== "<>" && op !== ">" && op !== ">=" && op !== "<" && op !== "<=") || !(scalar(item.right) || (typeof item.right === "string" && item.right.startsWith("\0") && identifier(item.right.slice(1)))))
383
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
384
+ charge.add(7);
385
+ return Object.freeze({ kind: "compare", op, left: item.left, right: item.right as string | CheckScalar });
386
+ }
387
+ if (tag.kind === "in") {
388
+ const item = own(value, ["kind", "left", "values"]);
389
+ if (!identifier(item.left))
390
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
391
+ const values = ownArray(item.values, 100);
392
+ if (!values.length || values.some((entry) => !scalar(entry)))
393
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
394
+ charge.add(4 + values.length);
395
+ return Object.freeze({ kind: "in", left: item.left, values: Object.freeze(values as CheckScalar[]) });
396
+ }
397
+ if (tag.kind === "null") {
398
+ const item = own(value, ["kind", "left", "not"]);
399
+ if (!identifier(item.left) || typeof item.not !== "boolean")
400
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
401
+ charge.add(4);
402
+ return Object.freeze({ kind: "null", left: item.left, not: item.not });
403
+ }
404
+ if (tag.kind === "and" || tag.kind === "or") {
405
+ const item = own(value, ["kind", "left", "right"]);
406
+ charge.add(2);
407
+ return Object.freeze({
408
+ kind: tag.kind, left: cloneCheck(item.left, depth + 1, state, charge), right: cloneCheck(item.right, depth + 1, state, charge)
409
+ });
410
+ }
411
+ if (tag.kind === "not") {
412
+ const item = own(value, ["kind", "inner"]);
413
+ charge.add(2);
414
+ return Object.freeze({ kind: "not", inner: cloneCheck(item.inner, depth + 1, state, charge) });
415
+ }
416
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
417
+ }
418
+ finally {
419
+ state.active.delete(value);
420
+ }
421
+ }
422
+ function kindOf(value: unknown): {
423
+ readonly kind: unknown;
424
+ } {
425
+ if (value === null || typeof value !== "object" || types.isProxy(value) || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype || Object.getOwnPropertySymbols(value).length)
426
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
427
+ const descriptor = Object.getOwnPropertyDescriptor(value, "kind");
428
+ if (!descriptor || !("value" in descriptor))
429
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
430
+ return Object.freeze({ kind: descriptor.value });
431
+ }
432
+ function validateExpected(tables: readonly ExpectedTable[], owners: ReadonlyMap<ExpectedTable, number>): void {
433
+ const registryRelations = new Set(["public\0__bazis_orm_owned_stores_v1", "public\0__bazis_orm_owned_stores_v1_pkey"]);
434
+ const relations = new Set(registryRelations);
435
+ for (const table of tables) {
436
+ const relation = `${table.schema}\0${table.table}`;
437
+ if (relations.has(relation))
438
+ throw failure(registryRelations.has(relation) ? "ORM_OWNED_STORE_OWNERSHIP_CONFLICT" : "ORM_OWNED_STORE_IDENTITY_MISMATCH");
439
+ relations.add(relation);
440
+ const columns = new Map(table.columns.map(column => [column.column, column]));
441
+ if (columns.size !== table.columns.length || !table.primaryKey.columns.length || !table.primaryKey.columns.every(column => columns.has(column)))
442
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
443
+ const pk = table.primaryKey.columns.map(column => columns.get(column)!);
444
+ if (pk.some(column => column.nullable))
445
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
446
+ const names = new Set([table.primaryKey.name]);
447
+ for (const name of [table.primaryKey.name, ...table.indexes.map(index => index.name)]) {
448
+ const key = `${table.schema}\0${name}`;
449
+ if (relations.has(key))
450
+ throw failure(registryRelations.has(key) ? "ORM_OWNED_STORE_OWNERSHIP_CONFLICT" : "ORM_OWNED_STORE_IDENTITY_MISMATCH");
451
+ relations.add(key);
452
+ }
453
+ for (const column of table.columns) {
454
+ const generated = column.generation !== "none";
455
+ const isPk = table.primaryKey.columns.includes(column.column);
456
+ const def = column.default;
457
+ if (generated && !isPk ||
458
+ column.generation === "identityByDefault" && (pk.length !== 1 || column.physicalType !== "integer" || def.kind !== "none") ||
459
+ column.generation === "uuidDefault" && (pk.length !== 1 || !isPk || column.physicalType !== "uuid" || def.kind !== "uuidV4") ||
460
+ column.generation === "none" && isPk && def.kind !== "none" ||
461
+ def.kind === "uuidV4" && !(column.generation === "uuidDefault" && pk.length === 1 && isPk && column.physicalType === "uuid") ||
462
+ def.kind === "currentTimestamp" ||
463
+ def.kind === "null" && !column.nullable ||
464
+ def.kind === "boolean" && !["boolean", "json"].includes(column.physicalType) ||
465
+ def.kind === "number" && (!["integer", "real", "json"].includes(column.physicalType) || column.physicalType === "integer" && !Number.isSafeInteger(def.value)) ||
466
+ def.kind === "string" && (!["text", "datetime", "json"].includes(column.physicalType) || column.physicalType === "datetime" && !rfc3339(def.value)))
467
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
468
+ }
469
+ for (const index of table.indexes)
470
+ if (!index.columns.every(column => columns.has(column)))
471
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
472
+ for (const check of table.checks) {
473
+ if (names.has(check.name))
474
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
475
+ names.add(check.name);
476
+ try {
477
+ validateCheckAst(check.expression as CheckAst, propertyProjection(table, pk));
478
+ }
479
+ catch {
480
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
481
+ }
482
+ const ast = check.expression as CheckAst;
483
+ checkColumns(ast).forEach(column => {
484
+ if (!columns.has(column))
485
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
486
+ });
487
+ checkPhysicalTypes(ast, columns);
488
+ }
489
+ for (const fk of table.foreignKeys) {
490
+ if (names.has(fk.name))
491
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
492
+ names.add(fk.name);
493
+ const target = tables.find(candidate => candidate.schema === fk.target.schema && candidate.table === fk.target.table);
494
+ if (!target || owners.get(target) !== owners.get(table) || !fk.columns.length || fk.columns.length !== fk.targetColumns.length || !fk.columns.every(column => columns.has(column)) || fk.targetColumns.join("\0") !== target.primaryKey.columns.join("\0") || !["noAction", "restrict", "cascade", "setNull"].includes(fk.onDelete) || !["noAction", "restrict", "cascade", "setNull"].includes(fk.onUpdate))
495
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
496
+ const source = fk.columns.map(column => columns.get(column)!);
497
+ const targetColumns = fk.targetColumns.map(column => target.columns.find(entry => entry.column === column));
498
+ if (targetColumns.some(column => !column) || source.some((column, index) => column.physicalType !== targetColumns[index]!.physicalType) || new Set(source.map(column => column.nullable)).size > 1 || (fk.onDelete === "setNull" || fk.onUpdate === "setNull") && !source.every(column => column.nullable))
499
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
500
+ }
501
+ }
502
+ }
503
+ function propertyProjection(table: ExpectedTable, primaryKey: readonly ExpectedTable["columns"][number][]): readonly PropertyModel[] {
504
+ const keys = new Set(primaryKey.map(column => column.column));
505
+ return table.columns.map(column => Object.freeze({
506
+ propertyName: column.column, columnName: column.column, type: checkPropertyType(column.physicalType), isKey: keys.has(column.column), generation: "none", required: !column.nullable, databaseDefault: column.default
507
+ }));
508
+ }
509
+ function checkPropertyType(physicalType: string): PropertyModel["type"] {
510
+ switch (physicalType) {
511
+ case "integer":
512
+ case "real":
513
+ case "text":
514
+ case "boolean":
515
+ case "datetime":
516
+ case "json": return physicalType;
517
+ case "uuid": return "text";
518
+ default: throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
519
+ }
520
+ }
521
+ function rfc3339(value: string): boolean {
522
+ const match = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d+)?(Z|[+-]\d{2}:\d{2})$/u);
523
+ if (!match)
524
+ return false;
525
+ const [, year, month, day, hour, minute, second, zone] = match;
526
+ if ([year, month, day, hour, minute, second, zone].some(value => value === undefined))
527
+ return false;
528
+ const numeric: readonly [
529
+ number,
530
+ number,
531
+ number,
532
+ number,
533
+ number,
534
+ number
535
+ ] = [Number(year), Number(month), Number(day), Number(hour), Number(minute), Number(second)];
536
+ if (numeric[1] < 1 || numeric[1] > 12 || numeric[2] < 1 || numeric[3] > 23 || numeric[4] > 59 || numeric[5] > 59)
537
+ return false;
538
+ if (numeric[2] > new Date(Date.UTC(numeric[0], numeric[1], 0)).getUTCDate())
539
+ return false;
540
+ if (zone !== "Z") {
541
+ const [offsetHourText, offsetMinuteText] = zone!.slice(1).split(":");
542
+ if (Number(offsetHourText) > 23 || Number(offsetMinuteText) > 59)
543
+ return false;
544
+ }
545
+ return true;
546
+ }
547
+ function checkPhysicalTypes(ast: CheckAst, columns: ReadonlyMap<string, ExpectedTable["columns"][number]>): void {
548
+ if (ast.kind === "compare" && typeof ast.right === "string" && ast.right.startsWith("\0") && columns.get(ast.left)?.physicalType !== columns.get(ast.right.slice(1))?.physicalType)
549
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
550
+ if (ast.kind === "and" || ast.kind === "or") {
551
+ checkPhysicalTypes(ast.left, columns);
552
+ checkPhysicalTypes(ast.right, columns);
553
+ }
554
+ if (ast.kind === "not")
555
+ checkPhysicalTypes(ast.inner, columns);
556
+ }
557
+ function checkColumns(ast: CheckAst): readonly string[] {
558
+ switch (ast.kind) {
559
+ case "compare": return [
560
+ ast.left, ...(typeof ast.right === "string" && ast.right.startsWith("\0") ? [ast.right.slice(1)] : [])
561
+ ];
562
+ case "in":
563
+ case "null": return [ast.left];
564
+ case "and":
565
+ case "or": return [...checkColumns(ast.left), ...checkColumns(ast.right)];
566
+ case "not": return checkColumns(ast.inner);
567
+ }
568
+ }
569
+ function own(value: unknown, keys: readonly string[], required = keys): Record<string, unknown> {
570
+ if (value === null || typeof value !== "object" || types.isProxy(value) || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype || Object.getOwnPropertySymbols(value).length)
571
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
572
+ const descriptors = Object.getOwnPropertyDescriptors(value);
573
+ if (Object.keys(descriptors).some(key => !keys.includes(key) || !("value" in descriptors[key]!)) || required.some(key => !Object.hasOwn(descriptors, key)))
574
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
575
+ return Object.fromEntries(Object.entries(descriptors).map(([key, descriptor]) => [key, (descriptor as PropertyDescriptor & {
576
+ value: unknown;
577
+ }).value]));
578
+ }
579
+ function ownArray(value: unknown, max: number): unknown[] {
580
+ if (!Array.isArray(value) || types.isProxy(value) || Object.getPrototypeOf(value) !== Array.prototype || Object.getOwnPropertySymbols(value).length || value.length > max)
581
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
582
+ const descriptors = Object.getOwnPropertyDescriptors(value), expected = new Set(["length", ...Array.from({ length: value.length }, (_, index) => String(index))]);
583
+ for (let i = 0; i < value.length; i++)
584
+ if (!descriptors[String(i)] || !("value" in descriptors[String(i)]!))
585
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
586
+ if (Object.keys(descriptors).some(key => !expected.has(key)))
587
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
588
+ return Array.from({ length: value.length }, (_, i) => (descriptors[String(i)] as PropertyDescriptor & {
589
+ value: unknown;
590
+ }).value);
591
+ }
592
+ function assertCurrent(registry: ReturnType<typeof parseOwnedStoreRegistrySnapshotV1>, prepared: readonly Prepared[]): void {
593
+ if (registry.state.kind === "present") {
594
+ const scopes: OrmCatalogScopeV1[] = [];
595
+ for (const row of registry.state.rows) {
596
+ const current = prepared.find(item => item.definition.storeKey === row.storeKey);
597
+ if (current && (row.modelHash !== current.modelHash || row.ownedScopeHash !== current.ownedScopeHash || row.ownedSchema !== current.definition.ownedScope.schema || row.tablePrefix !== current.definition.ownedScope.tablePrefix || Number(row.formatVersion) !== current.definition.formatVersion))
598
+ throw failure("ORM_OWNED_STORE_IDENTITY_MISMATCH");
599
+ const scope = { schema: row.ownedSchema, tablePrefix: row.tablePrefix };
600
+ if (scopes.some(other => overlap(other, scope)))
601
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
602
+ scopes.push(scope);
603
+ }
604
+ for (const item of prepared)
605
+ for (const scope of scopes)
606
+ if (!(scope.schema === item.definition.ownedScope.schema && scope.tablePrefix === item.definition.ownedScope.tablePrefix) && overlap(scope, item.definition.ownedScope))
607
+ throw failure("ORM_OWNED_STORE_OWNERSHIP_CONFLICT");
608
+ }
609
+ }
610
+ function scopeUnion(prepared: readonly Prepared[], rows: readonly {
611
+ readonly ownedSchema: string;
612
+ readonly tablePrefix: string;
613
+ }[]): readonly OrmCatalogScopeV1[] {
614
+ const all = [
615
+ ...prepared.flatMap(item => [item.definition.ownedScope, ...(item.definition.rejectIfPresent ?? [])]), ...rows.map(row => ({ schema: row.ownedSchema, tablePrefix: row.tablePrefix }))
616
+ ].sort(compareScope);
617
+ return Object.freeze(all.filter((x, i) => !i || x.schema !== all[i - 1]!.schema || x.tablePrefix !== all[i - 1]!.tablePrefix));
618
+ }
619
+ function lockPlan(prepared: readonly Prepared[], rows: readonly {
620
+ readonly storeKey: string;
621
+ readonly ownedSchema: string;
622
+ readonly tablePrefix: string;
623
+ readonly formatVersion: string;
624
+ }[]) {
625
+ const definitions = [
626
+ ...prepared.map(item => item.definition), ...rows.map(row => ({
627
+ contract: "bazis.orm-owned-store/v1" as const, storeKey: row.storeKey, formatVersion: Number(row.formatVersion), ownedScope: { schema: row.ownedSchema, tablePrefix: row.tablePrefix }
628
+ }))
629
+ ].sort(compareDefinition);
630
+ const scopes = [
631
+ ...prepared.flatMap(item => [item.definition.ownedScope, ...(item.definition.rejectIfPresent ?? [])]), ...rows.map(row => ({ schema: row.ownedSchema, tablePrefix: row.tablePrefix }))
632
+ ].sort(compareScope);
633
+ remember(canonicalOwnedStoreRegistryLockPreimageV1());
634
+ return Object.freeze({
635
+ stores: lockEntries("store", definitions.map(canonicalOwnedStoreStoreLockPreimageV1)), scopes: lockEntries("scope", scopes.map(canonicalOwnedStoreScopeLockPreimageV1))
636
+ });
637
+ }
638
+ function lockEntries(kind: "store" | "scope", values: readonly Buffer[]): readonly OwnedStoreSecondaryLockEntryV1[] {
639
+ const unique = new Map<string, Buffer>();
640
+ for (const preimage of values)
641
+ unique.set(preimage.toString("hex"), preimage);
642
+ return Object.freeze([...unique.values()].map(preimage => {
643
+ const key = remember(preimage);
644
+ return Object.freeze({ kind, preimage: Buffer.from(preimage), key });
645
+ }));
646
+ }
647
+ function remember(preimage: Buffer): bigint {
648
+ const key = ownedStoreAdvisoryLockV1(preimage), prior = preimages.get(key.toString());
649
+ if (prior && !prior.equals(preimage))
650
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
651
+ preimages.set(key.toString(), Buffer.from(preimage));
652
+ return key;
653
+ }
654
+ function createPlan(prepared: readonly Prepared[], existingSchemas: readonly string[]): readonly OwnedStoreCreateOperationV1[] {
655
+ const existing = new Set(existingSchemas);
656
+ const schemas = [
657
+ ...new Set(prepared.map(item => item.definition.ownedScope.schema).filter(schema => !existing.has(schema)))
658
+ ].sort(compareText);
659
+ const tables = prepared.flatMap(item => item.expected.tables).sort(compareTable);
660
+ const foreignKeys = tables.flatMap(table => table.foreignKeys.map(foreignKey => ({ table, foreignKey }))).sort((a, b) => compareTable(a.table, b.table) || compareText(a.foreignKey.name, b.foreignKey.name));
661
+ const indexes = tables.flatMap(table => table.indexes.map(index => ({ table, index }))).sort((a, b) => compareTable(a.table, b.table) || compareText(a.index.name, b.index.name));
662
+ return Object.freeze([
663
+ ...schemas.map(schema => Object.freeze({ kind: "createSchema" as const, schema })), ...tables.map(table => Object.freeze({ kind: "createTable" as const, table })), ...foreignKeys.map(({ table, foreignKey }) => Object.freeze({ kind: "addForeignKey" as const, table, foreignKey })), ...indexes.map(({ table, index }) => Object.freeze({ kind: "createIndex" as const, table, index }))
664
+ ]);
665
+ }
666
+ function identityRows(prepared: readonly Prepared[]): readonly OwnedStoreIdentityInsertV1[] {
667
+ return Object.freeze([...prepared].sort((a, b) => Buffer.compare(Buffer.from(a.definition.storeKey), Buffer.from(b.definition.storeKey))).map(item => Object.freeze({
668
+ storeKey: item.definition.storeKey, contract: "bazis.orm-owned-store/v1" as const, formatVersion: item.definition.formatVersion, ownedSchema: item.definition.ownedScope.schema, tablePrefix: item.definition.ownedScope.tablePrefix, ownedScopeHash: item.ownedScopeHash, modelHash: item.modelHash
669
+ })));
670
+ }
671
+ function lease(provider: DatabaseProvider, definition: Readonly<OrmOwnedStoreDefinitionV1>, graph: object): OwnedStoreLeaseV1 {
672
+ let counts = leaseCounts.get(provider);
673
+ if (!counts) {
674
+ counts = new WeakMap();
675
+ leaseCounts.set(provider, counts);
676
+ }
677
+ counts.set(definition, (counts.get(definition) ?? 0) + 1);
678
+ let lease: OwnedStoreLeaseV1;
679
+ lease = Object.freeze({
680
+ get active(): boolean {
681
+ return leaseStates.get(lease)?.active === true;
682
+ }, revoke(): void {
683
+ const state = leaseStates.get(lease);
684
+ if (!state || !state.active)
685
+ return;
686
+ state.active = false;
687
+ const count = counts!.get(state.definition) ?? 0;
688
+ if (count <= 1)
689
+ counts!.delete(state.definition);
690
+ else
691
+ counts!.set(state.definition, count - 1);
692
+ }
693
+ });
694
+ leaseStates.set(lease, { provider, definition, graph, active: true });
695
+ return lease;
696
+ }
697
+ function aborted(signal: AbortSignal | undefined): boolean {
698
+ if (!signal)
699
+ return false;
700
+ const getter = Object.getOwnPropertyDescriptor(AbortSignal.prototype, "aborted")?.get;
701
+ if (!getter)
702
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
703
+ try {
704
+ return getter.call(signal);
705
+ }
706
+ catch {
707
+ throw failure("ORM_OWNED_STORE_LOCK_UNAVAILABLE");
708
+ }
709
+ }
710
+ function compareText(a: string, b: string): number {
711
+ return Buffer.compare(Buffer.from(a, "utf8"), Buffer.from(b, "utf8"));
712
+ }
713
+ function compareScope(a: OrmCatalogScopeV1, b: OrmCatalogScopeV1): number {
714
+ return compareText(a.schema, b.schema) || compareText(a.tablePrefix, b.tablePrefix);
715
+ }
716
+ function compareDefinition(a: OrmOwnedStoreDefinitionV1, b: OrmOwnedStoreDefinitionV1): number {
717
+ return compareScope(a.ownedScope, b.ownedScope) || compareText(a.storeKey, b.storeKey) || a.formatVersion - b.formatVersion;
718
+ }
719
+ function compareTable(a: ExpectedTable, b: ExpectedTable): number {
720
+ return compareText(a.schema, b.schema) || compareText(a.table, b.table);
721
+ }
722
+ function overlap(a: OrmCatalogScopeV1, b: OrmCatalogScopeV1): boolean {
723
+ return a.schema === b.schema && (a.tablePrefix.startsWith(b.tablePrefix) || b.tablePrefix.startsWith(a.tablePrefix));
724
+ }
725
+ async function operational<T>(work: () => Promise<T>): Promise<T> {
726
+ try {
727
+ return await work();
728
+ }
729
+ catch (error) {
730
+ throw safe(error, "ORM_OWNED_STORE_LOCK_UNAVAILABLE");
731
+ }
732
+ }
733
+ function createFailure(error: unknown): OrmOwnedStoreAdmissionError {
734
+ const admitted = safe(error, "ORM_OWNED_STORE_CREATE_FAILED");
735
+ return admitted.code === "ORM_OWNED_STORE_OWNERSHIP_CONFLICT" || admitted.code === "ORM_OWNED_STORE_LOCK_UNAVAILABLE" ? admitted : failure("ORM_OWNED_STORE_CREATE_FAILED");
736
+ }
737
+ function safe(error: unknown, fallback: OrmOwnedStoreAdmissionError["code"]): OrmOwnedStoreAdmissionError {
738
+ try {
739
+ if (error === null || typeof error !== "object" || types.isProxy(error) || Object.getPrototypeOf(error) !== OrmOwnedStoreAdmissionError.prototype)
740
+ return failure(fallback);
741
+ const code = Object.getOwnPropertyDescriptor(error, "code"), message = Object.getOwnPropertyDescriptor(error, "message");
742
+ const known = [
743
+ "ORM_OWNED_STORE_PROVIDER_UNSUPPORTED", "ORM_OWNED_STORE_LOCK_UNAVAILABLE", "ORM_OWNED_STORE_IDENTITY_MISSING", "ORM_OWNED_STORE_IDENTITY_MISMATCH", "ORM_OWNED_STORE_OWNERSHIP_CONFLICT", "ORM_OWNED_STORE_DRIFT", "ORM_OWNED_STORE_CREATE_FAILED"
744
+ ];
745
+ if (!code || !("value" in code) || !message || !("value" in message) || typeof code.value !== "string" || code.value !== message.value || !known.includes(code.value))
746
+ return failure(fallback);
747
+ return failure(code.value as OrmOwnedStoreAdmissionError["code"]);
748
+ }
749
+ catch {
750
+ return failure(fallback);
751
+ }
752
+ }