@fgv/ts-res 5.0.0-2 → 5.0.0-21

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 (557) hide show
  1. package/.vscode/4.json +3 -0
  2. package/.vscode/launch.json +16 -0
  3. package/.vscode/settings.json +3 -0
  4. package/config/api-extractor.json +343 -0
  5. package/config/rig.json +16 -0
  6. package/dist/ts-res.d.ts +1528 -161
  7. package/dist/tsdoc-metadata.json +1 -1
  8. package/lib/index.d.ts +11 -2
  9. package/lib/index.js +25 -2
  10. package/lib/packlets/bundle/bundleBuilder.d.ts +41 -0
  11. package/lib/packlets/bundle/bundleBuilder.js +134 -0
  12. package/lib/packlets/bundle/bundleLoader.d.ts +72 -0
  13. package/lib/packlets/bundle/bundleLoader.js +105 -0
  14. package/lib/packlets/bundle/bundleNormalizer.d.ts +73 -0
  15. package/lib/packlets/bundle/bundleNormalizer.js +142 -0
  16. package/lib/packlets/bundle/bundleUtils.d.ts +70 -0
  17. package/lib/packlets/bundle/bundleUtils.js +117 -0
  18. package/lib/packlets/bundle/convert.d.ts +33 -0
  19. package/lib/packlets/bundle/convert.js +78 -0
  20. package/lib/packlets/bundle/index.d.ts +21 -0
  21. package/lib/packlets/bundle/index.js +83 -0
  22. package/lib/packlets/bundle/model.d.ts +100 -0
  23. package/lib/packlets/bundle/model.js +24 -0
  24. package/lib/packlets/common/helpers/resources.d.ts +7 -0
  25. package/lib/packlets/common/helpers/resources.js +12 -0
  26. package/lib/packlets/common/resources.d.ts +8 -0
  27. package/lib/packlets/conditions/conditionSet.d.ts +9 -0
  28. package/lib/packlets/conditions/conditionSet.js +74 -1
  29. package/lib/packlets/config/configInitFactory.d.ts +78 -0
  30. package/lib/packlets/config/configInitFactory.js +147 -0
  31. package/lib/packlets/config/convert.d.ts +9 -0
  32. package/lib/packlets/config/convert.js +11 -0
  33. package/lib/packlets/config/index.d.ts +1 -0
  34. package/lib/packlets/config/index.js +1 -0
  35. package/lib/packlets/config/systemConfiguration.d.ts +16 -3
  36. package/lib/packlets/config/systemConfiguration.js +19 -40
  37. package/lib/packlets/import/fsItem.js +8 -13
  38. package/lib/packlets/import/importers/jsonImporter.js +1 -0
  39. package/lib/packlets/qualifier-types/config/json.d.ts +13 -0
  40. package/lib/packlets/qualifier-types/config/json.js +11 -0
  41. package/lib/packlets/qualifier-types/literalValueHierarchy.js +1 -1
  42. package/lib/packlets/qualifiers/qualifierCollector.js +1 -2
  43. package/lib/packlets/resource-types/jsonResourceType.d.ts +9 -4
  44. package/lib/packlets/resource-types/jsonResourceType.js +8 -1
  45. package/lib/packlets/resource-types/resourceType.d.ts +102 -13
  46. package/lib/packlets/resource-types/resourceType.js +34 -2
  47. package/lib/packlets/resources/common.d.ts +26 -0
  48. package/lib/packlets/resources/resource.d.ts +6 -6
  49. package/lib/packlets/resources/resource.js +3 -8
  50. package/lib/packlets/resources/resourceCandidate.d.ts +5 -1
  51. package/lib/packlets/resources/resourceCandidate.js +6 -0
  52. package/lib/packlets/resources/resourceManagerBuilder.d.ts +182 -11
  53. package/lib/packlets/resources/resourceManagerBuilder.js +469 -15
  54. package/lib/packlets/runtime/cacheListener.d.ts +9 -0
  55. package/lib/packlets/runtime/cacheListener.js +6 -0
  56. package/lib/packlets/runtime/cacheMetrics.d.ts +6 -0
  57. package/lib/packlets/runtime/cacheMetrics.js +11 -0
  58. package/lib/packlets/runtime/compiledResourceCollection.d.ts +3 -3
  59. package/lib/packlets/runtime/compiledResourceCollection.js +7 -0
  60. package/lib/packlets/runtime/iResourceManager.d.ts +13 -5
  61. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.d.ts +7 -7
  62. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.js +5 -5
  63. package/lib/packlets/runtime/resourceResolver.d.ts +21 -0
  64. package/lib/packlets/runtime/resourceResolver.js +39 -17
  65. package/lib/packlets/runtime/validate.js +1 -0
  66. package/lib/packlets/zip-archive/convert.d.ts +52 -0
  67. package/lib/packlets/zip-archive/convert.js +104 -0
  68. package/lib/packlets/zip-archive/index.d.ts +23 -0
  69. package/lib/packlets/zip-archive/index.js +95 -0
  70. package/lib/packlets/zip-archive/json.d.ts +64 -0
  71. package/lib/packlets/zip-archive/json.js +24 -0
  72. package/lib/packlets/zip-archive/types.d.ts +98 -0
  73. package/lib/packlets/zip-archive/types.js +39 -0
  74. package/lib/packlets/zip-archive/zipArchiveCreator.d.ts +35 -0
  75. package/lib/packlets/zip-archive/zipArchiveCreator.js +194 -0
  76. package/lib/packlets/zip-archive/zipArchiveFormat.d.ts +70 -0
  77. package/lib/packlets/zip-archive/zipArchiveFormat.js +184 -0
  78. package/lib/packlets/zip-archive/zipArchiveLoader.d.ts +70 -0
  79. package/lib/packlets/zip-archive/zipArchiveLoader.js +285 -0
  80. package/lib/test/data/sample.json +32 -0
  81. package/lib/test/unit/bundle/bundleBuilder.test.d.ts +2 -0
  82. package/lib/test/unit/bundle/bundleLoader.test.d.ts +2 -0
  83. package/lib/test/unit/bundle/bundleUtils.test.d.ts +2 -0
  84. package/lib/test/unit/bundle/convert.test.d.ts +2 -0
  85. package/lib/test/unit/bundle/integration.test.d.ts +2 -0
  86. package/lib/test/unit/bundle/model.test.d.ts +2 -0
  87. package/lib/test/unit/bundle/normalization.test.d.ts +2 -0
  88. package/lib/test/unit/common/conditions.test.d.ts +2 -0
  89. package/lib/test/unit/common/helpers/conditions.test.d.ts +2 -0
  90. package/lib/test/unit/common/helpers/contexts.test.d.ts +2 -0
  91. package/lib/test/unit/common/helpers/qualifierDefaultValues.test.d.ts +2 -0
  92. package/lib/test/unit/common/resources.test.d.ts +2 -0
  93. package/lib/test/unit/conditions/condition.test.d.ts +2 -0
  94. package/lib/test/unit/conditions/conditionCollector.test.d.ts +2 -0
  95. package/lib/test/unit/conditions/conditionScoreAsDefault.test.d.ts +2 -0
  96. package/lib/test/unit/conditions/conditionSet.test.d.ts +2 -0
  97. package/lib/test/unit/conditions/conditionSetCollector.test.d.ts +2 -0
  98. package/lib/test/unit/conditions/conditionToken.test.d.ts +2 -0
  99. package/lib/test/unit/conditions/convert.test.d.ts +2 -0
  100. package/lib/test/unit/config/common.test.d.ts +2 -0
  101. package/lib/test/unit/config/convert.test.d.ts +2 -0
  102. package/lib/test/unit/config/predefined/default.test.d.ts +2 -0
  103. package/lib/test/unit/config/predefined/extended.test.d.ts +2 -0
  104. package/lib/test/unit/config/systemConfiguration.test.d.ts +2 -0
  105. package/lib/test/unit/config/systemConfigurationInitParams.test.d.ts +2 -0
  106. package/lib/test/unit/context/contextToken.test.d.ts +2 -0
  107. package/lib/test/unit/context/convert.test.d.ts +2 -0
  108. package/lib/test/unit/decisions/abstractDecision.test.d.ts +2 -0
  109. package/lib/test/unit/decisions/abstractDecisionCollector.test.d.ts +2 -0
  110. package/lib/test/unit/decisions/candidate.test.d.ts +2 -0
  111. package/lib/test/unit/decisions/concreteDecision.test.d.ts +2 -0
  112. package/lib/test/unit/decisions/decision.test.d.ts +2 -0
  113. package/lib/test/unit/import/collectionImporter.test.d.ts +2 -0
  114. package/lib/test/unit/import/fsItem.test.d.ts +2 -0
  115. package/lib/test/unit/import/fsItemImporter.test.d.ts +2 -0
  116. package/lib/test/unit/import/importContext.test.d.ts +2 -0
  117. package/lib/test/unit/import/importManager.test.d.ts +2 -0
  118. package/lib/test/unit/import/jsonImporter.test.d.ts +2 -0
  119. package/lib/test/unit/import/pathImporter.test.d.ts +2 -0
  120. package/lib/test/unit/qualifier-types/convert.test.d.ts +2 -0
  121. package/lib/test/unit/qualifier-types/helpers.test.d.ts +2 -0
  122. package/lib/test/unit/qualifier-types/languageQualifierType.test.d.ts +2 -0
  123. package/lib/test/unit/qualifier-types/literalQualifierType.test.d.ts +2 -0
  124. package/lib/test/unit/qualifier-types/literalValueHierarchy.test.d.ts +2 -0
  125. package/lib/test/unit/qualifier-types/qualifierType.test.d.ts +2 -0
  126. package/lib/test/unit/qualifier-types/qualifierTypeCollector.test.d.ts +2 -0
  127. package/lib/test/unit/qualifier-types/territoryQualifierType.test.d.ts +2 -0
  128. package/lib/test/unit/qualifier-types/testQualifierType.d.ts +15 -0
  129. package/lib/test/unit/qualifier-types/testQualifierType.js +89 -0
  130. package/lib/test/unit/qualifiers/convert.test.d.ts +2 -0
  131. package/lib/test/unit/qualifiers/qualifierCollector.test.d.ts +2 -0
  132. package/lib/test/unit/qualifiers/qualifierDefaultValue.test.d.ts +2 -0
  133. package/lib/test/unit/qualifiers/qualifierDefaultValueToken.test.d.ts +2 -0
  134. package/lib/test/unit/resource-json/convert.test.d.ts +2 -0
  135. package/lib/test/unit/resource-json/nameInheritance.test.d.ts +2 -0
  136. package/lib/test/unit/resource-json/resourceDeclCollection.test.d.ts +2 -0
  137. package/lib/test/unit/resource-json/resourceDeclTree.test.d.ts +2 -0
  138. package/lib/test/unit/resource-types/jsonResourceType.test.d.ts +2 -0
  139. package/lib/test/unit/resource-types/resourceTypeCollector.test.d.ts +2 -0
  140. package/lib/test/unit/resources/candidateReducer.integration.test.d.ts +2 -0
  141. package/lib/test/unit/resources/candidateReducer.test.d.ts +2 -0
  142. package/lib/test/unit/resources/reduceCandidates.test.d.ts +2 -0
  143. package/lib/test/unit/resources/reduceQualifiers.comprehensive.test.d.ts +2 -0
  144. package/lib/test/unit/resources/reduceQualifiers.test.d.ts +2 -0
  145. package/lib/test/unit/resources/resource.test.d.ts +2 -0
  146. package/lib/test/unit/resources/resourceBuilder.test.d.ts +2 -0
  147. package/lib/test/unit/resources/resourceCandidate.test.d.ts +2 -0
  148. package/lib/test/unit/resources/resourceManagerBuilder.clone.test.d.ts +2 -0
  149. package/lib/test/unit/resources/resourceManagerBuilder.getBuiltResourceTree.test.d.ts +2 -0
  150. package/lib/test/unit/resources/resourceManagerBuilder.test.d.ts +2 -0
  151. package/lib/test/unit/runtime/cacheListener.test.d.ts +2 -0
  152. package/lib/test/unit/runtime/cacheMetrics.test.d.ts +2 -0
  153. package/lib/test/unit/runtime/compiledResourceCollection.test.d.ts +2 -0
  154. package/lib/test/unit/runtime/conditionSetResolutionResult.comprehensive.test.d.ts +2 -0
  155. package/lib/test/unit/runtime/conditionSetResolutionResult.test.d.ts +2 -0
  156. package/lib/test/unit/runtime/context/contextQualifierProvider.test.d.ts +2 -0
  157. package/lib/test/unit/runtime/context/contextQualifierProviderValidator.test.d.ts +2 -0
  158. package/lib/test/unit/runtime/context/simpleContextQualifierProvider.test.d.ts +2 -0
  159. package/lib/test/unit/runtime/context/validatingSimpleContextQualifierProvider.test.d.ts +2 -0
  160. package/lib/test/unit/runtime/resource-tree/readOnlyResourceTree.test.d.ts +2 -0
  161. package/lib/test/unit/runtime/resource-tree/resourceTreeChildren.test.d.ts +2 -0
  162. package/lib/test/unit/runtime/resource-tree/resourceTreeChildrenValidator.test.d.ts +2 -0
  163. package/lib/test/unit/runtime/resourceResolver.defaultResolution.test.d.ts +2 -0
  164. package/lib/test/unit/runtime/resourceResolver.test.d.ts +2 -0
  165. package/lib/test/unit/runtime/validate.test.d.ts +2 -0
  166. package/lib/test/unit/zip-archive/convert.test.d.ts +2 -0
  167. package/lib/test/unit/zip-archive/json.test.d.ts +2 -0
  168. package/lib/test/unit/zip-archive/zipArchiveCreator.test.d.ts +2 -0
  169. package/lib/test/unit/zip-archive/zipArchiveFormat.test.d.ts +2 -0
  170. package/lib/test/unit/zip-archive/zipArchiveIdempotency.test.d.ts +2 -0
  171. package/lib/test/unit/zip-archive/zipArchiveLoader.test.d.ts +2 -0
  172. package/package.json +19 -25
  173. package/src/index.ts +75 -0
  174. package/src/packlets/bundle/bundleBuilder.ts +159 -0
  175. package/src/packlets/bundle/bundleLoader.ts +157 -0
  176. package/src/packlets/bundle/bundleNormalizer.ts +173 -0
  177. package/src/packlets/bundle/bundleUtils.ts +142 -0
  178. package/src/packlets/bundle/convert.ts +87 -0
  179. package/src/packlets/bundle/index.ts +52 -0
  180. package/src/packlets/bundle/model.ts +138 -0
  181. package/src/packlets/common/conditions.ts +226 -0
  182. package/src/packlets/common/convert.ts +184 -0
  183. package/src/packlets/common/helpers/conditions.ts +84 -0
  184. package/src/packlets/common/helpers/context.ts +88 -0
  185. package/src/packlets/common/helpers/index.ts +26 -0
  186. package/src/packlets/common/helpers/qualifierDefaultValues.ts +91 -0
  187. package/src/packlets/common/helpers/resources.ts +96 -0
  188. package/src/packlets/common/index.ts +30 -0
  189. package/src/packlets/common/resources.ts +78 -0
  190. package/src/packlets/common/validate/conditions.ts +595 -0
  191. package/src/packlets/common/validate/index.ts +27 -0
  192. package/src/packlets/common/validate/regularExpressions.ts +92 -0
  193. package/src/packlets/common/validate/resources.ts +170 -0
  194. package/src/packlets/conditions/condition.ts +351 -0
  195. package/src/packlets/conditions/conditionCollector.ts +103 -0
  196. package/src/packlets/conditions/conditionDecls.ts +50 -0
  197. package/src/packlets/conditions/conditionSet.ts +318 -0
  198. package/src/packlets/conditions/conditionSetCollector.ts +127 -0
  199. package/src/packlets/conditions/conditionSetDecls.ts +41 -0
  200. package/src/packlets/conditions/conditionToken.ts +180 -0
  201. package/src/packlets/conditions/convert/conditionSetDecls.ts +72 -0
  202. package/src/packlets/conditions/convert/decls.ts +95 -0
  203. package/src/packlets/conditions/convert/index.ts +24 -0
  204. package/src/packlets/conditions/index.ts +33 -0
  205. package/src/packlets/config/common.ts +107 -0
  206. package/src/packlets/config/configInitFactory.ts +142 -0
  207. package/src/packlets/config/convert.ts +61 -0
  208. package/src/packlets/config/index.ts +30 -0
  209. package/src/packlets/config/json.ts +43 -0
  210. package/src/packlets/config/predefined/default.ts +150 -0
  211. package/src/packlets/config/predefined/extended.ts +198 -0
  212. package/src/packlets/config/predefined/index.ts +26 -0
  213. package/src/packlets/config/systemConfiguration.ts +217 -0
  214. package/src/packlets/context/contextDecls.ts +76 -0
  215. package/src/packlets/context/contextToken.ts +252 -0
  216. package/src/packlets/context/convert/decls.ts +126 -0
  217. package/src/packlets/context/convert/index.ts +23 -0
  218. package/src/packlets/context/index.ts +27 -0
  219. package/src/packlets/decisions/abstractDecision.ts +87 -0
  220. package/src/packlets/decisions/abstractDecisionCollector.ts +122 -0
  221. package/src/packlets/decisions/candidate.ts +101 -0
  222. package/src/packlets/decisions/common.ts +37 -0
  223. package/src/packlets/decisions/concreteDecision.ts +157 -0
  224. package/src/packlets/decisions/decision.ts +172 -0
  225. package/src/packlets/decisions/index.ts +28 -0
  226. package/src/packlets/import/fsItem.ts +212 -0
  227. package/src/packlets/import/importContext.ts +183 -0
  228. package/src/packlets/import/importManager.ts +187 -0
  229. package/src/packlets/import/importable.ts +107 -0
  230. package/src/packlets/import/importers/collectionImporter.ts +153 -0
  231. package/src/packlets/import/importers/fsItemImporter.ts +154 -0
  232. package/src/packlets/import/importers/importer.ts +58 -0
  233. package/src/packlets/import/importers/index.ts +27 -0
  234. package/src/packlets/import/importers/jsonImporter.ts +133 -0
  235. package/src/packlets/import/importers/pathImporter.ts +134 -0
  236. package/src/packlets/import/index.ts +29 -0
  237. package/src/packlets/qualifier-types/config/convert.ts +108 -0
  238. package/src/packlets/qualifier-types/config/index.ts +27 -0
  239. package/src/packlets/qualifier-types/config/json.ts +126 -0
  240. package/src/packlets/qualifier-types/convert.ts +77 -0
  241. package/src/packlets/qualifier-types/helpers.ts +94 -0
  242. package/src/packlets/qualifier-types/index.ts +34 -0
  243. package/src/packlets/qualifier-types/languageQualifierType.ts +143 -0
  244. package/src/packlets/qualifier-types/literalQualifierType.ts +244 -0
  245. package/src/packlets/qualifier-types/literalValueHierarchy.ts +332 -0
  246. package/src/packlets/qualifier-types/qualifierType.ts +360 -0
  247. package/src/packlets/qualifier-types/qualifierTypeCollector.ts +102 -0
  248. package/src/packlets/qualifier-types/territoryQualifierType.ts +255 -0
  249. package/src/packlets/qualifiers/convert/decls.ts +90 -0
  250. package/src/packlets/qualifiers/convert/index.ts +24 -0
  251. package/src/packlets/qualifiers/convert/qualifier.ts +55 -0
  252. package/src/packlets/qualifiers/index.ts +31 -0
  253. package/src/packlets/qualifiers/qualifier.ts +169 -0
  254. package/src/packlets/qualifiers/qualifierCollector.ts +194 -0
  255. package/src/packlets/qualifiers/qualifierDecl.ts +80 -0
  256. package/src/packlets/qualifiers/qualifierDefaultValueDecls.ts +57 -0
  257. package/src/packlets/qualifiers/qualifierDefaultValueToken.ts +230 -0
  258. package/src/packlets/resource-json/compiled/common.ts +35 -0
  259. package/src/packlets/resource-json/compiled/convert.ts +143 -0
  260. package/src/packlets/resource-json/compiled/index.ts +27 -0
  261. package/src/packlets/resource-json/compiled/json.ts +239 -0
  262. package/src/packlets/resource-json/convert.ts +236 -0
  263. package/src/packlets/resource-json/helpers.ts +284 -0
  264. package/src/packlets/resource-json/index.ts +33 -0
  265. package/src/packlets/resource-json/json.ts +295 -0
  266. package/src/packlets/resource-json/normalized.ts +211 -0
  267. package/src/packlets/resource-json/resourceDeclCollection.ts +117 -0
  268. package/src/packlets/resource-json/resourceDeclContainer.ts +48 -0
  269. package/src/packlets/resource-json/resourceDeclTree.ts +116 -0
  270. package/src/packlets/resource-types/config/convert.ts +36 -0
  271. package/src/packlets/resource-types/config/index.ts +27 -0
  272. package/src/packlets/resource-types/config/json.ts +30 -0
  273. package/src/packlets/resource-types/helpers.ts +44 -0
  274. package/src/packlets/resource-types/index.ts +30 -0
  275. package/src/packlets/resource-types/jsonResourceType.ts +104 -0
  276. package/src/packlets/resource-types/resourceType.ts +259 -0
  277. package/src/packlets/resource-types/resourceTypeCollector.ts +79 -0
  278. package/src/packlets/resources/candidateReducer.ts +331 -0
  279. package/src/packlets/resources/common.ts +114 -0
  280. package/src/packlets/resources/index.ts +28 -0
  281. package/src/packlets/resources/resource.ts +307 -0
  282. package/src/packlets/resources/resourceBuilder.ts +269 -0
  283. package/src/packlets/resources/resourceCandidate.ts +333 -0
  284. package/src/packlets/resources/resourceManagerBuilder.ts +1169 -0
  285. package/src/packlets/runtime/cacheListener.ts +113 -0
  286. package/src/packlets/runtime/cacheMetrics.ts +206 -0
  287. package/src/packlets/runtime/compiledResourceCollection.ts +607 -0
  288. package/src/packlets/runtime/conditionSetResolutionResult.ts +160 -0
  289. package/src/packlets/runtime/context/contextQualifierProvider.ts +117 -0
  290. package/src/packlets/runtime/context/contextQualifierProviderValidator.ts +281 -0
  291. package/src/packlets/runtime/context/index.ts +26 -0
  292. package/src/packlets/runtime/context/simpleContextQualifierProvider.ts +225 -0
  293. package/src/packlets/runtime/context/validatingSimpleContextQualifierProvider.ts +96 -0
  294. package/src/packlets/runtime/iResourceManager.ts +130 -0
  295. package/src/packlets/runtime/index.ts +35 -0
  296. package/src/packlets/runtime/resource-tree/common.ts +126 -0
  297. package/src/packlets/runtime/resource-tree/index.ts +26 -0
  298. package/src/packlets/runtime/resource-tree/readOnlyResourceTree.ts +342 -0
  299. package/src/packlets/runtime/resource-tree/resourceTreeChildren.ts +125 -0
  300. package/src/packlets/runtime/resource-tree/resourceTreeChildrenValidator.ts +187 -0
  301. package/src/packlets/runtime/resourceResolver.ts +626 -0
  302. package/src/packlets/runtime/validate.ts +63 -0
  303. package/src/packlets/zip-archive/convert.ts +121 -0
  304. package/src/packlets/zip-archive/index.ts +76 -0
  305. package/src/packlets/zip-archive/json.ts +91 -0
  306. package/src/packlets/zip-archive/types.ts +140 -0
  307. package/src/packlets/zip-archive/zipArchiveCreator.ts +229 -0
  308. package/src/packlets/zip-archive/zipArchiveFormat.ts +158 -0
  309. package/src/packlets/zip-archive/zipArchiveLoader.ts +370 -0
  310. package/CHANGELOG.md +0 -14
  311. package/CLAUDE.md +0 -186
  312. package/EXAMPLE_INIT_PARAMS.md +0 -88
  313. package/PROGRESS_SUMMARY.md +0 -48
  314. package/lib/index.d.ts.map +0 -1
  315. package/lib/index.js.map +0 -1
  316. package/lib/packlets/common/conditions.d.ts.map +0 -1
  317. package/lib/packlets/common/conditions.js.map +0 -1
  318. package/lib/packlets/common/convert.d.ts.map +0 -1
  319. package/lib/packlets/common/convert.js.map +0 -1
  320. package/lib/packlets/common/helpers/conditions.d.ts.map +0 -1
  321. package/lib/packlets/common/helpers/conditions.js.map +0 -1
  322. package/lib/packlets/common/helpers/context.d.ts.map +0 -1
  323. package/lib/packlets/common/helpers/context.js.map +0 -1
  324. package/lib/packlets/common/helpers/index.d.ts.map +0 -1
  325. package/lib/packlets/common/helpers/index.js.map +0 -1
  326. package/lib/packlets/common/helpers/qualifierDefaultValues.d.ts.map +0 -1
  327. package/lib/packlets/common/helpers/qualifierDefaultValues.js.map +0 -1
  328. package/lib/packlets/common/helpers/resources.d.ts.map +0 -1
  329. package/lib/packlets/common/helpers/resources.js.map +0 -1
  330. package/lib/packlets/common/index.d.ts.map +0 -1
  331. package/lib/packlets/common/index.js.map +0 -1
  332. package/lib/packlets/common/resources.d.ts.map +0 -1
  333. package/lib/packlets/common/resources.js.map +0 -1
  334. package/lib/packlets/common/validate/conditions.d.ts.map +0 -1
  335. package/lib/packlets/common/validate/conditions.js.map +0 -1
  336. package/lib/packlets/common/validate/index.d.ts.map +0 -1
  337. package/lib/packlets/common/validate/index.js.map +0 -1
  338. package/lib/packlets/common/validate/regularExpressions.d.ts.map +0 -1
  339. package/lib/packlets/common/validate/regularExpressions.js.map +0 -1
  340. package/lib/packlets/common/validate/resources.d.ts.map +0 -1
  341. package/lib/packlets/common/validate/resources.js.map +0 -1
  342. package/lib/packlets/conditions/condition.d.ts.map +0 -1
  343. package/lib/packlets/conditions/condition.js.map +0 -1
  344. package/lib/packlets/conditions/conditionCollector.d.ts.map +0 -1
  345. package/lib/packlets/conditions/conditionCollector.js.map +0 -1
  346. package/lib/packlets/conditions/conditionDecls.d.ts.map +0 -1
  347. package/lib/packlets/conditions/conditionDecls.js.map +0 -1
  348. package/lib/packlets/conditions/conditionSet.d.ts.map +0 -1
  349. package/lib/packlets/conditions/conditionSet.js.map +0 -1
  350. package/lib/packlets/conditions/conditionSetCollector.d.ts.map +0 -1
  351. package/lib/packlets/conditions/conditionSetCollector.js.map +0 -1
  352. package/lib/packlets/conditions/conditionSetDecls.d.ts.map +0 -1
  353. package/lib/packlets/conditions/conditionSetDecls.js.map +0 -1
  354. package/lib/packlets/conditions/conditionToken.d.ts.map +0 -1
  355. package/lib/packlets/conditions/conditionToken.js.map +0 -1
  356. package/lib/packlets/conditions/convert/conditionSetDecls.d.ts.map +0 -1
  357. package/lib/packlets/conditions/convert/conditionSetDecls.js.map +0 -1
  358. package/lib/packlets/conditions/convert/decls.d.ts.map +0 -1
  359. package/lib/packlets/conditions/convert/decls.js.map +0 -1
  360. package/lib/packlets/conditions/convert/index.d.ts.map +0 -1
  361. package/lib/packlets/conditions/convert/index.js.map +0 -1
  362. package/lib/packlets/conditions/index.d.ts.map +0 -1
  363. package/lib/packlets/conditions/index.js.map +0 -1
  364. package/lib/packlets/config/common.d.ts.map +0 -1
  365. package/lib/packlets/config/common.js.map +0 -1
  366. package/lib/packlets/config/convert.d.ts.map +0 -1
  367. package/lib/packlets/config/convert.js.map +0 -1
  368. package/lib/packlets/config/index.d.ts.map +0 -1
  369. package/lib/packlets/config/index.js.map +0 -1
  370. package/lib/packlets/config/json.d.ts.map +0 -1
  371. package/lib/packlets/config/json.js.map +0 -1
  372. package/lib/packlets/config/predefined/default.d.ts.map +0 -1
  373. package/lib/packlets/config/predefined/default.js.map +0 -1
  374. package/lib/packlets/config/predefined/extended.d.ts.map +0 -1
  375. package/lib/packlets/config/predefined/extended.js.map +0 -1
  376. package/lib/packlets/config/predefined/index.d.ts.map +0 -1
  377. package/lib/packlets/config/predefined/index.js.map +0 -1
  378. package/lib/packlets/config/systemConfiguration.d.ts.map +0 -1
  379. package/lib/packlets/config/systemConfiguration.js.map +0 -1
  380. package/lib/packlets/context/contextDecls.d.ts.map +0 -1
  381. package/lib/packlets/context/contextDecls.js.map +0 -1
  382. package/lib/packlets/context/contextToken.d.ts.map +0 -1
  383. package/lib/packlets/context/contextToken.js.map +0 -1
  384. package/lib/packlets/context/convert/decls.d.ts.map +0 -1
  385. package/lib/packlets/context/convert/decls.js.map +0 -1
  386. package/lib/packlets/context/convert/index.d.ts.map +0 -1
  387. package/lib/packlets/context/convert/index.js.map +0 -1
  388. package/lib/packlets/context/index.d.ts.map +0 -1
  389. package/lib/packlets/context/index.js.map +0 -1
  390. package/lib/packlets/decisions/abstractDecision.d.ts.map +0 -1
  391. package/lib/packlets/decisions/abstractDecision.js.map +0 -1
  392. package/lib/packlets/decisions/abstractDecisionCollector.d.ts.map +0 -1
  393. package/lib/packlets/decisions/abstractDecisionCollector.js.map +0 -1
  394. package/lib/packlets/decisions/candidate.d.ts.map +0 -1
  395. package/lib/packlets/decisions/candidate.js.map +0 -1
  396. package/lib/packlets/decisions/common.d.ts.map +0 -1
  397. package/lib/packlets/decisions/common.js.map +0 -1
  398. package/lib/packlets/decisions/concreteDecision.d.ts.map +0 -1
  399. package/lib/packlets/decisions/concreteDecision.js.map +0 -1
  400. package/lib/packlets/decisions/decision.d.ts.map +0 -1
  401. package/lib/packlets/decisions/decision.js.map +0 -1
  402. package/lib/packlets/decisions/index.d.ts.map +0 -1
  403. package/lib/packlets/decisions/index.js.map +0 -1
  404. package/lib/packlets/import/fsItem.d.ts.map +0 -1
  405. package/lib/packlets/import/fsItem.js.map +0 -1
  406. package/lib/packlets/import/importContext.d.ts.map +0 -1
  407. package/lib/packlets/import/importContext.js.map +0 -1
  408. package/lib/packlets/import/importManager.d.ts.map +0 -1
  409. package/lib/packlets/import/importManager.js.map +0 -1
  410. package/lib/packlets/import/importable.d.ts.map +0 -1
  411. package/lib/packlets/import/importable.js.map +0 -1
  412. package/lib/packlets/import/importers/collectionImporter.d.ts.map +0 -1
  413. package/lib/packlets/import/importers/collectionImporter.js.map +0 -1
  414. package/lib/packlets/import/importers/fsItemImporter.d.ts.map +0 -1
  415. package/lib/packlets/import/importers/fsItemImporter.js.map +0 -1
  416. package/lib/packlets/import/importers/importer.d.ts.map +0 -1
  417. package/lib/packlets/import/importers/importer.js.map +0 -1
  418. package/lib/packlets/import/importers/index.d.ts.map +0 -1
  419. package/lib/packlets/import/importers/index.js.map +0 -1
  420. package/lib/packlets/import/importers/jsonImporter.d.ts.map +0 -1
  421. package/lib/packlets/import/importers/jsonImporter.js.map +0 -1
  422. package/lib/packlets/import/importers/pathImporter.d.ts.map +0 -1
  423. package/lib/packlets/import/importers/pathImporter.js.map +0 -1
  424. package/lib/packlets/import/index.d.ts.map +0 -1
  425. package/lib/packlets/import/index.js.map +0 -1
  426. package/lib/packlets/qualifier-types/config/convert.d.ts.map +0 -1
  427. package/lib/packlets/qualifier-types/config/convert.js.map +0 -1
  428. package/lib/packlets/qualifier-types/config/index.d.ts.map +0 -1
  429. package/lib/packlets/qualifier-types/config/index.js.map +0 -1
  430. package/lib/packlets/qualifier-types/config/json.d.ts.map +0 -1
  431. package/lib/packlets/qualifier-types/config/json.js.map +0 -1
  432. package/lib/packlets/qualifier-types/convert.d.ts.map +0 -1
  433. package/lib/packlets/qualifier-types/convert.js.map +0 -1
  434. package/lib/packlets/qualifier-types/helpers.d.ts.map +0 -1
  435. package/lib/packlets/qualifier-types/helpers.js.map +0 -1
  436. package/lib/packlets/qualifier-types/index.d.ts.map +0 -1
  437. package/lib/packlets/qualifier-types/index.js.map +0 -1
  438. package/lib/packlets/qualifier-types/languageQualifierType.d.ts.map +0 -1
  439. package/lib/packlets/qualifier-types/languageQualifierType.js.map +0 -1
  440. package/lib/packlets/qualifier-types/literalQualifierType.d.ts.map +0 -1
  441. package/lib/packlets/qualifier-types/literalQualifierType.js.map +0 -1
  442. package/lib/packlets/qualifier-types/literalValueHierarchy.d.ts.map +0 -1
  443. package/lib/packlets/qualifier-types/literalValueHierarchy.js.map +0 -1
  444. package/lib/packlets/qualifier-types/qualifierType.d.ts.map +0 -1
  445. package/lib/packlets/qualifier-types/qualifierType.js.map +0 -1
  446. package/lib/packlets/qualifier-types/qualifierTypeCollector.d.ts.map +0 -1
  447. package/lib/packlets/qualifier-types/qualifierTypeCollector.js.map +0 -1
  448. package/lib/packlets/qualifier-types/territoryQualifierType.d.ts.map +0 -1
  449. package/lib/packlets/qualifier-types/territoryQualifierType.js.map +0 -1
  450. package/lib/packlets/qualifiers/convert/decls.d.ts.map +0 -1
  451. package/lib/packlets/qualifiers/convert/decls.js.map +0 -1
  452. package/lib/packlets/qualifiers/convert/index.d.ts.map +0 -1
  453. package/lib/packlets/qualifiers/convert/index.js.map +0 -1
  454. package/lib/packlets/qualifiers/convert/qualifier.d.ts.map +0 -1
  455. package/lib/packlets/qualifiers/convert/qualifier.js.map +0 -1
  456. package/lib/packlets/qualifiers/index.d.ts.map +0 -1
  457. package/lib/packlets/qualifiers/index.js.map +0 -1
  458. package/lib/packlets/qualifiers/qualifier.d.ts.map +0 -1
  459. package/lib/packlets/qualifiers/qualifier.js.map +0 -1
  460. package/lib/packlets/qualifiers/qualifierCollector.d.ts.map +0 -1
  461. package/lib/packlets/qualifiers/qualifierCollector.js.map +0 -1
  462. package/lib/packlets/qualifiers/qualifierDecl.d.ts.map +0 -1
  463. package/lib/packlets/qualifiers/qualifierDecl.js.map +0 -1
  464. package/lib/packlets/qualifiers/qualifierDefaultValueDecls.d.ts.map +0 -1
  465. package/lib/packlets/qualifiers/qualifierDefaultValueDecls.js.map +0 -1
  466. package/lib/packlets/qualifiers/qualifierDefaultValueToken.d.ts.map +0 -1
  467. package/lib/packlets/qualifiers/qualifierDefaultValueToken.js.map +0 -1
  468. package/lib/packlets/resource-json/compiled/common.d.ts.map +0 -1
  469. package/lib/packlets/resource-json/compiled/common.js.map +0 -1
  470. package/lib/packlets/resource-json/compiled/convert.d.ts.map +0 -1
  471. package/lib/packlets/resource-json/compiled/convert.js.map +0 -1
  472. package/lib/packlets/resource-json/compiled/index.d.ts.map +0 -1
  473. package/lib/packlets/resource-json/compiled/index.js.map +0 -1
  474. package/lib/packlets/resource-json/compiled/json.d.ts.map +0 -1
  475. package/lib/packlets/resource-json/compiled/json.js.map +0 -1
  476. package/lib/packlets/resource-json/convert.d.ts.map +0 -1
  477. package/lib/packlets/resource-json/convert.js.map +0 -1
  478. package/lib/packlets/resource-json/helpers.d.ts.map +0 -1
  479. package/lib/packlets/resource-json/helpers.js.map +0 -1
  480. package/lib/packlets/resource-json/index.d.ts.map +0 -1
  481. package/lib/packlets/resource-json/index.js.map +0 -1
  482. package/lib/packlets/resource-json/json.d.ts.map +0 -1
  483. package/lib/packlets/resource-json/json.js.map +0 -1
  484. package/lib/packlets/resource-json/normalized.d.ts.map +0 -1
  485. package/lib/packlets/resource-json/normalized.js.map +0 -1
  486. package/lib/packlets/resource-json/resourceDeclCollection.d.ts.map +0 -1
  487. package/lib/packlets/resource-json/resourceDeclCollection.js.map +0 -1
  488. package/lib/packlets/resource-json/resourceDeclContainer.d.ts.map +0 -1
  489. package/lib/packlets/resource-json/resourceDeclContainer.js.map +0 -1
  490. package/lib/packlets/resource-json/resourceDeclTree.d.ts.map +0 -1
  491. package/lib/packlets/resource-json/resourceDeclTree.js.map +0 -1
  492. package/lib/packlets/resource-types/config/convert.d.ts.map +0 -1
  493. package/lib/packlets/resource-types/config/convert.js.map +0 -1
  494. package/lib/packlets/resource-types/config/index.d.ts.map +0 -1
  495. package/lib/packlets/resource-types/config/index.js.map +0 -1
  496. package/lib/packlets/resource-types/config/json.d.ts.map +0 -1
  497. package/lib/packlets/resource-types/config/json.js.map +0 -1
  498. package/lib/packlets/resource-types/helpers.d.ts.map +0 -1
  499. package/lib/packlets/resource-types/helpers.js.map +0 -1
  500. package/lib/packlets/resource-types/index.d.ts.map +0 -1
  501. package/lib/packlets/resource-types/index.js.map +0 -1
  502. package/lib/packlets/resource-types/jsonResourceType.d.ts.map +0 -1
  503. package/lib/packlets/resource-types/jsonResourceType.js.map +0 -1
  504. package/lib/packlets/resource-types/resourceType.d.ts.map +0 -1
  505. package/lib/packlets/resource-types/resourceType.js.map +0 -1
  506. package/lib/packlets/resource-types/resourceTypeCollector.d.ts.map +0 -1
  507. package/lib/packlets/resource-types/resourceTypeCollector.js.map +0 -1
  508. package/lib/packlets/resources/candidateReducer.d.ts.map +0 -1
  509. package/lib/packlets/resources/candidateReducer.js.map +0 -1
  510. package/lib/packlets/resources/common.d.ts.map +0 -1
  511. package/lib/packlets/resources/common.js.map +0 -1
  512. package/lib/packlets/resources/index.d.ts.map +0 -1
  513. package/lib/packlets/resources/index.js.map +0 -1
  514. package/lib/packlets/resources/resource.d.ts.map +0 -1
  515. package/lib/packlets/resources/resource.js.map +0 -1
  516. package/lib/packlets/resources/resourceBuilder.d.ts.map +0 -1
  517. package/lib/packlets/resources/resourceBuilder.js.map +0 -1
  518. package/lib/packlets/resources/resourceCandidate.d.ts.map +0 -1
  519. package/lib/packlets/resources/resourceCandidate.js.map +0 -1
  520. package/lib/packlets/resources/resourceManagerBuilder.d.ts.map +0 -1
  521. package/lib/packlets/resources/resourceManagerBuilder.js.map +0 -1
  522. package/lib/packlets/runtime/cacheListener.d.ts.map +0 -1
  523. package/lib/packlets/runtime/cacheListener.js.map +0 -1
  524. package/lib/packlets/runtime/cacheMetrics.d.ts.map +0 -1
  525. package/lib/packlets/runtime/cacheMetrics.js.map +0 -1
  526. package/lib/packlets/runtime/compiledResourceCollection.d.ts.map +0 -1
  527. package/lib/packlets/runtime/compiledResourceCollection.js.map +0 -1
  528. package/lib/packlets/runtime/conditionSetResolutionResult.d.ts.map +0 -1
  529. package/lib/packlets/runtime/conditionSetResolutionResult.js.map +0 -1
  530. package/lib/packlets/runtime/context/contextQualifierProvider.d.ts.map +0 -1
  531. package/lib/packlets/runtime/context/contextQualifierProvider.js.map +0 -1
  532. package/lib/packlets/runtime/context/contextQualifierProviderValidator.d.ts.map +0 -1
  533. package/lib/packlets/runtime/context/contextQualifierProviderValidator.js.map +0 -1
  534. package/lib/packlets/runtime/context/index.d.ts.map +0 -1
  535. package/lib/packlets/runtime/context/index.js.map +0 -1
  536. package/lib/packlets/runtime/context/simpleContextQualifierProvider.d.ts.map +0 -1
  537. package/lib/packlets/runtime/context/simpleContextQualifierProvider.js.map +0 -1
  538. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.d.ts.map +0 -1
  539. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.js.map +0 -1
  540. package/lib/packlets/runtime/iResourceManager.d.ts.map +0 -1
  541. package/lib/packlets/runtime/iResourceManager.js.map +0 -1
  542. package/lib/packlets/runtime/index.d.ts.map +0 -1
  543. package/lib/packlets/runtime/index.js.map +0 -1
  544. package/lib/packlets/runtime/resource-tree/common.d.ts.map +0 -1
  545. package/lib/packlets/runtime/resource-tree/common.js.map +0 -1
  546. package/lib/packlets/runtime/resource-tree/index.d.ts.map +0 -1
  547. package/lib/packlets/runtime/resource-tree/index.js.map +0 -1
  548. package/lib/packlets/runtime/resource-tree/readOnlyResourceTree.d.ts.map +0 -1
  549. package/lib/packlets/runtime/resource-tree/readOnlyResourceTree.js.map +0 -1
  550. package/lib/packlets/runtime/resource-tree/resourceTreeChildren.d.ts.map +0 -1
  551. package/lib/packlets/runtime/resource-tree/resourceTreeChildren.js.map +0 -1
  552. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.d.ts.map +0 -1
  553. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.js.map +0 -1
  554. package/lib/packlets/runtime/resourceResolver.d.ts.map +0 -1
  555. package/lib/packlets/runtime/resourceResolver.js.map +0 -1
  556. package/lib/packlets/runtime/validate.d.ts.map +0 -1
  557. package/lib/packlets/runtime/validate.js.map +0 -1
