@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,92 @@
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
+ * @internal
25
+ */
26
+ export const identifier: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*$/;
27
+
28
+ /**
29
+ * @internal
30
+ */
31
+ export const segmentedIdentifier: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*(\.[a-zA-Z_][a-zA-Z0-9_\-]*)*$/;
32
+
33
+ /**
34
+ * @internal
35
+ */
36
+ export const identifierList: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*(,[a-zA-Z_][a-zA-Z0-9_\-]*)*$/;
37
+
38
+ /**
39
+ * The format of a {@link ConditionKey | condition key} is:
40
+ * <qualifierName>-[<value>][\@<priority>](<scoreAsDefault>) where operator is `matches`, or
41
+ * <qualifierName>-<operator>-[<value>][\@<priority>](<scoreAsDefault>)
42
+ * @internal
43
+ */
44
+ export const conditionKey: RegExp =
45
+ /^[a-zA-Z_][a-zA-Z0-9_\-]*(-matches)?-\[.*\](?:@[0-9]{1,4})?(?:\([01](?:\.[0-9]+)?\))?$/;
46
+
47
+ /**
48
+ * A {@link ConditionToken | condition token} is a comma-separated list of one or more
49
+ * condition specifiers, where a condition specifier has either the form
50
+ * `<qualifierName>=<value>` or `<value>`.
51
+ * @internal
52
+ */
53
+ export const conditionToken: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*(?:=[a-zA-Z0-9_\-]+)?$/;
54
+
55
+ /**
56
+ * A {@link ContextToken | context token} has the form `<qualifierName>=<value>` or `<value>`.
57
+ * Context tokens allow broader character set including commas for comma-separated values.
58
+ * @internal
59
+ */
60
+ export const contextToken: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*(?:=[a-zA-Z0-9_\-,\s]+)?$/;
61
+
62
+ /**
63
+ * @internal
64
+ */
65
+ export const conditionSetHash: RegExp = /^[a-zA-Z0-9]{8}$/;
66
+
67
+ /**
68
+ * @internal
69
+ */
70
+ export const decisionKey: RegExp = /^[a-zA-Z0-9]{8}(?:\+[a-zA-Z0-9]{8})*(?:\|[a-zA-Z0-9]{8})?$/;
71
+
72
+ /**
73
+ * A {@link QualifierDefaultValueToken | qualifier default value token} has the form
74
+ * `<qualifierName>=<value>` or `<qualifierName>=` (to remove default).
75
+ * Default values allow broader character set including commas for comma-separated values.
76
+ * @internal
77
+ */
78
+ export const qualifierDefaultValueToken: RegExp = /^[a-zA-Z_][a-zA-Z0-9_\-]*=(?:[a-zA-Z0-9_\-,\s]*)?$/;
79
+
80
+ /**
81
+ * A {@link QualifierDefaultValuesToken | qualifier default values token} is a
82
+ * pipe-separated list of one or more qualifier default value tokens.
83
+ * Uses "|" as separator to avoid conflicts with comma-separated values within defaults.
84
+ * @internal
85
+ */
86
+ export const qualifierDefaultValuesToken: RegExp =
87
+ /^[a-zA-Z_][a-zA-Z0-9_\-]*=(?:[a-zA-Z0-9_\-,\s]*)?(?:\|[a-zA-Z_][a-zA-Z0-9_\-]*=(?:[a-zA-Z0-9_\-,\s]*)?)*$/;
88
+
89
+ /**
90
+ * @internal
91
+ */
92
+ export const territoryCode: RegExp = /^[a-zA-Z]{2}$/;
@@ -0,0 +1,170 @@
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, succeed, Result } from '@fgv/ts-utils';
24
+ import { ResourceId, ResourceIndex, ResourceName, ResourceTypeIndex, ResourceTypeName } from '../resources';
25
+ import { identifier, segmentedIdentifier } from './regularExpressions';
26
+
27
+ /**
28
+ * Checks if the given name is a valid resource name.
29
+ *
30
+ * @param name - The name to validate.
31
+ * @returns `true` if the name is a valid resource name, otherwise `false`.
32
+ * @public
33
+ */
34
+ export function isValidResourceName(name: string): name is ResourceName {
35
+ return identifier.test(name);
36
+ }
37
+
38
+ /**
39
+ * Checks if the given ID is a valid resource ID.
40
+ *
41
+ * @param id - The ID to validate.
42
+ * @returns `true` if the ID is a valid resource ID, otherwise `false`.
43
+ * @public
44
+ */
45
+ export function isValidResourceId(id: string): id is ResourceId {
46
+ return segmentedIdentifier.test(id);
47
+ }
48
+
49
+ /**
50
+ * Checks if the given index is a valid resource index.
51
+ *
52
+ * @param index - The index to validate.
53
+ * @returns `true` if the index is a valid resource index, otherwise `false`.
54
+ * @public
55
+ */
56
+ export function isValidResourceIndex(index: number): index is ResourceIndex {
57
+ return index >= 0;
58
+ }
59
+
60
+ /**
61
+ * Checks if the given name is a valid resource type name.
62
+ *
63
+ * @param name - The name to validate.
64
+ * @returns `true` if the name is a valid resource type name, otherwise `false`.
65
+ * @public
66
+ */
67
+ export function isValidResourceTypeName(name: string): name is ResourceTypeName {
68
+ return identifier.test(name);
69
+ }
70
+
71
+ /**
72
+ * Checks if the given index is a valid resource type index.
73
+ *
74
+ * @param index - The index to validate.
75
+ * @returns `true` if the index is a valid resource type index, otherwise `false`.
76
+ * @public
77
+ */
78
+ export function isValidResourceTypeIndex(index: number): index is ResourceTypeIndex {
79
+ return index >= 0;
80
+ }
81
+
82
+ /**
83
+ * Converts a string to a {@link ResourceName | resource name}.
84
+ *
85
+ * @param id - The string to convert.
86
+ * @returns `Success` with the converted name if valid, or `Failure` with an error message
87
+ * if not.
88
+ * @public
89
+ */
90
+ export function toResourceName(name: string): Result<ResourceName> {
91
+ /* c8 ignore next 3 - coverage having issues */
92
+ if (!isValidResourceName(name)) {
93
+ return fail(`${name}: not a valid resource name.`);
94
+ }
95
+ return succeed(name);
96
+ }
97
+
98
+ /**
99
+ * Converts a string to a {@link ResourceId | resource ID}.
100
+ *
101
+ * @param id - The string to convert.
102
+ * @returns `Success` with the converted ID if valid, or `Failure` with an error message
103
+ * if not.
104
+ * @public
105
+ */
106
+ export function toResourceId(id: string): Result<ResourceId> {
107
+ if (!isValidResourceId(id)) {
108
+ return fail(`${id}: not a valid resource ID.`);
109
+ }
110
+ return succeed(id);
111
+ }
112
+
113
+ /**
114
+ * Converts an optional string to an optional {@link ResourceId | resource ID}.
115
+ *
116
+ * @param id - The string to convert.
117
+ * @returns `Success` with the converted ID if valid, or `Failure` with an error message
118
+ * if not.
119
+ * @public
120
+ */
121
+ export function toOptionalResourceId(id?: string): Result<ResourceId | undefined> {
122
+ return id ? toResourceId(id) : succeed(undefined);
123
+ }
124
+
125
+ /**
126
+ * Converts a number to a {@link ResourceIndex | resource index}.
127
+ *
128
+ * @param index - The number to convert.
129
+ * @returns `Success` with the converted index if valid, or `Failure` with an error message
130
+ * if not.
131
+ * @public
132
+ */
133
+ export function toResourceIndex(index: number): Result<ResourceIndex> {
134
+ if (!isValidResourceIndex(index)) {
135
+ return fail(`${index}: not a valid resource index.`);
136
+ }
137
+ return succeed(index);
138
+ }
139
+
140
+ /**
141
+ * Converts a string to a {@link ResourceTypeName | resource type name}.
142
+ *
143
+ * @param name - The string to convert.
144
+ * @returns `Success` with the converted name if valid, or `Failure` with an error message
145
+ * if not.
146
+ * @public
147
+ */
148
+ export function toResourceTypeName(name: string): Result<ResourceTypeName> {
149
+ /* c8 ignore next 3 - coverage having issues */
150
+ if (!isValidResourceTypeName(name)) {
151
+ return fail(`${name}: not a valid resource type name.`);
152
+ }
153
+ return succeed(name);
154
+ }
155
+
156
+ /**
157
+ * Converts a number to a {@link ResourceTypeIndex | resource type index}.
158
+ *
159
+ * @param index - The number to convert.
160
+ * @returns `Success` with the converted index if valid, or `Failure` with an error message
161
+ * if not.
162
+ * @public
163
+ */
164
+ export function toResourceTypeIndex(index: number): Result<ResourceTypeIndex> {
165
+ /* c8 ignore next 3 - coverage having issues */
166
+ if (!isValidResourceTypeIndex(index)) {
167
+ return fail(`${index}: not a valid resource type index.`);
168
+ }
169
+ return succeed(index);
170
+ }
@@ -0,0 +1,351 @@
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, Collections, Result, fail } from '@fgv/ts-utils';
24
+ import {
25
+ Convert as CommonConvert,
26
+ ConditionIndex,
27
+ ConditionKey,
28
+ ConditionOperator,
29
+ ConditionPriority,
30
+ ConditionToken,
31
+ NoMatch,
32
+ QualifierConditionValue,
33
+ QualifierMatchScore,
34
+ Validate
35
+ } from '../common';
36
+ import { Qualifier } from '../qualifiers';
37
+ import { IValidatedConditionDecl } from './conditionDecls';
38
+ import * as ResourceJson from '../resource-json';
39
+ import * as Context from '../context';
40
+
41
+ // eslint-disable-next-line @rushstack/typedef-var
42
+ const scoreFormatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 3 });
43
+
44
+ /**
45
+ * Represents a single condition applied to some resource instance.
46
+ * @public
47
+ */
48
+ export class Condition implements IValidatedConditionDecl {
49
+ /**
50
+ * The {@link Qualifiers.Qualifier | qualifier} used in this condition.
51
+ */
52
+ public readonly qualifier: Qualifier;
53
+
54
+ /**
55
+ * The value to be matched in this condition.
56
+ */
57
+ public readonly value: QualifierConditionValue;
58
+
59
+ /**
60
+ * The {@link ConditionOperator | operator} used when matching context value to condition value.
61
+ */
62
+ public readonly operator: ConditionOperator;
63
+
64
+ /**
65
+ * The {@link ConditionPriority | relative priority} of this condition.
66
+ */
67
+ public readonly priority: ConditionPriority;
68
+
69
+ /**
70
+ * The {@link QualifierMatchScore | score} to be used when this condition is the default.
71
+ */
72
+ public readonly scoreAsDefault?: QualifierMatchScore;
73
+
74
+ protected _collectible: Collections.Collectible<ConditionKey, ConditionIndex>;
75
+
76
+ /**
77
+ * Constructs a new {@link Conditions.Condition | Condition} object.
78
+ * @param qualifier - The {@link Qualifiers.Qualifier | qualifier} used in this condition.
79
+ * @param value - The value to be matched in this condition.
80
+ * @param operator - The {@link ConditionOperator | operator} used when matching context value to condition value.
81
+ * @param priority - The {@link ConditionPriority | relative priority} of this condition.
82
+ * @param scoreAsDefault - The {@link QualifierMatchScore | score} to be used when this condition is the default.
83
+ * @param index - The index of this condition.
84
+ * @public
85
+ */
86
+ protected constructor({
87
+ qualifier,
88
+ value,
89
+ operator,
90
+ priority,
91
+ scoreAsDefault,
92
+ index
93
+ }: IValidatedConditionDecl) {
94
+ if (scoreAsDefault === undefined && qualifier.defaultValue !== undefined) {
95
+ const defaultMatch = qualifier.type.matches(value, qualifier.defaultValue, 'matches');
96
+ if (defaultMatch !== NoMatch) {
97
+ scoreAsDefault = defaultMatch;
98
+ }
99
+ }
100
+ this.qualifier = qualifier;
101
+ this.operator = operator;
102
+ this.value = qualifier.validateCondition(value, operator).orThrow();
103
+ this.priority = priority;
104
+ this.scoreAsDefault = scoreAsDefault;
105
+ this._collectible = new Collections.Collectible({
106
+ key: this.toKey(),
107
+ index,
108
+ indexConverter: CommonConvert.conditionIndex
109
+ });
110
+ }
111
+
112
+ public get key(): ConditionKey {
113
+ return this._collectible.key;
114
+ }
115
+
116
+ public get index(): ConditionIndex | undefined {
117
+ return this._collectible.index;
118
+ }
119
+
120
+ public setIndex(index: ConditionIndex): Result<ConditionIndex> {
121
+ return this._collectible.setIndex(index);
122
+ }
123
+
124
+ /**
125
+ * Creates a new {@link Conditions.Condition | Condition} object from the supplied
126
+ * {@link Conditions.IValidatedConditionDecl | validated condition declaration}.
127
+ * @param decl - The {@link Conditions.IValidatedConditionDecl | validated condition declaration}
128
+ * describing the condition to create.
129
+ * @returns `Success` with the new {@link Conditions.Condition | Condition} if successful,
130
+ * `Failure` otherwise.
131
+ * @public
132
+ */
133
+ public static create(decl: IValidatedConditionDecl): Result<Condition> {
134
+ return captureResult(() => new Condition(decl));
135
+ }
136
+
137
+ /**
138
+ * Determines if this condition matches the supplied {@link Context.IValidatedContextDecl | validated context}.
139
+ * @param context - The {@link Context.IValidatedContextDecl | context} to match against.
140
+ * @param options - The {@link Context.IContextMatchOptions | options} to use when matching the context.
141
+ * @returns A {@link QualifierMatchScore | match score} indicating match quality if the condition is present
142
+ * in the context to be matched, `undefined` otherwise.
143
+ * @remarks
144
+ * If {@link Context.IContextMatchOptions.partialContextMatch | `options.partialContextMatch``} is `true`, then
145
+ * the method will return `undefined` if the corresponding qualifier is not present in the context.
146
+ */
147
+ public getContextMatch(
148
+ context: Context.IValidatedContextDecl,
149
+ options?: Context.IContextMatchOptions
150
+ ): QualifierMatchScore | undefined {
151
+ options = options ?? {};
152
+ if (this.qualifier.name in context) {
153
+ const contextValue = context[this.qualifier.name];
154
+ const match = this.qualifier.type.matches(this.value, contextValue, this.operator);
155
+ if (match === NoMatch && options.acceptDefaultScore === true && this.scoreAsDefault !== undefined) {
156
+ return this.scoreAsDefault;
157
+ }
158
+ return match;
159
+ }
160
+ return options.partialContextMatch === true ? undefined : NoMatch;
161
+ }
162
+
163
+ /**
164
+ * Determines if this condition can match the supplied context, even if the context is partial.
165
+ *
166
+ * Returns true if:
167
+ * - The qualifier specified in the condition is not present in the context
168
+ * - The qualifier is present and matches the condition
169
+ *
170
+ * Returns false if:
171
+ * - The qualifier is present in the context and does not match the condition
172
+ *
173
+ * @param context - The context to match against.
174
+ * @param options - Options to use when matching the context.
175
+ * @returns `true` if the condition can match the (possibly partial) context, `false` otherwise.
176
+ * @public
177
+ */
178
+ public canMatchPartialContext(
179
+ context: Context.IValidatedContextDecl,
180
+ options?: Context.IContextMatchOptions
181
+ ): boolean {
182
+ /* c8 ignore next 1 - defense in depth */
183
+ const scoreAsDefault = this.scoreAsDefault ?? NoMatch;
184
+ if (!(this.qualifier.name in context) || scoreAsDefault > NoMatch) {
185
+ return true;
186
+ }
187
+ return this.qualifier.type.isPotentialMatch(this.value, context[this.qualifier.name]);
188
+ }
189
+
190
+ /**
191
+ * Compares two conditions for sorting purposes.
192
+ * @param c1 - The first {@link Conditions.Condition | condition} to compare.
193
+ * @param c2 - The second {@link Conditions.Condition | condition} to compare.
194
+ * @returns A negative number if c1 should come before c2, a positive number
195
+ * if c2 should come before c1, or zero if they are equivalent.
196
+ * @public
197
+ */
198
+ public static compare(c1: Condition, c2: Condition): number {
199
+ let diff = c1.priority - c2.priority;
200
+ diff = diff === 0 ? (c1.scoreAsDefault ?? 0) - (c2.scoreAsDefault ?? 0) : diff;
201
+ diff = diff === 0 ? c1.qualifier.name.localeCompare(c2.qualifier.name) : diff;
202
+ diff = diff === 0 ? c1.value.localeCompare(c2.value) : diff;
203
+ return diff;
204
+ }
205
+
206
+ /**
207
+ * Gets a {@link ConditionToken | condition token} for this condition, if possible.
208
+ * It is not possible to get a token for a condition with an operator other than `matches`,
209
+ * with other-than-default priority, or with a name or value that contains other than alphanumeric
210
+ * characters, underscore or non-leading hyphen.
211
+ * @param terse - if `true` and if the qualifier token is optional, the token will be omitted
212
+ * from the generated {@link ConditionToken | condition token}.
213
+ * @returns
214
+ */
215
+ public toToken(terse?: boolean): Result<ConditionToken> {
216
+ /* c8 ignore next 3 - defense in depth very difficult to induce */
217
+ if (this.operator !== 'matches') {
218
+ return fail(`${this.operator}: cannot create condition token for operator other than 'matches'`);
219
+ }
220
+ if (this.priority !== this.qualifier.defaultPriority) {
221
+ return fail(`${this.priority}: cannot create condition token for non-default priority`);
222
+ }
223
+ if (terse && this.qualifier.tokenIsOptional) {
224
+ return Validate.toConditionToken(this.value);
225
+ }
226
+ /* c8 ignore next 1 - coverage having a bad day */
227
+ const name = this.qualifier.token ?? this.qualifier.name;
228
+ return Validate.toConditionToken(`${name}=${this.value}`);
229
+ }
230
+
231
+ /**
232
+ * Gets the {@link ConditionKey | key} for this condition.
233
+ * @returns -
234
+ */
235
+ public toKey(): ConditionKey {
236
+ return Condition.getKeyForDecl(this).orThrow();
237
+ }
238
+
239
+ /**
240
+ * Get a human-readable string representation of the condition.
241
+ * @returns A string representation of the condition.
242
+ * @public
243
+ */
244
+ public toString(): string {
245
+ return this.toKey();
246
+ }
247
+
248
+ /**
249
+ * Gets the {@link ResourceJson.Json.IChildConditionDecl | child condition declaration} for this condition.
250
+ * @param options - The {@link ResourceJson.Helpers.IDeclarationOptions | options} to use when creating the child
251
+ * condition declaration.
252
+ * @returns The {@link ResourceJson.Json.IChildConditionDecl | child condition declaration} for this condition.
253
+ * @public
254
+ */
255
+ public toChildConditionDecl(
256
+ options?: ResourceJson.Helpers.IDeclarationOptions
257
+ ): ResourceJson.Json.IChildConditionDecl {
258
+ const showDefaults = options?.showDefaults === true;
259
+ return {
260
+ value: this.value,
261
+ /* c8 ignore next 1 - not really possible to reproduce right now */
262
+ ...(showDefaults || this.operator !== 'matches' ? { operator: this.operator } : {}),
263
+ ...(showDefaults || this.priority !== this.qualifier.defaultPriority
264
+ ? { priority: this.priority }
265
+ : {}),
266
+ ...(this.scoreAsDefault ? { scoreAsDefault: this.scoreAsDefault } : {})
267
+ };
268
+ }
269
+
270
+ /**
271
+ * Gets the value for this condition, or the {@link ResourceJson.Json.IChildConditionDecl | child condition declaration}
272
+ * if the condition has non-default operator, priority or a score as default.
273
+ * @param options - The {@link ResourceJson.Helpers.IDeclarationOptions | options} to use when creating the child
274
+ * condition declaration.
275
+ * @returns A string value for this condition, or the {@link ResourceJson.Json.IChildConditionDecl | child condition declaration}
276
+ * if the condition has non-default operator, priority or a score as default.
277
+ */
278
+ public toValueOrChildConditionDecl(
279
+ options?: ResourceJson.Helpers.IDeclarationOptions
280
+ ): string | ResourceJson.Json.IChildConditionDecl {
281
+ if (
282
+ options?.showDefaults !== true &&
283
+ this.operator === 'matches' &&
284
+ this.priority === this.qualifier.defaultPriority &&
285
+ this.scoreAsDefault === undefined
286
+ ) {
287
+ return this.value;
288
+ }
289
+ /* c8 ignore next 2 - unreachable: matches is the only real operator in practice */
290
+ return this.toChildConditionDecl(options);
291
+ }
292
+
293
+ /**
294
+ * Gets the {@link ResourceJson.Json.ILooseConditionDecl | loose condition declaration} for this condition.
295
+ * @param options - The {@link ResourceJson.Helpers.IDeclarationOptions | options} to use when creating the loose
296
+ * condition declaration.
297
+ * @returns The {@link ResourceJson.Json.ILooseConditionDecl | loose condition declaration} for this condition.
298
+ * @public
299
+ */
300
+ public toLooseConditionDecl(
301
+ options?: ResourceJson.Helpers.IDeclarationOptions
302
+ ): ResourceJson.Json.ILooseConditionDecl {
303
+ const showDefaults = options?.showDefaults === true;
304
+ return {
305
+ qualifierName: this.qualifier.name,
306
+ value: this.value,
307
+ /* c8 ignore next 1 - not really possible to reproduce right now */
308
+ ...(showDefaults || this.operator !== 'matches' ? { operator: this.operator } : {}),
309
+ ...(showDefaults || this.priority !== this.qualifier.defaultPriority
310
+ ? { priority: this.priority }
311
+ : {}),
312
+ ...(this.scoreAsDefault ? { scoreAsDefault: this.scoreAsDefault } : {})
313
+ };
314
+ }
315
+
316
+ /**
317
+ * Converts this condition to a compiled condition representation.
318
+ * @param options - Optional compilation options controlling the output format.
319
+ * @returns A compiled condition object that can be used for serialization or runtime processing.
320
+ * @public
321
+ */
322
+ public toCompiled(
323
+ options?: ResourceJson.Compiled.ICompiledResourceOptions
324
+ ): ResourceJson.Compiled.ICompiledCondition {
325
+ /* c8 ignore next 1 - defense in depth */
326
+ const operator = this.operator === 'matches' ? undefined : this.operator;
327
+ return {
328
+ qualifierIndex: this.qualifier.index!,
329
+ operator,
330
+ value: this.value,
331
+ priority: this.priority,
332
+ scoreAsDefault: this.scoreAsDefault,
333
+ ...(options?.includeMetadata === true ? { metadata: { key: this.key } } : {})
334
+ };
335
+ }
336
+
337
+ /**
338
+ * Gets the {@link ConditionKey | condition key} for a supplied {@link Conditions.IValidatedConditionDecl | condition declaration}.
339
+ * @param decl - The {@link Conditions.IValidatedConditionDecl | condition declaration} for which to get the key.
340
+ * @returns `Success` with the condition key if successful, `Failure` otherwise.
341
+ * @public
342
+ */
343
+ public static getKeyForDecl(decl: IValidatedConditionDecl): Result<ConditionKey> {
344
+ const scoreAsDefault = decl.scoreAsDefault ? `(${scoreFormatter.format(decl.scoreAsDefault)})` : '';
345
+ const key =
346
+ decl.operator === 'matches'
347
+ ? `${decl.qualifier.name}-[${decl.value}]@${decl.priority}${scoreAsDefault}`
348
+ : `${decl.qualifier.name}-${decl.operator}-[${decl.value}]@${decl.priority}${scoreAsDefault}`;
349
+ return Validate.toConditionKey(key);
350
+ }
351
+ }