@zudojs/core 0.1.0 → 1.1.0

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 (485) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +141 -7
  3. package/dist/application/application.d.ts +43 -2
  4. package/dist/application/application.js +111 -13
  5. package/dist/application/applicationContext.context.d.ts +27 -1
  6. package/dist/application/applicationContext.context.js +22 -2
  7. package/dist/application/createApplication.d.ts +78 -0
  8. package/dist/application/createApplication.js +109 -0
  9. package/dist/application/index.d.ts +2 -1
  10. package/dist/application/index.js +2 -1
  11. package/dist/configuration/configurationManager.manager.d.ts +42 -0
  12. package/dist/configuration/configurationManager.manager.js +104 -7
  13. package/dist/configuration/core/configuration.d.ts +60 -15
  14. package/dist/configuration/core/configuration.js +248 -51
  15. package/dist/configuration/core/configurationKey.key.d.ts +4 -2
  16. package/dist/configuration/core/configurationKey.key.js +2 -13
  17. package/dist/configuration/core/configurationPath.path.d.ts +17 -0
  18. package/dist/configuration/core/configurationPath.path.js +33 -0
  19. package/dist/configuration/core/index.d.ts +7 -1
  20. package/dist/configuration/core/index.js +1 -0
  21. package/dist/configuration/error/configurationError.error.d.ts +11 -0
  22. package/dist/configuration/error/configurationError.error.js +29 -1
  23. package/dist/configuration/error/configurationRedactor.redactor.d.ts +16 -0
  24. package/dist/configuration/error/configurationRedactor.redactor.js +83 -5
  25. package/dist/configuration/error/index.d.ts +2 -1
  26. package/dist/configuration/error/index.js +2 -1
  27. package/dist/configuration/index.d.ts +1 -1
  28. package/dist/configuration/loader/configurationLoader.loader.d.ts +47 -9
  29. package/dist/configuration/loader/configurationLoader.loader.js +107 -26
  30. package/dist/configuration/loader/index.d.ts +1 -1
  31. package/dist/configuration/loader/index.js +1 -1
  32. package/dist/configuration/registry/configurationProvider.provider.d.ts +26 -1
  33. package/dist/configuration/registry/configurationProvider.provider.js +33 -7
  34. package/dist/configuration/registry/configurationRegistry.registry.js +2 -1
  35. package/dist/configuration/schema/configurationSchema.schema.d.ts +0 -4
  36. package/dist/configuration/schema/configurationSchema.schema.js +11 -32
  37. package/dist/configuration/schema/configurationValidation.validator.d.ts +14 -2
  38. package/dist/configuration/schema/configurationValidation.validator.js +55 -7
  39. package/dist/configuration/schema/index.d.ts +1 -1
  40. package/dist/configuration/schema/index.js +1 -1
  41. package/dist/container/container.d.ts +51 -5
  42. package/dist/container/container.js +104 -33
  43. package/dist/container/index.d.ts +1 -1
  44. package/dist/container/index.js +1 -1
  45. package/dist/container/scope.d.ts +7 -6
  46. package/dist/context/core/contextAliases.deprecated.d.ts +32 -0
  47. package/dist/context/core/contextAliases.deprecated.js +6 -0
  48. package/dist/context/core/executionContext.context.d.ts +8 -0
  49. package/dist/context/core/executionContext.context.js +38 -15
  50. package/dist/context/core/index.d.ts +2 -2
  51. package/dist/context/core/index.js +2 -2
  52. package/dist/context/index.d.ts +20 -0
  53. package/dist/context/index.js +20 -0
  54. package/dist/context/provider/contextProvider.provider.d.ts +7 -4
  55. package/dist/context/provider/contextProvider.provider.js +9 -6
  56. package/dist/context/provider/contextStorage.storage.d.ts +47 -7
  57. package/dist/context/provider/contextStorage.storage.js +54 -12
  58. package/dist/context/provider/defaultContextStorage.storage.d.ts +18 -0
  59. package/dist/context/provider/defaultContextStorage.storage.js +20 -0
  60. package/dist/context/provider/index.d.ts +2 -1
  61. package/dist/context/provider/index.js +1 -0
  62. package/dist/errors/exceptions.d.ts +22 -0
  63. package/dist/errors/exceptions.js +38 -1
  64. package/dist/errors/frameworkError.error.d.ts +6 -9
  65. package/dist/errors/index.d.ts +1 -1
  66. package/dist/errors/index.js +1 -1
  67. package/dist/index.d.ts +4 -0
  68. package/dist/index.js +14 -0
  69. package/dist/lifecycle/core/index.d.ts +1 -1
  70. package/dist/lifecycle/core/index.js +1 -1
  71. package/dist/lifecycle/core/lifecycle.d.ts +47 -2
  72. package/dist/lifecycle/core/lifecycle.js +251 -85
  73. package/dist/lifecycle/core/lifecycleRegistry.registry.d.ts +8 -0
  74. package/dist/lifecycle/core/lifecycleRegistry.registry.js +20 -1
  75. package/dist/lifecycle/manager/lifecycleManager.manager.d.ts +21 -2
  76. package/dist/lifecycle/manager/lifecycleManager.manager.js +62 -99
  77. package/dist/lifecycle/scope/lifecycleScope.scope.d.ts +22 -1
  78. package/dist/lifecycle/scope/lifecycleScope.scope.js +85 -17
  79. package/dist/logging/console/consoleLogger.logger.d.ts +20 -1
  80. package/dist/logging/console/consoleLogger.logger.js +77 -11
  81. package/dist/logging/console/loggerFactory.factory.d.ts +6 -5
  82. package/dist/logging/console/loggerFactory.factory.js +1 -7
  83. package/dist/logging/core/index.d.ts +4 -3
  84. package/dist/logging/core/index.js +4 -3
  85. package/dist/logging/core/logEntry.entry.d.ts +41 -3
  86. package/dist/logging/core/logEntry.entry.js +125 -4
  87. package/dist/logging/core/logLevel.level.d.ts +18 -0
  88. package/dist/logging/core/logLevel.level.js +25 -1
  89. package/dist/logging/core/logRedaction.redaction.d.ts +38 -0
  90. package/dist/logging/core/logRedaction.redaction.js +19 -0
  91. package/dist/logging/core/logger.d.ts +14 -11
  92. package/dist/logging/core/logger.js +31 -6
  93. package/dist/logging/core/loggerContext.context.d.ts +12 -0
  94. package/dist/logging/core/loggerContext.context.js +19 -0
  95. package/dist/logging/core/loggerOptions.options.d.ts +17 -0
  96. package/dist/modules/index.d.ts +0 -1
  97. package/dist/modules/index.js +0 -6
  98. package/dist/modules/module.d.ts +7 -1
  99. package/dist/modules/moduleContext.context.d.ts +41 -7
  100. package/dist/modules/moduleContext.context.js +31 -8
  101. package/dist/modules/moduleDefinition.definition.d.ts +11 -7
  102. package/dist/modules/moduleDefinition.definition.js +41 -8
  103. package/dist/modules/moduleDependency/index.d.ts +2 -2
  104. package/dist/modules/moduleDependency/index.js +1 -1
  105. package/dist/modules/moduleDependency/moduleDependency.graph.d.ts +19 -2
  106. package/dist/modules/moduleDependency/moduleDependency.graph.js +122 -8
  107. package/dist/modules/moduleDependency/moduleDependency.ordering.d.ts +8 -0
  108. package/dist/modules/moduleDependency/moduleDependency.ordering.js +85 -57
  109. package/dist/modules/moduleDependency/moduleDependency.type.d.ts +28 -1
  110. package/dist/modules/moduleError/index.d.ts +1 -1
  111. package/dist/modules/moduleError/index.js +1 -1
  112. package/dist/modules/moduleError/moduleError.dependency.d.ts +11 -0
  113. package/dist/modules/moduleError/moduleError.dependency.js +15 -0
  114. package/dist/modules/moduleLifecycle/index.d.ts +5 -2
  115. package/dist/modules/moduleLifecycle/index.js +4 -1
  116. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.d.ts +73 -10
  117. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.js +204 -19
  118. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.d.ts +30 -5
  119. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.js +130 -10
  120. package/dist/modules/moduleLifecycle/moduleLifecycle.type.d.ts +78 -28
  121. package/dist/modules/moduleLifecycle/moduleLifecycle.type.js +15 -4
  122. package/dist/modules/moduleLoader/moduleLoader.loader.d.ts +39 -5
  123. package/dist/modules/moduleLoader/moduleLoader.loader.js +168 -59
  124. package/dist/modules/moduleLoader/moduleLoader.type.d.ts +4 -2
  125. package/dist/modules/moduleLoader/moduleLoader.type.js +10 -3
  126. package/dist/modules/moduleMetadata.metadata.js +15 -5
  127. package/dist/modules/moduleRegistry/index.d.ts +1 -1
  128. package/dist/modules/moduleRegistry/moduleRegistry.registry.d.ts +2 -2
  129. package/dist/modules/moduleRegistry/moduleRegistry.registry.js +38 -6
  130. package/dist/modules/moduleRegistry/moduleRegistry.type.d.ts +18 -1
  131. package/dist/runtime/index.d.ts +17 -15
  132. package/dist/runtime/index.js +14 -10
  133. package/dist/runtime/runtime.d.ts +135 -33
  134. package/dist/runtime/runtime.js +344 -114
  135. package/dist/runtime/runtimeBootstrap/index.d.ts +2 -1
  136. package/dist/runtime/runtimeBootstrap/index.js +1 -1
  137. package/dist/runtime/runtimeBootstrap/pipeline/index.d.ts +2 -2
  138. package/dist/runtime/runtimeBootstrap/pipeline/index.js +1 -2
  139. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.d.ts +41 -15
  140. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.js +111 -76
  141. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.d.ts +7 -4
  142. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.js +87 -59
  143. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.d.ts +10 -4
  144. package/dist/runtime/runtimeContext/index.d.ts +3 -5
  145. package/dist/runtime/runtimeContext/index.js +2 -4
  146. package/dist/runtime/runtimeContext/runtimeContext.factory.d.ts +10 -4
  147. package/dist/runtime/runtimeContext/runtimeContext.factory.js +30 -7
  148. package/dist/runtime/runtimeContext/runtimeContext.type.d.ts +36 -47
  149. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.d.ts +5 -0
  150. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.js +6 -4
  151. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.d.ts +4 -0
  152. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.js +7 -9
  153. package/dist/runtime/runtimeEnvironment/index.d.ts +2 -2
  154. package/dist/runtime/runtimeEnvironment/index.js +1 -1
  155. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.d.ts +20 -17
  156. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.js +20 -13
  157. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.d.ts +12 -1
  158. package/dist/runtime/runtimeError/index.d.ts +3 -3
  159. package/dist/runtime/runtimeError/index.js +1 -1
  160. package/dist/runtime/runtimeError/runtimeError.base.d.ts +15 -18
  161. package/dist/runtime/runtimeError/runtimeError.base.js +38 -36
  162. package/dist/runtime/runtimeError/runtimeError.lifecycle.d.ts +23 -8
  163. package/dist/runtime/runtimeError/runtimeError.lifecycle.js +31 -7
  164. package/dist/runtime/runtimeError/runtimeError.specialized.d.ts +1 -1
  165. package/dist/runtime/runtimeError/runtimeError.specialized.js +1 -1
  166. package/dist/runtime/runtimeError/runtimeError.type.d.ts +5 -9
  167. package/dist/runtime/runtimeLogger.d.ts +2 -2
  168. package/dist/runtime/runtimeLogger.js +3 -3
  169. package/dist/runtime/runtimeOptions/index.d.ts +1 -1
  170. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.d.ts +1 -1
  171. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.js +2 -0
  172. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.js +13 -2
  173. package/dist/runtime/runtimeOptions/runtimeOptions.type.d.ts +45 -16
  174. package/dist/runtime/runtimeOptions/runtimeOptions.validation.js +0 -1
  175. package/dist/runtime/runtimeShutdown/index.d.ts +3 -2
  176. package/dist/runtime/runtimeShutdown/index.js +2 -2
  177. package/dist/runtime/runtimeShutdown/pipeline/index.d.ts +2 -1
  178. package/dist/runtime/runtimeShutdown/pipeline/index.js +1 -1
  179. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.d.ts +37 -7
  180. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.js +85 -51
  181. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.d.ts +8 -16
  182. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.js +85 -87
  183. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.d.ts +9 -5
  184. package/dist/runtime/runtimeSignals/index.d.ts +8 -0
  185. package/dist/runtime/runtimeSignals/index.js +7 -0
  186. package/dist/runtime/runtimeSignals/runtimeSignals.d.ts +93 -0
  187. package/dist/runtime/runtimeSignals/runtimeSignals.js +149 -0
  188. package/dist/runtime/runtimeState.state.d.ts +32 -14
  189. package/dist/runtime/runtimeState.state.js +34 -27
  190. package/dist/runtime/runtimeTimeout.d.ts +40 -0
  191. package/dist/runtime/runtimeTimeout.js +42 -0
  192. package/package.json +25 -15
  193. package/dist/.tsbuildinfo +0 -1
  194. package/dist/application/application.d.ts.map +0 -1
  195. package/dist/application/application.js.map +0 -1
  196. package/dist/application/applicationContext.context.d.ts.map +0 -1
  197. package/dist/application/applicationContext.context.js.map +0 -1
  198. package/dist/application/applicationState.state.d.ts.map +0 -1
  199. package/dist/application/applicationState.state.js.map +0 -1
  200. package/dist/application/index.d.ts.map +0 -1
  201. package/dist/application/index.js.map +0 -1
  202. package/dist/configuration/configurationManager.manager.d.ts.map +0 -1
  203. package/dist/configuration/configurationManager.manager.js.map +0 -1
  204. package/dist/configuration/core/configuration.d.ts.map +0 -1
  205. package/dist/configuration/core/configuration.js.map +0 -1
  206. package/dist/configuration/core/configurationKey.key.d.ts.map +0 -1
  207. package/dist/configuration/core/configurationKey.key.js.map +0 -1
  208. package/dist/configuration/core/configurationSource.source.d.ts.map +0 -1
  209. package/dist/configuration/core/configurationSource.source.js.map +0 -1
  210. package/dist/configuration/core/index.d.ts.map +0 -1
  211. package/dist/configuration/core/index.js.map +0 -1
  212. package/dist/configuration/error/configurationError.error.d.ts.map +0 -1
  213. package/dist/configuration/error/configurationError.error.js.map +0 -1
  214. package/dist/configuration/error/configurationRedactor.redactor.d.ts.map +0 -1
  215. package/dist/configuration/error/configurationRedactor.redactor.js.map +0 -1
  216. package/dist/configuration/error/index.d.ts.map +0 -1
  217. package/dist/configuration/error/index.js.map +0 -1
  218. package/dist/configuration/events/configurationEvents.events.d.ts.map +0 -1
  219. package/dist/configuration/events/configurationEvents.events.js.map +0 -1
  220. package/dist/configuration/events/index.d.ts.map +0 -1
  221. package/dist/configuration/events/index.js.map +0 -1
  222. package/dist/configuration/index.d.ts.map +0 -1
  223. package/dist/configuration/index.js.map +0 -1
  224. package/dist/configuration/loader/configurationLoader.loader.d.ts.map +0 -1
  225. package/dist/configuration/loader/configurationLoader.loader.js.map +0 -1
  226. package/dist/configuration/loader/index.d.ts.map +0 -1
  227. package/dist/configuration/loader/index.js.map +0 -1
  228. package/dist/configuration/registry/configurationProvider.provider.d.ts.map +0 -1
  229. package/dist/configuration/registry/configurationProvider.provider.js.map +0 -1
  230. package/dist/configuration/registry/configurationRegistry.registry.d.ts.map +0 -1
  231. package/dist/configuration/registry/configurationRegistry.registry.js.map +0 -1
  232. package/dist/configuration/registry/index.d.ts.map +0 -1
  233. package/dist/configuration/registry/index.js.map +0 -1
  234. package/dist/configuration/schema/configurationSchema.schema.d.ts.map +0 -1
  235. package/dist/configuration/schema/configurationSchema.schema.js.map +0 -1
  236. package/dist/configuration/schema/configurationValidation.validator.d.ts.map +0 -1
  237. package/dist/configuration/schema/configurationValidation.validator.js.map +0 -1
  238. package/dist/configuration/schema/index.d.ts.map +0 -1
  239. package/dist/configuration/schema/index.js.map +0 -1
  240. package/dist/container/container.d.ts.map +0 -1
  241. package/dist/container/container.js.map +0 -1
  242. package/dist/container/index.d.ts.map +0 -1
  243. package/dist/container/index.js.map +0 -1
  244. package/dist/container/provider.d.ts.map +0 -1
  245. package/dist/container/provider.js.map +0 -1
  246. package/dist/container/scope.d.ts.map +0 -1
  247. package/dist/container/scope.js.map +0 -1
  248. package/dist/container/token.d.ts.map +0 -1
  249. package/dist/container/token.js.map +0 -1
  250. package/dist/context/core/context.d.ts +0 -95
  251. package/dist/context/core/context.d.ts.map +0 -1
  252. package/dist/context/core/context.js +0 -103
  253. package/dist/context/core/context.js.map +0 -1
  254. package/dist/context/core/contextKey.key.d.ts.map +0 -1
  255. package/dist/context/core/contextKey.key.js.map +0 -1
  256. package/dist/context/core/executionContext.context.d.ts.map +0 -1
  257. package/dist/context/core/executionContext.context.js.map +0 -1
  258. package/dist/context/core/index.d.ts.map +0 -1
  259. package/dist/context/core/index.js.map +0 -1
  260. package/dist/context/index.d.ts.map +0 -1
  261. package/dist/context/index.js.map +0 -1
  262. package/dist/context/provider/contextProvider.provider.d.ts.map +0 -1
  263. package/dist/context/provider/contextProvider.provider.js.map +0 -1
  264. package/dist/context/provider/contextStorage.storage.d.ts.map +0 -1
  265. package/dist/context/provider/contextStorage.storage.js.map +0 -1
  266. package/dist/context/provider/index.d.ts.map +0 -1
  267. package/dist/context/provider/index.js.map +0 -1
  268. package/dist/context/snapshot/contextSnapshot.snapshot.d.ts.map +0 -1
  269. package/dist/context/snapshot/contextSnapshot.snapshot.js.map +0 -1
  270. package/dist/context/snapshot/index.d.ts.map +0 -1
  271. package/dist/context/snapshot/index.js.map +0 -1
  272. package/dist/context/values/contextValues.values.d.ts.map +0 -1
  273. package/dist/context/values/contextValues.values.js.map +0 -1
  274. package/dist/context/values/index.d.ts.map +0 -1
  275. package/dist/context/values/index.js.map +0 -1
  276. package/dist/contracts/adapter.d.ts.map +0 -1
  277. package/dist/contracts/adapter.js.map +0 -1
  278. package/dist/contracts/disposable.d.ts.map +0 -1
  279. package/dist/contracts/disposable.js.map +0 -1
  280. package/dist/contracts/handler.d.ts.map +0 -1
  281. package/dist/contracts/handler.js.map +0 -1
  282. package/dist/contracts/index.d.ts.map +0 -1
  283. package/dist/contracts/index.js.map +0 -1
  284. package/dist/errors/errorCode.code.d.ts.map +0 -1
  285. package/dist/errors/errorCode.code.js.map +0 -1
  286. package/dist/errors/exceptions.d.ts.map +0 -1
  287. package/dist/errors/exceptions.js.map +0 -1
  288. package/dist/errors/frameworkError.error.d.ts.map +0 -1
  289. package/dist/errors/frameworkError.error.js.map +0 -1
  290. package/dist/errors/index.d.ts.map +0 -1
  291. package/dist/errors/index.js.map +0 -1
  292. package/dist/index.d.ts.map +0 -1
  293. package/dist/index.js.map +0 -1
  294. package/dist/lifecycle/core/index.d.ts.map +0 -1
  295. package/dist/lifecycle/core/index.js.map +0 -1
  296. package/dist/lifecycle/core/lifecycle.d.ts.map +0 -1
  297. package/dist/lifecycle/core/lifecycle.js.map +0 -1
  298. package/dist/lifecycle/core/lifecycleHook.hook.d.ts.map +0 -1
  299. package/dist/lifecycle/core/lifecycleHook.hook.js.map +0 -1
  300. package/dist/lifecycle/core/lifecycleRegistry.registry.d.ts.map +0 -1
  301. package/dist/lifecycle/core/lifecycleRegistry.registry.js.map +0 -1
  302. package/dist/lifecycle/core/lifecycleState.state.d.ts +0 -2
  303. package/dist/lifecycle/core/lifecycleState.state.d.ts.map +0 -1
  304. package/dist/lifecycle/core/lifecycleState.state.js +0 -2
  305. package/dist/lifecycle/core/lifecycleState.state.js.map +0 -1
  306. package/dist/lifecycle/index.d.ts.map +0 -1
  307. package/dist/lifecycle/index.js.map +0 -1
  308. package/dist/lifecycle/manager/index.d.ts.map +0 -1
  309. package/dist/lifecycle/manager/index.js.map +0 -1
  310. package/dist/lifecycle/manager/lifecycleManager.manager.d.ts.map +0 -1
  311. package/dist/lifecycle/manager/lifecycleManager.manager.js.map +0 -1
  312. package/dist/lifecycle/scope/index.d.ts.map +0 -1
  313. package/dist/lifecycle/scope/index.js.map +0 -1
  314. package/dist/lifecycle/scope/lifecycleScope.scope.d.ts.map +0 -1
  315. package/dist/lifecycle/scope/lifecycleScope.scope.js.map +0 -1
  316. package/dist/logging/console/consoleLogger.logger.d.ts.map +0 -1
  317. package/dist/logging/console/consoleLogger.logger.js.map +0 -1
  318. package/dist/logging/console/index.d.ts.map +0 -1
  319. package/dist/logging/console/index.js.map +0 -1
  320. package/dist/logging/console/loggerFactory.factory.d.ts.map +0 -1
  321. package/dist/logging/console/loggerFactory.factory.js.map +0 -1
  322. package/dist/logging/core/index.d.ts.map +0 -1
  323. package/dist/logging/core/index.js.map +0 -1
  324. package/dist/logging/core/logEntry.entry.d.ts.map +0 -1
  325. package/dist/logging/core/logEntry.entry.js.map +0 -1
  326. package/dist/logging/core/logLevel.level.d.ts.map +0 -1
  327. package/dist/logging/core/logLevel.level.js.map +0 -1
  328. package/dist/logging/core/logger.d.ts.map +0 -1
  329. package/dist/logging/core/logger.js.map +0 -1
  330. package/dist/logging/core/loggerContext.context.d.ts.map +0 -1
  331. package/dist/logging/core/loggerContext.context.js.map +0 -1
  332. package/dist/logging/core/loggerOptions.options.d.ts.map +0 -1
  333. package/dist/logging/core/loggerOptions.options.js.map +0 -1
  334. package/dist/logging/index.d.ts.map +0 -1
  335. package/dist/logging/index.js.map +0 -1
  336. package/dist/modules/index.d.ts.map +0 -1
  337. package/dist/modules/index.js.map +0 -1
  338. package/dist/modules/module.d.ts.map +0 -1
  339. package/dist/modules/module.js.map +0 -1
  340. package/dist/modules/moduleContext.context.d.ts.map +0 -1
  341. package/dist/modules/moduleContext.context.js.map +0 -1
  342. package/dist/modules/moduleDefinition.definition.d.ts.map +0 -1
  343. package/dist/modules/moduleDefinition.definition.js.map +0 -1
  344. package/dist/modules/moduleDependency/index.d.ts.map +0 -1
  345. package/dist/modules/moduleDependency/index.js.map +0 -1
  346. package/dist/modules/moduleDependency/moduleDependency.graph.d.ts.map +0 -1
  347. package/dist/modules/moduleDependency/moduleDependency.graph.js.map +0 -1
  348. package/dist/modules/moduleDependency/moduleDependency.ordering.d.ts.map +0 -1
  349. package/dist/modules/moduleDependency/moduleDependency.ordering.js.map +0 -1
  350. package/dist/modules/moduleDependency/moduleDependency.type.d.ts.map +0 -1
  351. package/dist/modules/moduleDependency/moduleDependency.type.js.map +0 -1
  352. package/dist/modules/moduleError/index.d.ts.map +0 -1
  353. package/dist/modules/moduleError/index.js.map +0 -1
  354. package/dist/modules/moduleError/moduleError.base.d.ts.map +0 -1
  355. package/dist/modules/moduleError/moduleError.base.js.map +0 -1
  356. package/dist/modules/moduleError/moduleError.dependency.d.ts.map +0 -1
  357. package/dist/modules/moduleError/moduleError.dependency.js.map +0 -1
  358. package/dist/modules/moduleError/moduleError.helpers.d.ts.map +0 -1
  359. package/dist/modules/moduleError/moduleError.helpers.js.map +0 -1
  360. package/dist/modules/moduleError/moduleError.lifecycle.d.ts.map +0 -1
  361. package/dist/modules/moduleError/moduleError.lifecycle.js.map +0 -1
  362. package/dist/modules/moduleError/moduleError.registration.d.ts.map +0 -1
  363. package/dist/modules/moduleError/moduleError.registration.js.map +0 -1
  364. package/dist/modules/moduleLifecycle/index.d.ts.map +0 -1
  365. package/dist/modules/moduleLifecycle/index.js.map +0 -1
  366. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.d.ts.map +0 -1
  367. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.js.map +0 -1
  368. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.d.ts.map +0 -1
  369. package/dist/modules/moduleLifecycle/moduleLifecycle.stateMachine.js.map +0 -1
  370. package/dist/modules/moduleLifecycle/moduleLifecycle.type.d.ts.map +0 -1
  371. package/dist/modules/moduleLifecycle/moduleLifecycle.type.js.map +0 -1
  372. package/dist/modules/moduleLoader/index.d.ts.map +0 -1
  373. package/dist/modules/moduleLoader/index.js.map +0 -1
  374. package/dist/modules/moduleLoader/moduleLoader.loader.d.ts.map +0 -1
  375. package/dist/modules/moduleLoader/moduleLoader.loader.js.map +0 -1
  376. package/dist/modules/moduleLoader/moduleLoader.type.d.ts.map +0 -1
  377. package/dist/modules/moduleLoader/moduleLoader.type.js.map +0 -1
  378. package/dist/modules/moduleMetadata.metadata.d.ts.map +0 -1
  379. package/dist/modules/moduleMetadata.metadata.js.map +0 -1
  380. package/dist/modules/moduleRegistry/index.d.ts.map +0 -1
  381. package/dist/modules/moduleRegistry/index.js.map +0 -1
  382. package/dist/modules/moduleRegistry/moduleRegistry.registry.d.ts.map +0 -1
  383. package/dist/modules/moduleRegistry/moduleRegistry.registry.js.map +0 -1
  384. package/dist/modules/moduleRegistry/moduleRegistry.type.d.ts.map +0 -1
  385. package/dist/modules/moduleRegistry/moduleRegistry.type.js.map +0 -1
  386. package/dist/runtime/index.d.ts.map +0 -1
  387. package/dist/runtime/index.js.map +0 -1
  388. package/dist/runtime/runtime.d.ts.map +0 -1
  389. package/dist/runtime/runtime.js.map +0 -1
  390. package/dist/runtime/runtimeBootstrap/index.d.ts.map +0 -1
  391. package/dist/runtime/runtimeBootstrap/index.js.map +0 -1
  392. package/dist/runtime/runtimeBootstrap/pipeline/index.d.ts.map +0 -1
  393. package/dist/runtime/runtimeBootstrap/pipeline/index.js.map +0 -1
  394. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.d.ts +0 -6
  395. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.d.ts.map +0 -1
  396. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.js +0 -27
  397. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.invoke.js.map +0 -1
  398. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.d.ts.map +0 -1
  399. package/dist/runtime/runtimeBootstrap/pipeline/runtimeBootstrap.pipeline.js.map +0 -1
  400. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.d.ts.map +0 -1
  401. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.core.js.map +0 -1
  402. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.d.ts.map +0 -1
  403. package/dist/runtime/runtimeBootstrap/runtimeBootstrap.type.js.map +0 -1
  404. package/dist/runtime/runtimeContext/index.d.ts.map +0 -1
  405. package/dist/runtime/runtimeContext/index.js.map +0 -1
  406. package/dist/runtime/runtimeContext/runtimeContext.core.d.ts +0 -38
  407. package/dist/runtime/runtimeContext/runtimeContext.core.d.ts.map +0 -1
  408. package/dist/runtime/runtimeContext/runtimeContext.core.js +0 -99
  409. package/dist/runtime/runtimeContext/runtimeContext.core.js.map +0 -1
  410. package/dist/runtime/runtimeContext/runtimeContext.factory.d.ts.map +0 -1
  411. package/dist/runtime/runtimeContext/runtimeContext.factory.js.map +0 -1
  412. package/dist/runtime/runtimeContext/runtimeContext.type.d.ts.map +0 -1
  413. package/dist/runtime/runtimeContext/runtimeContext.type.js.map +0 -1
  414. package/dist/runtime/runtimeEnvironment/detection/index.d.ts.map +0 -1
  415. package/dist/runtime/runtimeEnvironment/detection/index.js.map +0 -1
  416. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.detection.d.ts.map +0 -1
  417. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.detection.js.map +0 -1
  418. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.d.ts.map +0 -1
  419. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.env.js.map +0 -1
  420. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.d.ts.map +0 -1
  421. package/dist/runtime/runtimeEnvironment/detection/runtimeEnvironment.os.js.map +0 -1
  422. package/dist/runtime/runtimeEnvironment/index.d.ts.map +0 -1
  423. package/dist/runtime/runtimeEnvironment/index.js.map +0 -1
  424. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.d.ts.map +0 -1
  425. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.core.js.map +0 -1
  426. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.d.ts.map +0 -1
  427. package/dist/runtime/runtimeEnvironment/runtimeEnvironment.type.js.map +0 -1
  428. package/dist/runtime/runtimeError/index.d.ts.map +0 -1
  429. package/dist/runtime/runtimeError/index.js.map +0 -1
  430. package/dist/runtime/runtimeError/runtimeError.base.d.ts.map +0 -1
  431. package/dist/runtime/runtimeError/runtimeError.base.js.map +0 -1
  432. package/dist/runtime/runtimeError/runtimeError.lifecycle.d.ts.map +0 -1
  433. package/dist/runtime/runtimeError/runtimeError.lifecycle.js.map +0 -1
  434. package/dist/runtime/runtimeError/runtimeError.specialized.d.ts.map +0 -1
  435. package/dist/runtime/runtimeError/runtimeError.specialized.js.map +0 -1
  436. package/dist/runtime/runtimeError/runtimeError.type.d.ts.map +0 -1
  437. package/dist/runtime/runtimeError/runtimeError.type.js.map +0 -1
  438. package/dist/runtime/runtimeLogger.d.ts.map +0 -1
  439. package/dist/runtime/runtimeLogger.js.map +0 -1
  440. package/dist/runtime/runtimeManager/index.d.ts +0 -12
  441. package/dist/runtime/runtimeManager/index.d.ts.map +0 -1
  442. package/dist/runtime/runtimeManager/index.js +0 -11
  443. package/dist/runtime/runtimeManager/index.js.map +0 -1
  444. package/dist/runtime/runtimeManager/runtimeManager.core.d.ts +0 -31
  445. package/dist/runtime/runtimeManager/runtimeManager.core.d.ts.map +0 -1
  446. package/dist/runtime/runtimeManager/runtimeManager.core.js +0 -136
  447. package/dist/runtime/runtimeManager/runtimeManager.core.js.map +0 -1
  448. package/dist/runtime/runtimeManager/runtimeManager.error.d.ts +0 -14
  449. package/dist/runtime/runtimeManager/runtimeManager.error.d.ts.map +0 -1
  450. package/dist/runtime/runtimeManager/runtimeManager.error.js +0 -21
  451. package/dist/runtime/runtimeManager/runtimeManager.error.js.map +0 -1
  452. package/dist/runtime/runtimeManager/runtimeManager.factory.d.ts +0 -7
  453. package/dist/runtime/runtimeManager/runtimeManager.factory.d.ts.map +0 -1
  454. package/dist/runtime/runtimeManager/runtimeManager.factory.js +0 -8
  455. package/dist/runtime/runtimeManager/runtimeManager.factory.js.map +0 -1
  456. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.d.ts +0 -16
  457. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.d.ts.map +0 -1
  458. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.js +0 -49
  459. package/dist/runtime/runtimeManager/runtimeManager.lifecycle.js.map +0 -1
  460. package/dist/runtime/runtimeManager/runtimeManager.type.d.ts +0 -54
  461. package/dist/runtime/runtimeManager/runtimeManager.type.d.ts.map +0 -1
  462. package/dist/runtime/runtimeManager/runtimeManager.type.js +0 -2
  463. package/dist/runtime/runtimeManager/runtimeManager.type.js.map +0 -1
  464. package/dist/runtime/runtimeOptions/index.d.ts.map +0 -1
  465. package/dist/runtime/runtimeOptions/index.js.map +0 -1
  466. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.d.ts.map +0 -1
  467. package/dist/runtime/runtimeOptions/runtimeOptions.defaults.js.map +0 -1
  468. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.d.ts.map +0 -1
  469. package/dist/runtime/runtimeOptions/runtimeOptions.resolver.js.map +0 -1
  470. package/dist/runtime/runtimeOptions/runtimeOptions.type.d.ts.map +0 -1
  471. package/dist/runtime/runtimeOptions/runtimeOptions.type.js.map +0 -1
  472. package/dist/runtime/runtimeOptions/runtimeOptions.validation.d.ts.map +0 -1
  473. package/dist/runtime/runtimeOptions/runtimeOptions.validation.js.map +0 -1
  474. package/dist/runtime/runtimeShutdown/index.d.ts.map +0 -1
  475. package/dist/runtime/runtimeShutdown/index.js.map +0 -1
  476. package/dist/runtime/runtimeShutdown/pipeline/index.d.ts.map +0 -1
  477. package/dist/runtime/runtimeShutdown/pipeline/index.js.map +0 -1
  478. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.d.ts.map +0 -1
  479. package/dist/runtime/runtimeShutdown/pipeline/runtimeShutdown.pipeline.js.map +0 -1
  480. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.d.ts.map +0 -1
  481. package/dist/runtime/runtimeShutdown/runtimeShutdown.core.js.map +0 -1
  482. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.d.ts.map +0 -1
  483. package/dist/runtime/runtimeShutdown/runtimeShutdown.type.js.map +0 -1
  484. package/dist/runtime/runtimeState.state.d.ts.map +0 -1
  485. package/dist/runtime/runtimeState.state.js.map +0 -1
