@fgv/ts-res 5.0.0-12 → 5.0.0-14

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 (493) 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 +64 -10
  7. package/dist/tsdoc-metadata.json +1 -1
  8. package/lib/packlets/resource-types/resourceType.d.ts +59 -3
  9. package/lib/packlets/resource-types/resourceType.js +2 -2
  10. package/lib/packlets/resources/resource.d.ts +1 -5
  11. package/lib/packlets/resources/resource.js +2 -8
  12. package/lib/packlets/runtime/compiledResourceCollection.d.ts +2 -2
  13. package/lib/packlets/runtime/iResourceManager.d.ts +2 -2
  14. package/lib/test/data/sample.json +32 -0
  15. package/lib/test/unit/bundle/bundleBuilder.test.d.ts +2 -0
  16. package/lib/test/unit/bundle/bundleLoader.test.d.ts +2 -0
  17. package/lib/test/unit/bundle/bundleUtils.test.d.ts +2 -0
  18. package/lib/test/unit/bundle/convert.test.d.ts +2 -0
  19. package/lib/test/unit/bundle/integration.test.d.ts +2 -0
  20. package/lib/test/unit/bundle/model.test.d.ts +2 -0
  21. package/lib/test/unit/bundle/normalization.test.d.ts +2 -0
  22. package/lib/test/unit/common/conditions.test.d.ts +2 -0
  23. package/lib/test/unit/common/helpers/conditions.test.d.ts +2 -0
  24. package/lib/test/unit/common/helpers/contexts.test.d.ts +2 -0
  25. package/lib/test/unit/common/helpers/qualifierDefaultValues.test.d.ts +2 -0
  26. package/lib/test/unit/common/resources.test.d.ts +2 -0
  27. package/lib/test/unit/conditions/condition.test.d.ts +2 -0
  28. package/lib/test/unit/conditions/conditionCollector.test.d.ts +2 -0
  29. package/lib/test/unit/conditions/conditionScoreAsDefault.test.d.ts +2 -0
  30. package/lib/test/unit/conditions/conditionSet.test.d.ts +2 -0
  31. package/lib/test/unit/conditions/conditionSetCollector.test.d.ts +2 -0
  32. package/lib/test/unit/conditions/conditionToken.test.d.ts +2 -0
  33. package/lib/test/unit/conditions/convert.test.d.ts +2 -0
  34. package/lib/test/unit/config/common.test.d.ts +2 -0
  35. package/lib/test/unit/config/convert.test.d.ts +2 -0
  36. package/lib/test/unit/config/predefined/default.test.d.ts +2 -0
  37. package/lib/test/unit/config/predefined/extended.test.d.ts +2 -0
  38. package/lib/test/unit/config/systemConfiguration.test.d.ts +2 -0
  39. package/lib/test/unit/config/systemConfigurationInitParams.test.d.ts +2 -0
  40. package/lib/test/unit/context/contextToken.test.d.ts +2 -0
  41. package/lib/test/unit/context/convert.test.d.ts +2 -0
  42. package/lib/test/unit/decisions/abstractDecision.test.d.ts +2 -0
  43. package/lib/test/unit/decisions/abstractDecisionCollector.test.d.ts +2 -0
  44. package/lib/test/unit/decisions/candidate.test.d.ts +2 -0
  45. package/lib/test/unit/decisions/concreteDecision.test.d.ts +2 -0
  46. package/lib/test/unit/decisions/decision.test.d.ts +2 -0
  47. package/lib/test/unit/import/collectionImporter.test.d.ts +2 -0
  48. package/lib/test/unit/import/fsItem.test.d.ts +2 -0
  49. package/lib/test/unit/import/fsItemImporter.test.d.ts +2 -0
  50. package/lib/test/unit/import/importContext.test.d.ts +2 -0
  51. package/lib/test/unit/import/importManager.test.d.ts +2 -0
  52. package/lib/test/unit/import/jsonImporter.test.d.ts +2 -0
  53. package/lib/test/unit/import/pathImporter.test.d.ts +2 -0
  54. package/lib/test/unit/qualifier-types/convert.test.d.ts +2 -0
  55. package/lib/test/unit/qualifier-types/helpers.test.d.ts +2 -0
  56. package/lib/test/unit/qualifier-types/languageQualifierType.test.d.ts +2 -0
  57. package/lib/test/unit/qualifier-types/literalQualifierType.test.d.ts +2 -0
  58. package/lib/test/unit/qualifier-types/literalValueHierarchy.test.d.ts +2 -0
  59. package/lib/test/unit/qualifier-types/qualifierType.test.d.ts +2 -0
  60. package/lib/test/unit/qualifier-types/qualifierTypeCollector.test.d.ts +2 -0
  61. package/lib/test/unit/qualifier-types/territoryQualifierType.test.d.ts +2 -0
  62. package/lib/test/unit/qualifier-types/testQualifierType.d.ts +15 -0
  63. package/lib/test/unit/qualifier-types/testQualifierType.js +89 -0
  64. package/lib/test/unit/qualifiers/convert.test.d.ts +2 -0
  65. package/lib/test/unit/qualifiers/qualifierCollector.test.d.ts +2 -0
  66. package/lib/test/unit/qualifiers/qualifierDefaultValue.test.d.ts +2 -0
  67. package/lib/test/unit/qualifiers/qualifierDefaultValueToken.test.d.ts +2 -0
  68. package/lib/test/unit/resource-json/convert.test.d.ts +2 -0
  69. package/lib/test/unit/resource-json/nameInheritance.test.d.ts +2 -0
  70. package/lib/test/unit/resource-json/resourceDeclCollection.test.d.ts +2 -0
  71. package/lib/test/unit/resource-json/resourceDeclTree.test.d.ts +2 -0
  72. package/lib/test/unit/resource-types/jsonResourceType.test.d.ts +2 -0
  73. package/lib/test/unit/resource-types/resourceTypeCollector.test.d.ts +2 -0
  74. package/lib/test/unit/resources/candidateReducer.integration.test.d.ts +2 -0
  75. package/lib/test/unit/resources/candidateReducer.test.d.ts +2 -0
  76. package/lib/test/unit/resources/reduceCandidates.test.d.ts +2 -0
  77. package/lib/test/unit/resources/reduceQualifiers.comprehensive.test.d.ts +2 -0
  78. package/lib/test/unit/resources/reduceQualifiers.test.d.ts +2 -0
  79. package/lib/test/unit/resources/resource.test.d.ts +2 -0
  80. package/lib/test/unit/resources/resourceBuilder.test.d.ts +2 -0
  81. package/lib/test/unit/resources/resourceCandidate.test.d.ts +2 -0
  82. package/lib/test/unit/resources/resourceManagerBuilder.getBuiltResourceTree.test.d.ts +2 -0
  83. package/lib/test/unit/resources/resourceManagerBuilder.test.d.ts +2 -0
  84. package/lib/test/unit/runtime/cacheListener.test.d.ts +2 -0
  85. package/lib/test/unit/runtime/cacheMetrics.test.d.ts +2 -0
  86. package/lib/test/unit/runtime/compiledResourceCollection.test.d.ts +2 -0
  87. package/lib/test/unit/runtime/conditionSetResolutionResult.comprehensive.test.d.ts +2 -0
  88. package/lib/test/unit/runtime/conditionSetResolutionResult.test.d.ts +2 -0
  89. package/lib/test/unit/runtime/context/contextQualifierProvider.test.d.ts +2 -0
  90. package/lib/test/unit/runtime/context/contextQualifierProviderValidator.test.d.ts +2 -0
  91. package/lib/test/unit/runtime/context/simpleContextQualifierProvider.test.d.ts +2 -0
  92. package/lib/test/unit/runtime/context/validatingSimpleContextQualifierProvider.test.d.ts +2 -0
  93. package/lib/test/unit/runtime/resource-tree/readOnlyResourceTree.test.d.ts +2 -0
  94. package/lib/test/unit/runtime/resource-tree/resourceTreeChildren.test.d.ts +2 -0
  95. package/lib/test/unit/runtime/resource-tree/resourceTreeChildrenValidator.test.d.ts +2 -0
  96. package/lib/test/unit/runtime/resourceResolver.defaultResolution.test.d.ts +2 -0
  97. package/lib/test/unit/runtime/resourceResolver.test.d.ts +2 -0
  98. package/lib/test/unit/runtime/validate.test.d.ts +2 -0
  99. package/package.json +18 -25
  100. package/src/index.ts +73 -0
  101. package/src/packlets/bundle/bundleBuilder.ts +159 -0
  102. package/src/packlets/bundle/bundleLoader.ts +157 -0
  103. package/src/packlets/bundle/bundleNormalizer.ts +173 -0
  104. package/src/packlets/bundle/bundleUtils.ts +142 -0
  105. package/src/packlets/bundle/convert.ts +87 -0
  106. package/src/packlets/bundle/index.ts +52 -0
  107. package/src/packlets/bundle/model.ts +138 -0
  108. package/src/packlets/common/conditions.ts +226 -0
  109. package/src/packlets/common/convert.ts +184 -0
  110. package/src/packlets/common/helpers/conditions.ts +84 -0
  111. package/src/packlets/common/helpers/context.ts +88 -0
  112. package/src/packlets/common/helpers/index.ts +26 -0
  113. package/src/packlets/common/helpers/qualifierDefaultValues.ts +91 -0
  114. package/src/packlets/common/helpers/resources.ts +96 -0
  115. package/src/packlets/common/index.ts +30 -0
  116. package/src/packlets/common/resources.ts +78 -0
  117. package/src/packlets/common/validate/conditions.ts +595 -0
  118. package/src/packlets/common/validate/index.ts +27 -0
  119. package/src/packlets/common/validate/regularExpressions.ts +92 -0
  120. package/src/packlets/common/validate/resources.ts +170 -0
  121. package/src/packlets/conditions/condition.ts +351 -0
  122. package/src/packlets/conditions/conditionCollector.ts +103 -0
  123. package/src/packlets/conditions/conditionDecls.ts +50 -0
  124. package/src/packlets/conditions/conditionSet.ts +318 -0
  125. package/src/packlets/conditions/conditionSetCollector.ts +127 -0
  126. package/src/packlets/conditions/conditionSetDecls.ts +41 -0
  127. package/src/packlets/conditions/conditionToken.ts +180 -0
  128. package/src/packlets/conditions/convert/conditionSetDecls.ts +72 -0
  129. package/src/packlets/conditions/convert/decls.ts +95 -0
  130. package/src/packlets/conditions/convert/index.ts +24 -0
  131. package/src/packlets/conditions/index.ts +33 -0
  132. package/src/packlets/config/common.ts +107 -0
  133. package/src/packlets/config/configInitFactory.ts +142 -0
  134. package/src/packlets/config/convert.ts +50 -0
  135. package/src/packlets/config/index.ts +30 -0
  136. package/src/packlets/config/json.ts +43 -0
  137. package/src/packlets/config/predefined/default.ts +150 -0
  138. package/src/packlets/config/predefined/extended.ts +198 -0
  139. package/src/packlets/config/predefined/index.ts +26 -0
  140. package/src/packlets/config/systemConfiguration.ts +217 -0
  141. package/src/packlets/context/contextDecls.ts +76 -0
  142. package/src/packlets/context/contextToken.ts +252 -0
  143. package/src/packlets/context/convert/decls.ts +126 -0
  144. package/src/packlets/context/convert/index.ts +23 -0
  145. package/src/packlets/context/index.ts +27 -0
  146. package/src/packlets/decisions/abstractDecision.ts +87 -0
  147. package/src/packlets/decisions/abstractDecisionCollector.ts +122 -0
  148. package/src/packlets/decisions/candidate.ts +101 -0
  149. package/src/packlets/decisions/common.ts +37 -0
  150. package/src/packlets/decisions/concreteDecision.ts +157 -0
  151. package/src/packlets/decisions/decision.ts +172 -0
  152. package/src/packlets/decisions/index.ts +28 -0
  153. package/src/packlets/import/fsItem.ts +212 -0
  154. package/src/packlets/import/importContext.ts +183 -0
  155. package/src/packlets/import/importManager.ts +187 -0
  156. package/src/packlets/import/importable.ts +107 -0
  157. package/src/packlets/import/importers/collectionImporter.ts +153 -0
  158. package/src/packlets/import/importers/fsItemImporter.ts +154 -0
  159. package/src/packlets/import/importers/importer.ts +58 -0
  160. package/src/packlets/import/importers/index.ts +27 -0
  161. package/src/packlets/import/importers/jsonImporter.ts +133 -0
  162. package/src/packlets/import/importers/pathImporter.ts +134 -0
  163. package/src/packlets/import/index.ts +29 -0
  164. package/src/packlets/qualifier-types/config/convert.ts +108 -0
  165. package/src/packlets/qualifier-types/config/index.ts +27 -0
  166. package/src/packlets/qualifier-types/config/json.ts +126 -0
  167. package/src/packlets/qualifier-types/convert.ts +77 -0
  168. package/src/packlets/qualifier-types/helpers.ts +94 -0
  169. package/src/packlets/qualifier-types/index.ts +34 -0
  170. package/src/packlets/qualifier-types/languageQualifierType.ts +143 -0
  171. package/src/packlets/qualifier-types/literalQualifierType.ts +244 -0
  172. package/src/packlets/qualifier-types/literalValueHierarchy.ts +332 -0
  173. package/src/packlets/qualifier-types/qualifierType.ts +360 -0
  174. package/src/packlets/qualifier-types/qualifierTypeCollector.ts +102 -0
  175. package/src/packlets/qualifier-types/territoryQualifierType.ts +255 -0
  176. package/src/packlets/qualifiers/convert/decls.ts +90 -0
  177. package/src/packlets/qualifiers/convert/index.ts +24 -0
  178. package/src/packlets/qualifiers/convert/qualifier.ts +55 -0
  179. package/src/packlets/qualifiers/index.ts +31 -0
  180. package/src/packlets/qualifiers/qualifier.ts +169 -0
  181. package/src/packlets/qualifiers/qualifierCollector.ts +194 -0
  182. package/src/packlets/qualifiers/qualifierDecl.ts +80 -0
  183. package/src/packlets/qualifiers/qualifierDefaultValueDecls.ts +57 -0
  184. package/src/packlets/qualifiers/qualifierDefaultValueToken.ts +230 -0
  185. package/src/packlets/resource-json/compiled/common.ts +35 -0
  186. package/src/packlets/resource-json/compiled/convert.ts +143 -0
  187. package/src/packlets/resource-json/compiled/index.ts +27 -0
  188. package/src/packlets/resource-json/compiled/json.ts +239 -0
  189. package/src/packlets/resource-json/convert.ts +236 -0
  190. package/src/packlets/resource-json/helpers.ts +284 -0
  191. package/src/packlets/resource-json/index.ts +33 -0
  192. package/src/packlets/resource-json/json.ts +295 -0
  193. package/src/packlets/resource-json/normalized.ts +211 -0
  194. package/src/packlets/resource-json/resourceDeclCollection.ts +117 -0
  195. package/src/packlets/resource-json/resourceDeclContainer.ts +48 -0
  196. package/src/packlets/resource-json/resourceDeclTree.ts +116 -0
  197. package/src/packlets/resource-types/config/convert.ts +36 -0
  198. package/src/packlets/resource-types/config/index.ts +27 -0
  199. package/src/packlets/resource-types/config/json.ts +30 -0
  200. package/src/packlets/resource-types/helpers.ts +44 -0
  201. package/src/packlets/resource-types/index.ts +30 -0
  202. package/src/packlets/resource-types/jsonResourceType.ts +96 -0
  203. package/src/packlets/resource-types/resourceType.ts +215 -0
  204. package/src/packlets/resource-types/resourceTypeCollector.ts +79 -0
  205. package/src/packlets/resources/candidateReducer.ts +331 -0
  206. package/src/packlets/resources/common.ts +98 -0
  207. package/src/packlets/resources/index.ts +28 -0
  208. package/src/packlets/resources/resource.ts +307 -0
  209. package/src/packlets/resources/resourceBuilder.ts +269 -0
  210. package/src/packlets/resources/resourceCandidate.ts +333 -0
  211. package/src/packlets/resources/resourceManagerBuilder.ts +1116 -0
  212. package/src/packlets/runtime/cacheListener.ts +113 -0
  213. package/src/packlets/runtime/cacheMetrics.ts +206 -0
  214. package/src/packlets/runtime/compiledResourceCollection.ts +607 -0
  215. package/src/packlets/runtime/conditionSetResolutionResult.ts +160 -0
  216. package/src/packlets/runtime/context/contextQualifierProvider.ts +117 -0
  217. package/src/packlets/runtime/context/contextQualifierProviderValidator.ts +281 -0
  218. package/src/packlets/runtime/context/index.ts +26 -0
  219. package/src/packlets/runtime/context/simpleContextQualifierProvider.ts +225 -0
  220. package/src/packlets/runtime/context/validatingSimpleContextQualifierProvider.ts +96 -0
  221. package/src/packlets/runtime/iResourceManager.ts +130 -0
  222. package/src/packlets/runtime/index.ts +35 -0
  223. package/src/packlets/runtime/resource-tree/common.ts +126 -0
  224. package/src/packlets/runtime/resource-tree/index.ts +26 -0
  225. package/src/packlets/runtime/resource-tree/readOnlyResourceTree.ts +342 -0
  226. package/src/packlets/runtime/resource-tree/resourceTreeChildren.ts +125 -0
  227. package/src/packlets/runtime/resource-tree/resourceTreeChildrenValidator.ts +189 -0
  228. package/src/packlets/runtime/resourceResolver.ts +626 -0
  229. package/src/packlets/runtime/validate.ts +63 -0
  230. package/CHANGELOG.md +0 -14
  231. package/CLAUDE.md +0 -186
  232. package/EXAMPLE_INIT_PARAMS.md +0 -88
  233. package/PROGRESS_SUMMARY.md +0 -48
  234. package/lib/index.d.ts.map +0 -1
  235. package/lib/index.js.map +0 -1
  236. package/lib/packlets/bundle/bundleBuilder.d.ts.map +0 -1
  237. package/lib/packlets/bundle/bundleBuilder.js.map +0 -1
  238. package/lib/packlets/bundle/bundleLoader.d.ts.map +0 -1
  239. package/lib/packlets/bundle/bundleLoader.js.map +0 -1
  240. package/lib/packlets/bundle/bundleNormalizer.d.ts.map +0 -1
  241. package/lib/packlets/bundle/bundleNormalizer.js.map +0 -1
  242. package/lib/packlets/bundle/bundleUtils.d.ts.map +0 -1
  243. package/lib/packlets/bundle/bundleUtils.js.map +0 -1
  244. package/lib/packlets/bundle/convert.d.ts.map +0 -1
  245. package/lib/packlets/bundle/convert.js.map +0 -1
  246. package/lib/packlets/bundle/index.d.ts.map +0 -1
  247. package/lib/packlets/bundle/index.js.map +0 -1
  248. package/lib/packlets/bundle/model.d.ts.map +0 -1
  249. package/lib/packlets/bundle/model.js.map +0 -1
  250. package/lib/packlets/common/conditions.d.ts.map +0 -1
  251. package/lib/packlets/common/conditions.js.map +0 -1
  252. package/lib/packlets/common/convert.d.ts.map +0 -1
  253. package/lib/packlets/common/convert.js.map +0 -1
  254. package/lib/packlets/common/helpers/conditions.d.ts.map +0 -1
  255. package/lib/packlets/common/helpers/conditions.js.map +0 -1
  256. package/lib/packlets/common/helpers/context.d.ts.map +0 -1
  257. package/lib/packlets/common/helpers/context.js.map +0 -1
  258. package/lib/packlets/common/helpers/index.d.ts.map +0 -1
  259. package/lib/packlets/common/helpers/index.js.map +0 -1
  260. package/lib/packlets/common/helpers/qualifierDefaultValues.d.ts.map +0 -1
  261. package/lib/packlets/common/helpers/qualifierDefaultValues.js.map +0 -1
  262. package/lib/packlets/common/helpers/resources.d.ts.map +0 -1
  263. package/lib/packlets/common/helpers/resources.js.map +0 -1
  264. package/lib/packlets/common/index.d.ts.map +0 -1
  265. package/lib/packlets/common/index.js.map +0 -1
  266. package/lib/packlets/common/resources.d.ts.map +0 -1
  267. package/lib/packlets/common/resources.js.map +0 -1
  268. package/lib/packlets/common/validate/conditions.d.ts.map +0 -1
  269. package/lib/packlets/common/validate/conditions.js.map +0 -1
  270. package/lib/packlets/common/validate/index.d.ts.map +0 -1
  271. package/lib/packlets/common/validate/index.js.map +0 -1
  272. package/lib/packlets/common/validate/regularExpressions.d.ts.map +0 -1
  273. package/lib/packlets/common/validate/regularExpressions.js.map +0 -1
  274. package/lib/packlets/common/validate/resources.d.ts.map +0 -1
  275. package/lib/packlets/common/validate/resources.js.map +0 -1
  276. package/lib/packlets/conditions/condition.d.ts.map +0 -1
  277. package/lib/packlets/conditions/condition.js.map +0 -1
  278. package/lib/packlets/conditions/conditionCollector.d.ts.map +0 -1
  279. package/lib/packlets/conditions/conditionCollector.js.map +0 -1
  280. package/lib/packlets/conditions/conditionDecls.d.ts.map +0 -1
  281. package/lib/packlets/conditions/conditionDecls.js.map +0 -1
  282. package/lib/packlets/conditions/conditionSet.d.ts.map +0 -1
  283. package/lib/packlets/conditions/conditionSet.js.map +0 -1
  284. package/lib/packlets/conditions/conditionSetCollector.d.ts.map +0 -1
  285. package/lib/packlets/conditions/conditionSetCollector.js.map +0 -1
  286. package/lib/packlets/conditions/conditionSetDecls.d.ts.map +0 -1
  287. package/lib/packlets/conditions/conditionSetDecls.js.map +0 -1
  288. package/lib/packlets/conditions/conditionToken.d.ts.map +0 -1
  289. package/lib/packlets/conditions/conditionToken.js.map +0 -1
  290. package/lib/packlets/conditions/convert/conditionSetDecls.d.ts.map +0 -1
  291. package/lib/packlets/conditions/convert/conditionSetDecls.js.map +0 -1
  292. package/lib/packlets/conditions/convert/decls.d.ts.map +0 -1
  293. package/lib/packlets/conditions/convert/decls.js.map +0 -1
  294. package/lib/packlets/conditions/convert/index.d.ts.map +0 -1
  295. package/lib/packlets/conditions/convert/index.js.map +0 -1
  296. package/lib/packlets/conditions/index.d.ts.map +0 -1
  297. package/lib/packlets/conditions/index.js.map +0 -1
  298. package/lib/packlets/config/common.d.ts.map +0 -1
  299. package/lib/packlets/config/common.js.map +0 -1
  300. package/lib/packlets/config/configInitFactory.d.ts.map +0 -1
  301. package/lib/packlets/config/configInitFactory.js.map +0 -1
  302. package/lib/packlets/config/convert.d.ts.map +0 -1
  303. package/lib/packlets/config/convert.js.map +0 -1
  304. package/lib/packlets/config/index.d.ts.map +0 -1
  305. package/lib/packlets/config/index.js.map +0 -1
  306. package/lib/packlets/config/json.d.ts.map +0 -1
  307. package/lib/packlets/config/json.js.map +0 -1
  308. package/lib/packlets/config/predefined/default.d.ts.map +0 -1
  309. package/lib/packlets/config/predefined/default.js.map +0 -1
  310. package/lib/packlets/config/predefined/extended.d.ts.map +0 -1
  311. package/lib/packlets/config/predefined/extended.js.map +0 -1
  312. package/lib/packlets/config/predefined/index.d.ts.map +0 -1
  313. package/lib/packlets/config/predefined/index.js.map +0 -1
  314. package/lib/packlets/config/systemConfiguration.d.ts.map +0 -1
  315. package/lib/packlets/config/systemConfiguration.js.map +0 -1
  316. package/lib/packlets/context/contextDecls.d.ts.map +0 -1
  317. package/lib/packlets/context/contextDecls.js.map +0 -1
  318. package/lib/packlets/context/contextToken.d.ts.map +0 -1
  319. package/lib/packlets/context/contextToken.js.map +0 -1
  320. package/lib/packlets/context/convert/decls.d.ts.map +0 -1
  321. package/lib/packlets/context/convert/decls.js.map +0 -1
  322. package/lib/packlets/context/convert/index.d.ts.map +0 -1
  323. package/lib/packlets/context/convert/index.js.map +0 -1
  324. package/lib/packlets/context/index.d.ts.map +0 -1
  325. package/lib/packlets/context/index.js.map +0 -1
  326. package/lib/packlets/decisions/abstractDecision.d.ts.map +0 -1
  327. package/lib/packlets/decisions/abstractDecision.js.map +0 -1
  328. package/lib/packlets/decisions/abstractDecisionCollector.d.ts.map +0 -1
  329. package/lib/packlets/decisions/abstractDecisionCollector.js.map +0 -1
  330. package/lib/packlets/decisions/candidate.d.ts.map +0 -1
  331. package/lib/packlets/decisions/candidate.js.map +0 -1
  332. package/lib/packlets/decisions/common.d.ts.map +0 -1
  333. package/lib/packlets/decisions/common.js.map +0 -1
  334. package/lib/packlets/decisions/concreteDecision.d.ts.map +0 -1
  335. package/lib/packlets/decisions/concreteDecision.js.map +0 -1
  336. package/lib/packlets/decisions/decision.d.ts.map +0 -1
  337. package/lib/packlets/decisions/decision.js.map +0 -1
  338. package/lib/packlets/decisions/index.d.ts.map +0 -1
  339. package/lib/packlets/decisions/index.js.map +0 -1
  340. package/lib/packlets/import/fsItem.d.ts.map +0 -1
  341. package/lib/packlets/import/fsItem.js.map +0 -1
  342. package/lib/packlets/import/importContext.d.ts.map +0 -1
  343. package/lib/packlets/import/importContext.js.map +0 -1
  344. package/lib/packlets/import/importManager.d.ts.map +0 -1
  345. package/lib/packlets/import/importManager.js.map +0 -1
  346. package/lib/packlets/import/importable.d.ts.map +0 -1
  347. package/lib/packlets/import/importable.js.map +0 -1
  348. package/lib/packlets/import/importers/collectionImporter.d.ts.map +0 -1
  349. package/lib/packlets/import/importers/collectionImporter.js.map +0 -1
  350. package/lib/packlets/import/importers/fsItemImporter.d.ts.map +0 -1
  351. package/lib/packlets/import/importers/fsItemImporter.js.map +0 -1
  352. package/lib/packlets/import/importers/importer.d.ts.map +0 -1
  353. package/lib/packlets/import/importers/importer.js.map +0 -1
  354. package/lib/packlets/import/importers/index.d.ts.map +0 -1
  355. package/lib/packlets/import/importers/index.js.map +0 -1
  356. package/lib/packlets/import/importers/jsonImporter.d.ts.map +0 -1
  357. package/lib/packlets/import/importers/jsonImporter.js.map +0 -1
  358. package/lib/packlets/import/importers/pathImporter.d.ts.map +0 -1
  359. package/lib/packlets/import/importers/pathImporter.js.map +0 -1
  360. package/lib/packlets/import/index.d.ts.map +0 -1
  361. package/lib/packlets/import/index.js.map +0 -1
  362. package/lib/packlets/qualifier-types/config/convert.d.ts.map +0 -1
  363. package/lib/packlets/qualifier-types/config/convert.js.map +0 -1
  364. package/lib/packlets/qualifier-types/config/index.d.ts.map +0 -1
  365. package/lib/packlets/qualifier-types/config/index.js.map +0 -1
  366. package/lib/packlets/qualifier-types/config/json.d.ts.map +0 -1
  367. package/lib/packlets/qualifier-types/config/json.js.map +0 -1
  368. package/lib/packlets/qualifier-types/convert.d.ts.map +0 -1
  369. package/lib/packlets/qualifier-types/convert.js.map +0 -1
  370. package/lib/packlets/qualifier-types/helpers.d.ts.map +0 -1
  371. package/lib/packlets/qualifier-types/helpers.js.map +0 -1
  372. package/lib/packlets/qualifier-types/index.d.ts.map +0 -1
  373. package/lib/packlets/qualifier-types/index.js.map +0 -1
  374. package/lib/packlets/qualifier-types/languageQualifierType.d.ts.map +0 -1
  375. package/lib/packlets/qualifier-types/languageQualifierType.js.map +0 -1
  376. package/lib/packlets/qualifier-types/literalQualifierType.d.ts.map +0 -1
  377. package/lib/packlets/qualifier-types/literalQualifierType.js.map +0 -1
  378. package/lib/packlets/qualifier-types/literalValueHierarchy.d.ts.map +0 -1
  379. package/lib/packlets/qualifier-types/literalValueHierarchy.js.map +0 -1
  380. package/lib/packlets/qualifier-types/qualifierType.d.ts.map +0 -1
  381. package/lib/packlets/qualifier-types/qualifierType.js.map +0 -1
  382. package/lib/packlets/qualifier-types/qualifierTypeCollector.d.ts.map +0 -1
  383. package/lib/packlets/qualifier-types/qualifierTypeCollector.js.map +0 -1
  384. package/lib/packlets/qualifier-types/territoryQualifierType.d.ts.map +0 -1
  385. package/lib/packlets/qualifier-types/territoryQualifierType.js.map +0 -1
  386. package/lib/packlets/qualifiers/convert/decls.d.ts.map +0 -1
  387. package/lib/packlets/qualifiers/convert/decls.js.map +0 -1
  388. package/lib/packlets/qualifiers/convert/index.d.ts.map +0 -1
  389. package/lib/packlets/qualifiers/convert/index.js.map +0 -1
  390. package/lib/packlets/qualifiers/convert/qualifier.d.ts.map +0 -1
  391. package/lib/packlets/qualifiers/convert/qualifier.js.map +0 -1
  392. package/lib/packlets/qualifiers/index.d.ts.map +0 -1
  393. package/lib/packlets/qualifiers/index.js.map +0 -1
  394. package/lib/packlets/qualifiers/qualifier.d.ts.map +0 -1
  395. package/lib/packlets/qualifiers/qualifier.js.map +0 -1
  396. package/lib/packlets/qualifiers/qualifierCollector.d.ts.map +0 -1
  397. package/lib/packlets/qualifiers/qualifierCollector.js.map +0 -1
  398. package/lib/packlets/qualifiers/qualifierDecl.d.ts.map +0 -1
  399. package/lib/packlets/qualifiers/qualifierDecl.js.map +0 -1
  400. package/lib/packlets/qualifiers/qualifierDefaultValueDecls.d.ts.map +0 -1
  401. package/lib/packlets/qualifiers/qualifierDefaultValueDecls.js.map +0 -1
  402. package/lib/packlets/qualifiers/qualifierDefaultValueToken.d.ts.map +0 -1
  403. package/lib/packlets/qualifiers/qualifierDefaultValueToken.js.map +0 -1
  404. package/lib/packlets/resource-json/compiled/common.d.ts.map +0 -1
  405. package/lib/packlets/resource-json/compiled/common.js.map +0 -1
  406. package/lib/packlets/resource-json/compiled/convert.d.ts.map +0 -1
  407. package/lib/packlets/resource-json/compiled/convert.js.map +0 -1
  408. package/lib/packlets/resource-json/compiled/index.d.ts.map +0 -1
  409. package/lib/packlets/resource-json/compiled/index.js.map +0 -1
  410. package/lib/packlets/resource-json/compiled/json.d.ts.map +0 -1
  411. package/lib/packlets/resource-json/compiled/json.js.map +0 -1
  412. package/lib/packlets/resource-json/convert.d.ts.map +0 -1
  413. package/lib/packlets/resource-json/convert.js.map +0 -1
  414. package/lib/packlets/resource-json/helpers.d.ts.map +0 -1
  415. package/lib/packlets/resource-json/helpers.js.map +0 -1
  416. package/lib/packlets/resource-json/index.d.ts.map +0 -1
  417. package/lib/packlets/resource-json/index.js.map +0 -1
  418. package/lib/packlets/resource-json/json.d.ts.map +0 -1
  419. package/lib/packlets/resource-json/json.js.map +0 -1
  420. package/lib/packlets/resource-json/normalized.d.ts.map +0 -1
  421. package/lib/packlets/resource-json/normalized.js.map +0 -1
  422. package/lib/packlets/resource-json/resourceDeclCollection.d.ts.map +0 -1
  423. package/lib/packlets/resource-json/resourceDeclCollection.js.map +0 -1
  424. package/lib/packlets/resource-json/resourceDeclContainer.d.ts.map +0 -1
  425. package/lib/packlets/resource-json/resourceDeclContainer.js.map +0 -1
  426. package/lib/packlets/resource-json/resourceDeclTree.d.ts.map +0 -1
  427. package/lib/packlets/resource-json/resourceDeclTree.js.map +0 -1
  428. package/lib/packlets/resource-types/config/convert.d.ts.map +0 -1
  429. package/lib/packlets/resource-types/config/convert.js.map +0 -1
  430. package/lib/packlets/resource-types/config/index.d.ts.map +0 -1
  431. package/lib/packlets/resource-types/config/index.js.map +0 -1
  432. package/lib/packlets/resource-types/config/json.d.ts.map +0 -1
  433. package/lib/packlets/resource-types/config/json.js.map +0 -1
  434. package/lib/packlets/resource-types/helpers.d.ts.map +0 -1
  435. package/lib/packlets/resource-types/helpers.js.map +0 -1
  436. package/lib/packlets/resource-types/index.d.ts.map +0 -1
  437. package/lib/packlets/resource-types/index.js.map +0 -1
  438. package/lib/packlets/resource-types/jsonResourceType.d.ts.map +0 -1
  439. package/lib/packlets/resource-types/jsonResourceType.js.map +0 -1
  440. package/lib/packlets/resource-types/resourceType.d.ts.map +0 -1
  441. package/lib/packlets/resource-types/resourceType.js.map +0 -1
  442. package/lib/packlets/resource-types/resourceTypeCollector.d.ts.map +0 -1
  443. package/lib/packlets/resource-types/resourceTypeCollector.js.map +0 -1
  444. package/lib/packlets/resources/candidateReducer.d.ts.map +0 -1
  445. package/lib/packlets/resources/candidateReducer.js.map +0 -1
  446. package/lib/packlets/resources/common.d.ts.map +0 -1
  447. package/lib/packlets/resources/common.js.map +0 -1
  448. package/lib/packlets/resources/index.d.ts.map +0 -1
  449. package/lib/packlets/resources/index.js.map +0 -1
  450. package/lib/packlets/resources/resource.d.ts.map +0 -1
  451. package/lib/packlets/resources/resource.js.map +0 -1
  452. package/lib/packlets/resources/resourceBuilder.d.ts.map +0 -1
  453. package/lib/packlets/resources/resourceBuilder.js.map +0 -1
  454. package/lib/packlets/resources/resourceCandidate.d.ts.map +0 -1
  455. package/lib/packlets/resources/resourceCandidate.js.map +0 -1
  456. package/lib/packlets/resources/resourceManagerBuilder.d.ts.map +0 -1
  457. package/lib/packlets/resources/resourceManagerBuilder.js.map +0 -1
  458. package/lib/packlets/runtime/cacheListener.d.ts.map +0 -1
  459. package/lib/packlets/runtime/cacheListener.js.map +0 -1
  460. package/lib/packlets/runtime/cacheMetrics.d.ts.map +0 -1
  461. package/lib/packlets/runtime/cacheMetrics.js.map +0 -1
  462. package/lib/packlets/runtime/compiledResourceCollection.d.ts.map +0 -1
  463. package/lib/packlets/runtime/compiledResourceCollection.js.map +0 -1
  464. package/lib/packlets/runtime/conditionSetResolutionResult.d.ts.map +0 -1
  465. package/lib/packlets/runtime/conditionSetResolutionResult.js.map +0 -1
  466. package/lib/packlets/runtime/context/contextQualifierProvider.d.ts.map +0 -1
  467. package/lib/packlets/runtime/context/contextQualifierProvider.js.map +0 -1
  468. package/lib/packlets/runtime/context/contextQualifierProviderValidator.d.ts.map +0 -1
  469. package/lib/packlets/runtime/context/contextQualifierProviderValidator.js.map +0 -1
  470. package/lib/packlets/runtime/context/index.d.ts.map +0 -1
  471. package/lib/packlets/runtime/context/index.js.map +0 -1
  472. package/lib/packlets/runtime/context/simpleContextQualifierProvider.d.ts.map +0 -1
  473. package/lib/packlets/runtime/context/simpleContextQualifierProvider.js.map +0 -1
  474. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.d.ts.map +0 -1
  475. package/lib/packlets/runtime/context/validatingSimpleContextQualifierProvider.js.map +0 -1
  476. package/lib/packlets/runtime/iResourceManager.d.ts.map +0 -1
  477. package/lib/packlets/runtime/iResourceManager.js.map +0 -1
  478. package/lib/packlets/runtime/index.d.ts.map +0 -1
  479. package/lib/packlets/runtime/index.js.map +0 -1
  480. package/lib/packlets/runtime/resource-tree/common.d.ts.map +0 -1
  481. package/lib/packlets/runtime/resource-tree/common.js.map +0 -1
  482. package/lib/packlets/runtime/resource-tree/index.d.ts.map +0 -1
  483. package/lib/packlets/runtime/resource-tree/index.js.map +0 -1
  484. package/lib/packlets/runtime/resource-tree/readOnlyResourceTree.d.ts.map +0 -1
  485. package/lib/packlets/runtime/resource-tree/readOnlyResourceTree.js.map +0 -1
  486. package/lib/packlets/runtime/resource-tree/resourceTreeChildren.d.ts.map +0 -1
  487. package/lib/packlets/runtime/resource-tree/resourceTreeChildren.js.map +0 -1
  488. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.d.ts.map +0 -1
  489. package/lib/packlets/runtime/resource-tree/resourceTreeChildrenValidator.js.map +0 -1
  490. package/lib/packlets/runtime/resourceResolver.d.ts.map +0 -1
  491. package/lib/packlets/runtime/resourceResolver.js.map +0 -1
  492. package/lib/packlets/runtime/validate.d.ts.map +0 -1
  493. package/lib/packlets/runtime/validate.js.map +0 -1