@@ -0,0 +1,342 @@
1
+ /*
2
+ * Copyright (c) 2025 Erik Fortune
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+
23
+ import { MessageAggregator, Result, captureResult, mapResults, succeed } from '@fgv/ts-utils';
24
+ import { ResourceId, ResourceName, Helpers } from '../../common';
25
+ import {
26
+ IReadOnlyResourceTreeNode,
27
+ IReadOnlyResourceTreeLeaf,
28
+ IReadOnlyResourceTreeBranch,
29
+ IReadOnlyResourceTreeRoot,
30
+ IReadOnlyValidatingResourceTreeChildren
31
+ } from './common';
32
+ import { ReadOnlyResourceTreeChildren } from './resourceTreeChildren';
33
+
34
+ /**
35
+ * Interface for initializing a resource tree root with child nodes.
36
+ * @public
37
+ */
38
+ export interface IResourceTreeRootInit<T> {
39
+ readonly children: Record<ResourceName, ResourceTreeNodeInit<T>>;
40
+ }
41
+
42
+ /**
43
+ * Interface for initializing a leaf node with a resource value.
44
+ * @public
45
+ */
46
+ export interface IResourceTreeLeafInit<T> {
47
+ readonly resource: T;
48
+ }
49
+
50
+ /**
51
+ * Interface for initializing a branch node with child nodes.
52
+ * @public
53
+ */
54
+ export interface IResourceTreeBranchInit<T> {
55
+ readonly children: Record<ResourceName, ResourceTreeNodeInit<T>>;
56
+ }
57
+
58
+ /**
59
+ * Union type for tree node initialization data.
60
+ * @public
61
+ */
62
+ export type ResourceTreeNodeInit<T> = IResourceTreeLeafInit<T> | IResourceTreeBranchInit<T>;
63
+
64
+ // Type guards
65
+ /**
66
+ * Type guard to determine if an init object represents a branch or root with children.
67
+ * @param init - The initialization object to test
68
+ * @returns True if the init object has children property
69
+ * @public
70
+ */
71
+ export function isResourceTreeRootOrNodeInit<T>(
72
+ init: ResourceTreeNodeInit<T> | IResourceTreeRootInit<T>
73
+ ): init is IResourceTreeBranchInit<T> {
74
+ return 'children' in init;
75
+ }
76
+
77
+ /**
78
+ * Type guard to determine if an init object represents a leaf node with a resource.
79
+ * @param init - The initialization object to test
80
+ * @returns True if the init object has a resource but no children
81
+ * @public
82
+ */
83
+ export function isResourceTreeLeafInit<T>(init: ResourceTreeNodeInit<T>): init is IResourceTreeLeafInit<T> {
84
+ return 'resource' in init && !('children' in init);
85
+ }
86
+
87
+ /**
88
+ * Implementation of a read-only resource tree leaf node that contains a resource value.
89
+ * Leaf nodes represent the actual resources in the tree and cannot have children.
90
+ * @public
91
+ */
92
+ export class ReadOnlyResourceTreeLeaf<T> implements IReadOnlyResourceTreeLeaf<T> {
93
+ public readonly name: ResourceName;
94
+ public readonly id: ResourceId;
95
+ public readonly resource: T;
96
+
97
+ public get isRoot(): false {
98
+ return false;
99
+ }
100
+
101
+ public get isBranch(): false {
102
+ return false;
103
+ }
104
+
105
+ public get isLeaf(): true {
106
+ return true;
107
+ }
108
+
109
+ /**
110
+ * Creates a new leaf node. Use the static create method instead.
111
+ * @param name - The name of this node (last segment of the path)
112
+ * @param parentPath - The path to the parent node (undefined for root-level nodes)
113
+ * @param resource - The resource value stored in this leaf
114
+ */
115
+ protected constructor(name: ResourceName, parentPath: ResourceId | undefined, resource: T) {
116
+ this.name = name;
117
+ this.id = Helpers.joinResourceIds(parentPath, name).orThrow();
118
+ this.resource = resource;
119
+ }
120
+
121
+ /**
122
+ * Creates a new ReadOnlyResourceTreeLeaf instance.
123
+ * @param name - The name of this node (last segment of the path)
124
+ * @param parentPath - The path to the parent node (undefined for root-level nodes)
125
+ * @param resource - The resource value to store in this leaf
126
+ * @returns Result containing the new leaf node or failure if construction fails
127
+ */
128
+ public static create<T>(
129
+ name: ResourceName,
130
+ parentPath: ResourceId | undefined,
131
+ resource: T
132
+ ): Result<ReadOnlyResourceTreeLeaf<T>> {
133
+ return captureResult(() => new ReadOnlyResourceTreeLeaf(name, parentPath, resource));
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Implementation of a read-only resource tree branch node that contains child nodes.
139
+ * Branch nodes organize other nodes in a hierarchical structure and may optionally contain a resource value.
140
+ * @public
141
+ */
142
+ export class ReadOnlyResourceTreeBranch<T> implements IReadOnlyResourceTreeBranch<T> {
143
+ public readonly children: IReadOnlyValidatingResourceTreeChildren<T>;
144
+ public readonly name: ResourceName;
145
+ public readonly id: ResourceId;
146
+
147
+ public get isRoot(): false {
148
+ return false;
149
+ }
150
+
151
+ public get isBranch(): true {
152
+ return true;
153
+ }
154
+
155
+ public get isLeaf(): false {
156
+ return false;
157
+ }
158
+
159
+ /**
160
+ * Creates a new branch node. Use the static create method instead.
161
+ * @param name - The name of this node (last segment of the path)
162
+ * @param parentPath - The path to the parent node (undefined for root-level nodes)
163
+ * @param init - Initialization data containing child nodes
164
+ */
165
+ private constructor(
166
+ name: ResourceName,
167
+ parentPath: ResourceId | undefined,
168
+ init: IResourceTreeBranchInit<T>
169
+ ) {
170
+ this.name = name;
171
+ this.id = Helpers.joinResourceIds(parentPath, name).orThrow();
172
+
173
+ const children = mapResults<IReadOnlyResourceTreeNode<T>>(
174
+ (
175
+ Array.from(Object.entries(init.children)) as [
176
+ ResourceName,
177
+ IResourceTreeBranchInit<T> | IResourceTreeLeafInit<T>
178
+ ][]
179
+ ).map(([childName, childInit]) => {
180
+ if (isResourceTreeLeafInit(childInit)) {
181
+ return ReadOnlyResourceTreeLeaf.create(childName, this.id, childInit.resource);
182
+ }
183
+ return ReadOnlyResourceTreeBranch.create(childName, this.id, childInit);
184
+ })
185
+ ).orThrow();
186
+
187
+ this.children = new ReadOnlyResourceTreeChildren(
188
+ this.id,
189
+ children.map((c): [ResourceName, IReadOnlyResourceTreeNode<T>] => [c.name, c])
190
+ );
191
+ }
192
+
193
+ /**
194
+ * Creates a new ReadOnlyResourceTreeBranch instance.
195
+ * @param childName - The name of this node (last segment of the path)
196
+ * @param path - The path to the parent node (undefined for root-level nodes)
197
+ * @param childInit - Initialization data containing child nodes
198
+ * @returns Result containing the new branch node or failure if construction fails
199
+ */
200
+ public static create<T>(
201
+ childName: ResourceName,
202
+ path: ResourceId | undefined,
203
+ childInit: IResourceTreeBranchInit<T>
204
+ ): Result<ReadOnlyResourceTreeBranch<T>> {
205
+ return captureResult(() => new ReadOnlyResourceTreeBranch(childName, path, childInit));
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Union type representing any node in a read-only resource tree.
211
+ * @public
212
+ */
213
+ export type ReadOnlyResourceTreeNode<T> = ReadOnlyResourceTreeBranch<T> | ReadOnlyResourceTreeLeaf<T>;
214
+
215
+ /**
216
+ * Implementation of a read-only resource tree root that organizes resources hierarchically.
217
+ * The root provides the entry point for tree navigation and resource access by ResourceId paths.
218
+ * @public
219
+ */
220
+ export class ReadOnlyResourceTreeRoot<T> implements IReadOnlyResourceTreeRoot<T> {
221
+ public readonly children: IReadOnlyValidatingResourceTreeChildren<T>;
222
+
223
+ public get isRoot(): true {
224
+ return true;
225
+ }
226
+
227
+ public get isBranch(): false {
228
+ return false;
229
+ }
230
+
231
+ public get isLeaf(): false {
232
+ return false;
233
+ }
234
+
235
+ /**
236
+ * Creates a new root node. Use the static create method instead.
237
+ * @param init - Initialization data containing child nodes
238
+ */
239
+ protected constructor(init: IResourceTreeRootInit<T>) {
240
+ const children = mapResults<ReadOnlyResourceTreeBranch<T> | ReadOnlyResourceTreeLeaf<T>>(
241
+ (
242
+ Array.from(Object.entries(init.children)) as [
243
+ ResourceName,
244
+ IResourceTreeBranchInit<T> | IResourceTreeLeafInit<T>
245
+ ][]
246
+ ).map(([childName, childInit]) => {
247
+ if (isResourceTreeLeafInit(childInit)) {
248
+ return ReadOnlyResourceTreeLeaf.create(childName, undefined, childInit.resource);
249
+ }
250
+ return ReadOnlyResourceTreeBranch.create(childName, undefined, childInit);
251
+ })
252
+ ).orThrow();
253
+
254
+ this.children = new ReadOnlyResourceTreeChildren(
255
+ undefined,
256
+ children.map((c): [ResourceName, IReadOnlyResourceTreeNode<T>] => [c.name, c])
257
+ );
258
+ }
259
+
260
+ /**
261
+ * Creates a new ReadOnlyResourceTreeRoot from an array of resources.
262
+ * @param resources - Array of [ResourceId, resource] pairs to build the tree from
263
+ * @returns Result containing the new root or failure if construction fails
264
+ */
265
+ public static create<T>(resources: [ResourceId, T][]): Result<ReadOnlyResourceTreeRoot<T>>;
266
+
267
+ /**
268
+ * Creates a new ReadOnlyResourceTreeRoot from initialization data.
269
+ * @param init - Tree initialization structure
270
+ * @returns Result containing the new root or failure if construction fails
271
+ */
272
+ public static create<T>(init: IResourceTreeRootInit<T>): Result<ReadOnlyResourceTreeRoot<T>>;
273
+
274
+ /**
275
+ * Creates a new ReadOnlyResourceTreeRoot from either resources or initialization data.
276
+ * @param init - Either an array of [ResourceId, resource] pairs or tree initialization structure
277
+ * @returns Result containing the new root or failure if construction fails
278
+ */
279
+ public static create<T>(
280
+ init: IResourceTreeRootInit<T> | [ResourceId, T][]
281
+ ): Result<ReadOnlyResourceTreeRoot<T>> {
282
+ if (Array.isArray(init)) {
283
+ return ReadOnlyResourceTreeRoot.createResourceTreeInit(init).onSuccess((treeInit) =>
284
+ captureResult(() => new ReadOnlyResourceTreeRoot(treeInit))
285
+ );
286
+ }
287
+ return captureResult(() => new ReadOnlyResourceTreeRoot(init));
288
+ }
289
+
290
+ /**
291
+ * Converts an array of resources into tree initialization data.
292
+ * Validates that resource paths do not conflict - if a path has child resources,
293
+ * it cannot itself be a resource (e.g., if 'app.messages.welcome' exists, then 'app' cannot be a resource).
294
+ * @param resources - Array of [ResourceId, resource] pairs to convert
295
+ * @returns Result containing the initialization structure or failure if validation fails
296
+ */
297
+ public static createResourceTreeInit<T>(resources: [ResourceId, T][]): Result<IResourceTreeRootInit<T>> {
298
+ const errors: MessageAggregator = new MessageAggregator();
299
+ const root: IResourceTreeRootInit<T> = { children: {} };
300
+
301
+ for (const [id, resource] of resources) {
302
+ Helpers.splitResourceId(id)
303
+ .onSuccess((pathComponents) => {
304
+ let currentNode: IResourceTreeBranchInit<T> | IResourceTreeRootInit<T> = root;
305
+ const resourceName = pathComponents.pop()!;
306
+
307
+ for (const nodeName of pathComponents) {
308
+ if (isResourceTreeRootOrNodeInit(currentNode)) {
309
+ if (!(nodeName in currentNode.children)) {
310
+ currentNode.children[nodeName] = { children: {} };
311
+ }
312
+ if (isResourceTreeLeafInit(currentNode.children[nodeName])) {
313
+ errors.addMessage(`${id}: Expected a branch but found a leaf at ${nodeName}.`);
314
+ } else {
315
+ currentNode = currentNode.children[nodeName];
316
+ }
317
+ } /* c8 ignore next 4 - defense in depth, not reachable without chicanery */ else if (
318
+ isResourceTreeLeafInit(currentNode)
319
+ ) {
320
+ errors.addMessage(`${id}: Expected a branch but found a leaf.`);
321
+ break;
322
+ } /* c8 ignore next 3 - defense in depth, not reachable without chicanery */ else {
323
+ errors.addMessage(`${id}: Unexpected structure in resource tree`);
324
+ }
325
+ }
326
+
327
+ if (isResourceTreeRootOrNodeInit(currentNode)) {
328
+ if (resourceName in currentNode.children) {
329
+ errors.addMessage(`${id}: Duplicate resource at path.`);
330
+ } else {
331
+ currentNode.children[resourceName] = { resource };
332
+ } /* c8 ignore next 3 - defense in depth, not reachable without chicanery */
333
+ } else {
334
+ errors.addMessage(`${id}: Expected a branch but found a leaf.`);
335
+ }
336
+ return succeed(currentNode.children[resourceName]);
337
+ })
338
+ .aggregateError(errors);
339
+ }
340
+ return errors.returnOrReport(succeed(root));
341
+ }
342
+ }
@@ -0,0 +1,125 @@
1
+ /*
2
+ * Copyright (c) 2025 Erik Fortune
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+
23
+ import { Collections, Result, ResultMap, fail, succeed } from '@fgv/ts-utils';
24
+ import { ResourceId, ResourceName, Helpers } from '../../common';
25
+ import {
26
+ IReadOnlyResourceTreeBranch,
27
+ IReadOnlyResourceTreeChildren,
28
+ IReadOnlyResourceTreeLeaf,
29
+ IReadOnlyResourceTreeNode,
30
+ IReadOnlyValidatingResourceTreeChildren
31
+ } from './common';
32
+ import { ResourceTreeChildrenValidator } from './resourceTreeChildrenValidator';
33
+
34
+ /**
35
+ * Implementation of a result-based resource tree that provides hierarchical access to resources.
36
+ * Extends ResultMap to provide collection-like access while adding tree-specific navigation methods.
37
+ * @public
38
+ */
39
+ export class ReadOnlyResourceTreeChildren<T>
40
+ extends ResultMap<ResourceName, IReadOnlyResourceTreeNode<T>>
41
+ implements IReadOnlyValidatingResourceTreeChildren<T>
42
+ {
43
+ protected path: ResourceId | undefined;
44
+ public validating: IReadOnlyResourceTreeChildren<T, string, string>;
45
+
46
+ /**
47
+ * Creates a new ReadOnlyResourceTreeChildren instance.
48
+ * @param path - The path to this tree node (undefined for root)
49
+ * @param entries - Array of [name, node] tuples to populate the tree
50
+ */
51
+ public constructor(path: ResourceId | undefined, entries: [ResourceName, IReadOnlyResourceTreeNode<T>][]) {
52
+ super(entries);
53
+ this.path = path;
54
+ this.validating = new ResourceTreeChildrenValidator<T>(this);
55
+ }
56
+
57
+ public getResource(name: ResourceName): Result<IReadOnlyResourceTreeNode<T>> {
58
+ return this.get(name).onSuccess((node) => {
59
+ if (node.isLeaf) {
60
+ return succeed(node).withDetail<Collections.ResultMapResultDetail>('success');
61
+ }
62
+ return fail<IReadOnlyResourceTreeNode<T>>(
63
+ `${name}: not a resource${this.path ? ` in ${this.path}` : ''}.`
64
+ ).withDetail<Collections.ResultMapResultDetail>('failure');
65
+ });
66
+ }
67
+
68
+ public getBranch(name: ResourceName): Result<IReadOnlyResourceTreeNode<T>> {
69
+ return this.get(name).onSuccess((node) => {
70
+ if (node.isBranch) {
71
+ return succeed(node).withDetail<Collections.ResultMapResultDetail>('success');
72
+ }
73
+ return fail<IReadOnlyResourceTreeNode<T>>(
74
+ `${name}: not a branch${this.path ? ` in ${this.path}` : ''}.`
75
+ ).withDetail<Collections.ResultMapResultDetail>('failure');
76
+ });
77
+ }
78
+
79
+ public getById(id: ResourceId): Result<IReadOnlyResourceTreeNode<T>> {
80
+ return Helpers.splitResourceId(id).onSuccess((names) => {
81
+ let name = names.shift();
82
+ if (name !== undefined) {
83
+ let node = this.get(name).orDefault();
84
+ while (node) {
85
+ name = names.shift();
86
+ if (name === undefined) {
87
+ return succeed(node);
88
+ }
89
+ if (node.isLeaf) {
90
+ /* c8 ignore next 1 - defense in depth */
91
+ return fail(`${id}: resource not found${this.path ? ` in ${this.path}` : ''}.`);
92
+ }
93
+ node = (node as IReadOnlyResourceTreeBranch<T>).children.get(name).orDefault();
94
+ }
95
+ }
96
+ return fail(`${id}: resource not found${this.path ? ` in ${this.path}` : ''}.`);
97
+ });
98
+ }
99
+
100
+ public getResourceById(id: ResourceId): Result<IReadOnlyResourceTreeLeaf<T>> {
101
+ return this.getById(id).onSuccess((node) => {
102
+ if (node.isLeaf) {
103
+ return succeed(node as IReadOnlyResourceTreeLeaf<T>).withDetail<Collections.ResultMapResultDetail>(
104
+ 'success'
105
+ );
106
+ }
107
+ return fail<IReadOnlyResourceTreeLeaf<T>>(
108
+ `${id}: not a resource${this.path ? ` in ${this.path}` : ''}.`
109
+ ).withDetail<Collections.ResultMapResultDetail>('failure');
110
+ });
111
+ }
112
+
113
+ public getBranchById(id: ResourceId): Result<IReadOnlyResourceTreeBranch<T>> {
114
+ return this.getById(id).onSuccess((node) => {
115
+ if (node.isBranch) {
116
+ return succeed(node as IReadOnlyResourceTreeBranch<T>).withDetail<Collections.ResultMapResultDetail>(
117
+ 'success'
118
+ );
119
+ }
120
+ return fail<IReadOnlyResourceTreeBranch<T>>(
121
+ `${id}: not a branch${this.path ? ` in ${this.path}` : ''}.`
122
+ ).withDetail<Collections.ResultMapResultDetail>('failure');
123
+ });
124
+ }
125
+ }
@@ -0,0 +1,187 @@
1
+ /*
2
+ * Copyright (c) 2025 Erik Fortune
3
+ *
4
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ * of this software and associated documentation files (the "Software"), to deal
6
+ * in the Software without restriction, including without limitation the rights
7
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ * copies of the Software, and to permit persons to whom the Software is
9
+ * furnished to do so, subject to the following conditions:
10
+ *
11
+ * The above copyright notice and this permission notice shall be included in all
12
+ * copies or substantial portions of the Software.
13
+ *
14
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ * SOFTWARE.
21
+ */
22
+
23
+ import { Validate } from '../../common';
24
+ import { Result, IReadOnlyResultMap, DetailedResult, Collections, failWithDetail } from '@fgv/ts-utils';
25
+ import { ResourceName } from '../../common';
26
+ import {
27
+ IReadOnlyResourceTreeBranch,
28
+ IReadOnlyResourceTreeChildren,
29
+ IReadOnlyResourceTreeLeaf,
30
+ IReadOnlyResourceTreeNode
31
+ } from './common';
32
+
33
+ /**
34
+ * A validator wrapper for resource tree children that validates string inputs before
35
+ * delegating to the underlying tree children collection.
36
+ *
37
+ * This class implements {@link Runtime.ResourceTree.IReadOnlyValidatingResourceTreeChildren | IReadOnlyValidatingResourceTreeChildren}
38
+ * by wrapping an {@link Runtime.ResourceTree.IReadOnlyResourceTreeChildren | IReadOnlyResourceTreeChildren} instance and
39
+ * providing string-based access to all tree operations. All string inputs are validated using the library's
40
+ * validation utilities before being passed to the underlying collection.
41
+ *
42
+ * The validator acts as a bridge between string-based external APIs and the
43
+ * strongly-typed internal tree operations, ensuring type safety and consistent
44
+ * error handling throughout the resource tree navigation.
45
+ *
46
+ * @public
47
+ */
48
+ export class ResourceTreeChildrenValidator<T> implements IReadOnlyResourceTreeChildren<T, string, string> {
49
+ private readonly _inner: IReadOnlyResourceTreeChildren<T>;
50
+
51
+ /**
52
+ * Creates a new validator wrapper for resource tree children.
53
+ * @param inner - The underlying resource tree children collection to wrap with validation
54
+ */
55
+ public constructor(inner: IReadOnlyResourceTreeChildren<T>) {
56
+ this._inner = inner;
57
+ }
58
+
59
+ /**
60
+ * Gets a tree node by its string ResourceId path, validating the input.
61
+ * @param id - The string ResourceId path to validate and look up
62
+ * @returns Result containing the node if found, or failure if validation fails or not found
63
+ */
64
+ public getById(id: string): Result<IReadOnlyResourceTreeNode<T>> {
65
+ return Validate.toResourceId(id).onSuccess((resourceId) => {
66
+ return this._inner.getById(resourceId);
67
+ });
68
+ }
69
+
70
+ /**
71
+ * Gets a resource node by its string name (single component), validating the input.
72
+ * @param name - The string ResourceName to validate and look up
73
+ * @returns Result containing the node if it's a resource, or failure if validation fails or not found
74
+ */
75
+ public getResource(name: string): Result<IReadOnlyResourceTreeNode<T>> {
76
+ return Validate.toResourceName(name).onSuccess((resourceName) => {
77
+ return this._inner.getResource(resourceName);
78
+ });
79
+ }
80
+
81
+ /**
82
+ * Gets a branch node by its string name (single component), validating the input.
83
+ * @param name - The string ResourceName to validate and look up
84
+ * @returns Result containing the node if it's a branch, or failure if validation fails or not found
85
+ */
86
+ public getBranch(name: string): Result<IReadOnlyResourceTreeNode<T>> {
87
+ return Validate.toResourceName(name).onSuccess((resourceName) => {
88
+ return this._inner.getBranch(resourceName);
89
+ });
90
+ }
91
+
92
+ /**
93
+ * Gets a resource leaf node by its string ResourceId path, validating the input.
94
+ * @param id - The string ResourceId path to validate and look up
95
+ * @returns Result containing the leaf if found and is a resource, or failure otherwise
96
+ */
97
+ public getResourceById(id: string): Result<IReadOnlyResourceTreeLeaf<T>> {
98
+ return Validate.toResourceId(id).onSuccess((resourceId) => {
99
+ return this._inner.getResourceById(resourceId);
100
+ });
101
+ }
102
+
103
+ /**
104
+ * Gets a branch node by its string ResourceId path, validating the input.
105
+ * @param id - The string ResourceId path to validate and look up
106
+ * @returns Result containing the branch if found and has children, or failure otherwise
107
+ */
108
+ public getBranchById(id: string): Result<IReadOnlyResourceTreeBranch<T>> {
109
+ return Validate.toResourceId(id).onSuccess((resourceId) => {
110
+ return this._inner.getBranchById(resourceId);
111
+ });
112
+ }
113
+
114
+ /**
115
+ * The number of direct child nodes in this collection.
116
+ */
117
+ public get size(): number {
118
+ return this._inner.size;
119
+ }
120
+
121
+ /**
122
+ * Returns an iterator of [ResourceName, node] pairs for all child nodes.
123
+ * @returns Map iterator for all child nodes
124
+ */
125
+ public entries(): IterableIterator<[ResourceName, IReadOnlyResourceTreeNode<T>]> {
126
+ return this._inner.entries();
127
+ }
128
+
129
+ /**
130
+ * Executes a callback function for each child node in the collection.
131
+ * @param cb - The callback function to execute for each child node
132
+ * @param arg - Optional argument to pass to the callback
133
+ */
134
+ public forEach(
135
+ cb: (value: unknown, key: string, map: IReadOnlyResultMap<string, unknown>, thisArg?: unknown) => void,
136
+ arg?: unknown
137
+ ): void {
138
+ for (const [key, value] of this._inner.entries()) {
139
+ cb(value, key as ResourceName, this, arg);
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Gets a child node by its string key with detailed error information.
145
+ * @param key - The string key to look up
146
+ * @returns DetailedResult containing the node if found, or failure with details
147
+ */
148
+ public get(key: string): DetailedResult<IReadOnlyResourceTreeNode<T>, Collections.ResultMapResultDetail> {
149
+ if (Validate.isValidResourceName(key)) {
150
+ return this._inner.get(key);
151
+ }
152
+ return failWithDetail(`${key}: invalid resource name.`, 'invalid-key');
153
+ }
154
+
155
+ /**
156
+ * Checks if a child node exists at the given string key.
157
+ * @param key - The string key to check
158
+ * @returns True if a child node exists at the key, false otherwise
159
+ */
160
+ public has(key: string): boolean {
161
+ return this._inner.has(key as ResourceName);
162
+ }
163
+
164
+ /**
165
+ * Returns an iterator of ResourceName keys for all child nodes.
166
+ * @returns Map iterator for all child node keys
167
+ */
168
+ public keys(): IterableIterator<ResourceName> {
169
+ return this._inner.keys();
170
+ }
171
+
172
+ /**
173
+ * Returns an iterator of child node values.
174
+ * @returns Map iterator for all child node values
175
+ */
176
+ public values(): IterableIterator<IReadOnlyResourceTreeNode<T>> {
177
+ return this._inner.values();
178
+ }
179
+
180
+ /**
181
+ * Returns an iterator for [ResourceName, node] pairs, enabling for...of iteration.
182
+ * @returns Iterable iterator for all child nodes
183
+ */
184
+ public [Symbol.iterator](): IterableIterator<[ResourceName, IReadOnlyResourceTreeNode<T>]> {
185
+ return this._inner[Symbol.iterator]();
186
+ }
187
+ }