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,261 @@
1
+ import { DiContainer } from "../container";
2
+ import { ServiceCollection } from "../ServiceCollection";
3
+ import { HOSTED_SERVICE, type HostedService } from "../extensions/hosted-service";
4
+ import { SERVICE_PROVIDER, SERVICE_PROVIDER_BY_TYPE } from "../extensions/service-provider-token";
5
+ import { isClassProvider, ProviderDefinition, type Provider } from "../provider";
6
+ import { getClassDeps } from "../internal/classDeps";
7
+ import { ModuleEncapsulationError } from "../errors";
8
+ import { OpenGenericRegistration } from "../internal/OpenGenericRegistration";
9
+ import type { Class } from "../token";
10
+ import type { BuildServiceProviderOptions } from "../types";
11
+ import { DI } from "./DI";
12
+ import { Global } from "./Global";
13
+ import { Module } from "./Module";
14
+ import { validateModuleEncapsulation, type ModuleGraphRecord } from "./encapsulation";
15
+ import { expandModuleMetadata } from "./moduleExtensions";
16
+ import {
17
+ applyModuleOwnedProviderContributors,
18
+ ModuleOwnedContributionStore,
19
+ validateModuleOwnedContributions,
20
+ } from "./moduleOwnedProviderContributors";
21
+ import { createModuleScopedNameBinder } from "./moduleNameBinding";
22
+ import { createProviderSelectionValidator } from "./providerSelection";
23
+ import { ModuleRegistrar } from "./ModuleRegistrar";
24
+ import { scoped, singleton } from "./shortcuts";
25
+ import { getGeneratedClassDeps } from "./autoDeps";
26
+ import { applyClassProviderHooksToDefinition, collectClassProviderHooks } from "./classProviderHooks";
27
+ import type { BazisModuleRef } from "./types";
28
+
29
+ function moduleDiagnosticName(moduleRef: BazisModuleRef, fallbackIndex: number): string {
30
+ if (typeof moduleRef === "function") {
31
+ const name = moduleRef.name.trim();
32
+ if (name.length > 0) {
33
+ return name;
34
+ }
35
+ }
36
+ return `module#${fallbackIndex}`;
37
+ }
38
+
39
+ export function createContainer(rootModule: BazisModuleRef, options?: BuildServiceProviderOptions): DiContainer {
40
+ // The container itself is injectable (SERVICE_PROVIDER, .NET-style). The
41
+ // instance does not exist until the end of this function, so the factory
42
+ // closes over a ref that is assigned right after construction.
43
+ let built: DiContainer | undefined;
44
+ @Global()
45
+ @Module({
46
+ providers: [
47
+ DI.singleton(
48
+ DI.factoryProvider(SERVICE_PROVIDER, [], () => {
49
+ if (!built) {
50
+ throw new Error("SERVICE_PROVIDER resolved before the container finished building.");
51
+ }
52
+ return built;
53
+ }),
54
+ ),
55
+ // Canonical class token for generated identity and name-based deps.
56
+ DI.singleton(
57
+ DI.factoryProvider(SERVICE_PROVIDER_BY_TYPE, [], () => {
58
+ if (!built) {
59
+ throw new Error("SERVICE_PROVIDER resolved before the container finished building.");
60
+ }
61
+ return built;
62
+ }),
63
+ ),
64
+ ],
65
+ })
66
+ class BazisDiInfraModule {}
67
+
68
+ const diInfraModule = BazisDiInfraModule;
69
+
70
+ const collection = new ServiceCollection();
71
+ const registrar = new ModuleRegistrar(collection);
72
+ const records = new Map<BazisModuleRef, ModuleGraphRecord>();
73
+ const moduleOwnedContributions = new ModuleOwnedContributionStore();
74
+ // Which module declared each definition — used for module-scoped name binding.
75
+ const recordOf = new Map<ProviderDefinition, ModuleGraphRecord>();
76
+ const openGenericRecordOf = new Map<OpenGenericRegistration, ModuleGraphRecord>();
77
+ const loading: BazisModuleRef[] = [];
78
+ const activeModules = new Set<BazisModuleRef>();
79
+
80
+ const loadModule = (moduleRef: BazisModuleRef): void => {
81
+ if (activeModules.has(moduleRef)) {
82
+ const cycle = [...loading.slice(loading.indexOf(moduleRef)), moduleRef]
83
+ .map((ref) => records.get(ref)!.name).join(" -> ");
84
+ throw new ModuleEncapsulationError([`Module imports cycle: ${cycle}`]);
85
+ }
86
+ if (records.has(moduleRef)) {
87
+ return;
88
+ }
89
+ const record: ModuleGraphRecord = {
90
+ name: moduleDiagnosticName(moduleRef, records.size),
91
+ imports: [],
92
+ exports: moduleRef.exports,
93
+ global: moduleRef.global === true,
94
+ providedTokens: new Set(),
95
+ providedFamilies: new Set(),
96
+ definitions: [],
97
+ };
98
+ records.set(moduleRef, record);
99
+ activeModules.add(moduleRef);
100
+ loading.push(moduleRef);
101
+
102
+ const imports = moduleRef.imports;
103
+ if (imports) {
104
+ for (let index = 0; index < imports.length; index += 1) {
105
+ const importedModule = imports[index] as BazisModuleRef;
106
+ loadModule(importedModule);
107
+ record.imports.push(records.get(importedModule) as ModuleGraphRecord);
108
+ }
109
+ }
110
+
111
+ // Extra declarative keys (e.g. `ormBazis`) contributed by higher layers via
112
+ // registered expanders — loaded exactly like `imports`.
113
+ const expanded = expandModuleMetadata(moduleRef);
114
+ for (let index = 0; index < expanded.length; index += 1) {
115
+ const expandedModule = expanded[index] as BazisModuleRef;
116
+ loadModule(expandedModule);
117
+ record.imports.push(records.get(expandedModule) as ModuleGraphRecord);
118
+ }
119
+
120
+ const definitionsStart = collection.size;
121
+ const openGenericsStart = collection.openGenericSize;
122
+
123
+ const providers = moduleRef.providers;
124
+ if (providers) {
125
+ for (let index = 0; index < providers.length; index += 1) {
126
+ collection.add(providers[index] as ProviderDefinition);
127
+ }
128
+ }
129
+
130
+ const controllers = moduleRef.controllers;
131
+ if (controllers) {
132
+ for (let index = 0; index < controllers.length; index += 1) {
133
+ collection.add(scoped(controllers[index] as Class<object>));
134
+ }
135
+ }
136
+
137
+ const background = moduleRef.background;
138
+ if (background) {
139
+ for (let index = 0; index < background.length; index += 1) {
140
+ const ServiceClass = background[index] as Class<HostedService>;
141
+ // Singleton instance + a HOSTED_SERVICE entry resolving to it, so the
142
+ // kernel starts/stops it with the rest of the app.
143
+ collection.add(singleton(ServiceClass));
144
+ collection.add(
145
+ DI.singleton(DI.factoryProviderWithResolver(HOSTED_SERVICE, [], (resolver) => resolver.resolve(ServiceClass))),
146
+ );
147
+ }
148
+ }
149
+
150
+ moduleRef.configure?.(registrar);
151
+
152
+ // Higher-layer declarative capabilities are registered while their owner
153
+ // record is still open. This preserves access to private feature deps
154
+ // without turning a contribution into a synthetic imported module.
155
+ applyModuleOwnedProviderContributors(
156
+ moduleRef,
157
+ record.name,
158
+ collection,
159
+ moduleOwnedContributions,
160
+ definitionsStart,
161
+ );
162
+
163
+ // Attribute everything registered by this module (providers + configure)
164
+ // to its graph record for build-time encapsulation validation.
165
+ // configure() may remove/replace earlier entries, moving array offsets.
166
+ // New definitions still belong to this module even after such a mutation.
167
+ const ownDefinitions = moduleRef.configure
168
+ ? collection.toArray().filter((definition) => !recordOf.has(definition))
169
+ : collection.definitionsFrom(definitionsStart);
170
+ for (let index = 0; index < ownDefinitions.length; index += 1) {
171
+ const definition = ownDefinitions[index] as ProviderDefinition;
172
+ record.definitions.push(definition);
173
+ record.providedTokens.add(definition.provider.provide);
174
+ const providedToken = definition.provider.provide;
175
+ if (typeof providedToken !== "function" && providedToken.genericFamilyId) {
176
+ record.providedFamilies.add(providedToken.genericFamilyId);
177
+ }
178
+ recordOf.set(definition, record);
179
+ }
180
+ for (const registration of collection.openGenericsFrom(openGenericsStart)) {
181
+ record.providedFamilies.add(registration.family.id);
182
+ openGenericRecordOf.set(registration, record);
183
+ }
184
+ loading.pop();
185
+ activeModules.delete(moduleRef);
186
+ };
187
+
188
+ loadModule(diInfraModule);
189
+ loadModule(rootModule);
190
+ const recordList = Array.from(records.values());
191
+ const collectedDefinitions = collection.toArray();
192
+ const classProviderHooks = collectClassProviderHooks(collectedDefinitions);
193
+ const normalizeDefinition = (definition: ProviderDefinition): ProviderDefinition =>
194
+ normalizeLateGeneratedClassDeps(applyClassProviderHooksToDefinition(definition, classProviderHooks));
195
+ const activeDefinitions = new Set(collectedDefinitions);
196
+ for (const record of recordList) {
197
+ // Removed providers must not continue to contribute dependency checks.
198
+ const active = record.definitions.filter((definition) => activeDefinitions.has(definition));
199
+ record.definitions.splice(0, record.definitions.length, ...active);
200
+ }
201
+ const definitions = collectedDefinitions.map(normalizeDefinition);
202
+ const normalizedRecordOf = new Map<ProviderDefinition, ModuleGraphRecord>();
203
+ for (let index = 0; index < collectedDefinitions.length; index += 1) {
204
+ const original = collectedDefinitions[index] as ProviderDefinition;
205
+ const normalized = definitions[index] as ProviderDefinition;
206
+ const record = recordOf.get(original);
207
+ if (record) {
208
+ normalizedRecordOf.set(normalized, record);
209
+ const definitionIndex = record.definitions.indexOf(original);
210
+ if (definitionIndex >= 0) {
211
+ record.definitions[definitionIndex] = normalized;
212
+ }
213
+ }
214
+ }
215
+ moduleOwnedContributions.validateProviderExclusivity(collection.toArray());
216
+ validateModuleOwnedContributions(moduleOwnedContributions, definitions);
217
+ const validateDefinition = validateModuleEncapsulation(recordList);
218
+ const bindDefinition = createModuleScopedNameBinder(recordList);
219
+ const validateSelection = createProviderSelectionValidator(
220
+ recordList, definitions, normalizedRecordOf, collection.openGenericToArray(), openGenericRecordOf,
221
+ );
222
+ const boundDefinitions = definitions.map((definition) => {
223
+ const record = normalizedRecordOf.get(definition);
224
+ if (!record) return definition;
225
+ const bound = bindDefinition(definition, record);
226
+ validateSelection(bound, record);
227
+ return bound;
228
+ });
229
+ const openGenerics = collection.openGenericToArray().map((registration) => {
230
+ const record = openGenericRecordOf.get(registration);
231
+ if (!record) {
232
+ return registration;
233
+ }
234
+ return new OpenGenericRegistration(registration.family, (argument) => {
235
+ const definition = normalizeDefinition(new ProviderDefinition(
236
+ registration.providerFactory(argument), registration.lifetime, registration.key,
237
+ ));
238
+ // Validate and bind before the container publishes the closed batch.
239
+ // Root resolution still uses the generic declaration's module visibility.
240
+ validateDefinition(definition, record);
241
+ const bound = bindDefinition(definition, record);
242
+ validateSelection(bound, record);
243
+ return bound.provider;
244
+ }, registration.lifetime, registration.key);
245
+ });
246
+ built = new DiContainer(boundDefinitions, openGenerics, options, moduleOwnedContributions);
247
+ return built;
248
+ }
249
+
250
+ function normalizeLateGeneratedClassDeps(definition: ProviderDefinition): ProviderDefinition {
251
+ const provider = definition.provider;
252
+ if (!isClassProvider(provider) || provider.deps !== undefined || getClassDeps(provider.useClass) !== undefined) {
253
+ return definition;
254
+ }
255
+ const generatedDeps = getGeneratedClassDeps(provider.useClass);
256
+ if (generatedDeps === undefined) {
257
+ return definition;
258
+ }
259
+ const normalizedProvider = { ...provider, deps: generatedDeps } as Provider<unknown>;
260
+ return new ProviderDefinition(normalizedProvider, definition.lifetime, definition.key);
261
+ }
@@ -0,0 +1,416 @@
1
+ import { ModuleEncapsulationError } from "../errors";
2
+ import { getProviderDeps } from "../internal/providerDeps";
3
+ import type { ProviderDefinition, ProviderDependencyList } from "../provider";
4
+ import { isKeyedDependency, isLazyDependency, isNamedDependency } from "../provider";
5
+ import type { OpenGenericTokenFamily, Token } from "../token";
6
+ import { tokenToDebugName } from "../token";
7
+ import { applyNamedDependencyEncapsulationHooks } from "./encapsulationHooks";
8
+ import type { ModuleExport } from "./types";
9
+
10
+ /**
11
+ * Build-time module graph record. Collected by `createContainer` while
12
+ * loading modules; consumed by `validateModuleEncapsulation`.
13
+ */
14
+ export interface ModuleGraphRecord {
15
+ readonly name: string;
16
+ readonly imports: ModuleGraphRecord[];
17
+ /** undefined — the module is fully open; otherwise the explicit export list. */
18
+ readonly exports: readonly ModuleExport[] | undefined;
19
+ /** Global module: exported tokens are visible everywhere without imports. */
20
+ readonly global: boolean;
21
+ readonly providedTokens: Set<Token<unknown>>;
22
+ readonly providedFamilies: Set<symbol>;
23
+ readonly definitions: ProviderDefinition[];
24
+ }
25
+
26
+ /**
27
+ * Validates that every provider's dependencies are visible to its module:
28
+ * a module sees its own providers plus whatever its direct imports export.
29
+ * Open modules (no `exports` field) transitively expose everything they see,
30
+ * which keeps pre-encapsulation code working unchanged.
31
+ *
32
+ * Runs once at container build time and returns a checker for providers
33
+ * materialized later by an open generic factory. Visibility is computed once;
34
+ * cached service resolution does not repeat validation.
35
+ */
36
+ export function validateModuleEncapsulation(
37
+ records: readonly ModuleGraphRecord[],
38
+ ): (definition: ProviderDefinition, record: ModuleGraphRecord) => void {
39
+ if (!hasClosedModules(records)) {
40
+ return () => {};
41
+ }
42
+
43
+ const issues: string[] = [];
44
+ const tokensByName = collectTokensByName(records);
45
+ const allProvidedTokens = new Set<Token<unknown>>();
46
+ const allProvidedFamilies = new Set<symbol>();
47
+ for (let index = 0; index < records.length; index += 1) {
48
+ const record = records[index] as ModuleGraphRecord;
49
+ for (const token of record.providedTokens) {
50
+ allProvidedTokens.add(token);
51
+ }
52
+ for (const familyId of record.providedFamilies) {
53
+ allProvidedFamilies.add(familyId);
54
+ }
55
+ }
56
+ const exportedTokensMemo = new Map<ModuleGraphRecord, Set<Token<unknown>>>();
57
+ const exportedFamiliesMemo = new Map<ModuleGraphRecord, Set<symbol>>();
58
+ const visiting = new Set<ModuleGraphRecord>();
59
+
60
+ const exportedTokens = (record: ModuleGraphRecord): Set<Token<unknown>> => {
61
+ const memoized = exportedTokensMemo.get(record);
62
+ if (memoized) {
63
+ return memoized;
64
+ }
65
+ if (visiting.has(record)) {
66
+ return new Set();
67
+ }
68
+ visiting.add(record);
69
+
70
+ const result = new Set<Token<unknown>>();
71
+ if (record.exports === undefined) {
72
+ for (const token of record.providedTokens) {
73
+ result.add(token);
74
+ }
75
+ for (let index = 0; index < record.imports.length; index += 1) {
76
+ for (const token of exportedTokens(record.imports[index] as ModuleGraphRecord)) {
77
+ result.add(token);
78
+ }
79
+ }
80
+ } else {
81
+ const visible = visibleTokens(record);
82
+ for (let index = 0; index < record.exports.length; index += 1) {
83
+ const ref = record.exports[index] as ModuleExport;
84
+ if (isFamilyExport(ref)) {
85
+ continue;
86
+ }
87
+ if (record.providedTokens.has(ref) || visible.has(ref)) {
88
+ result.add(ref);
89
+ } else {
90
+ issues.push(
91
+ `Module "${record.name}" exports "${tokenToDebugName(ref)}" which it neither provides nor imports.`,
92
+ );
93
+ }
94
+ }
95
+ }
96
+
97
+ visiting.delete(record);
98
+ exportedTokensMemo.set(record, result);
99
+ return result;
100
+ };
101
+
102
+ const visibleTokens = (record: ModuleGraphRecord): Set<Token<unknown>> => {
103
+ const result = new Set<Token<unknown>>(record.providedTokens);
104
+ for (let index = 0; index < record.imports.length; index += 1) {
105
+ for (const token of exportedTokens(record.imports[index] as ModuleGraphRecord)) {
106
+ result.add(token);
107
+ }
108
+ }
109
+ return result;
110
+ };
111
+
112
+ const exportedFamilies = (record: ModuleGraphRecord): Set<symbol> => {
113
+ const memoized = exportedFamiliesMemo.get(record);
114
+ if (memoized) {
115
+ return memoized;
116
+ }
117
+ if (visiting.has(record)) {
118
+ return new Set();
119
+ }
120
+ visiting.add(record);
121
+
122
+ const result = new Set<symbol>();
123
+ if (record.exports === undefined) {
124
+ for (const familyId of record.providedFamilies) {
125
+ result.add(familyId);
126
+ }
127
+ for (let index = 0; index < record.imports.length; index += 1) {
128
+ for (const familyId of exportedFamilies(record.imports[index] as ModuleGraphRecord)) {
129
+ result.add(familyId);
130
+ }
131
+ }
132
+ } else {
133
+ for (let index = 0; index < record.exports.length; index += 1) {
134
+ const ref = record.exports[index] as ModuleExport;
135
+ if (isFamilyExport(ref)) {
136
+ result.add(ref.id);
137
+ }
138
+ }
139
+ }
140
+
141
+ visiting.delete(record);
142
+ exportedFamiliesMemo.set(record, result);
143
+ return result;
144
+ };
145
+
146
+ const visibleFamilies = (record: ModuleGraphRecord): Set<symbol> => {
147
+ const result = new Set<symbol>(record.providedFamilies);
148
+ for (let index = 0; index < record.imports.length; index += 1) {
149
+ for (const familyId of exportedFamilies(record.imports[index] as ModuleGraphRecord)) {
150
+ result.add(familyId);
151
+ }
152
+ }
153
+ return result;
154
+ };
155
+
156
+ // Global modules (kernel infrastructure) are visible to everyone without an
157
+ // explicit import, mirroring NestJS @Global().
158
+ const globalTokens = new Set<Token<unknown>>();
159
+ const globalFamilies = new Set<symbol>();
160
+ for (let index = 0; index < records.length; index += 1) {
161
+ const record = records[index] as ModuleGraphRecord;
162
+ if (!record.global) {
163
+ continue;
164
+ }
165
+ for (const token of exportedTokens(record)) {
166
+ globalTokens.add(token);
167
+ }
168
+ for (const familyId of exportedFamilies(record)) {
169
+ globalFamilies.add(familyId);
170
+ }
171
+ }
172
+
173
+ const contexts = new Map<ModuleGraphRecord, DependencyCheckContext>();
174
+ for (let recordIndex = 0; recordIndex < records.length; recordIndex += 1) {
175
+ const record = records[recordIndex] as ModuleGraphRecord;
176
+ const visible = visibleTokens(record);
177
+ const familiesVisible = visibleFamilies(record);
178
+ for (const token of globalTokens) {
179
+ visible.add(token);
180
+ }
181
+ for (const familyId of globalFamilies) {
182
+ familiesVisible.add(familyId);
183
+ }
184
+
185
+ const context: DependencyCheckContext = {
186
+ visible, familiesVisible, tokensByName, allProvidedTokens, allProvidedFamilies, issues,
187
+ };
188
+ contexts.set(record, context);
189
+ for (const definition of record.definitions) {
190
+ checkDefinition(record, definition, context);
191
+ }
192
+ }
193
+
194
+ if (issues.length > 0) {
195
+ throw new ModuleEncapsulationError(issues);
196
+ }
197
+ return (definition, record) => {
198
+ const context = contexts.get(record);
199
+ if (!context) {
200
+ return;
201
+ }
202
+ const materializedIssues: string[] = [];
203
+ checkDefinition(record, definition, { ...context, issues: materializedIssues });
204
+ if (materializedIssues.length > 0) {
205
+ throw new ModuleEncapsulationError(materializedIssues);
206
+ }
207
+ };
208
+ }
209
+
210
+ interface DependencyCheckContext {
211
+ readonly visible: ReadonlySet<Token<unknown>>;
212
+ readonly familiesVisible: ReadonlySet<symbol>;
213
+ readonly tokensByName: ReadonlyMap<string, Token<unknown>[]>;
214
+ readonly allProvidedTokens: ReadonlySet<Token<unknown>>;
215
+ readonly allProvidedFamilies: ReadonlySet<symbol>;
216
+ readonly issues: string[];
217
+ }
218
+
219
+ function checkDefinition(
220
+ record: ModuleGraphRecord,
221
+ definition: ProviderDefinition,
222
+ context: DependencyCheckContext,
223
+ ): void {
224
+ for (const dependency of getProviderDeps(definition.provider)) {
225
+ if (dependency !== undefined) {
226
+ checkDependency(record, definition, dependency, context);
227
+ }
228
+ }
229
+ }
230
+
231
+ function checkDependency(
232
+ record: ModuleGraphRecord,
233
+ definition: ProviderDefinition,
234
+ dep: NonNullable<ProviderDependencyList[number]>,
235
+ context: DependencyCheckContext,
236
+ ): void {
237
+ const consumer = tokenToDebugName(definition.provider.provide);
238
+
239
+ // Laziness changes "when" a dependency is created, not "whether" the module
240
+ // may see it — validate the inner descriptor with the same rules.
241
+ if (isLazyDependency(dep)) {
242
+ checkDependency(record, definition, dep.inner, context);
243
+ return;
244
+ }
245
+
246
+ if (isNamedDependency(dep)) {
247
+ if (
248
+ applyNamedDependencyEncapsulationHooks({
249
+ depName: dep.name,
250
+ consumer,
251
+ moduleName: record.name,
252
+ visible: context.visible,
253
+ familiesVisible: context.familiesVisible,
254
+ })
255
+ ) {
256
+ return;
257
+ }
258
+ const candidates = context.tokensByName.get(dep.name);
259
+ // No candidates at all is a missing-dependency problem, not encapsulation.
260
+ if (!candidates || candidates.length === 0) {
261
+ return;
262
+ }
263
+ for (let index = 0; index < candidates.length; index += 1) {
264
+ if (context.visible.has(candidates[index] as Token<unknown>)) {
265
+ return;
266
+ }
267
+ }
268
+ context.issues.push(
269
+ `Module "${record.name}": "${consumer}" depends on "${dep.name}", which is provided by another module but not exported.`,
270
+ );
271
+ return;
272
+ }
273
+
274
+ const token = isKeyedDependency(dep) ? dep.token : dep;
275
+ if (typeof token !== "function" && token.genericFamilyId) {
276
+ if (context.visible.has(token)) {
277
+ return;
278
+ }
279
+ // Unknown family is a missing-registration problem, not encapsulation.
280
+ if (
281
+ context.allProvidedFamilies.has(token.genericFamilyId) &&
282
+ !context.familiesVisible.has(token.genericFamilyId)
283
+ ) {
284
+ context.issues.push(
285
+ `Module "${record.name}": "${consumer}" depends on open generic "${tokenToDebugName(token)}", whose family is not exported by any imported module.`,
286
+ );
287
+ }
288
+ return;
289
+ }
290
+
291
+ // Missing tokens are reported by validateOnBuild / resolve, not here.
292
+ if (!context.allProvidedTokens.has(token) || context.visible.has(token)) {
293
+ return;
294
+ }
295
+ context.issues.push(
296
+ `Module "${record.name}": "${consumer}" depends on "${tokenToDebugName(token)}", which is provided by another module but not exported.`,
297
+ );
298
+ }
299
+
300
+ function collectTokensByName(records: readonly ModuleGraphRecord[]): Map<string, Token<unknown>[]> {
301
+ const result = new Map<string, Token<unknown>[]>();
302
+ for (let recordIndex = 0; recordIndex < records.length; recordIndex += 1) {
303
+ const record = records[recordIndex] as ModuleGraphRecord;
304
+ for (const token of record.providedTokens) {
305
+ const name = tokenToDebugName(token);
306
+ const existing = result.get(name);
307
+ if (existing) {
308
+ if (!existing.includes(token)) {
309
+ existing.push(token);
310
+ }
311
+ } else {
312
+ result.set(name, [token]);
313
+ }
314
+ }
315
+ }
316
+ return result;
317
+ }
318
+
319
+ function hasClosedModules(records: readonly ModuleGraphRecord[]): boolean {
320
+ for (let index = 0; index < records.length; index += 1) {
321
+ if ((records[index] as ModuleGraphRecord).exports !== undefined) {
322
+ return true;
323
+ }
324
+ }
325
+ return false;
326
+ }
327
+
328
+ export function isFamilyExport(ref: ModuleExport): ref is OpenGenericTokenFamily<unknown, unknown> {
329
+ return typeof ref === "object" && ref !== null && "of" in ref && typeof (ref as { of: unknown }).of === "function";
330
+ }
331
+
332
+ /**
333
+ * Effective set of tokens visible to each module: its own providers, the tokens
334
+ * exported (transitively, with re-export) by its direct imports, plus everything
335
+ * exported by global modules. Same visibility semantics as
336
+ * {@link validateModuleEncapsulation}, but computed for *every* graph (including
337
+ * the fully-open default) and without issue reporting — validation has already
338
+ * run by the time this is consumed. Powers module-scoped named-dependency
339
+ * resolution (see `bindModuleScopedNames`).
340
+ */
341
+ export function computeModuleVisibleTokens(
342
+ records: readonly ModuleGraphRecord[],
343
+ ): Map<ModuleGraphRecord, Set<Token<unknown>>> {
344
+ const exportedMemo = new Map<ModuleGraphRecord, Set<Token<unknown>>>();
345
+ const visiting = new Set<ModuleGraphRecord>();
346
+
347
+ const visibleOf = (record: ModuleGraphRecord): Set<Token<unknown>> => {
348
+ const result = new Set<Token<unknown>>(record.providedTokens);
349
+ for (let index = 0; index < record.imports.length; index += 1) {
350
+ for (const token of exported(record.imports[index] as ModuleGraphRecord)) {
351
+ result.add(token);
352
+ }
353
+ }
354
+ return result;
355
+ };
356
+
357
+ const exported = (record: ModuleGraphRecord): Set<Token<unknown>> => {
358
+ const memoized = exportedMemo.get(record);
359
+ if (memoized) {
360
+ return memoized;
361
+ }
362
+ if (visiting.has(record)) {
363
+ return new Set();
364
+ }
365
+ visiting.add(record);
366
+
367
+ const result = new Set<Token<unknown>>();
368
+ if (record.exports === undefined) {
369
+ for (const token of record.providedTokens) {
370
+ result.add(token);
371
+ }
372
+ for (let index = 0; index < record.imports.length; index += 1) {
373
+ for (const token of exported(record.imports[index] as ModuleGraphRecord)) {
374
+ result.add(token);
375
+ }
376
+ }
377
+ } else {
378
+ const visible = visibleOf(record);
379
+ for (let index = 0; index < record.exports.length; index += 1) {
380
+ const ref = record.exports[index] as ModuleExport;
381
+ if (isFamilyExport(ref)) {
382
+ continue;
383
+ }
384
+ if (record.providedTokens.has(ref) || visible.has(ref)) {
385
+ result.add(ref);
386
+ }
387
+ }
388
+ }
389
+
390
+ visiting.delete(record);
391
+ exportedMemo.set(record, result);
392
+ return result;
393
+ };
394
+
395
+ const globalTokens = new Set<Token<unknown>>();
396
+ for (let index = 0; index < records.length; index += 1) {
397
+ const record = records[index] as ModuleGraphRecord;
398
+ if (!record.global) {
399
+ continue;
400
+ }
401
+ for (const token of exported(record)) {
402
+ globalTokens.add(token);
403
+ }
404
+ }
405
+
406
+ const result = new Map<ModuleGraphRecord, Set<Token<unknown>>>();
407
+ for (let index = 0; index < records.length; index += 1) {
408
+ const record = records[index] as ModuleGraphRecord;
409
+ const visible = visibleOf(record);
410
+ for (const token of globalTokens) {
411
+ visible.add(token);
412
+ }
413
+ result.set(record, visible);
414
+ }
415
+ return result;
416
+ }