@zudojs/core 0.0.1 → 1.0.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 +15 -0
  6. package/dist/application/applicationContext.context.js +12 -0
  7. package/dist/application/createApplication.d.ts +78 -0
  8. package/dist/application/createApplication.js +104 -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 +32 -0
  12. package/dist/configuration/configurationManager.manager.js +86 -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 +52 -5
  42. package/dist/container/container.js +110 -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 +114 -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 +44 -6
  117. package/dist/modules/moduleLifecycle/moduleLifecycle.lifecycle.js +153 -9
  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 +65 -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 +123 -50
  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 +98 -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 +5 -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 +77 -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 +21 -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,18 +1,100 @@
1
- /** Immutable configuration container. */
1
+ import { normalizeConfigurationPath, requireConfigurationPath, } from "./configurationPath.path.js";
2
+ import { ConfigurationMissingError, ConfigurationPathError, ConfigurationTypeError, } from "../error/configurationError.error.js";
3
+ const FORBIDDEN_PATH_SEGMENTS = new Set([
4
+ "__proto__",
5
+ "constructor",
6
+ "prototype",
7
+ ]);
8
+ /**
9
+ * Recursively freezes a configuration value tree.
10
+ *
11
+ * Nodes that are already frozen are assumed to be deep-frozen
12
+ * (which holds for all trees produced by this module) and are
13
+ * skipped.
14
+ */
15
+ function deepFreezeConfigurationValue(value) {
16
+ if (value === null || typeof value !== "object")
17
+ return value;
18
+ if (Object.isFrozen(value))
19
+ return value;
20
+ if (Array.isArray(value)) {
21
+ for (const item of value)
22
+ deepFreezeConfigurationValue(item);
23
+ return Object.freeze(value);
24
+ }
25
+ for (const child of Object.values(value)) {
26
+ deepFreezeConfigurationValue(child);
27
+ }
28
+ return Object.freeze(value);
29
+ }
30
+ /**
31
+ * Deep-copies a configuration value tree.
32
+ *
33
+ * Plain objects and arrays are cloned recursively; primitives are
34
+ * returned as-is. Used so accessors that hand out whole subtrees
35
+ * never expose internal references.
36
+ */
37
+ function cloneConfigurationValue(value) {
38
+ if (value === null || typeof value !== "object")
39
+ return value;
40
+ if (Array.isArray(value)) {
41
+ return value.map((item) => cloneConfigurationValue(item));
42
+ }
43
+ const result = {};
44
+ for (const [key, child] of Object.entries(value)) {
45
+ result[key] = cloneConfigurationValue(child);
46
+ }
47
+ return result;
48
+ }
49
+ const STRICT_DECIMAL_PATTERN = /^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$/;
50
+ /**
51
+ * Immutable configuration container.
52
+ *
53
+ * The values tree is deep-frozen at construction, so accessors can
54
+ * safely hand out internal references. Callers should treat any
55
+ * object passed into the constructor (or `with()`) as owned by the
56
+ * configuration afterwards: it becomes frozen.
57
+ */
2
58
  export class Configuration {
3
59
  values;
4
60
  source;
5
61
  namespace;
62
+ pathSources;
6
63
  constructor(options = {}) {
7
64
  this.source = options.source ?? "runtime";
8
65
  this.namespace = options.namespace;
9
- this.values = Object.freeze({ ...(options.values ?? {}) });
66
+ this.values = deepFreezeConfigurationValue((options.values ?? {}));
67
+ this.pathSources = new Map(options.sources ?? []);
10
68
  }
11
69
  getNamespace() {
12
70
  return this.namespace;
13
71
  }
14
- getSource() {
15
- return this.source;
72
+ /**
73
+ * Returns the source of a configuration path, or of the whole
74
+ * configuration when no path is supplied.
75
+ *
76
+ * When entries originate from multiple source types, "mixed"
77
+ * is returned.
78
+ */
79
+ getSource(path) {
80
+ if (path === undefined) {
81
+ const distinct = new Set(this.pathSources.values());
82
+ if (distinct.size === 0)
83
+ return this.source;
84
+ for (const key of Object.keys(this.values)) {
85
+ if (!this.hasSourceRecordFor(key)) {
86
+ distinct.add(this.source);
87
+ break;
88
+ }
89
+ }
90
+ if (distinct.size === 1)
91
+ return [...distinct][0];
92
+ return "mixed";
93
+ }
94
+ const normalizedPath = this.normalizePath(path);
95
+ if (!normalizedPath)
96
+ return this.source;
97
+ return this.resolvePathSource(normalizedPath);
16
98
  }
17
99
  get(path) {
18
100
  const normalizedPath = this.normalizePath(path);
@@ -21,7 +103,9 @@ export class Configuration {
21
103
  const parts = normalizedPath.split(".");
22
104
  let current = this.values;
23
105
  for (const part of parts) {
24
- if (typeof current !== "object" || current === null || !(part in current))
106
+ if (typeof current !== "object" ||
107
+ current === null ||
108
+ !Object.hasOwn(current, part))
25
109
  return undefined;
26
110
  current = current[part];
27
111
  }
@@ -30,7 +114,7 @@ export class Configuration {
30
114
  require(path) {
31
115
  const value = this.get(path);
32
116
  if (value === undefined)
33
- throw new Error(`Required configuration "${path}" is not defined.`);
117
+ throw new ConfigurationMissingError(path);
34
118
  return value;
35
119
  }
36
120
  getByKey(key) {
@@ -39,7 +123,7 @@ export class Configuration {
39
123
  requireByKey(key) {
40
124
  const value = this.getByKey(key);
41
125
  if (value === undefined)
42
- throw new Error(`Required configuration "${key.path}" is not defined.`);
126
+ throw new ConfigurationMissingError(key.path);
43
127
  return value;
44
128
  }
45
129
  has(path) {
@@ -58,7 +142,7 @@ export class Configuration {
58
142
  if (normalized === "false" || normalized === "0" || normalized === "no")
59
143
  return false;
60
144
  }
61
- throw new TypeError(`Configuration "${path}" is not a valid boolean.`);
145
+ throw new ConfigurationTypeError(path, "boolean", value);
62
146
  }
63
147
  getNumber(path, defaultValue) {
64
148
  const value = this.get(path);
@@ -67,14 +151,26 @@ export class Configuration {
67
151
  if (typeof value === "number") {
68
152
  if (Number.isFinite(value))
69
153
  return value;
70
- throw new TypeError(`Configuration "${path}" must be a finite number.`);
154
+ throw new ConfigurationTypeError(path, "number", value);
71
155
  }
72
156
  if (typeof value === "string") {
73
- const parsed = Number(value.trim());
74
- if (Number.isFinite(parsed))
75
- return parsed;
157
+ const trimmed = value.trim();
158
+ if (trimmed === "") {
159
+ /*
160
+ * Empty and whitespace-only strings are treated as
161
+ * "value not provided" rather than silently coerced to 0.
162
+ */
163
+ if (defaultValue !== undefined)
164
+ return defaultValue;
165
+ throw new ConfigurationTypeError(path, "number", value);
166
+ }
167
+ if (STRICT_DECIMAL_PATTERN.test(trimmed)) {
168
+ const parsed = Number(trimmed);
169
+ if (Number.isFinite(parsed))
170
+ return parsed;
171
+ }
76
172
  }
77
- throw new TypeError(`Configuration "${path}" is not a valid number.`);
173
+ throw new ConfigurationTypeError(path, "number", value);
78
174
  }
79
175
  getString(path, defaultValue) {
80
176
  const value = this.get(path);
@@ -84,18 +180,21 @@ export class Configuration {
84
180
  return value;
85
181
  if (typeof value === "number" || typeof value === "boolean")
86
182
  return String(value);
87
- throw new TypeError(`Configuration "${path}" is not a valid string.`);
88
- }
89
- createKey(path) {
90
- const normalizedPath = this.normalizePath(path);
91
- if (!normalizedPath)
92
- throw new Error("Configuration key path cannot be empty.");
93
- return Object.freeze({ path: normalizedPath, id: Symbol(normalizedPath) });
183
+ throw new ConfigurationTypeError(path, "string", value);
94
184
  }
95
185
  scope(namespace) {
96
- const normalizedNamespace = this.normalizePath(namespace);
97
- if (!normalizedNamespace)
98
- throw new Error("Configuration scope cannot be empty.");
186
+ const normalizedNamespace = requireConfigurationPath(namespace);
187
+ const exactSource = this.pathSources.get(normalizedNamespace);
188
+ const scopedSource = exactSource ??
189
+ this.resolveAncestorSource(normalizedNamespace) ??
190
+ this.source;
191
+ const scopedSources = new Map();
192
+ const prefix = `${normalizedNamespace}.`;
193
+ for (const [recordedPath, source] of this.pathSources) {
194
+ if (recordedPath.startsWith(prefix)) {
195
+ scopedSources.set(recordedPath.slice(prefix.length), source);
196
+ }
197
+ }
99
198
  const scopedValues = this.get(normalizedNamespace);
100
199
  if (scopedValues === undefined ||
101
200
  typeof scopedValues !== "object" ||
@@ -103,58 +202,159 @@ export class Configuration {
103
202
  Array.isArray(scopedValues)) {
104
203
  return new Configuration({
105
204
  values: {},
106
- source: this.source,
205
+ source: scopedSource,
107
206
  namespace: normalizedNamespace,
108
207
  });
109
208
  }
110
209
  return new Configuration({
111
210
  values: scopedValues,
112
- source: this.source,
211
+ source: scopedSource,
113
212
  namespace: normalizedNamespace,
213
+ sources: scopedSources,
114
214
  });
115
215
  }
116
216
  entries() {
117
217
  return Object.entries(this.values).map(([path, value]) => ({
118
218
  path,
119
219
  value,
120
- source: this.source,
220
+ source: this.resolvePathSource(path),
121
221
  }));
122
222
  }
223
+ /**
224
+ * Returns a deep copy of the complete values tree.
225
+ *
226
+ * The copy is unfrozen and independent of the configuration, so
227
+ * callers may mutate it freely without affecting this instance
228
+ * or anything derived from it.
229
+ */
123
230
  toObject() {
124
- return this.values;
231
+ return cloneConfigurationValue(this.values);
125
232
  }
233
+ /**
234
+ * Deeply merges another configuration on top of this one.
235
+ *
236
+ * Objects are merged recursively, arrays and primitives are
237
+ * replaced. Per-path source attribution from both configurations
238
+ * is preserved; the other configuration wins on conflicts.
239
+ */
126
240
  merge(other) {
241
+ const values = this.deepMergeValues(this.values, other.values);
242
+ const sources = new Map(this.pathSources);
243
+ for (const [path, source] of other.pathSources)
244
+ sources.set(path, source);
127
245
  return new Configuration({
128
- values: { ...this.values, ...other.toObject() },
246
+ values,
129
247
  source: other.source,
130
248
  namespace: other.namespace ?? this.namespace,
249
+ sources,
131
250
  });
132
251
  }
133
252
  with(path, value, source = "runtime") {
134
- const normalizedPath = this.normalizePath(path);
135
- if (!normalizedPath)
136
- throw new Error("Configuration path cannot be empty.");
253
+ const normalizedPath = requireConfigurationPath(path);
137
254
  const values = this.setNestedValue(this.values, normalizedPath, value);
138
- return new Configuration({ values, source, namespace: this.namespace });
255
+ const sources = new Map(this.pathSources);
256
+ const prefix = `${normalizedPath}.`;
257
+ for (const recordedPath of sources.keys()) {
258
+ if (recordedPath.startsWith(prefix))
259
+ sources.delete(recordedPath);
260
+ }
261
+ sources.set(normalizedPath, source);
262
+ return new Configuration({
263
+ values,
264
+ source: this.source,
265
+ namespace: this.namespace,
266
+ sources,
267
+ });
139
268
  }
140
269
  without(path) {
141
270
  const normalizedPath = this.normalizePath(path);
142
271
  if (!normalizedPath)
143
272
  return this;
144
273
  const values = this.deleteNestedValue(this.values, normalizedPath);
274
+ const sources = new Map(this.pathSources);
275
+ const prefix = `${normalizedPath}.`;
276
+ sources.delete(normalizedPath);
277
+ for (const recordedPath of [...sources.keys()]) {
278
+ if (recordedPath.startsWith(prefix))
279
+ sources.delete(recordedPath);
280
+ }
145
281
  return new Configuration({
146
282
  values,
147
283
  source: this.source,
148
284
  namespace: this.namespace,
285
+ sources,
149
286
  });
150
287
  }
151
288
  normalizePath(path) {
152
- return path.trim().replace(/\s+/g, "");
289
+ return normalizeConfigurationPath(path);
290
+ }
291
+ hasSourceRecordFor(topLevelKey) {
292
+ if (this.pathSources.has(topLevelKey))
293
+ return true;
294
+ const prefix = `${topLevelKey}.`;
295
+ for (const recordedPath of this.pathSources.keys()) {
296
+ if (recordedPath.startsWith(prefix))
297
+ return true;
298
+ }
299
+ return false;
300
+ }
301
+ resolveAncestorSource(path) {
302
+ const parts = path.split(".");
303
+ for (let index = parts.length - 1; index > 0; index--) {
304
+ const ancestor = parts.slice(0, index).join(".");
305
+ const source = this.pathSources.get(ancestor);
306
+ if (source !== undefined)
307
+ return source;
308
+ }
309
+ return undefined;
310
+ }
311
+ resolvePathSource(path) {
312
+ const exact = this.pathSources.get(path);
313
+ if (exact !== undefined)
314
+ return exact;
315
+ const ancestor = this.resolveAncestorSource(path);
316
+ if (ancestor !== undefined)
317
+ return ancestor;
318
+ const prefix = `${path}.`;
319
+ const descendantSources = new Set();
320
+ for (const [recordedPath, source] of this.pathSources) {
321
+ if (recordedPath.startsWith(prefix))
322
+ descendantSources.add(source);
323
+ }
324
+ if (descendantSources.size === 1)
325
+ return [...descendantSources][0];
326
+ if (descendantSources.size > 1)
327
+ return "mixed";
328
+ return this.source;
329
+ }
330
+ deepMergeValues(base, override) {
331
+ if (base === null ||
332
+ override === null ||
333
+ typeof base !== "object" ||
334
+ typeof override !== "object" ||
335
+ Array.isArray(base) ||
336
+ Array.isArray(override)) {
337
+ return override;
338
+ }
339
+ const result = {};
340
+ for (const [key, value] of Object.entries(base)) {
341
+ if (FORBIDDEN_PATH_SEGMENTS.has(key))
342
+ continue;
343
+ result[key] = value;
344
+ }
345
+ for (const [key, value] of Object.entries(override)) {
346
+ if (FORBIDDEN_PATH_SEGMENTS.has(key))
347
+ continue;
348
+ const existing = result[key];
349
+ result[key] =
350
+ existing !== undefined ? this.deepMergeValues(existing, value) : value;
351
+ }
352
+ return result;
153
353
  }
154
354
  setNestedValue(source, path, value) {
155
355
  const parts = path.split(".");
156
- if (parts.some((p) => p === "__proto__" || p === "constructor" || p === "prototype")) {
157
- throw new TypeError(`Invalid configuration path: "${path}"`);
356
+ if (parts.some((p) => FORBIDDEN_PATH_SEGMENTS.has(p))) {
357
+ throw new ConfigurationPathError(path, "path names a forbidden segment.");
158
358
  }
159
359
  const result = { ...source };
160
360
  let current = result;
@@ -172,34 +372,31 @@ export class Configuration {
172
372
  current[parts[parts.length - 1]] = value;
173
373
  return result;
174
374
  }
375
+ /**
376
+ * Removes a nested value by shallow-cloning only the objects
377
+ * along the path, mirroring the strategy used by setNestedValue.
378
+ */
175
379
  deleteNestedValue(source, path) {
176
380
  const parts = path.split(".");
177
- if (parts.some((p) => p === "__proto__" || p === "constructor" || p === "prototype")) {
178
- throw new TypeError(`Invalid configuration path: "${path}"`);
381
+ if (parts.some((p) => FORBIDDEN_PATH_SEGMENTS.has(p))) {
382
+ throw new ConfigurationPathError(path, "path names a forbidden segment.");
179
383
  }
180
- const result = structuredClone(source);
384
+ const result = { ...source };
181
385
  let current = result;
182
386
  for (let index = 0; index < parts.length - 1; index++) {
183
387
  const part = parts[index];
184
- if (part === "__proto__" ||
185
- part === "constructor" ||
186
- part === "prototype")
187
- return result;
188
388
  const next = current[part];
189
389
  if (next === null || typeof next !== "object" || Array.isArray(next))
190
390
  return result;
191
- current = next;
192
- }
193
- const lastPart = parts[parts.length - 1];
194
- if (lastPart === "__proto__" ||
195
- lastPart === "constructor" ||
196
- lastPart === "prototype")
197
- return result;
198
- delete current[lastPart];
391
+ const clone = { ...next };
392
+ current[part] = clone;
393
+ current = clone;
394
+ }
395
+ delete current[parts[parts.length - 1]];
199
396
  return result;
200
397
  }
201
398
  }
202
- /** Creates an empty Configuration instance. */
399
+ /** Creates a Configuration instance. */
203
400
  export function createConfiguration(options = {}) {
204
401
  return new Configuration(options);
205
402
  }
@@ -27,8 +27,10 @@ export interface ConfigurationKey<T> {
27
27
  /**
28
28
  * Unique identifier for this configuration key.
29
29
  *
30
- * Symbols prevent accidental collisions between keys that
31
- * happen to use the same path.
30
+ * Note that configuration lookups are performed by `path`,
31
+ * not by this symbol. The symbol only helps distinguish key
32
+ * instances from each other in debugging and diagnostics;
33
+ * two keys with the same path resolve the same value.
32
34
  */
33
35
  readonly id: symbol;
34
36
  }
@@ -1,3 +1,4 @@
1
+ import { requireConfigurationPath } from "./configurationPath.path.js";
1
2
  /**
2
3
  * Creates a strongly typed configuration key.
3
4
  *
@@ -6,22 +7,10 @@
6
7
  * type the caller expects it to have.
7
8
  */
8
9
  export function createConfigurationKey(path) {
9
- const normalizedPath = normalizeConfigurationPath(path);
10
- if (!normalizedPath) {
11
- throw new Error("Configuration key path cannot be empty.");
12
- }
10
+ const normalizedPath = requireConfigurationPath(path);
13
11
  return Object.freeze({
14
12
  path: normalizedPath,
15
13
  id: Symbol(normalizedPath),
16
14
  });
17
15
  }
18
- /**
19
- * Normalizes a configuration path.
20
- */
21
- function normalizeConfigurationPath(path) {
22
- if (typeof path !== "string") {
23
- throw new TypeError("Configuration key path must be a string.");
24
- }
25
- return path.trim().replace(/\s+/g, "");
26
- }
27
16
  //# sourceMappingURL=configurationKey.key.js.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared configuration path normalization.
3
+ *
4
+ * This is the single canonical implementation used by the
5
+ * configuration container, keys, schemas, and registry.
6
+ *
7
+ * Paths are trimmed. Paths that still contain whitespace after
8
+ * trimming are rejected instead of silently rewritten, because
9
+ * silently stripping whitespace can turn a typo into a lookup
10
+ * for a completely different configuration value.
11
+ */
12
+ export declare function normalizeConfigurationPath(path: string): string;
13
+ /**
14
+ * Normalizes a configuration path and rejects empty results.
15
+ */
16
+ export declare function requireConfigurationPath(path: string): string;
17
+ //# sourceMappingURL=configurationPath.path.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { ConfigurationPathError } from "../error/configurationError.error.js";
2
+ /**
3
+ * Shared configuration path normalization.
4
+ *
5
+ * This is the single canonical implementation used by the
6
+ * configuration container, keys, schemas, and registry.
7
+ *
8
+ * Paths are trimmed. Paths that still contain whitespace after
9
+ * trimming are rejected instead of silently rewritten, because
10
+ * silently stripping whitespace can turn a typo into a lookup
11
+ * for a completely different configuration value.
12
+ */
13
+ export function normalizeConfigurationPath(path) {
14
+ if (typeof path !== "string") {
15
+ throw new ConfigurationPathError(String(path), "path must be a string.");
16
+ }
17
+ const normalized = path.trim();
18
+ if (/\s/.test(normalized)) {
19
+ throw new ConfigurationPathError(path, "path must not contain whitespace.");
20
+ }
21
+ return normalized;
22
+ }
23
+ /**
24
+ * Normalizes a configuration path and rejects empty results.
25
+ */
26
+ export function requireConfigurationPath(path) {
27
+ const normalized = normalizeConfigurationPath(path);
28
+ if (!normalized) {
29
+ throw new ConfigurationPathError(path, "path cannot be empty.");
30
+ }
31
+ return normalized;
32
+ }
33
+ //# sourceMappingURL=configurationPath.path.js.map
@@ -4,9 +4,15 @@
4
4
  * Core configuration types, keys, and source abstractions.
5
5
  */
6
6
  export { Configuration, createConfiguration } from "./configuration.js";
7
- export type { ConfigurationOptions, ConfigurationValue, ConfigurationSource as ConfigurationValueSource, ConfigurationEntry, } from "./configuration.js";
7
+ export type { ConfigurationOptions, ConfigurationValue, ConfigurationEntry, ConfigurationEntrySource, } from "./configuration.js";
8
+ /**
9
+ * Compatibility alias. The string-union source type now lives in
10
+ * configurationSource.source.ts as ConfigurationSourceType.
11
+ */
12
+ export type { ConfigurationSourceType as ConfigurationValueSource } from "./configurationSource.source.js";
8
13
  export { createConfigurationKey } from "./configurationKey.key.js";
9
14
  export type { ConfigurationKey } from "./configurationKey.key.js";
15
+ export { normalizeConfigurationPath, requireConfigurationPath, } from "./configurationPath.path.js";
10
16
  export { BaseConfigurationSource, createConfigurationSource, sortConfigurationSources, } from "./configurationSource.source.js";
11
17
  export type { ConfigurationSource, ConfigurationSourceType, ConfigurationSourceEntry, ConfigurationSourceOptions, } from "./configurationSource.source.js";
12
18
  //# sourceMappingURL=index.d.ts.map
@@ -5,5 +5,6 @@
5
5
  */
6
6
  export { Configuration, createConfiguration } from "./configuration.js";
7
7
  export { createConfigurationKey } from "./configurationKey.key.js";
8
+ export { normalizeConfigurationPath, requireConfigurationPath, } from "./configurationPath.path.js";
8
9
  export { BaseConfigurationSource, createConfigurationSource, sortConfigurationSources, } from "./configurationSource.source.js";
9
10
  //# sourceMappingURL=index.js.map
@@ -1,5 +1,9 @@
1
1
  import { FrameworkError } from "../../errors/frameworkError.error.js";
2
2
  import { ErrorCode } from "../../errors/errorCode.code.js";
3
+ /**
4
+ * Produces a redacted message from an unknown cause.
5
+ */
6
+ export declare function describeConfigurationCause(cause: unknown): string;
3
7
  /**
4
8
  * Base error for all configuration related failures.
5
9
  *
@@ -41,6 +45,13 @@ export declare class ConfigurationSourceError extends ConfigurationError {
41
45
  export declare class ConfigurationMissingError extends ConfigurationError {
42
46
  constructor(path: string);
43
47
  }
48
+ /**
49
+ * Thrown when a configuration path is malformed: empty, containing
50
+ * whitespace, or naming a forbidden segment such as "__proto__".
51
+ */
52
+ export declare class ConfigurationPathError extends ConfigurationError {
53
+ constructor(path: string, reason: string);
54
+ }
44
55
  /**
45
56
  * Thrown when a configuration value has an invalid type
46
57
  * or otherwise cannot be interpreted correctly.
@@ -1,5 +1,18 @@
1
1
  import { FrameworkError } from "../../errors/frameworkError.error.js";
2
2
  import { ErrorCode } from "../../errors/errorCode.code.js";
3
+ import { ConfigurationRedactor } from "./configurationRedactor.redactor.js";
4
+ /**
5
+ * Default redactor used to scrub raw cause text before it is
6
+ * embedded in configuration error messages.
7
+ */
8
+ const defaultErrorRedactor = new ConfigurationRedactor();
9
+ /**
10
+ * Produces a redacted message from an unknown cause.
11
+ */
12
+ export function describeConfigurationCause(cause) {
13
+ const message = cause instanceof Error ? cause.message : String(cause);
14
+ return defaultErrorRedactor.redactText(message);
15
+ }
3
16
  /**
4
17
  * Base error for all configuration related failures.
5
18
  *
@@ -45,7 +58,7 @@ export class ConfigurationSourceError extends ConfigurationError {
45
58
  */
46
59
  sourceType;
47
60
  constructor(sourceName, sourceType, cause) {
48
- const causeMessage = cause instanceof Error ? cause.message : String(cause);
61
+ const causeMessage = describeConfigurationCause(cause);
49
62
  super(ErrorCode.CONFIGURATION_LOAD_FAILED, `Failed to load configuration source "${sourceName}": ${causeMessage}`, {
50
63
  cause,
51
64
  details: {
@@ -69,6 +82,21 @@ export class ConfigurationMissingError extends ConfigurationError {
69
82
  this.name = "ConfigurationMissingError";
70
83
  }
71
84
  }
85
+ /**
86
+ * Thrown when a configuration path is malformed: empty, containing
87
+ * whitespace, or naming a forbidden segment such as "__proto__".
88
+ */
89
+ export class ConfigurationPathError extends ConfigurationError {
90
+ constructor(path, reason) {
91
+ super(ErrorCode.CONFIGURATION_INVALID, `Invalid configuration path "${path}": ${reason}`, {
92
+ path,
93
+ details: {
94
+ reason,
95
+ },
96
+ });
97
+ this.name = "ConfigurationPathError";
98
+ }
99
+ }
72
100
  /**
73
101
  * Thrown when a configuration value has an invalid type
74
102
  * or otherwise cannot be interpreted correctly.
@@ -97,8 +97,24 @@ export declare class ConfigurationRedactor {
97
97
  /**
98
98
  * Checks whether a path segment matches one of the
99
99
  * configured sensitive patterns.
100
+ *
101
+ * Matching is word-boundary aware: the segment is split into
102
+ * words on separators and camelCase transitions, and a pattern
103
+ * matches only when a consecutive run of words spells it out.
104
+ * This means "apiToken" and "access_token" match "token", but
105
+ * "tokenizer" and "secretary" do not match "token"/"secret".
100
106
  */
101
107
  private matchesSensitivePattern;
108
+ /**
109
+ * Redacts sensitive-looking fragments from free-form text such
110
+ * as error messages.
111
+ *
112
+ * Occurrences of "<sensitive>=value", "<sensitive>: value", and
113
+ * "<sensitive> value" have their value replaced. This is a
114
+ * best-effort scrub for diagnostics; it does not guarantee that
115
+ * arbitrary text contains no secrets.
116
+ */
117
+ redactText(text: string): string;
102
118
  }
103
119
  /**
104
120
  * Creates a ConfigurationRedactor.