@fgv/ts-res 5.0.0-22 → 5.0.0-24

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 (288) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +665 -44
  3. package/lib/packlets/common/convert.d.ts +10 -0
  4. package/lib/packlets/common/convert.js +11 -1
  5. package/lib/packlets/common/resources.d.ts +14 -0
  6. package/lib/packlets/common/validate/regularExpressions.d.ts +4 -0
  7. package/lib/packlets/common/validate/regularExpressions.js +5 -1
  8. package/lib/packlets/common/validate/resources.d.ts +35 -1
  9. package/lib/packlets/common/validate/resources.js +54 -0
  10. package/lib/packlets/config/convert.js +1 -1
  11. package/lib/packlets/config/json.d.ts +1 -1
  12. package/lib/packlets/qualifier-types/config/convert.d.ts +22 -1
  13. package/lib/packlets/qualifier-types/config/convert.js +67 -2
  14. package/lib/packlets/qualifier-types/config/json.d.ts +11 -2
  15. package/lib/packlets/qualifier-types/helpers.d.ts +1 -2
  16. package/lib/packlets/qualifier-types/languageQualifierType.d.ts +27 -1
  17. package/lib/packlets/qualifier-types/languageQualifierType.js +75 -0
  18. package/lib/packlets/qualifier-types/literalQualifierType.d.ts +30 -4
  19. package/lib/packlets/qualifier-types/literalQualifierType.js +77 -0
  20. package/lib/packlets/qualifier-types/literalValueHierarchy.d.ts +6 -10
  21. package/lib/packlets/qualifier-types/literalValueHierarchy.js +10 -0
  22. package/lib/packlets/qualifier-types/qualifierType.d.ts +28 -0
  23. package/lib/packlets/qualifier-types/territoryQualifierType.d.ts +28 -4
  24. package/lib/packlets/qualifier-types/territoryQualifierType.js +77 -0
  25. package/lib/packlets/resource-json/compiled/convert.js +2 -1
  26. package/lib/packlets/resource-json/compiled/json.d.ts +6 -2
  27. package/lib/packlets/resource-types/jsonResourceType.d.ts +4 -0
  28. package/lib/packlets/resource-types/jsonResourceType.js +4 -0
  29. package/lib/packlets/resource-types/resourceType.d.ts +4 -0
  30. package/lib/packlets/resources/candidateValue.d.ts +92 -0
  31. package/lib/{test/unit/qualifier-types/testQualifierType.js → packlets/resources/candidateValue.js} +63 -24
  32. package/lib/packlets/resources/candidateValueCollector.d.ts +55 -0
  33. package/lib/packlets/resources/candidateValueCollector.js +96 -0
  34. package/lib/packlets/resources/index.d.ts +2 -0
  35. package/lib/packlets/resources/index.js +2 -0
  36. package/lib/packlets/resources/resource.js +2 -2
  37. package/lib/packlets/resources/resourceBuilder.d.ts +6 -0
  38. package/lib/packlets/resources/resourceBuilder.js +3 -1
  39. package/lib/packlets/resources/resourceCandidate.d.ts +10 -1
  40. package/lib/packlets/resources/resourceCandidate.js +11 -5
  41. package/lib/packlets/resources/resourceManagerBuilder.d.ts +7 -0
  42. package/lib/packlets/resources/resourceManagerBuilder.js +13 -6
  43. package/lib/packlets/runtime/compiledResourceCollection.d.ts +20 -8
  44. package/lib/packlets/runtime/compiledResourceCollection.js +25 -4
  45. package/lib/packlets/runtime/index.d.ts +1 -0
  46. package/lib/packlets/runtime/index.js +1 -0
  47. package/lib/packlets/runtime/resource-tree/common.d.ts +1 -1
  48. package/lib/packlets/runtime/resourceTreeResolver.d.ts +152 -0
  49. package/lib/packlets/runtime/resourceTreeResolver.js +222 -0
  50. package/package.json +12 -12
  51. package/.vscode/4.json +0 -3
  52. package/.vscode/launch.json +0 -16
  53. package/.vscode/settings.json +0 -3
  54. package/dist/ts-res.d.ts +0 -9713
  55. package/dist/tsdoc-metadata.json +0 -11
  56. package/lib/test/data/sample.json +0 -32
  57. package/lib/test/unit/bundle/bundleBuilder.test.d.ts +0 -2
  58. package/lib/test/unit/bundle/bundleLoader.test.d.ts +0 -2
  59. package/lib/test/unit/bundle/bundleUtils.test.d.ts +0 -2
  60. package/lib/test/unit/bundle/convert.test.d.ts +0 -2
  61. package/lib/test/unit/bundle/integration.test.d.ts +0 -2
  62. package/lib/test/unit/bundle/model.test.d.ts +0 -2
  63. package/lib/test/unit/bundle/normalization.test.d.ts +0 -2
  64. package/lib/test/unit/common/conditions.test.d.ts +0 -2
  65. package/lib/test/unit/common/helpers/conditions.test.d.ts +0 -2
  66. package/lib/test/unit/common/helpers/contexts.test.d.ts +0 -2
  67. package/lib/test/unit/common/helpers/qualifierDefaultValues.test.d.ts +0 -2
  68. package/lib/test/unit/common/resources.test.d.ts +0 -2
  69. package/lib/test/unit/conditions/condition.test.d.ts +0 -2
  70. package/lib/test/unit/conditions/conditionCollector.test.d.ts +0 -2
  71. package/lib/test/unit/conditions/conditionScoreAsDefault.test.d.ts +0 -2
  72. package/lib/test/unit/conditions/conditionSet.test.d.ts +0 -2
  73. package/lib/test/unit/conditions/conditionSetCollector.test.d.ts +0 -2
  74. package/lib/test/unit/conditions/conditionToken.test.d.ts +0 -2
  75. package/lib/test/unit/conditions/convert.test.d.ts +0 -2
  76. package/lib/test/unit/config/common.test.d.ts +0 -2
  77. package/lib/test/unit/config/convert.test.d.ts +0 -2
  78. package/lib/test/unit/config/predefined/default.test.d.ts +0 -2
  79. package/lib/test/unit/config/predefined/extended.test.d.ts +0 -2
  80. package/lib/test/unit/config/systemConfiguration.test.d.ts +0 -2
  81. package/lib/test/unit/config/systemConfigurationInitParams.test.d.ts +0 -2
  82. package/lib/test/unit/context/contextToken.test.d.ts +0 -2
  83. package/lib/test/unit/context/convert.test.d.ts +0 -2
  84. package/lib/test/unit/decisions/abstractDecision.test.d.ts +0 -2
  85. package/lib/test/unit/decisions/abstractDecisionCollector.test.d.ts +0 -2
  86. package/lib/test/unit/decisions/candidate.test.d.ts +0 -2
  87. package/lib/test/unit/decisions/concreteDecision.test.d.ts +0 -2
  88. package/lib/test/unit/decisions/decision.test.d.ts +0 -2
  89. package/lib/test/unit/import/collectionImporter.test.d.ts +0 -2
  90. package/lib/test/unit/import/fsItem.test.d.ts +0 -2
  91. package/lib/test/unit/import/fsItemImporter.test.d.ts +0 -2
  92. package/lib/test/unit/import/importContext.test.d.ts +0 -2
  93. package/lib/test/unit/import/importManager.test.d.ts +0 -2
  94. package/lib/test/unit/import/jsonImporter.test.d.ts +0 -2
  95. package/lib/test/unit/import/pathImporter.test.d.ts +0 -2
  96. package/lib/test/unit/qualifier-types/convert.test.d.ts +0 -2
  97. package/lib/test/unit/qualifier-types/helpers.test.d.ts +0 -2
  98. package/lib/test/unit/qualifier-types/languageQualifierType.test.d.ts +0 -2
  99. package/lib/test/unit/qualifier-types/literalQualifierType.test.d.ts +0 -2
  100. package/lib/test/unit/qualifier-types/literalValueHierarchy.test.d.ts +0 -2
  101. package/lib/test/unit/qualifier-types/qualifierType.test.d.ts +0 -2
  102. package/lib/test/unit/qualifier-types/qualifierTypeCollector.test.d.ts +0 -2
  103. package/lib/test/unit/qualifier-types/territoryQualifierType.test.d.ts +0 -2
  104. package/lib/test/unit/qualifier-types/testQualifierType.d.ts +0 -15
  105. package/lib/test/unit/qualifiers/convert.test.d.ts +0 -2
  106. package/lib/test/unit/qualifiers/qualifierCollector.test.d.ts +0 -2
  107. package/lib/test/unit/qualifiers/qualifierDefaultValue.test.d.ts +0 -2
  108. package/lib/test/unit/qualifiers/qualifierDefaultValueToken.test.d.ts +0 -2
  109. package/lib/test/unit/resource-json/convert.test.d.ts +0 -2
  110. package/lib/test/unit/resource-json/nameInheritance.test.d.ts +0 -2
  111. package/lib/test/unit/resource-json/resourceDeclCollection.test.d.ts +0 -2
  112. package/lib/test/unit/resource-json/resourceDeclTree.test.d.ts +0 -2
  113. package/lib/test/unit/resource-types/derivedResourceType.test.d.ts +0 -2
  114. package/lib/test/unit/resource-types/jsonResourceType.test.d.ts +0 -2
  115. package/lib/test/unit/resource-types/resourceTypeCollector.test.d.ts +0 -2
  116. package/lib/test/unit/resource-types/testDerivedResourceType.d.ts +0 -78
  117. package/lib/test/unit/resource-types/testDerivedResourceType.js +0 -110
  118. package/lib/test/unit/resources/candidateReducer.integration.test.d.ts +0 -2
  119. package/lib/test/unit/resources/candidateReducer.test.d.ts +0 -2
  120. package/lib/test/unit/resources/reduceCandidates.test.d.ts +0 -2
  121. package/lib/test/unit/resources/reduceQualifiers.comprehensive.test.d.ts +0 -2
  122. package/lib/test/unit/resources/reduceQualifiers.test.d.ts +0 -2
  123. package/lib/test/unit/resources/resource.test.d.ts +0 -2
  124. package/lib/test/unit/resources/resourceBuilder.test.d.ts +0 -2
  125. package/lib/test/unit/resources/resourceCandidate.test.d.ts +0 -2
  126. package/lib/test/unit/resources/resourceManagerBuilder.clone.test.d.ts +0 -2
  127. package/lib/test/unit/resources/resourceManagerBuilder.getBuiltResourceTree.test.d.ts +0 -2
  128. package/lib/test/unit/resources/resourceManagerBuilder.test.d.ts +0 -2
  129. package/lib/test/unit/runtime/cacheListener.test.d.ts +0 -2
  130. package/lib/test/unit/runtime/cacheMetrics.test.d.ts +0 -2
  131. package/lib/test/unit/runtime/compiledResourceCollection.test.d.ts +0 -2
  132. package/lib/test/unit/runtime/conditionSetResolutionResult.comprehensive.test.d.ts +0 -2
  133. package/lib/test/unit/runtime/conditionSetResolutionResult.test.d.ts +0 -2
  134. package/lib/test/unit/runtime/context/contextQualifierProvider.test.d.ts +0 -2
  135. package/lib/test/unit/runtime/context/contextQualifierProviderValidator.test.d.ts +0 -2
  136. package/lib/test/unit/runtime/context/simpleContextQualifierProvider.test.d.ts +0 -2
  137. package/lib/test/unit/runtime/context/validatingSimpleContextQualifierProvider.test.d.ts +0 -2
  138. package/lib/test/unit/runtime/resource-tree/readOnlyResourceTree.test.d.ts +0 -2
  139. package/lib/test/unit/runtime/resource-tree/resourceTreeChildren.test.d.ts +0 -2
  140. package/lib/test/unit/runtime/resource-tree/resourceTreeChildrenValidator.test.d.ts +0 -2
  141. package/lib/test/unit/runtime/resourceResolver.coverage.test.d.ts +0 -2
  142. package/lib/test/unit/runtime/resourceResolver.defaultResolution.test.d.ts +0 -2
  143. package/lib/test/unit/runtime/resourceResolver.newFeatures.test.d.ts +0 -2
  144. package/lib/test/unit/runtime/resourceResolver.test.d.ts +0 -2
  145. package/lib/test/unit/runtime/validate.test.d.ts +0 -2
  146. package/lib/test/unit/zip-archive/convert.test.d.ts +0 -2
  147. package/lib/test/unit/zip-archive/json.test.d.ts +0 -2
  148. package/lib/test/unit/zip-archive/zipArchiveCreator.test.d.ts +0 -2
  149. package/lib/test/unit/zip-archive/zipArchiveFormat.test.d.ts +0 -2
  150. package/lib/test/unit/zip-archive/zipArchiveIdempotency.test.d.ts +0 -2
  151. package/lib/test/unit/zip-archive/zipArchiveLoader.test.d.ts +0 -2
  152. package/src/index.ts +0 -75
  153. package/src/packlets/bundle/bundleBuilder.ts +0 -159
  154. package/src/packlets/bundle/bundleLoader.ts +0 -157
  155. package/src/packlets/bundle/bundleNormalizer.ts +0 -173
  156. package/src/packlets/bundle/bundleUtils.ts +0 -142
  157. package/src/packlets/bundle/convert.ts +0 -87
  158. package/src/packlets/bundle/index.ts +0 -52
  159. package/src/packlets/bundle/model.ts +0 -138
  160. package/src/packlets/common/conditions.ts +0 -226
  161. package/src/packlets/common/convert.ts +0 -184
  162. package/src/packlets/common/helpers/conditions.ts +0 -84
  163. package/src/packlets/common/helpers/context.ts +0 -88
  164. package/src/packlets/common/helpers/index.ts +0 -26
  165. package/src/packlets/common/helpers/qualifierDefaultValues.ts +0 -91
  166. package/src/packlets/common/helpers/resources.ts +0 -96
  167. package/src/packlets/common/index.ts +0 -30
  168. package/src/packlets/common/resources.ts +0 -105
  169. package/src/packlets/common/validate/conditions.ts +0 -595
  170. package/src/packlets/common/validate/index.ts +0 -27
  171. package/src/packlets/common/validate/regularExpressions.ts +0 -92
  172. package/src/packlets/common/validate/resources.ts +0 -170
  173. package/src/packlets/conditions/condition.ts +0 -351
  174. package/src/packlets/conditions/conditionCollector.ts +0 -103
  175. package/src/packlets/conditions/conditionDecls.ts +0 -50
  176. package/src/packlets/conditions/conditionSet.ts +0 -318
  177. package/src/packlets/conditions/conditionSetCollector.ts +0 -127
  178. package/src/packlets/conditions/conditionSetDecls.ts +0 -41
  179. package/src/packlets/conditions/conditionToken.ts +0 -180
  180. package/src/packlets/conditions/convert/conditionSetDecls.ts +0 -72
  181. package/src/packlets/conditions/convert/decls.ts +0 -95
  182. package/src/packlets/conditions/convert/index.ts +0 -24
  183. package/src/packlets/conditions/index.ts +0 -33
  184. package/src/packlets/config/common.ts +0 -107
  185. package/src/packlets/config/configInitFactory.ts +0 -142
  186. package/src/packlets/config/convert.ts +0 -61
  187. package/src/packlets/config/index.ts +0 -30
  188. package/src/packlets/config/json.ts +0 -43
  189. package/src/packlets/config/predefined/default.ts +0 -150
  190. package/src/packlets/config/predefined/extended.ts +0 -198
  191. package/src/packlets/config/predefined/index.ts +0 -26
  192. package/src/packlets/config/systemConfiguration.ts +0 -217
  193. package/src/packlets/context/contextDecls.ts +0 -76
  194. package/src/packlets/context/contextToken.ts +0 -252
  195. package/src/packlets/context/convert/decls.ts +0 -126
  196. package/src/packlets/context/convert/index.ts +0 -23
  197. package/src/packlets/context/index.ts +0 -27
  198. package/src/packlets/decisions/abstractDecision.ts +0 -87
  199. package/src/packlets/decisions/abstractDecisionCollector.ts +0 -122
  200. package/src/packlets/decisions/candidate.ts +0 -101
  201. package/src/packlets/decisions/common.ts +0 -37
  202. package/src/packlets/decisions/concreteDecision.ts +0 -157
  203. package/src/packlets/decisions/decision.ts +0 -172
  204. package/src/packlets/decisions/index.ts +0 -28
  205. package/src/packlets/import/fsItem.ts +0 -212
  206. package/src/packlets/import/importContext.ts +0 -183
  207. package/src/packlets/import/importManager.ts +0 -187
  208. package/src/packlets/import/importable.ts +0 -107
  209. package/src/packlets/import/importers/collectionImporter.ts +0 -153
  210. package/src/packlets/import/importers/fsItemImporter.ts +0 -154
  211. package/src/packlets/import/importers/importer.ts +0 -58
  212. package/src/packlets/import/importers/index.ts +0 -27
  213. package/src/packlets/import/importers/jsonImporter.ts +0 -133
  214. package/src/packlets/import/importers/pathImporter.ts +0 -134
  215. package/src/packlets/import/index.ts +0 -29
  216. package/src/packlets/qualifier-types/config/convert.ts +0 -108
  217. package/src/packlets/qualifier-types/config/index.ts +0 -27
  218. package/src/packlets/qualifier-types/config/json.ts +0 -126
  219. package/src/packlets/qualifier-types/convert.ts +0 -77
  220. package/src/packlets/qualifier-types/helpers.ts +0 -94
  221. package/src/packlets/qualifier-types/index.ts +0 -34
  222. package/src/packlets/qualifier-types/languageQualifierType.ts +0 -143
  223. package/src/packlets/qualifier-types/literalQualifierType.ts +0 -244
  224. package/src/packlets/qualifier-types/literalValueHierarchy.ts +0 -332
  225. package/src/packlets/qualifier-types/qualifierType.ts +0 -360
  226. package/src/packlets/qualifier-types/qualifierTypeCollector.ts +0 -102
  227. package/src/packlets/qualifier-types/territoryQualifierType.ts +0 -255
  228. package/src/packlets/qualifiers/convert/decls.ts +0 -90
  229. package/src/packlets/qualifiers/convert/index.ts +0 -24
  230. package/src/packlets/qualifiers/convert/qualifier.ts +0 -55
  231. package/src/packlets/qualifiers/index.ts +0 -31
  232. package/src/packlets/qualifiers/qualifier.ts +0 -169
  233. package/src/packlets/qualifiers/qualifierCollector.ts +0 -194
  234. package/src/packlets/qualifiers/qualifierDecl.ts +0 -80
  235. package/src/packlets/qualifiers/qualifierDefaultValueDecls.ts +0 -57
  236. package/src/packlets/qualifiers/qualifierDefaultValueToken.ts +0 -230
  237. package/src/packlets/resource-json/compiled/common.ts +0 -35
  238. package/src/packlets/resource-json/compiled/convert.ts +0 -143
  239. package/src/packlets/resource-json/compiled/index.ts +0 -27
  240. package/src/packlets/resource-json/compiled/json.ts +0 -239
  241. package/src/packlets/resource-json/convert.ts +0 -236
  242. package/src/packlets/resource-json/helpers.ts +0 -284
  243. package/src/packlets/resource-json/index.ts +0 -33
  244. package/src/packlets/resource-json/json.ts +0 -295
  245. package/src/packlets/resource-json/normalized.ts +0 -211
  246. package/src/packlets/resource-json/resourceDeclCollection.ts +0 -117
  247. package/src/packlets/resource-json/resourceDeclContainer.ts +0 -48
  248. package/src/packlets/resource-json/resourceDeclTree.ts +0 -116
  249. package/src/packlets/resource-types/config/convert.ts +0 -38
  250. package/src/packlets/resource-types/config/index.ts +0 -27
  251. package/src/packlets/resource-types/config/json.ts +0 -33
  252. package/src/packlets/resource-types/helpers.ts +0 -44
  253. package/src/packlets/resource-types/index.ts +0 -30
  254. package/src/packlets/resource-types/jsonResourceType.ts +0 -102
  255. package/src/packlets/resource-types/resourceType.ts +0 -292
  256. package/src/packlets/resource-types/resourceTypeCollector.ts +0 -79
  257. package/src/packlets/resources/candidateReducer.ts +0 -331
  258. package/src/packlets/resources/common.ts +0 -114
  259. package/src/packlets/resources/index.ts +0 -28
  260. package/src/packlets/resources/resource.ts +0 -307
  261. package/src/packlets/resources/resourceBuilder.ts +0 -269
  262. package/src/packlets/resources/resourceCandidate.ts +0 -333
  263. package/src/packlets/resources/resourceManagerBuilder.ts +0 -1169
  264. package/src/packlets/runtime/cacheListener.ts +0 -113
  265. package/src/packlets/runtime/cacheMetrics.ts +0 -206
  266. package/src/packlets/runtime/compiledResourceCollection.ts +0 -607
  267. package/src/packlets/runtime/conditionSetResolutionResult.ts +0 -160
  268. package/src/packlets/runtime/context/contextQualifierProvider.ts +0 -117
  269. package/src/packlets/runtime/context/contextQualifierProviderValidator.ts +0 -281
  270. package/src/packlets/runtime/context/index.ts +0 -26
  271. package/src/packlets/runtime/context/simpleContextQualifierProvider.ts +0 -225
  272. package/src/packlets/runtime/context/validatingSimpleContextQualifierProvider.ts +0 -96
  273. package/src/packlets/runtime/iResourceManager.ts +0 -130
  274. package/src/packlets/runtime/index.ts +0 -35
  275. package/src/packlets/runtime/resource-tree/common.ts +0 -126
  276. package/src/packlets/runtime/resource-tree/index.ts +0 -26
  277. package/src/packlets/runtime/resource-tree/readOnlyResourceTree.ts +0 -342
  278. package/src/packlets/runtime/resource-tree/resourceTreeChildren.ts +0 -125
  279. package/src/packlets/runtime/resource-tree/resourceTreeChildrenValidator.ts +0 -187
  280. package/src/packlets/runtime/resourceResolver.ts +0 -712
  281. package/src/packlets/runtime/validate.ts +0 -63
  282. package/src/packlets/zip-archive/convert.ts +0 -121
  283. package/src/packlets/zip-archive/index.ts +0 -76
  284. package/src/packlets/zip-archive/json.ts +0 -91
  285. package/src/packlets/zip-archive/types.ts +0 -140
  286. package/src/packlets/zip-archive/zipArchiveCreator.ts +0 -229
  287. package/src/packlets/zip-archive/zipArchiveFormat.ts +0 -158
  288. package/src/packlets/zip-archive/zipArchiveLoader.ts +0 -370