@@ -0,0 +1,116 @@
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 { captureResult, mapResults, MessageAggregator, Result, succeed } from '@fgv/ts-utils';
24
+ import { IResourceDeclContainer } from './resourceDeclContainer';
25
+ import * as Convert from './convert';
26
+ import * as Normalized from './normalized';
27
+ import * as Json from './json';
28
+ import { Helpers as CommonHelpers } from '../common';
29
+ import { mergeChildResource } from './helpers';
30
+
31
+ /**
32
+ * Class that extracts resources and candidates from a
33
+ * {@link ResourceJson.Json.IResourceTreeRootDecl | resource tree root}.
34
+ * @public
35
+ */
36
+ export class ResourceDeclTree implements IResourceDeclContainer {
37
+ /**
38
+ * The {@link ResourceJson.Normalized.IResourceTreeRootDecl | resource tree root declaration}
39
+ * being processed.
40
+ */
41
+ public readonly tree: Normalized.IResourceTreeRootDecl;
42
+
43
+ /**
44
+ * {@inheritdoc ResourceJson.IResourceDeclContainer.context}
45
+ */
46
+ public get context(): Normalized.IContainerContextDecl | undefined {
47
+ return this.tree.context;
48
+ }
49
+
50
+ protected _resources: Normalized.ILooseResourceDecl[] = [];
51
+ protected _candidates: Normalized.ILooseResourceCandidateDecl[] = [];
52
+
53
+ protected constructor(tree: Normalized.IResourceTreeRootDecl) {
54
+ this.tree = tree;
55
+ const id = tree.context?.baseId;
56
+ const conditions = tree.context?.conditions;
57
+ this._extract(tree, id, conditions).orThrow();
58
+ }
59
+
60
+ /**
61
+ * Creates a new {@link ResourceJson.ResourceDeclTree | ResourceDeclTree} from an
62
+ * untyped {@link ResourceJson.Json.IResourceTreeRootDecl | resource tree root declaration}.
63
+ * @param from - The JSON object to convert.
64
+ * @returns `Success` with the new tree if the JSON object is valid, otherwise `Failure`.
65
+ */
66
+ public static create(from: unknown): Result<ResourceDeclTree> {
67
+ return Convert.resourceTreeRootDecl
68
+ .convert(from)
69
+ .withErrorFormat((err) => `Invalid resource tree: ${err}`)
70
+ .onSuccess((decl) => {
71
+ return captureResult(() => new ResourceDeclTree(decl));
72
+ });
73
+ }
74
+
75
+ /**
76
+ * Gets the loose resources extracted from the collection.
77
+ * @returns The {@link ResourceJson.Normalized.ILooseResourceDecl | loose resource declarations}
78
+ * extracted from the collection.
79
+ */
80
+ public getImporterResources(): ReadonlyArray<Normalized.ILooseResourceDecl> {
81
+ return this._resources;
82
+ }
83
+
84
+ /**
85
+ * Gets the loose candidates extracted from the collection.
86
+ * @returns The {@link ResourceJson.Normalized.ILooseResourceCandidateDecl | loose resource candidate declarations}
87
+ * extracted from the collection.
88
+ */
89
+ public getImporterCandidates(): ReadonlyArray<Normalized.ILooseResourceCandidateDecl> {
90
+ return this._candidates;
91
+ }
92
+
93
+ private _extract(
94
+ node: Normalized.IResourceTreeChildNodeDecl,
95
+ parentName?: string,
96
+ parentConditions?: ReadonlyArray<Json.ILooseConditionDecl>
97
+ ): Result<this> {
98
+ const errors: MessageAggregator = new MessageAggregator();
99
+
100
+ const resourceEntries = Array.from(Object.entries(node.resources ?? {}));
101
+ const mergedResources = resourceEntries.map(([name, resource]) =>
102
+ mergeChildResource(resource, name, parentName, parentConditions)
103
+ );
104
+ this._resources.push(...mapResults(mergedResources).aggregateError(errors).orDefault([]));
105
+
106
+ const children = Array.from(Object.entries(node.children ?? {}));
107
+ children.forEach(([name, childNode]) => {
108
+ CommonHelpers.joinResourceIds(parentName, name)
109
+ .onSuccess((childName) => {
110
+ return this._extract(childNode, childName, parentConditions).aggregateError(errors);
111
+ })
112
+ .aggregateError(errors);
113
+ });
114
+ return errors.returnOrReport(succeed(this));
115
+ }
116
+ }
@@ -0,0 +1,36 @@
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
+ /* eslint-disable @rushstack/typedef-var */
24
+
25
+ import { Converters } from '@fgv/ts-utils';
26
+ import { IResourceTypeConfig } from './json';
27
+
28
+ /**
29
+ * A `Converter` for {@link ResourceTypes.Config.IResourceTypeConfig | ResourceTypeConfig} objects.
30
+ * @returns A `Converter` for {@link ResourceTypes.Config.IResourceTypeConfig | ResourceTypeConfig} objects.
31
+ * @public
32
+ */
33
+ export const resourceTypeConfig = Converters.strictObject<IResourceTypeConfig>({
34
+ name: Converters.string,
35
+ typeName: Converters.string
36
+ });
@@ -0,0 +1,27 @@
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 * as Convert from './convert';
24
+
25
+ export * from './json';
26
+
27
+ export { Convert };
@@ -0,0 +1,30 @@
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
+ /**
24
+ * Configuration for a {@link ResourceTypes.ResourceType | resource type}.
25
+ * @public
26
+ */
27
+ export interface IResourceTypeConfig {
28
+ name: string;
29
+ typeName: string;
30
+ }
@@ -0,0 +1,44 @@
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 { fail, Result } from '@fgv/ts-utils';
24
+ import { IResourceTypeConfig } from './config';
25
+ import { ResourceType } from './resourceType';
26
+ import { JsonResourceType } from './jsonResourceType';
27
+ import { Convert as CommonConverters } from '../common';
28
+
29
+ /**
30
+ * Creates a {@link ResourceTypes.ResourceType | ResourceType} from a configuration object.
31
+ * @param config - The {@link ResourceTypes.Config.IResourceTypeConfig | configuration object}
32
+ * containing the name and type name of the resource type.
33
+ * @returns `Success` with the new {@link ResourceTypes.ResourceType | ResourceType}
34
+ * if successful, `Failure` with an error message otherwise.
35
+ * @public
36
+ */
37
+ export function createResourceTypeFromConfig(config: IResourceTypeConfig): Result<ResourceType> {
38
+ if (config.typeName === 'json') {
39
+ return CommonConverters.resourceTypeName
40
+ .convert(config.name)
41
+ .onSuccess((key) => JsonResourceType.create({ key }));
42
+ }
43
+ return fail(`${config.typeName}: Unknown resource type.`);
44
+ }
@@ -0,0 +1,30 @@
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 * as Config from './config';
24
+
25
+ export * from './resourceType';
26
+ export * from './resourceTypeCollector';
27
+ export * from './jsonResourceType';
28
+ export * from './helpers';
29
+
30
+ export { Config };
@@ -0,0 +1,96 @@
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 { Converters as JsonConverters, JsonObject } from '@fgv/ts-json-base';
24
+ import { IResourceCandidateValidationProperties, ResourceType } from './resourceType';
25
+ import { CandidateCompleteness, Convert, ResourceTypeName } from '../common';
26
+ import { captureResult, Result } from '@fgv/ts-utils';
27
+
28
+ /**
29
+ * Parameters to create a {@link ResourceTypes.JsonResourceType | JsonResourceType} instance.
30
+ * @public
31
+ */
32
+ export interface IJsonResourceTypeCreateParams {
33
+ /**
34
+ * Optional key for the new {@link ResourceTypes.JsonResourceType | JsonResourceType} instance.
35
+ * Defaults to 'json'.
36
+ */
37
+ key?: string;
38
+
39
+ /**
40
+ * Optional index for the new {@link ResourceTypes.JsonResourceType | JsonResourceType}
41
+ * instance.
42
+ */
43
+ index?: number;
44
+ }
45
+
46
+ /**
47
+ * Implementation of a {@link ResourceTypes.ResourceType | ResourceType} for JSON values.
48
+ * @public
49
+ */
50
+ export class JsonResourceType extends ResourceType<JsonObject> {
51
+ /**
52
+ * Protected {@link ResourceTypes.JsonResourceType | JsonResourceType} constructor for use by subclasses.
53
+ * Use {@link ResourceTypes.JsonResourceType.create | JsonResourceType.create} to create a new instance.
54
+ * @param key - The key for the new {@link ResourceTypes.JsonResourceType | JsonResourceType} instance.
55
+ * @param index - Optional index for the new {@link ResourceTypes.JsonResourceType | JsonResourceType} instance.
56
+ */
57
+ protected constructor(key: ResourceTypeName, index?: number) {
58
+ super(key, index);
59
+ }
60
+
61
+ /**
62
+ * Factory method to create a new {@link ResourceTypes.JsonResourceType | JsonResourceType} instance.
63
+ * @param params - {@link ResourceTypes.IJsonResourceTypeCreateParams | Parameters} to create the new instance.
64
+ * @returns `Success` with the new {@link ResourceTypes.JsonResourceType | JsonResourceType} instance if successful
65
+ * or `Failure` with an error message if not.
66
+ */
67
+ public static create(params?: IJsonResourceTypeCreateParams): Result<JsonResourceType> {
68
+ return Convert.resourceTypeName.convert(params?.key ?? 'json').onSuccess((key) => {
69
+ return captureResult(() => new JsonResourceType(key, params?.index));
70
+ });
71
+ }
72
+
73
+ /**
74
+ * {@inheritdoc ResourceTypes.ResourceType.validateDeclaration}
75
+ */
76
+
77
+ public validateDeclaration(props: IResourceCandidateValidationProperties): Result<JsonObject> {
78
+ return JsonConverters.jsonObject.convert(props.json);
79
+ }
80
+
81
+ /**
82
+ * {@inheritdoc ResourceTypes.ResourceType.(validate:1)}
83
+ */
84
+ public validate(json: JsonObject, completeness: CandidateCompleteness): Result<JsonObject>;
85
+ /**
86
+ * {@inheritdoc ResourceTypes.ResourceType.(validate:2)}
87
+ */
88
+ public validate(json: JsonObject, completeness: 'full'): Result<JsonObject>;
89
+ /**
90
+ * {@inheritdoc ResourceTypes.ResourceType.(validate:3)}
91
+ */
92
+ public validate(json: JsonObject, completeness: 'partial'): Result<JsonObject>;
93
+ public validate(json: JsonObject, __completeness?: CandidateCompleteness): Result<JsonObject> {
94
+ return JsonConverters.jsonObject.convert(json);
95
+ }
96
+ }
@@ -0,0 +1,215 @@
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 { JsonValue } from '@fgv/ts-json-base';
24
+ import { Collections, ICollectible, Result } from '@fgv/ts-utils';
25
+ import {
26
+ CandidateCompleteness,
27
+ Convert as CommonConvert,
28
+ Validate,
29
+ ResourceTypeIndex,
30
+ ResourceTypeName,
31
+ ResourceValueMergeMethod,
32
+ ResourceId
33
+ } from '../common';
34
+
35
+ /**
36
+ * Parameters used to validate a {@link ResourceJson.Json.ILooseResourceCandidateDecl | resource candidate declaration}.
37
+ * @public
38
+ */
39
+ export interface IResourceCandidateValidationProperties {
40
+ /**
41
+ * {@inheritdoc ResourceJson.Json.ILooseResourceCandidateDecl.id}
42
+ * @public
43
+ */
44
+ id: ResourceId;
45
+
46
+ /**
47
+ * Describes how complete the candidate value is.
48
+ * @public
49
+ */
50
+ completeness: CandidateCompleteness;
51
+
52
+ /**
53
+ * {@inheritdoc ResourceJson.Json.ILooseResourceCandidateDecl.json}
54
+ * @public
55
+ */
56
+ json: JsonValue;
57
+
58
+ /**
59
+ * {@inheritdoc ResourceJson.Json.ILooseResourceCandidateDecl.mergeMethod}
60
+ * @public
61
+ */
62
+ mergeMethod: ResourceValueMergeMethod;
63
+ }
64
+
65
+ /**
66
+ * Interface for a resource type. Resource types are responsible for
67
+ * validating and converting JSON values into the appropriate strongly-typed
68
+ * resource value.
69
+ * @public
70
+ */
71
+ export interface IResourceType<T = unknown> extends ICollectible<ResourceTypeName, ResourceTypeIndex> {
72
+ /**
73
+ * The key for this resource type.
74
+ */
75
+ readonly key: ResourceTypeName;
76
+
77
+ /**
78
+ * The index for this resource type.
79
+ */
80
+ readonly index: ResourceTypeIndex | undefined;
81
+
82
+ /**
83
+ * Validates properties of a {@link ResourceJson.Json.ILooseResourceCandidateDecl | resource candidate declaration} for
84
+ * a resource instance value.
85
+ * @param props - The {@link ResourceTypes.IResourceCandidateValidationProperties | properties } to validate.
86
+ * @returns `Success` with the strongly-typed resource value if the JSON and merge method
87
+ * are valid, `Failure` with an error message otherwise.
88
+ * @public
89
+ */
90
+ validateDeclaration(props: IResourceCandidateValidationProperties): Result<T | Partial<T>>;
91
+
92
+ /**
93
+ * Validates a JSON value for use as a partial resource instance value.
94
+ * @param json - The JSON value to validate.
95
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
96
+ * @returns `Success` with the strongly-typed partial resource value if the JSON is valid,
97
+ * `Failure` with an error message otherwise.
98
+ * @public
99
+ */
100
+ validate(json: JsonValue, completeness: CandidateCompleteness): Result<Partial<T>>;
101
+
102
+ /**
103
+ * Validates a JSON value for use as a complete resource instance value.
104
+ * @param json - The JSON value to validate.
105
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
106
+ * @returns `Success` with the strongly-typed resource value if the JSON is valid,
107
+ * `Failure` with an error message otherwise.
108
+ * @public
109
+ */
110
+ validate(json: JsonValue, completeness: 'full'): Result<T>;
111
+
112
+ /**
113
+ * Validates a JSON value for use as a partial resource instance value.
114
+ * @param json - The JSON value to validate.
115
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
116
+ * @returns `Success` with the strongly-typed partial resource value if the JSON is valid,
117
+ * `Failure` with an error message otherwise.
118
+ * @public
119
+ */
120
+ validate(json: JsonValue, completeness: 'partial'): Result<Partial<T>>;
121
+
122
+ /**
123
+ * Sets the index for this resource type. Once set, the index cannot be changed.
124
+ */
125
+ setIndex(index: number): Result<ResourceTypeIndex>;
126
+ }
127
+
128
+ /**
129
+ * Abstract base class for resource types which are responsible for
130
+ * validating and converting JSON values into the appropriate strongly-typed
131
+ * resource value.
132
+ * @public
133
+ */
134
+ export abstract class ResourceType<T = unknown> implements IResourceType<T> {
135
+ private _collectible: Collections.Collectible<ResourceTypeName, ResourceTypeIndex>;
136
+ /**
137
+ * {@inheritdoc ResourceTypes.IResourceType.key}
138
+ */
139
+ public get key(): ResourceTypeName {
140
+ return this._collectible.key;
141
+ }
142
+
143
+ /**
144
+ * {@inheritdoc ResourceTypes.IResourceType.index}
145
+ */
146
+ public get index(): ResourceTypeIndex | undefined {
147
+ return this._collectible.index;
148
+ }
149
+
150
+ protected constructor(key: ResourceTypeName, index?: number) {
151
+ this._collectible = new Collections.Collectible<ResourceTypeName, ResourceTypeIndex>({
152
+ key,
153
+ /* c8 ignore next 1 - coverage having a rough time */
154
+ index: index !== undefined ? Validate.toResourceTypeIndex(index).orThrow() : undefined,
155
+ indexConverter: CommonConvert.resourceTypeIndex
156
+ });
157
+ }
158
+
159
+ /**
160
+ * Validates properties of a {@link ResourceJson.Json.ILooseResourceCandidateDecl | resource candidate declaration} for
161
+ * a resource instance value.
162
+ * @param props - The {@link ResourceTypes.IResourceCandidateValidationProperties | properties } to validate.
163
+ * @returns `Success` with the strongly-typed resource value if the JSON and merge method
164
+ * are valid, `Failure` with an error message otherwise.
165
+ * @public
166
+ */
167
+ public abstract validateDeclaration(props: IResourceCandidateValidationProperties): Result<T | Partial<T>>;
168
+
169
+ /**
170
+ * Validates a JSON value for use as a partial resource instance value.
171
+ * @param json - The JSON value to validate.
172
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
173
+ * @returns `Success` with the strongly-typed partial resource value if the JSON is valid,
174
+ * `Failure` with an error message otherwise.
175
+ * @public
176
+ */
177
+ public abstract validate(json: JsonValue, completeness: CandidateCompleteness): Result<Partial<T>>;
178
+
179
+ /**
180
+ * Validates a JSON value for use as a complete resource instance value.
181
+ * @param json - The JSON value to validate.
182
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
183
+ * @returns `Success` with the strongly-typed resource value if the JSON is valid,
184
+ * `Failure` with an error message otherwise.
185
+ * @public
186
+ */
187
+ public abstract validate(json: JsonValue, completeness: 'full'): Result<T>;
188
+
189
+ /**
190
+ * Validates a JSON value for use as a partial resource instance value.
191
+ * @param json - The JSON value to validate.
192
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
193
+ * @returns `Success` with the strongly-typed partial resource value if the JSON is valid,
194
+ * `Failure` with an error message otherwise.
195
+ * @public
196
+ */
197
+ public abstract validate(json: JsonValue, completeness: 'partial'): Result<Partial<T>>;
198
+
199
+ /**
200
+ * Validates a JSON value for use as a full or partial resource instance value.
201
+ * @param json - The JSON value to validate.
202
+ * @param completeness - Describes {@link CandidateCompleteness | how complete} the candidate value is.
203
+ * @returns `Success` with the strongly-typed full or partial resource value if
204
+ * the JSON is valid, `Failure` with an error message otherwise.
205
+ * @public
206
+ */
207
+ public abstract validate(json: JsonValue, completeness?: CandidateCompleteness): Result<T | Partial<T>>;
208
+
209
+ /**
210
+ * Sets the index for this resource type. Once set, the index cannot be changed.
211
+ */
212
+ public setIndex(index: number): Result<ResourceTypeIndex> {
213
+ return this._collectible.setIndex(index);
214
+ }
215
+ }
@@ -0,0 +1,79 @@
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, fail, succeed, ValidatingCollector, captureResult } from '@fgv/ts-utils';
24
+ import { ResourceType } from './resourceType';
25
+ import { Convert as CommonConvert, ResourceTypeName } from '../common';
26
+
27
+ /**
28
+ * Parameters for creating a {@link ResourceTypes.ResourceTypeCollector | ResourceTypeCollector}.
29
+ * @public
30
+ */
31
+ export interface IResourceCollectorCreateParams {
32
+ resourceTypes?: ResourceType[];
33
+ }
34
+
35
+ /**
36
+ * Map {@link ResourceTypeName | resource type names} to {@link ResourceTypes.ResourceType | resource types}.
37
+ * @public
38
+ */
39
+ export class ResourceTypeCollector extends ValidatingCollector<ResourceType> {
40
+ protected constructor({ resourceTypes }: IResourceCollectorCreateParams) {
41
+ /* c8 ignore next 1 - coverage having a rough day */
42
+ resourceTypes = resourceTypes ?? [];
43
+
44
+ super({
45
+ converters: new Collections.KeyValueConverters<ResourceTypeName, ResourceType>({
46
+ key: CommonConvert.resourceTypeName,
47
+ value: (from: unknown) => this._toResourceType(from)
48
+ })
49
+ });
50
+ resourceTypes.forEach((resourceType) => {
51
+ this.add(resourceType).orThrow();
52
+ });
53
+ }
54
+
55
+ /**
56
+ * Creates a new {@link ResourceTypes.ResourceTypeCollector | ResourceTypeCollector}.
57
+ * @param params - Optional for creating the new collector.
58
+ * @returns `Success` with the new instance, or `Failure` with an error
59
+ * message if the collector could not be created.
60
+ */
61
+ public static create(params?: IResourceCollectorCreateParams): Result<ResourceTypeCollector> {
62
+ /* c8 ignore next 1 - coverage having a rough day */
63
+ params = params ?? {};
64
+ return captureResult(() => new ResourceTypeCollector(params));
65
+ }
66
+
67
+ protected _toResourceType(from: unknown): Result<ResourceType> {
68
+ if (from instanceof ResourceType) {
69
+ return succeed(from);
70
+ }
71
+ return fail('Not a resource type.');
72
+ }
73
+ }
74
+
75
+ /**
76
+ * A read-only version of {@link ResourceTypes.ResourceTypeCollector | ResourceTypeCollector}.
77
+ * @public
78
+ */
79
+ export type ReadOnlyResourceTypeCollector = Collections.IReadOnlyValidatingCollector<ResourceType>;