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,207 @@
1
+ import type { ColumnType, EntityModel, IndexModel, PropertyModel } from "../Metadata/types";
2
+ import type { IntrospectedSchema } from "../Schema/introspection";
3
+ import type { OrmExpectedSchema } from "../Schema/ExpectedSchema";
4
+
5
+ /**
6
+ * A value that can be bound as a query parameter. A wide union, because
7
+ * PostgreSQL accepts native `boolean`, `Date` and `jsonb` objects. A concrete
8
+ * provider receives values after `SqlDialect.encode`.
9
+ */
10
+ export type SqlParam =
11
+ | string
12
+ | number
13
+ | bigint
14
+ | boolean
15
+ | null
16
+ | Uint8Array
17
+ | Date
18
+ | readonly unknown[]
19
+ | Record<string, unknown>;
20
+
21
+ /** A query result row. */
22
+ export type Row = Record<string, unknown>;
23
+
24
+ /**
25
+ * Minimal SQL executor. The provider implements it directly (outside a
26
+ * transaction), and inside a transaction `transaction()` passes a scoped
27
+ * executor; this is needed for pooled providers (PostgreSQL), where a
28
+ * transaction is bound to a reserved connection.
29
+ */
30
+ export interface DbExecutor {
31
+ query(sql: string, params: readonly SqlParam[]): Promise<Row[]>;
32
+ execute(sql: string, params: readonly SqlParam[]): Promise<ExecuteResult>;
33
+ }
34
+
35
+ /** Work tied to completion of the surrounding top-level transaction. */
36
+ export type TransactionCallback = () => Promise<void> | void;
37
+
38
+ /** Work that must run only after the surrounding top-level transaction commits. */
39
+ export type AfterCommitCallback = TransactionCallback;
40
+
41
+ /** Row-level lock requested by a SELECT query. */
42
+ export type RowLockMode = "update";
43
+
44
+ /** Result of a modifying command. */
45
+ export interface ExecuteResult {
46
+ /** Number of affected rows. */
47
+ readonly changes: number;
48
+ /** Id of the last inserted row (for identity keys). */
49
+ readonly lastInsertId: number | bigint;
50
+ }
51
+
52
+ /** SQL provider limits that affect the size of batch commands. */
53
+ export interface DatabaseProviderLimits {
54
+ /** Maximum number of bound parameters in one SQL command. */
55
+ readonly maxParametersPerCommand: number;
56
+ /** Optional upper limit of rows in one multi-row INSERT. */
57
+ readonly maxRowsPerInsert?: number;
58
+ /** Upper limit of values in one `WHERE ... IN (...)`. */
59
+ readonly maxParametersPerInList?: number;
60
+ }
61
+
62
+ /** Provider diagnostic signal for the health check and startup warnings. */
63
+ export interface DatabaseProviderDiagnostic {
64
+ readonly code: string;
65
+ readonly severity: "warning" | "error";
66
+ readonly message: string;
67
+ }
68
+
69
+ /** PostgreSQL-only capability: locks, transaction, DDL and catalog reads share one reserved session. */
70
+ export interface SchemaAdmissionCapabilityV1 {
71
+ readonly version: 1;
72
+ readonly provider: "postgres";
73
+ readonly distributedLock: true;
74
+ readonly transactionalDdl: true;
75
+ readonly exactIntrospection: true;
76
+ withSchemaAdmission<T>(schemas: readonly string[], work: (scope: SchemaAdmissionScope) => Promise<T>): Promise<T>;
77
+ }
78
+ export interface SchemaAdmissionScope extends DbExecutor { introspectExpected(expected: OrmExpectedSchema): Promise<IntrospectedSchema> }
79
+
80
+ /**
81
+ * SQL dialect: everything that differs between DBMSs (quoting, parameter
82
+ * placeholders, column types, auto-increment). A new provider can be added by
83
+ * implementing a dialect + a transport.
84
+ */
85
+ export interface SqlDialect {
86
+ readonly name: string;
87
+ /** Quotes one identifier; a dot inside the name is kept literally. */
88
+ quoteId(name: string): string;
89
+ /** Qualified table name, taking `EntityModel.schema` into account. */
90
+ qualifyTable(model: EntityModel): string;
91
+ /** PostgreSQL parameter placeholder by index (0-based): `$1`, `$2`, …. */
92
+ parameter(index: number): string;
93
+ /** Column type in DDL. */
94
+ columnType(type: ColumnType): string;
95
+ /** Whether `INSERT ... RETURNING` is supported. */
96
+ readonly supportsReturning: boolean;
97
+ /** Encodes a property value into a query parameter for this DBMS. */
98
+ encode(value: unknown, type: ColumnType): SqlParam;
99
+ /** Decodes a column value into a property value. */
100
+ decode(value: unknown, type: ColumnType): unknown;
101
+ /** SQL suffix for a row-locking SELECT; empty when the dialect has no such clause. */
102
+ rowLockClause(mode: RowLockMode): string;
103
+ /** DDL that creates the table (`CREATE TABLE IF NOT EXISTS ...`) with FK constraints. */
104
+ createTableSql(model: EntityModel, foreignKeys: readonly ForeignKeyConstraint[]): string;
105
+ /** DDL that creates all indexes of the entity. */
106
+ createIndexSql(model: EntityModel): readonly string[];
107
+ /** DDL that creates one index. */
108
+ createIndexSqlOne(model: EntityModel, index: IndexModel): string;
109
+ /** DDL that adds a column (`ALTER TABLE ... ADD COLUMN ...`). */
110
+ addColumnSql(model: EntityModel, property: PropertyModel, foreignKey?: ForeignKeyConstraint): string;
111
+ /**
112
+ * DDL that drops a column (`ALTER TABLE ... DROP COLUMN ...`). A destructive
113
+ * operation: the auto-migration never calls it (see `SchemaDiffer`); only
114
+ * explicit schema management scenarios do.
115
+ */
116
+ dropColumnSql(model: EntityModel, columnName: string): string;
117
+ }
118
+
119
+ /** FK constraint description for DDL (already resolved into column/table names). */
120
+ export interface ForeignKeyConstraint {
121
+ readonly column: string;
122
+ readonly columns?: readonly string[];
123
+ readonly name?: string;
124
+ readonly referencedTable: string;
125
+ readonly referencedColumn: string;
126
+ readonly referencedColumns?: readonly string[];
127
+ readonly onDelete?: "noAction" | "restrict" | "cascade" | "setNull";
128
+ readonly onUpdate?: "noAction" | "restrict" | "cascade" | "setNull";
129
+ /** Physical type of the FK column when it is more precise than the general `PropertyModel.type` (for example native PostgreSQL UUID). */
130
+ readonly columnType?: ColumnType | "uuid";
131
+ }
132
+
133
+ /**
134
+ * Transport to a concrete DBMS. The methods are async for providers with
135
+ * network I/O (PostgreSQL). Only parameterized queries are used everywhere.
136
+ */
137
+ export interface DatabaseProvider {
138
+ readonly name: string;
139
+ readonly dialect: SqlDialect;
140
+ readonly schemaAdmissionCapability?: SchemaAdmissionCapabilityV1;
141
+ /** Batch command limits of the concrete provider. */
142
+ readonly limits?: DatabaseProviderLimits;
143
+ /** Diagnostics of provider capabilities (for example a degraded migration lock). */
144
+ diagnostics?(): readonly DatabaseProviderDiagnostic[];
145
+ /** SELECT: returns rows. */
146
+ query(sql: string, params: readonly SqlParam[]): Promise<Row[]>;
147
+ /** INSERT/UPDATE/DELETE/DDL: returns the number of changes and lastInsertId. */
148
+ execute(sql: string, params: readonly SqlParam[]): Promise<ExecuteResult>;
149
+ /**
150
+ * Runs work in a transaction (BEGIN/COMMIT, ROLLBACK on exception).
151
+ * The callback gets an executor bound to the transaction's connection;
152
+ * all queries inside must go through it.
153
+ */
154
+ transaction<T>(work: (tx: DbExecutor) => Promise<T>): Promise<T>;
155
+ /**
156
+ * Runs an atomic transaction scope.
157
+ *
158
+ * Outside an ambient transaction this is equivalent to {@link transaction}.
159
+ * Inside an ambient transaction a capable provider creates a real database
160
+ * savepoint, so a caught inner failure cannot leak partial writes into the
161
+ * outer commit. The capability is optional for third-party providers; code
162
+ * that requires composable atomic work must fail fast when it is absent.
163
+ */
164
+ transactionScope?<T>(work: (tx: DbExecutor) => Promise<T>): Promise<T>;
165
+ /** True only in the current async flow while it is joined to an ambient transaction. */
166
+ isTransactionActive?(): boolean;
167
+ /**
168
+ * Registers work after the ambient top-level commit. Outside a transaction
169
+ * the callback runs immediately. Useful for notifications that must never
170
+ * expose uncommitted state.
171
+ */
172
+ afterCommit?(callback: AfterCommitCallback): Promise<void> | void;
173
+ /**
174
+ * Registers compensation after rollback of the ambient top-level
175
+ * transaction. Intended for restoring in-memory ORM state that was updated
176
+ * while SQL was executing. Outside a transaction the callback is ignored.
177
+ */
178
+ afterRollback?(callback: TransactionCallback): void;
179
+ /** Connection check for the health check. */
180
+ ping(signal?: AbortSignal): Promise<boolean>;
181
+ /** Introspection of the actual database schema (for the auto-migration). */
182
+ introspect(): Promise<IntrospectedSchema>;
183
+ /**
184
+ * Runs `work` under a cross-process migration lock (optional).
185
+ * PostgreSQL uses an advisory lock so that two instances starting at the
186
+ * same time do not race to apply migrations.
187
+ */
188
+ withMigrationLock?<T>(work: () => Promise<T>): Promise<T>;
189
+ /**
190
+ * Subscribes to an async notification channel (PostgreSQL `LISTEN`). Optional:
191
+ * providers without push support do not implement it, and the subscriber falls
192
+ * back to polling. `handler` is called for every incoming notification with
193
+ * its payload.
194
+ */
195
+ listen?(channel: string, handler: (payload: string) => void | Promise<void>): Promise<NotificationSubscription>;
196
+ /**
197
+ * Sends a notification to a channel (PostgreSQL `NOTIFY` through `pg_notify`). Optional.
198
+ * Delivered to all channel subscribers, including the sender.
199
+ */
200
+ notify?(channel: string, payload?: string): Promise<void>;
201
+ close(): Promise<void>;
202
+ }
203
+
204
+ /** Active notification channel subscription; `close()` removes it. */
205
+ export interface NotificationSubscription {
206
+ close(): Promise<void> | void;
207
+ }
@@ -0,0 +1,78 @@
1
+ import type { EntityModel } from "../Metadata/types";
2
+ import type { DbContextRuntime } from "../runtime";
3
+ import { EntityQuery } from "./EntityQuery";
4
+ import { Operand } from "./conditions";
5
+ import { KeyTuple } from "../Metadata/KeyTuple";
6
+ import { insertIfAbsent, type OrmInsertIfAbsentResultV1, type OrmUniqueKeySelectorV1 } from "./ImmediateMutations";
7
+
8
+ /**
9
+ * Table access point: queries (inherited from `EntityQuery`) plus tracker
10
+ * operations (add/update/remove/attach) and key lookup with `find`.
11
+ */
12
+ export class DbSet<T extends object> extends EntityQuery<T> {
13
+ constructor(model: EntityModel, runtime: DbContextRuntime) {
14
+ super(model, runtime);
15
+ }
16
+
17
+ /** Marks the entity for insertion. */
18
+ add(entity: T): T {
19
+ this.runtime.tracker.add(entity, this.model);
20
+ return entity;
21
+ }
22
+
23
+ addRange(entities: readonly T[]): void {
24
+ for (const entity of entities) {
25
+ this.runtime.tracker.add(entity, this.model);
26
+ }
27
+ }
28
+
29
+ /** Marks the entity as modified (full update). */
30
+ update(entity: T): T {
31
+ this.runtime.tracker.update(entity, this.model);
32
+ return entity;
33
+ }
34
+
35
+ /** Marks the entity for deletion. */
36
+ remove(entity: T): T {
37
+ this.runtime.tracker.remove(entity, this.model);
38
+ return entity;
39
+ }
40
+
41
+ /** Attaches an existing entity as Unchanged (with a snapshot). */
42
+ attach(entity: T): T {
43
+ this.runtime.tracker.attach(entity, this.model);
44
+ return entity;
45
+ }
46
+
47
+ /**
48
+ * Primary key lookup with the usual query filters/soft delete.
49
+ * The identity map still returns the canonical tracked instance, but the
50
+ * query always goes to the database so a cached entity cannot bypass filters.
51
+ */
52
+ find(key: unknown): Promise<T | null> {
53
+ return this.byKey(key).firstOrDefault();
54
+ }
55
+
56
+ /**
57
+ * Reads the current row and locks it for mutation in the surrounding
58
+ * transaction. PostgreSQL emits `FOR UPDATE`; query filters remain active.
59
+ */
60
+ findForUpdate(key: unknown): Promise<T | null> {
61
+ return this.byKey(key).forUpdate().firstOrDefault();
62
+ }
63
+
64
+ insertIfAbsent(entity: T, options: { readonly conflictBy: OrmUniqueKeySelectorV1<T> }): Promise<OrmInsertIfAbsentResultV1> {
65
+ return insertIfAbsent(this.model, this.runtime, entity, options);
66
+ }
67
+
68
+ private byKey(key: unknown): EntityQuery<T> {
69
+ const tuple = KeyTuple.fromInput(this.model, key);
70
+ let query: EntityQuery<T> = this;
71
+ for (let index = 0; index < this.model.key.length; index += 1) {
72
+ const property = this.model.key[index]!;
73
+ const value = tuple.values[index];
74
+ query = query.where((entity) => (entity as unknown as Record<string, Operand>)[property.propertyName]!.eq(value));
75
+ }
76
+ return query;
77
+ }
78
+ }
@@ -0,0 +1,247 @@
1
+ import { EntityNotFoundError } from "../errors";
2
+ import type { EntityModel } from "../Metadata/types";
3
+ import type { DbContextRuntime } from "../runtime";
4
+ import { fieldSelector, type KeySelectorFn, type PredicateFn } from "./conditions";
5
+ import { IncludeLoader } from "./IncludeLoader";
6
+ import { materialize, materializeProjection } from "./materialize";
7
+ import { EMPTY_PLAN, withCondition, withOrder, type QueryPlan } from "./QueryPlan";
8
+ import { SqlTranslator } from "./SqlTranslator";
9
+ import { executeImmediateDelete, executeImmediateUpdate, type OrmMutationResultV1, type OrmUpdateValuesV1 } from "./ImmediateMutations";
10
+
11
+ export interface ForUpdateOptionsV1 { readonly skipLocked?: boolean; }
12
+
13
+ /** Navigation element type: `Post[]` -> `Post`, `User | undefined` -> `User`. */
14
+ export type NavigationElement<N> = N extends readonly (infer E)[] ? E : NonNullable<N>;
15
+ function captureNavigation<T>(selector: (entity: T) => unknown): string {
16
+ let captured = "";
17
+ const proxy = new Proxy(
18
+ {},
19
+ {
20
+ get(_target, property): undefined {
21
+ captured = String(property);
22
+ return undefined;
23
+ },
24
+ },
25
+ );
26
+ selector(proxy as T);
27
+ if (captured === "") {
28
+ throw new Error("include/thenInclude selector must access a navigation property, e.g. x => x.posts");
29
+ }
30
+ return captured;
31
+ }
32
+
33
+ /** Captures the `.select(u => ({ alias: u.prop }))` projection. */
34
+ function captureProjection<T, R extends Record<string, unknown>>(
35
+ selector: (entity: T) => R,
36
+ ): { readonly alias: string; readonly property: string }[] {
37
+ const proxy = new Proxy(
38
+ {},
39
+ {
40
+ get(_target, property): string {
41
+ return String(property);
42
+ },
43
+ },
44
+ );
45
+ const mapped = selector(proxy as T);
46
+ return Object.entries(mapped).map(([alias, propertyName]) => ({ alias, property: String(propertyName) }));
47
+ }
48
+
49
+ /**
50
+ * Immutable LINQ-like query over one entity. Each step
51
+ * (where/orderBy/take/skip/asNoTracking) returns a new `EntityQuery` with an
52
+ * extended plan; terminal methods (toList/first/count/...) run the SQL.
53
+ */
54
+ export class EntityQuery<T extends object, TResult = T> {
55
+ constructor(
56
+ protected readonly model: EntityModel,
57
+ protected readonly runtime: DbContextRuntime,
58
+ protected readonly plan: QueryPlan = EMPTY_PLAN,
59
+ ) {}
60
+
61
+ protected derive(plan: QueryPlan): EntityQuery<T, TResult> {
62
+ return new EntityQuery<T, TResult>(this.model, this.runtime, plan);
63
+ }
64
+
65
+ /** Filter. Several calls are combined with AND. */
66
+ where(predicate: PredicateFn<T>): EntityQuery<T, TResult> {
67
+ const result = predicate(fieldSelector<T>());
68
+ return this.derive(withCondition(this.plan, result.node));
69
+ }
70
+
71
+ orderBy(selector: KeySelectorFn<T>): EntityQuery<T, TResult> {
72
+ return this.derive(withOrder(this.plan, { property: selector(fieldSelector<T>()).property, descending: false }));
73
+ }
74
+
75
+ orderByDescending(selector: KeySelectorFn<T>): EntityQuery<T, TResult> {
76
+ return this.derive(withOrder(this.plan, { property: selector(fieldSelector<T>()).property, descending: true }));
77
+ }
78
+
79
+ take(count: number): EntityQuery<T, TResult> {
80
+ const invalidRequestedLimit = !Number.isSafeInteger(count) || count <= 0 ? count : this.plan.invalidRequestedLimit;
81
+ return this.derive({ ...this.plan, limit: Math.max(0, Math.trunc(count)), requestedLimit: count, ...(invalidRequestedLimit === undefined ? {} : { invalidRequestedLimit }) });
82
+ }
83
+
84
+ skip(count: number): EntityQuery<T, TResult> {
85
+ return this.derive({ ...this.plan, offset: Math.max(0, Math.trunc(count)) });
86
+ }
87
+
88
+ /** Read-only: the result is not tracked by the ChangeTracker (faster). */
89
+ asNoTracking(): EntityQuery<T, TResult> {
90
+ return this.derive({ ...this.plan, noTracking: true });
91
+ }
92
+
93
+ /** Do not apply global `@QueryFilter`s and the soft-delete filter. */
94
+ ignoreQueryFilters(): EntityQuery<T, TResult> {
95
+ return this.derive({ ...this.plan, ignoreQueryFilters: true });
96
+ }
97
+
98
+ /**
99
+ * Locks selected rows for mutation until the surrounding transaction ends.
100
+ * PostgreSQL emits `FOR UPDATE`. Call this only inside a caller-owned
101
+ * transaction.
102
+ */
103
+ forUpdate(options?: ForUpdateOptionsV1): EntityQuery<T, TResult> {
104
+ return this.derive({ ...this.plan, rowLock: "update", skipLocked: options?.skipLocked === true });
105
+ }
106
+
107
+ /**
108
+ * Projects columns into a plain object (without materializing the full entity).
109
+ *
110
+ * ```ts
111
+ * await ctx.users.select(u => ({ name: u.name, age: u.age })).toList();
112
+ * ```
113
+ */
114
+ select<R extends Record<string, unknown>>(selector: (entity: T) => R): ProjectedQuery<T, R> {
115
+ const projections = captureProjection(selector);
116
+ return new ProjectedQuery<T, R>(this.model, this.runtime, { ...this.plan, projections, noTracking: true });
117
+ }
118
+
119
+ /**
120
+ * Eager loading of a navigation (split query). Chain `.thenInclude(...)`
121
+ * to load nested navigations.
122
+ *
123
+ * ```ts
124
+ * ctx.users.include((u) => u.posts).thenInclude((p) => p.comments).toList();
125
+ * ```
126
+ */
127
+ include<N>(selector: (entity: T) => N): IncludableQuery<T, NavigationElement<N>> {
128
+ const navigation = captureNavigation(selector);
129
+ const plan: QueryPlan = { ...this.plan, includes: [...this.plan.includes, [navigation]] };
130
+ return new IncludableQuery<T, NavigationElement<N>>(this.model, this.runtime, plan);
131
+ }
132
+
133
+ protected translator(): SqlTranslator {
134
+ return new SqlTranslator(this.model, this.runtime.provider.dialect);
135
+ }
136
+
137
+ async toList(): Promise<TResult[]> {
138
+ assertSkipLocked(this.model, this.runtime, this.plan, "toList");
139
+ const { sql, params } = this.translator().selectAll(this.plan);
140
+ const rows = await this.runtime.provider.query(sql, params);
141
+ const result: T[] = new Array(rows.length);
142
+ for (let i = 0; i < rows.length; i += 1) {
143
+ let entity = materialize<T>(this.model, rows[i]!, this.runtime.provider.dialect);
144
+ if (!this.plan.noTracking) {
145
+ // trackLoaded returns the canonical instance (identity resolution).
146
+ entity = this.plan.rowLock
147
+ ? this.runtime.tracker.trackReloaded(entity, this.model) as T
148
+ : this.runtime.tracker.trackLoaded(entity, this.model) as T;
149
+ }
150
+ result[i] = entity;
151
+ }
152
+ if (this.plan.includes.length > 0) {
153
+ await new IncludeLoader(this.runtime).load(this.model, result as object[], this.plan.includes, this.plan.noTracking);
154
+ }
155
+ return result as unknown as TResult[];
156
+ }
157
+
158
+ /** The first element or null. */
159
+ async firstOrDefault(predicate?: PredicateFn<T>): Promise<TResult | null> {
160
+ const query = predicate ? this.where(predicate) : this;
161
+ const rows = await query.take(1).toList();
162
+ return rows.length > 0 ? rows[0]! : null;
163
+ }
164
+
165
+ /** The first element, or an error if nothing is found. */
166
+ async first(predicate?: PredicateFn<T>): Promise<TResult> {
167
+ const result = await this.firstOrDefault(predicate);
168
+ if (result === null) {
169
+ throw new EntityNotFoundError(this.model.name);
170
+ }
171
+ return result;
172
+ }
173
+
174
+ async count(predicate?: PredicateFn<T>): Promise<number> {
175
+ const query = predicate ? this.where(predicate) : this;
176
+ assertSkipLocked(query.model, query.runtime, query.plan, "count");
177
+ const { sql, params } = query.translator().selectCount(query.plan);
178
+ const rows = await this.runtime.provider.query(sql, params);
179
+ return Number((rows[0] as { count?: unknown })?.count ?? 0);
180
+ }
181
+
182
+ async any(predicate?: PredicateFn<T>): Promise<boolean> {
183
+ return (await this.count(predicate)) > 0;
184
+ }
185
+
186
+ executeUpdate(values: OrmUpdateValuesV1<T>): Promise<OrmMutationResultV1> {
187
+ return executeImmediateUpdate(this.model, this.runtime, this.plan, values);
188
+ }
189
+
190
+ executeDelete(): Promise<OrmMutationResultV1> {
191
+ return executeImmediateDelete(this.model, this.runtime, this.plan);
192
+ }
193
+
194
+ }
195
+
196
+ function assertSkipLocked(model: EntityModel, runtime: DbContextRuntime, plan: QueryPlan, terminal: "toList" | "count"): void {
197
+ if (!plan.skipLocked) return;
198
+ if (terminal !== "toList" || runtime.provider.isTransactionActive?.() !== true || plan.conditions.length === 0 || plan.invalidRequestedLimit !== undefined || !Number.isSafeInteger(plan.limit) || plan.limit! <= 0 || plan.requestedLimit !== undefined && plan.requestedLimit !== plan.limit || plan.offset !== undefined || plan.projections.length !== 0 || plan.includes.length !== 0) throw new Error("FOR UPDATE SKIP LOCKED requires an active transaction, where, positive take, and terminal materialization.");
199
+ const ordered = new Set(plan.orders.map((order) => order.property));
200
+ if (!model.key.every((key) => ordered.has(key.propertyName))) throw new Error("FOR UPDATE SKIP LOCKED requires an explicit complete primary-key order.");
201
+ }
202
+
203
+ /**
204
+ * Query with an active Include chain: `thenInclude` loads a navigation of the
205
+ * last included entity (`TLast`).
206
+ */
207
+ export class IncludableQuery<T extends object, TLast> extends EntityQuery<T> {
208
+ thenInclude<N>(selector: (entity: TLast) => N): IncludableQuery<T, NavigationElement<N>> {
209
+ const navigation = captureNavigation(selector);
210
+ const includes = this.plan.includes.map((path) => [...path]);
211
+ const last = includes[includes.length - 1];
212
+ if (!last) {
213
+ throw new Error("thenInclude must follow an include().");
214
+ }
215
+ last.push(navigation);
216
+ return new IncludableQuery<T, NavigationElement<N>>(this.model, this.runtime, { ...this.plan, includes });
217
+ }
218
+ }
219
+
220
+ /** Query with a `.select(...)` projection: `toList()` returns plain objects. */
221
+ export class ProjectedQuery<T extends object, R> extends EntityQuery<T, R> {
222
+ protected override derive(plan: QueryPlan): ProjectedQuery<T, R> {
223
+ return new ProjectedQuery<T, R>(this.model, this.runtime, plan);
224
+ }
225
+
226
+ override async toList(): Promise<R[]> {
227
+ assertSkipLocked(this.model, this.runtime, this.plan, "toList");
228
+ const { sql, params } = this.translator().selectAll(this.plan);
229
+ const rows = await this.runtime.provider.query(sql, params);
230
+ const dialect = this.runtime.provider.dialect;
231
+ return rows.map((row) => materializeProjection(this.model, row, dialect, this.plan.projections) as R);
232
+ }
233
+
234
+ override async firstOrDefault(predicate?: PredicateFn<T>): Promise<R | null> {
235
+ const query = predicate ? this.where(predicate) : this;
236
+ const rows = await query.take(1).toList();
237
+ return rows.length > 0 ? rows[0]! : null;
238
+ }
239
+
240
+ override async first(predicate?: PredicateFn<T>): Promise<R> {
241
+ const result = await this.firstOrDefault(predicate);
242
+ if (result === null) {
243
+ throw new EntityNotFoundError(this.model.name);
244
+ }
245
+ return result;
246
+ }
247
+ }