@@ -1,142 +0,0 @@
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 { Result, succeed, fail } from '@fgv/ts-utils';
24
- import { SystemConfiguration } from '../config';
25
- import { Compiled as ResourceJsonCompiled } from '../resource-json';
26
- import { IBundleMetadata } from './model';
27
- import { bundle as bundleConverter } from './convert';
28
-
29
- /**
30
- * Components extracted from a bundle for reuse in different contexts.
31
- * @public
32
- */
33
- export interface IBundleComponents {
34
- /**
35
- * The system configuration from the bundle.
36
- */
37
- systemConfiguration: SystemConfiguration;
38
-
39
- /**
40
- * The compiled resource collection from the bundle.
41
- */
42
- compiledCollection: ResourceJsonCompiled.ICompiledResourceCollection;
43
-
44
- /**
45
- * The bundle metadata including build information.
46
- */
47
- metadata: IBundleMetadata;
48
- }
49
-
50
- /**
51
- * Utility functions for working with resource bundles.
52
- * Provides reusable logic for bundle detection, parsing, and component extraction.
53
- * @public
54
- */
55
- export class BundleUtils {
56
- /**
57
- * Checks if the given object appears to be a bundle file by examining its structure.
58
- * This is a lightweight check that doesn't perform full validation.
59
- * @param data - The data to check
60
- * @returns True if the data appears to be a bundle structure
61
- * @public
62
- */
63
- public static isBundleFile(data: unknown): boolean {
64
- return bundleConverter.convert(data).isSuccess();
65
- }
66
-
67
- /**
68
- * Extracts and validates components from a bundle for reuse.
69
- * Performs full validation of the bundle structure and creates typed components.
70
- * @param bundleData - The raw bundle data to extract components from
71
- * @returns Success with bundle components if valid, Failure with error message otherwise
72
- * @public
73
- */
74
- public static extractBundleComponents(bundleData: unknown): Result<IBundleComponents> {
75
- return bundleConverter
76
- .convert(bundleData)
77
- .withErrorFormat((err) => `Invalid bundle structure: ${err}`)
78
- .onSuccess((bundle) => {
79
- return SystemConfiguration.create(bundle.config)
80
- .withErrorFormat((err) => `Invalid system configuration in bundle: ${err}`)
81
- .onSuccess((systemConfiguration) => {
82
- return succeed({
83
- systemConfiguration,
84
- compiledCollection: bundle.compiledCollection,
85
- metadata: bundle.metadata
86
- });
87
- });
88
- });
89
- }
90
-
91
- /**
92
- * Extracts just the metadata from potential bundle data without full validation.
93
- * Useful for displaying bundle information without processing the entire bundle.
94
- * @param data - The data to extract metadata from
95
- * @returns Success with metadata if found and valid, Failure otherwise
96
- * @public
97
- */
98
- public static extractBundleMetadata(data: unknown): Result<IBundleMetadata> {
99
- return bundleConverter
100
- .convert(data)
101
- .onSuccess((bundle) => {
102
- return succeed(bundle.metadata);
103
- })
104
- .withErrorFormat((err) => {
105
- return `Not a bundle file: ${err}`;
106
- });
107
- }
108
-
109
- /**
110
- * Parses bundle data from a JSON string.
111
- * Convenience method that combines JSON parsing with bundle component extraction.
112
- * @param jsonString - The JSON string containing bundle data
113
- * @returns Success with bundle components if valid, Failure with error message otherwise
114
- * @public
115
- */
116
- public static parseBundleFromJson(jsonString: string): Result<IBundleComponents> {
117
- try {
118
- const data = JSON.parse(jsonString);
119
- return BundleUtils.extractBundleComponents(data);
120
- } catch (error) {
121
- /* c8 ignore next 1 - defense in depth */
122
- return fail(`Failed to parse JSON: ${error instanceof Error ? error.message : String(error)}`);
123
- }
124
- }
125
-
126
- /**
127
- * Checks if a file name suggests it might be a bundle file.
128
- * This is a heuristic check based on file naming conventions.
129
- * @param fileName - The file name to check
130
- * @returns True if the file name suggests a bundle file
131
- * @public
132
- */
133
- public static isBundleFileName(fileName: string): boolean {
134
- const lowerName = fileName.toLowerCase();
135
- return (
136
- lowerName.endsWith('.bundle.json') ||
137
- lowerName.endsWith('-bundle.json') ||
138
- lowerName.endsWith('_bundle.json') ||
139
- (lowerName.includes('bundle') && lowerName.endsWith('.json'))
140
- );
141
- }
142
- }
@@ -1,87 +0,0 @@
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 { Converter, Converters } from '@fgv/ts-utils';
24
- import { Converters as JsonConverters } from '@fgv/ts-json-base';
25
- import { Convert as ConfigConvert } from '../config';
26
- import { Compiled as ResourceJsonCompiled } from '../resource-json';
27
- import { IBundleMetadata, IBundleExportMetadata, IBundle, IBundleCreateParams } from './model';
28
-
29
- /**
30
- * `Converter` for a {@link Bundle.IBundleMetadata | bundle metadata} object.
31
- * @public
32
- */
33
- export const bundleMetadata: Converter<IBundleMetadata> = Converters.strictObject<IBundleMetadata>({
34
- dateBuilt: Converters.string,
35
- checksum: Converters.string,
36
- version: Converters.string.optional(),
37
- description: Converters.string.optional()
38
- });
39
-
40
- /**
41
- * `Converter` for {@link Bundle.IBundleExportMetadata | bundle export metadata}.
42
- * @public
43
- */
44
- export const bundleExportMetadata: Converter<IBundleExportMetadata> =
45
- Converters.strictObject<IBundleExportMetadata>({
46
- exportedAt: Converters.string,
47
- exportedFrom: Converters.string,
48
- type: Converters.string,
49
- filterContext: JsonConverters.jsonObject.optional()
50
- });
51
-
52
- /**
53
- * `Converter` for a {@link Bundle.IBundle | bundle} object.
54
- * @public
55
- */
56
- export const bundle: Converter<IBundle> = Converters.strictObject<IBundle>({
57
- metadata: bundleMetadata,
58
- config: ConfigConvert.systemConfiguration,
59
- compiledCollection: ResourceJsonCompiled.Convert.compiledResourceCollection,
60
- exportMetadata: bundleExportMetadata.optional()
61
- });
62
-
63
- /**
64
- * `Converter` for {@link Bundle.IBundleCreateParams | bundle creation parameters}.
65
- * @public
66
- */
67
- export const bundleCreateParams: Converter<IBundleCreateParams> =
68
- Converters.strictObject<IBundleCreateParams>({
69
- version: Converters.string.optional(),
70
- description: Converters.string.optional(),
71
- dateBuilt: Converters.string.optional()
72
- });
73
-
74
- /**
75
- * Lightweight converter for bundle structure validation without full processing.
76
- * Useful for detecting bundle files without the overhead of full validation.
77
- * @public
78
- */
79
- export const bundleStructure: Converter<{
80
- metadata: IBundleMetadata;
81
- config: unknown;
82
- compiledCollection: unknown;
83
- }> = Converters.strictObject({
84
- metadata: bundleMetadata,
85
- config: JsonConverters.jsonValue,
86
- compiledCollection: JsonConverters.jsonValue
87
- });
@@ -1,52 +0,0 @@
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
- * Bundle packlet providing functionality for creating and loading resource bundles.
25
- *
26
- * Resource bundles encapsulate compiled resources, configuration, and metadata with
27
- * integrity verification. They provide a portable way to distribute pre-compiled
28
- * resource collections.
29
- *
30
- * @packageDocumentation
31
- */
32
-
33
- import * as Model from './model';
34
- import * as Convert from './convert';
35
-
36
- // Model interfaces
37
- export type { IBundleMetadata, IBundleExportMetadata, IBundle, IBundleCreateParams } from './model';
38
-
39
- // Builder and loader classes
40
- export { BundleBuilder } from './bundleBuilder';
41
- export { BundleLoader } from './bundleLoader';
42
- export type { IBundleLoaderCreateParams } from './bundleLoader';
43
-
44
- // Utilities
45
- export { BundleUtils } from './bundleUtils';
46
- export type { IBundleComponents } from './bundleUtils';
47
-
48
- export { Model, Convert };
49
-
50
- // Internal utilities (not part of public API)
51
- /** @internal */
52
- export { BundleNormalizer } from './bundleNormalizer';
@@ -1,138 +0,0 @@
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 { Hash } from '@fgv/ts-utils';
24
- import { Model as ConfigModel } from '../config';
25
- import { Compiled as ResourceJsonCompiled } from '../resource-json';
26
-
27
- /**
28
- * Metadata for a resource bundle, including build information and integrity verification.
29
- * @public
30
- */
31
- export interface IBundleMetadata {
32
- /**
33
- * ISO timestamp indicating when the bundle was built.
34
- */
35
- dateBuilt: string;
36
-
37
- /**
38
- * SHA-256 checksum of the serialized compiled resource collection for integrity verification.
39
- */
40
- checksum: string;
41
-
42
- /**
43
- * Optional version identifier for the bundle.
44
- */
45
- version?: string;
46
-
47
- /**
48
- * Optional human-readable description of the bundle.
49
- */
50
- description?: string;
51
- }
52
-
53
- /**
54
- * Optional export metadata for tracking bundle export information.
55
- * @public
56
- */
57
- export interface IBundleExportMetadata {
58
- /**
59
- * ISO timestamp indicating when the bundle was exported.
60
- */
61
- exportedAt: string;
62
-
63
- /**
64
- * Tool or application that exported the bundle.
65
- */
66
- exportedFrom: string;
67
-
68
- /**
69
- * Type of bundle export (e.g., 'ts-res-bundle', 'ts-res-bundle-filtered').
70
- */
71
- type: string;
72
-
73
- /**
74
- * Optional filter context if the bundle represents filtered data.
75
- */
76
- filterContext?: Record<string, unknown>;
77
- }
78
-
79
- /**
80
- * A complete resource bundle that encapsulates built resources, configuration, and metadata.
81
- * Bundles provide a portable, integrity-verified way to distribute pre-compiled resource collections.
82
- * @public
83
- */
84
- export interface IBundle {
85
- /**
86
- * Metadata about the bundle including build date and integrity checksum.
87
- */
88
- metadata: IBundleMetadata;
89
-
90
- /**
91
- * The system configuration that was used to build the resources in this bundle.
92
- */
93
- config: ConfigModel.ISystemConfiguration;
94
-
95
- /**
96
- * The compiled resource collection containing all resources, conditions, and decisions.
97
- */
98
- compiledCollection: ResourceJsonCompiled.ICompiledResourceCollection;
99
-
100
- /**
101
- * Optional export metadata for tracking when and how the bundle was exported.
102
- */
103
- exportMetadata?: IBundleExportMetadata;
104
- }
105
-
106
- /**
107
- * Optional parameters for bundle creation.
108
- * @public
109
- */
110
- export interface IBundleCreateParams {
111
- /**
112
- * Optional version identifier to include in the bundle metadata.
113
- */
114
- version?: string;
115
-
116
- /**
117
- * Optional description to include in the bundle metadata.
118
- */
119
- description?: string;
120
-
121
- /**
122
- * Optional custom build date. If not provided, the current date will be used.
123
- */
124
- dateBuilt?: string;
125
-
126
- /**
127
- * Optional hash normalizer for generating checksums. If not provided,
128
- * a CRC32 normalizer will be used for browser compatibility.
129
- */
130
- hashNormalizer?: Hash.HashingNormalizer;
131
-
132
- /**
133
- * Whether to normalize the ResourceManagerBuilder before bundle creation.
134
- * When true, the builder is reconstructed in canonical order to ensure
135
- * order-independent checksums. Defaults to false for Phase 1 compatibility.
136
- */
137
- normalize?: boolean;
138
- }
@@ -1,226 +0,0 @@
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 { Brand } from '@fgv/ts-utils';
24
-
25
- /**
26
- * Branded string representing a validated qualifier name.
27
- * @public
28
- */
29
- export type QualifierName = Brand<string, 'QualifierName'>;
30
-
31
- /**
32
- * Branded number representing a validated qualifier index.
33
- * @public
34
- */
35
- export type QualifierIndex = Brand<number, 'QualifierIndex'>;
36
-
37
- /**
38
- * Branded string representing a validated qualifier type name.
39
- * @public
40
- */
41
- export type QualifierTypeName = Brand<string, 'QualifierTypeName'>;
42
-
43
- /**
44
- * Branded number representing a validated qualifier type index.
45
- * @public
46
- */
47
- export type QualifierTypeIndex = Brand<number, 'QualifierTypeIndex'>;
48
-
49
- /**
50
- * Branded type for a validated qualifier condition value - i.e. a value
51
- * that has been determined to be valid for use in a condition attached
52
- * to some resource.
53
- *
54
- * @example
55
- * For a language qualifier type, it is likely that a single language
56
- * tag can be used for either a condition or a context value. However,
57
- * a list of languages would likely only be valid as a context value.
58
- * @public
59
- */
60
- export type QualifierConditionValue = Brand<string, 'QualifierConditionValue'>;
61
-
62
- /**
63
- * Branded type for a validated qualifier context value - i.e. a value
64
- * that has been determined to be valid for use in some runtime context.
65
- * @example
66
- * For a language qualifier type, it is likely that a single language
67
- * tag can be used for either a condition or a context value. However,
68
- * a list of languages would likely only be valid as a context value.
69
- * @public
70
- */
71
- export type QualifierContextValue = Brand<string, 'QualifierContextValue'>;
72
-
73
- /**
74
- * Branded number representing a score in the range 0.0 (no match) .. 1.0 (perfect match)
75
- * which results from evaluating some condition.
76
- * @public
77
- */
78
- export type QualifierMatchScore = Brand<number, 'QualifierMatchScore'>;
79
-
80
- /**
81
- * {@link QualifierMatchScore | Match score} indicating no match.
82
- * @public
83
- */
84
- export const NoMatch: QualifierMatchScore = 0.0 as QualifierMatchScore;
85
-
86
- /**
87
- * {@link QualifierMatchScore | Match score} indicating a perfect match.
88
- * @public
89
- */
90
- export const PerfectMatch: QualifierMatchScore = 1.0 as QualifierMatchScore;
91
-
92
- /**
93
- * Branded number representing a validated condition priority.
94
- * @public
95
- */
96
- export type ConditionPriority = Brand<number, 'ConditionPriority'>;
97
-
98
- /**
99
- * Minimum valid priority for a condition.
100
- * @public
101
- */
102
- export const MinConditionPriority: ConditionPriority = 0 as ConditionPriority;
103
-
104
- /**
105
- * Maximum valid priority for a condition.
106
- * @public
107
- */
108
- export const MaxConditionPriority: ConditionPriority = 1000 as ConditionPriority;
109
-
110
- /**
111
- * Condition operators for use in conditions.
112
- * @public
113
- */
114
- export type ConditionOperator = 'always' | 'never' | 'matches';
115
-
116
- /**
117
- * Array of all valid condition operators.
118
- * @public
119
- */
120
- export const allConditionOperators: ConditionOperator[] = ['always', 'never', 'matches'];
121
-
122
- /**
123
- * Branded number representing a validated condition index.
124
- * @public
125
- */
126
- export type ConditionIndex = Brand<number, 'ConditionIndex'>;
127
-
128
- /**
129
- * A branded string representing a validated condition key. A condition key is a
130
- * string value which fully describes the condition apart from index. The condition
131
- * key can be used to quickly determine if two conditions are identical apart from
132
- * index, or for inspection.
133
- * @public
134
- */
135
- export type ConditionKey = Brand<string, 'ConditionKey'>;
136
-
137
- /**
138
- * A string representing a validated condition token. Condition tokens are
139
- * typically extracted from the name of some resource (e.g. file or folder)
140
- * being imported. A condition token has the form `<qualifierName>=<value>`
141
- * or `<value>`.
142
- * @public
143
- */
144
- export type ConditionToken = Brand<string, 'ConditionToken'>;
145
-
146
- /**
147
- * Branded number representing a validated condition set index.
148
- * @public
149
- */
150
- export type ConditionSetIndex = Brand<number, 'ConditionSetIndex'>;
151
-
152
- /**
153
- * Branded string representing a validated condition set key. A condition set key
154
- * is a string value which fully describes the condition set apart from index. The
155
- * condition set key can be used to quickly determine if two condition sets are
156
- * identical apart from index, or for inspection.
157
- * @public
158
- */
159
- export type ConditionSetKey = Brand<string, 'ConditionSetKey'>;
160
-
161
- /**
162
- * A string representing a validated condition set token. Condition set tokens are
163
- * typically extracted from the name of some resource (e.g. file or folder) being
164
- * imported. A condition set token is a comma-separated list of one or more
165
- * {@link ConditionToken | condition tokens}, where a condition token has either
166
- * the form `<qualifierName>=<value>` or `<value>`.
167
- * @public
168
- */
169
- export type ConditionSetToken = Brand<string, 'ConditionSetToken'>;
170
-
171
- /**
172
- * Branded string representing a hash value for a condition set. The hash value
173
- * is an 8-character string derived from the crc32 hash of the condition set key
174
- * and is used to quickly and compactly identify a condition set or compare for
175
- * equality.
176
- * @public
177
- */
178
- export type ConditionSetHash = Brand<string, 'ConditionSetHash'>;
179
-
180
- /**
181
- * Branded string representing a validated decision key. A decision key is a string
182
- * value which fully describes the decision apart from index. The decision key can
183
- * be used to quickly determine if two decisions are identical apart from index.
184
- * @public
185
- */
186
- export type DecisionKey = Brand<string, 'DecisionKey'>;
187
-
188
- /**
189
- * Branded number representing a validated decision index.
190
- * @public
191
- */
192
- export type DecisionIndex = Brand<number, 'DecisionIndex'>;
193
-
194
- /**
195
- * A string representing a validated context qualifier token. Context qualifier tokens are used
196
- * for filtering resources by context criteria. A context qualifier token has the form
197
- * `<qualifierName>=<value>` or `<value>`.
198
- * @public
199
- */
200
- export type ContextQualifierToken = Brand<string, 'ContextQualifierToken'>;
201
-
202
- /**
203
- * A string representing a validated context token. Context tokens are
204
- * pipe-separated lists of one or more context qualifier tokens. Uses "|" as separator
205
- * to avoid conflicts with comma-separated values within context values.
206
- * Example: "language=en-US,de-DE|territory=US|role=admin"
207
- * @public
208
- */
209
- export type ContextToken = Brand<string, 'ContextToken'>;
210
-
211
- /**
212
- * A string representing a single qualifier default value assignment.
213
- * Format: "qualifierName=defaultValue" or "qualifierName=" (to remove default)
214
- * Example: "language=en-US,en-CA" or "territory=US"
215
- * @public
216
- */
217
- export type QualifierDefaultValueToken = Brand<string, 'QualifierDefaultValueToken'>;
218
-
219
- /**
220
- * A string representing a validated qualifier default values token. Default value tokens are
221
- * pipe-separated lists of one or more qualifier default value tokens. Uses "|" as separator
222
- * to avoid conflicts with comma-separated values within default values.
223
- * Example: "language=en-US,en-CA|territory=US|device=desktop,tablet"
224
- * @public
225
- */
226
- export type QualifierDefaultValuesToken = Brand<string, 'QualifierDefaultValuesToken'>;