@@ -1,11 +1,22 @@
1
- import { ModuleLifecycleError as BaseModuleLifecycleError } from "@zudojs/errors";
1
+ import { ModuleOperationError } from "../moduleError/moduleError.lifecycle.js";
2
2
  /**
3
3
  * Error thrown when a module lifecycle operation fails.
4
+ *
5
+ * Part of the core module error taxonomy: it is a ModuleError
6
+ * carrying the phase-specific code (MODULE_INITIALIZATION_FAILED,
7
+ * MODULE_START_FAILED, ...), so callers can catch it by type or by
8
+ * code.
4
9
  */
5
- export class ModuleLifecycleError extends BaseModuleLifecycleError {
10
+ export class ModuleLifecycleError extends ModuleOperationError {
11
+ /**
12
+ * Errors encountered while rolling back already-completed
13
+ * modules after this failure. Best-effort: rollback itself
14
+ * never masks the original failure.
15
+ */
16
+ rollbackErrors;
6
17
  constructor(moduleId, phase, cause) {
7
- const message = cause instanceof Error ? cause.message : String(cause);
8
- super(moduleId, phase, `Module "${moduleId}" failed during ${phase}: ${message}`, cause);
18
+ super(moduleId, phase, cause);
19
+ this.name = "ModuleLifecycleError";
9
20
  }
10
21
  }
11
22
  //# sourceMappingURL=moduleLifecycle.type.js.map
@@ -7,6 +7,11 @@ import type { ModuleLoaderOptions, ModuleLoadResult } from "./moduleLoader.type.
7
7
  *
8
8
  * Reads definitions from registry, builds dependency graph,
9
9
  * validates, resolves startup order, instantiates modules.
10
+ *
11
+ * Dependencies are always resolved against every registered
12
+ * definition. autoLoad filtering applies only to load roots:
13
+ * a module registered with autoLoad disabled is still loaded
14
+ * when another loading module requires it.
10
15
  */
11
16
  export declare class ModuleLoader {
12
17
  private readonly application;
@@ -15,21 +20,50 @@ export declare class ModuleLoader {
15
20
  private readonly registry;
16
21
  private readonly allowExplicitLoad;
17
22
  private readonly contexts;
23
+ private readonly inFlightLoads;
18
24
  constructor(registry: ModuleRegistry, options: ModuleLoaderOptions);
19
- /** Loads every module whose definition has autoLoad enabled. */
25
+ /**
26
+ * Loads every module whose definition has autoLoad enabled,
27
+ * plus every module those modules require (regardless of the
28
+ * required module's autoLoad setting).
29
+ */
20
30
  loadAll(): Promise<ModuleLoadResult>;
21
- /** Loads a specific module and all of its required dependencies. */
31
+ /**
32
+ * Loads a specific module and all of its required dependencies.
33
+ *
34
+ * Concurrent load() calls for the same module share a single
35
+ * in-flight load.
36
+ */
22
37
  load(moduleId: ModuleId): Promise<Module>;
23
- private loadDefinitions;
38
+ /**
39
+ * Loads the dependency closure of the requested module ids.
40
+ */
41
+ private loadClosure;
42
+ /**
43
+ * Collects the dependency closure of the requested modules
44
+ * across every registered definition.
45
+ *
46
+ * Optional dependencies join the closure only when they are
47
+ * registered; missing required dependencies are reported with
48
+ * the module that needs them.
49
+ */
50
+ private collectClosure;
24
51
  private createGraph;
25
- private collectDependencies;
26
52
  private instantiate;
27
53
  private createModuleLogger;
28
- private isExplicitlyRequested;
29
54
  getContext(moduleId: ModuleId): ModuleContext | undefined;
30
55
  requireContext(moduleId: ModuleId): ModuleContext;
31
56
  getContexts(): ReadonlyMap<ModuleId, ModuleContext>;
32
57
  isLoaded(moduleId: ModuleId): boolean;
58
+ /**
59
+ * Forgets a module's runtime instance and context.
60
+ *
61
+ * The loader does not run lifecycle hooks; callers that need
62
+ * the instance shut down first should use
63
+ * ModuleLifecycleManager.unloadModule(). Returns false when the
64
+ * module is not registered or holds no instance.
65
+ */
66
+ unload(moduleId: ModuleId): boolean;
33
67
  }
34
68
  /** Creates a module loader. */
35
69
  export declare function createModuleLoader(registry: ModuleRegistry, options: ModuleLoaderOptions): ModuleLoader;
@@ -1,11 +1,20 @@
1
1
  import { createModuleContext } from "../moduleContext.context.js";
2
- import { createModuleDependencyGraph, resolveModuleStartupOrder, validateModuleDependencyGraph, } from "../moduleDependency/index.js";
2
+ import { createModuleDependencyGraph, resolveModuleStartupOrder, } from "../moduleDependency/index.js";
3
3
  import { ModuleLoadError } from "./moduleLoader.type.js";
4
+ import { ModuleError } from "../moduleError/moduleError.base.js";
5
+ import { MissingModuleDependencyError } from "../moduleError/moduleError.dependency.js";
6
+ import { InvalidModuleInstanceError, ModuleInstantiationError, } from "../moduleError/moduleError.lifecycle.js";
7
+ import { ModuleNotFoundError } from "../moduleError/moduleError.registration.js";
4
8
  /**
5
9
  * Default module loader.
6
10
  *
7
11
  * Reads definitions from registry, builds dependency graph,
8
12
  * validates, resolves startup order, instantiates modules.
13
+ *
14
+ * Dependencies are always resolved against every registered
15
+ * definition. autoLoad filtering applies only to load roots:
16
+ * a module registered with autoLoad disabled is still loaded
17
+ * when another loading module requires it.
9
18
  */
10
19
  export class ModuleLoader {
11
20
  application;
@@ -14,6 +23,7 @@ export class ModuleLoader {
14
23
  registry;
15
24
  allowExplicitLoad;
16
25
  contexts = new Map();
26
+ inFlightLoads = new Map();
17
27
  constructor(registry, options) {
18
28
  this.registry = registry;
19
29
  this.application = options.application;
@@ -21,14 +31,24 @@ export class ModuleLoader {
21
31
  this.logger = options.logger;
22
32
  this.allowExplicitLoad = options.allowExplicitLoad ?? true;
23
33
  }
24
- /** Loads every module whose definition has autoLoad enabled. */
34
+ /**
35
+ * Loads every module whose definition has autoLoad enabled,
36
+ * plus every module those modules require (regardless of the
37
+ * required module's autoLoad setting).
38
+ */
25
39
  async loadAll() {
26
- const definitions = this.registry
40
+ const roots = this.registry
27
41
  .getDefinitions()
28
- .filter((d) => d.autoLoad !== false);
29
- return this.loadDefinitions(definitions);
42
+ .filter((definition) => definition.autoLoad !== false)
43
+ .map((definition) => definition.id);
44
+ return this.loadClosure(roots, { reportSkipped: true });
30
45
  }
31
- /** Loads a specific module and all of its required dependencies. */
46
+ /**
47
+ * Loads a specific module and all of its required dependencies.
48
+ *
49
+ * Concurrent load() calls for the same module share a single
50
+ * in-flight load.
51
+ */
32
52
  async load(moduleId) {
33
53
  const registration = this.registry.require(moduleId);
34
54
  if (registration.state === "loaded" && registration.instance)
@@ -36,39 +56,83 @@ export class ModuleLoader {
36
56
  if (registration.definition.autoLoad === false && !this.allowExplicitLoad) {
37
57
  throw new ModuleLoadError(moduleId, new Error(`Module "${moduleId}" is not configured for explicit loading.`));
38
58
  }
39
- const definitions = this.collectDependencies(moduleId);
40
- await this.loadDefinitions(definitions);
41
- const loaded = this.registry.require(moduleId);
42
- if (!loaded.instance)
43
- throw new ModuleLoadError(moduleId, new Error("Module was not instantiated."));
44
- return loaded.instance;
59
+ const pending = this.inFlightLoads.get(moduleId);
60
+ if (pending)
61
+ return pending;
62
+ const loadPromise = (async () => {
63
+ await this.loadClosure([moduleId], { reportSkipped: false });
64
+ const loaded = this.registry.require(moduleId);
65
+ if (!loaded.instance)
66
+ throw new ModuleLoadError(moduleId, new Error("Module was not instantiated."));
67
+ return loaded.instance;
68
+ })().finally(() => {
69
+ this.inFlightLoads.delete(moduleId);
70
+ });
71
+ this.inFlightLoads.set(moduleId, loadPromise);
72
+ return loadPromise;
45
73
  }
46
- async loadDefinitions(definitions) {
47
- if (definitions.length === 0)
48
- return { loaded: [], alreadyLoaded: [], skipped: [], order: [] };
49
- const graph = this.createGraph(definitions);
50
- const missing = validateModuleDependencyGraph(graph);
51
- if (missing.length > 0)
52
- throw new ModuleLoadError("module-dependencies", new Error(`Missing required modules: ${missing.join(", ")}`));
53
- const order = resolveModuleStartupOrder(graph);
74
+ /**
75
+ * Loads the dependency closure of the requested module ids.
76
+ */
77
+ async loadClosure(requested, options) {
78
+ const closure = this.collectClosure(requested);
54
79
  const loaded = [];
55
80
  const alreadyLoaded = [];
56
- const skipped = [];
57
- for (const moduleId of order) {
58
- const registration = this.registry.get(moduleId);
59
- if (!registration)
60
- throw new ModuleLoadError(moduleId, new Error(`Module "${moduleId}" disappeared from the registry during loading.`));
61
- if (registration.state === "loaded" && registration.instance) {
62
- alreadyLoaded.push(registration.instance);
63
- continue;
81
+ const order = [];
82
+ /*
83
+ * Instances may declare dependencies of their own
84
+ * (Module.dependencies) that the definition does not list.
85
+ * Those are only known after instantiation, so the closure is
86
+ * extended and loaded in rounds until nothing new appears.
87
+ */
88
+ let pending = new Set(closure.keys());
89
+ while (pending.size > 0) {
90
+ const graph = this.createGraph([...closure.values()]);
91
+ const roundOrder = resolveModuleStartupOrder(graph).filter((id) => pending.has(id));
92
+ const discovered = [];
93
+ for (const moduleId of roundOrder) {
94
+ const registration = this.registry.get(moduleId);
95
+ if (!registration)
96
+ throw new ModuleLoadError(moduleId, new Error(`Module "${moduleId}" disappeared from the registry during loading.`));
97
+ order.push(moduleId);
98
+ let instance;
99
+ if (registration.state === "loaded" && registration.instance) {
100
+ instance = registration.instance;
101
+ alreadyLoaded.push(instance);
102
+ }
103
+ else {
104
+ instance = await this.instantiate(registration.definition);
105
+ loaded.push(instance);
106
+ }
107
+ for (const dependencyId of instance.dependencies ?? []) {
108
+ if (closure.has(dependencyId))
109
+ continue;
110
+ if (!this.registry.has(dependencyId))
111
+ throw new MissingModuleDependencyError(moduleId, dependencyId);
112
+ discovered.push(dependencyId);
113
+ }
64
114
  }
65
- if (registration.definition.autoLoad === false &&
66
- !this.isExplicitlyRequested(moduleId, definitions)) {
67
- skipped.push(moduleId);
68
- continue;
115
+ const extra = this.collectClosure(discovered);
116
+ pending = new Set();
117
+ for (const [id, definition] of extra) {
118
+ if (closure.has(id))
119
+ continue;
120
+ closure.set(id, definition);
121
+ pending.add(id);
122
+ }
123
+ }
124
+ /*
125
+ * Skipped modules are determined after loading so that an
126
+ * autoLoad:false module pulled in by an instance-declared
127
+ * dependency is reported as loaded, not skipped.
128
+ */
129
+ const skipped = [];
130
+ if (options.reportSkipped) {
131
+ for (const definition of this.registry.getDefinitions()) {
132
+ if (definition.autoLoad === false && !closure.has(definition.id)) {
133
+ skipped.push(definition.id);
134
+ }
69
135
  }
70
- const instance = await this.instantiate(registration.definition);
71
- loaded.push(instance);
72
136
  }
73
137
  return {
74
138
  loaded: Object.freeze([...loaded]),
@@ -77,29 +141,41 @@ export class ModuleLoader {
77
141
  order: Object.freeze([...order]),
78
142
  };
79
143
  }
80
- createGraph(definitions) {
81
- const nodes = definitions.map((d) => ({
82
- id: d.id,
83
- dependencies: this.registry.getDependencies(d.id),
84
- }));
85
- return createModuleDependencyGraph(nodes);
86
- }
87
- collectDependencies(moduleId) {
144
+ /**
145
+ * Collects the dependency closure of the requested modules
146
+ * across every registered definition.
147
+ *
148
+ * Optional dependencies join the closure only when they are
149
+ * registered; missing required dependencies are reported with
150
+ * the module that needs them.
151
+ */
152
+ collectClosure(requested) {
88
153
  const collected = new Map();
89
- const visit = (currentId) => {
154
+ const queue = [...requested];
155
+ while (queue.length > 0) {
156
+ const currentId = queue.shift();
90
157
  if (collected.has(currentId))
91
- return;
158
+ continue;
92
159
  const registration = this.registry.require(currentId);
93
160
  collected.set(currentId, registration.definition);
94
161
  for (const dependency of this.registry.getDependencies(currentId)) {
95
- if (dependency.optional && !this.registry.has(dependency.id))
96
- continue;
97
- if (this.registry.has(dependency.id))
98
- visit(dependency.id);
162
+ if (!this.registry.has(dependency.id)) {
163
+ if (dependency.optional)
164
+ continue;
165
+ throw new MissingModuleDependencyError(currentId, dependency.id);
166
+ }
167
+ queue.push(dependency.id);
99
168
  }
100
- };
101
- visit(moduleId);
102
- return Object.freeze([...collected.values()]);
169
+ }
170
+ return collected;
171
+ }
172
+ createGraph(definitions) {
173
+ const nodes = definitions.map((d) => ({
174
+ id: d.id,
175
+ dependencies: this.registry.getDependencies(d.id),
176
+ version: d.version,
177
+ }));
178
+ return createModuleDependencyGraph(nodes);
103
179
  }
104
180
  async instantiate(definition) {
105
181
  const moduleId = definition.id;
@@ -107,9 +183,9 @@ export class ModuleLoader {
107
183
  try {
108
184
  const module = await definition.factory(definition.options);
109
185
  if (!module || typeof module !== "object")
110
- throw new TypeError(`Module factory for "${moduleId}" did not return a valid module.`);
186
+ throw new InvalidModuleInstanceError(moduleId, `Module factory for "${moduleId}" did not return a valid module.`);
111
187
  if (module.id !== moduleId)
112
- throw new TypeError(`Module factory returned module "${module.id}" but expected "${moduleId}".`);
188
+ throw new InvalidModuleInstanceError(moduleId, `Module factory returned module "${module.id}" but expected "${moduleId}".`);
113
189
  if (typeof module.attach === "function")
114
190
  module.attach(this.application);
115
191
  const moduleLogger = this.createModuleLogger(module);
@@ -121,7 +197,22 @@ export class ModuleLoader {
121
197
  logger: moduleLogger,
122
198
  },
123
199
  metadata: definition.metadata,
124
- moduleContexts: this.contexts,
200
+ /*
201
+ * Modules get a resolver, never the shared context map, so
202
+ * they cannot enumerate or reach undeclared modules.
203
+ */
204
+ moduleContexts: (dependencyId) => this.contexts.get(dependencyId),
205
+ /*
206
+ * Dependencies declared by the instance itself
207
+ * (Module.dependencies) are honoured alongside the
208
+ * definition's, matching the lifecycle ordering.
209
+ */
210
+ declaredDependencies: [
211
+ ...this.registry
212
+ .getDependencies(moduleId)
213
+ .map((dependency) => dependency.id),
214
+ ...(module.dependencies ?? []),
215
+ ],
125
216
  });
126
217
  this.contexts.set(moduleId, context);
127
218
  this.registry.setState(moduleId, "loaded", { instance: module });
@@ -129,7 +220,9 @@ export class ModuleLoader {
129
220
  }
130
221
  catch (error) {
131
222
  this.registry.setState(moduleId, "failed", { error });
132
- throw new ModuleLoadError(moduleId, error);
223
+ if (error instanceof ModuleError)
224
+ throw error;
225
+ throw new ModuleInstantiationError(moduleId, error);
133
226
  }
134
227
  }
135
228
  createModuleLogger(module) {
@@ -138,16 +231,13 @@ export class ModuleLoader {
138
231
  return logger.child({ moduleId: module.id, module: module.name });
139
232
  return this.logger;
140
233
  }
141
- isExplicitlyRequested(moduleId, definitions) {
142
- return definitions.some((d) => d.id === moduleId);
143
- }
144
234
  getContext(moduleId) {
145
235
  return this.contexts.get(moduleId);
146
236
  }
147
237
  requireContext(moduleId) {
148
238
  const context = this.getContext(moduleId);
149
239
  if (!context)
150
- throw new Error(`Module "${moduleId}" has not been loaded.`);
240
+ throw new ModuleNotFoundError(moduleId);
151
241
  return context;
152
242
  }
153
243
  getContexts() {
@@ -156,6 +246,25 @@ export class ModuleLoader {
156
246
  isLoaded(moduleId) {
157
247
  return this.registry.get(moduleId)?.state === "loaded";
158
248
  }
249
+ /**
250
+ * Forgets a module's runtime instance and context.
251
+ *
252
+ * The loader does not run lifecycle hooks; callers that need
253
+ * the instance shut down first should use
254
+ * ModuleLifecycleManager.unloadModule(). Returns false when the
255
+ * module is not registered or holds no instance.
256
+ */
257
+ unload(moduleId) {
258
+ const registration = this.registry.get(moduleId);
259
+ if (!registration)
260
+ return false;
261
+ const hadInstance = this.contexts.delete(moduleId);
262
+ if (registration.state === "registered" ||
263
+ registration.state === "unloaded")
264
+ return hadInstance;
265
+ this.registry.setState(moduleId, "unloaded");
266
+ return true;
267
+ }
159
268
  }
160
269
  /** Creates a module loader. */
161
270
  export function createModuleLoader(registry, options) {
@@ -47,11 +47,13 @@ export interface ModuleLoadResult {
47
47
  */
48
48
  readonly order: readonly ModuleId[];
49
49
  }
50
- import { ModuleLoadError as BaseModuleLoadError } from "@zudojs/errors";
50
+ import { ModuleError } from "../moduleError/moduleError.base.js";
51
51
  /**
52
52
  * Error thrown when one or more modules cannot be loaded.
53
+ *
54
+ * Part of the core module error taxonomy (code MODULE_LOAD_FAILED).
53
55
  */
54
- export declare class ModuleLoadError extends BaseModuleLoadError {
56
+ export declare class ModuleLoadError extends ModuleError {
55
57
  constructor(moduleId: ModuleId, cause: unknown);
56
58
  }
57
59
  //# sourceMappingURL=moduleLoader.type.d.ts.map
@@ -1,11 +1,18 @@
1
- import { ModuleLoadError as BaseModuleLoadError } from "@zudojs/errors";
1
+ import { ModuleError, ModuleErrorCode, } from "../moduleError/moduleError.base.js";
2
2
  /**
3
3
  * Error thrown when one or more modules cannot be loaded.
4
+ *
5
+ * Part of the core module error taxonomy (code MODULE_LOAD_FAILED).
4
6
  */
5
- export class ModuleLoadError extends BaseModuleLoadError {
7
+ export class ModuleLoadError extends ModuleError {
6
8
  constructor(moduleId, cause) {
7
9
  const message = cause instanceof Error ? cause.message : String(cause);
8
- super(moduleId, `Failed to load module "${moduleId}": ${message}`, cause);
10
+ super(`Failed to load module "${moduleId}": ${message}`, {
11
+ code: ModuleErrorCode.LOAD_FAILED,
12
+ moduleId,
13
+ cause,
14
+ });
15
+ this.name = "ModuleLoadError";
9
16
  }
10
17
  }
11
18
  //# sourceMappingURL=moduleLoader.type.js.map
@@ -1,3 +1,4 @@
1
+ import { InvalidModuleDefinitionError } from "./moduleError/moduleError.registration.js";
1
2
  function normalizeOptionalString(value) {
2
3
  if (value === undefined)
3
4
  return undefined;
@@ -35,12 +36,12 @@ function validateModuleMetadata(metadata) {
35
36
  if (metadata.deprecated &&
36
37
  metadata.deprecationMessage === undefined &&
37
38
  metadata.replacement === undefined) {
38
- throw new TypeError("Deprecated modules should provide either a deprecationMessage or replacement module.");
39
+ throw new InvalidModuleDefinitionError("Deprecated modules should provide either a deprecationMessage or replacement module.");
39
40
  }
40
41
  if (metadata.homepage && !isValidUrl(metadata.homepage))
41
- throw new TypeError(`Invalid module homepage URL: ${metadata.homepage}`);
42
+ throw new InvalidModuleDefinitionError(`Invalid module homepage URL: ${metadata.homepage}`);
42
43
  if (metadata.repository && !isValidUrl(metadata.repository))
43
- throw new TypeError(`Invalid module repository URL: ${metadata.repository}`);
44
+ throw new InvalidModuleDefinitionError(`Invalid module repository URL: ${metadata.repository}`);
44
45
  }
45
46
  /** Creates immutable module metadata. */
46
47
  export function createModuleMetadata(options = {}) {
@@ -61,13 +62,22 @@ export function createModuleMetadata(options = {}) {
61
62
  validateModuleMetadata(metadata);
62
63
  return Object.freeze(metadata);
63
64
  }
65
+ /**
66
+ * Removes keys whose value is undefined so spreading a metadata
67
+ * object cannot clobber defined values with undefined.
68
+ */
69
+ function withoutUndefinedValues(metadata) {
70
+ if (!metadata)
71
+ return {};
72
+ return Object.fromEntries(Object.entries(metadata).filter(([, value]) => value !== undefined));
73
+ }
64
74
  /** Merges two metadata objects. Values from `override` take precedence. */
65
75
  export function mergeModuleMetadata(base, override) {
66
76
  if (!base && !override)
67
77
  return createModuleMetadata();
68
78
  return createModuleMetadata({
69
- ...(base ?? {}),
70
- ...(override ?? {}),
79
+ ...withoutUndefinedValues(base),
80
+ ...withoutUndefinedValues(override),
71
81
  tags: [...(base?.tags ?? []), ...(override?.tags ?? [])],
72
82
  environments: override?.environments ?? base?.environments,
73
83
  extra: { ...(base?.extra ?? {}), ...(override?.extra ?? {}) },
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * Stores module definitions and tracks their runtime state.
5
5
  */
6
- export { type ModuleRegistrationState, type ModuleRegistration, type ModuleRegistryOptions, type ModuleRegistryEventType, type ModuleRegistryEvent, type ModuleRegistryListener, type ModuleRegistry, } from "./moduleRegistry.type.js";
6
+ export { type ModuleRegistrationState, type ModuleRegistration, type ModuleRegistryOptions, type ModuleRegisterOptions, type ModuleRegistryEventType, type ModuleRegistryEvent, type ModuleRegistryListener, type ModuleRegistry, } from "./moduleRegistry.type.js";
7
7
  export { DefaultModuleRegistry, createModuleRegistry, isModuleRegistration, } from "./moduleRegistry.registry.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -2,14 +2,14 @@ import type { Module, ModuleId } from "../module.js";
2
2
  import type { ModuleDefinition } from "../moduleDefinition.definition.js";
3
3
  import type { ModuleMetadata } from "../moduleMetadata.metadata.js";
4
4
  import type { ModuleDependency } from "../moduleDependency/moduleDependency.type.js";
5
- import type { ModuleRegistrationState, ModuleRegistration, ModuleRegistryOptions, ModuleRegistryListener, ModuleRegistry } from "./moduleRegistry.type.js";
5
+ import type { ModuleRegistrationState, ModuleRegistration, ModuleRegistryOptions, ModuleRegistryListener, ModuleRegistry, ModuleRegisterOptions } from "./moduleRegistry.type.js";
6
6
  /** Default in-memory module registry. */
7
7
  export declare class DefaultModuleRegistry implements ModuleRegistry {
8
8
  private readonly registrations;
9
9
  private readonly listeners;
10
10
  private readonly allowReplacement;
11
11
  constructor(options?: ModuleRegistryOptions);
12
- register<TModule extends Module>(definition: ModuleDefinition<TModule>): ModuleRegistration<TModule>;
12
+ register<TModule extends Module>(definition: ModuleDefinition<TModule>, options?: ModuleRegisterOptions): ModuleRegistration<TModule>;
13
13
  registerMany(definitions: readonly ModuleDefinition[]): readonly ModuleRegistration[];
14
14
  get(moduleId: ModuleId): ModuleRegistration | undefined;
15
15
  require(moduleId: ModuleId): ModuleRegistration;
@@ -1,4 +1,6 @@
1
1
  import { isModuleDefinition } from "../moduleDefinition.definition.js";
2
+ import { DuplicateModuleError, InvalidModuleDefinitionError, ModuleNotFoundError, } from "../moduleError/moduleError.registration.js";
3
+ import { InvalidModuleStateError } from "../moduleError/moduleError.lifecycle.js";
2
4
  /** Default in-memory module registry. */
3
5
  export class DefaultModuleRegistry {
4
6
  registrations = new Map();
@@ -7,13 +9,36 @@ export class DefaultModuleRegistry {
7
9
  constructor(options = {}) {
8
10
  this.allowReplacement = options.allowReplacement ?? false;
9
11
  }
10
- register(definition) {
12
+ register(definition, options = {}) {
11
13
  if (!isModuleDefinition(definition))
12
- throw new TypeError("Invalid module definition.");
13
- const moduleId = definition.id.trim();
14
+ throw new InvalidModuleDefinitionError("Invalid module definition.");
15
+ /*
16
+ * Ids are canonicalized when the definition is created
17
+ * (defineModule rejects untrimmed ids), so the registry can
18
+ * use definition.id directly.
19
+ */
20
+ const moduleId = definition.id;
21
+ if (moduleId !== moduleId.trim())
22
+ throw new InvalidModuleDefinitionError(`Module id "${moduleId}" must not contain leading or trailing whitespace.`, moduleId);
14
23
  const existing = this.registrations.get(moduleId);
15
24
  if (existing && !this.allowReplacement)
16
- throw new Error(`Module "${moduleId}" is already registered.`);
25
+ throw new DuplicateModuleError(moduleId);
26
+ /*
27
+ * Replacing a definition whose module instance is already
28
+ * loaded (or currently loading) would strand the live
29
+ * instance: the lifecycle system would keep managing an
30
+ * object whose definition no longer exists. Callers must opt
31
+ * in explicitly with { replaceLoaded: true }.
32
+ */
33
+ if (existing &&
34
+ (existing.state === "loaded" || existing.state === "loading") &&
35
+ options.replaceLoaded !== true) {
36
+ throw new InvalidModuleStateError(moduleId, existing.state, [
37
+ "registered",
38
+ "failed",
39
+ "unloaded",
40
+ ]);
41
+ }
17
42
  const now = new Date();
18
43
  const registration = Object.freeze({
19
44
  definition,
@@ -42,7 +67,7 @@ export class DefaultModuleRegistry {
42
67
  require(moduleId) {
43
68
  const registration = this.get(moduleId);
44
69
  if (!registration)
45
- throw new Error(`Module "${moduleId}" is not registered.`);
70
+ throw new ModuleNotFoundError(moduleId);
46
71
  return registration;
47
72
  }
48
73
  has(moduleId) {
@@ -78,9 +103,16 @@ export class DefaultModuleRegistry {
78
103
  setState(moduleId, state, details = {}) {
79
104
  const existing = this.require(moduleId);
80
105
  const now = new Date();
106
+ /*
107
+ * Leaving a state that carries a live instance drops the
108
+ * instance reference; the registry never keeps a stale module
109
+ * object around once it has been unloaded.
110
+ */
81
111
  const registration = Object.freeze({
82
112
  definition: existing.definition,
83
- instance: details.instance ?? existing.instance,
113
+ instance: state === "unloaded"
114
+ ? undefined
115
+ : (details.instance ?? existing.instance),
84
116
  state,
85
117
  error: details.error,
86
118
  registeredAt: existing.registeredAt,
@@ -64,6 +64,23 @@ export interface ModuleRegistryEvent {
64
64
  readonly timestamp: Date;
65
65
  }
66
66
  export type ModuleRegistryListener = (event: ModuleRegistryEvent) => void | Promise<void>;
67
+ /**
68
+ * Options accepted when registering a module definition.
69
+ */
70
+ export interface ModuleRegisterOptions {
71
+ /**
72
+ * Allows replacing a definition whose module instance is
73
+ * already loaded (or loading).
74
+ *
75
+ * Replacing a loaded module strands the live instance, so it
76
+ * is rejected with InvalidModuleStateError unless the caller
77
+ * opts in explicitly. Replacement itself additionally requires
78
+ * the registry's allowReplacement option.
79
+ *
80
+ * Defaults to false.
81
+ */
82
+ readonly replaceLoaded?: boolean;
83
+ }
67
84
  /**
68
85
  * Public contract for the module registry.
69
86
  */
@@ -71,7 +88,7 @@ export interface ModuleRegistry {
71
88
  /**
72
89
  * Registers a module definition.
73
90
  */
74
- register<TModule extends Module>(definition: ModuleDefinition<TModule>): ModuleRegistration<TModule>;
91
+ register<TModule extends Module>(definition: ModuleDefinition<TModule>, options?: ModuleRegisterOptions): ModuleRegistration<TModule>;
75
92
  /**
76
93
  * Registers multiple definitions.
77
94
  */