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

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 (197) hide show
  1. package/README.md +794 -137
  2. package/dist/ts-res.d.ts +506 -33
  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 +40 -1
  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/config/convert.js +3 -1
  28. package/lib/packlets/resource-types/config/json.d.ts +2 -0
  29. package/lib/packlets/resource-types/jsonResourceType.d.ts +10 -6
  30. package/lib/packlets/resource-types/jsonResourceType.js +7 -10
  31. package/lib/packlets/resource-types/resourceType.d.ts +20 -8
  32. package/lib/packlets/resource-types/resourceType.js +20 -16
  33. package/lib/packlets/resources/candidateValue.d.ts +92 -0
  34. package/lib/packlets/resources/candidateValue.js +128 -0
  35. package/lib/packlets/resources/candidateValueCollector.d.ts +55 -0
  36. package/lib/packlets/resources/candidateValueCollector.js +96 -0
  37. package/lib/packlets/resources/index.d.ts +2 -0
  38. package/lib/packlets/resources/index.js +2 -0
  39. package/lib/packlets/resources/resource.js +2 -2
  40. package/lib/packlets/resources/resourceBuilder.d.ts +6 -0
  41. package/lib/packlets/resources/resourceBuilder.js +3 -1
  42. package/lib/packlets/resources/resourceCandidate.d.ts +10 -1
  43. package/lib/packlets/resources/resourceCandidate.js +11 -5
  44. package/lib/packlets/resources/resourceManagerBuilder.d.ts +7 -0
  45. package/lib/packlets/resources/resourceManagerBuilder.js +13 -6
  46. package/lib/packlets/runtime/compiledResourceCollection.d.ts +20 -8
  47. package/lib/packlets/runtime/compiledResourceCollection.js +25 -4
  48. package/lib/packlets/runtime/resource-tree/common.d.ts +1 -1
  49. package/lib/packlets/runtime/resourceResolver.d.ts +39 -1
  50. package/lib/packlets/runtime/resourceResolver.js +45 -28
  51. package/lib/test/unit/qualifier-types/testQualifierType.d.ts +4 -0
  52. package/lib/test/unit/qualifier-types/testQualifierType.js +24 -0
  53. package/lib/test/unit/resource-types/derivedResourceType.test.d.ts +2 -0
  54. package/lib/test/unit/resource-types/testDerivedResourceType.d.ts +79 -0
  55. package/lib/test/unit/resource-types/testDerivedResourceType.js +113 -0
  56. package/lib/test/unit/resources/candidateValue.test.d.ts +2 -0
  57. package/lib/test/unit/resources/candidateValueCollector.test.d.ts +2 -0
  58. package/lib/test/unit/runtime/resourceResolver.coverage.test.d.ts +2 -0
  59. package/lib/test/unit/runtime/resourceResolver.newFeatures.test.d.ts +2 -0
  60. package/package.json +7 -7
  61. package/src/index.ts +0 -75
  62. package/src/packlets/bundle/bundleBuilder.ts +0 -159
  63. package/src/packlets/bundle/bundleLoader.ts +0 -157
  64. package/src/packlets/bundle/bundleNormalizer.ts +0 -173
  65. package/src/packlets/bundle/bundleUtils.ts +0 -142
  66. package/src/packlets/bundle/convert.ts +0 -87
  67. package/src/packlets/bundle/index.ts +0 -52
  68. package/src/packlets/bundle/model.ts +0 -138
  69. package/src/packlets/common/conditions.ts +0 -226
  70. package/src/packlets/common/convert.ts +0 -184
  71. package/src/packlets/common/helpers/conditions.ts +0 -84
  72. package/src/packlets/common/helpers/context.ts +0 -88
  73. package/src/packlets/common/helpers/index.ts +0 -26
  74. package/src/packlets/common/helpers/qualifierDefaultValues.ts +0 -91
  75. package/src/packlets/common/helpers/resources.ts +0 -96
  76. package/src/packlets/common/index.ts +0 -30
  77. package/src/packlets/common/resources.ts +0 -78
  78. package/src/packlets/common/validate/conditions.ts +0 -595
  79. package/src/packlets/common/validate/index.ts +0 -27
  80. package/src/packlets/common/validate/regularExpressions.ts +0 -92
  81. package/src/packlets/common/validate/resources.ts +0 -170
  82. package/src/packlets/conditions/condition.ts +0 -351
  83. package/src/packlets/conditions/conditionCollector.ts +0 -103
  84. package/src/packlets/conditions/conditionDecls.ts +0 -50
  85. package/src/packlets/conditions/conditionSet.ts +0 -318
  86. package/src/packlets/conditions/conditionSetCollector.ts +0 -127
  87. package/src/packlets/conditions/conditionSetDecls.ts +0 -41
  88. package/src/packlets/conditions/conditionToken.ts +0 -180
  89. package/src/packlets/conditions/convert/conditionSetDecls.ts +0 -72
  90. package/src/packlets/conditions/convert/decls.ts +0 -95
  91. package/src/packlets/conditions/convert/index.ts +0 -24
  92. package/src/packlets/conditions/index.ts +0 -33
  93. package/src/packlets/config/common.ts +0 -107
  94. package/src/packlets/config/configInitFactory.ts +0 -142
  95. package/src/packlets/config/convert.ts +0 -61
  96. package/src/packlets/config/index.ts +0 -30
  97. package/src/packlets/config/json.ts +0 -43
  98. package/src/packlets/config/predefined/default.ts +0 -150
  99. package/src/packlets/config/predefined/extended.ts +0 -198
  100. package/src/packlets/config/predefined/index.ts +0 -26
  101. package/src/packlets/config/systemConfiguration.ts +0 -217
  102. package/src/packlets/context/contextDecls.ts +0 -76
  103. package/src/packlets/context/contextToken.ts +0 -252
  104. package/src/packlets/context/convert/decls.ts +0 -126
  105. package/src/packlets/context/convert/index.ts +0 -23
  106. package/src/packlets/context/index.ts +0 -27
  107. package/src/packlets/decisions/abstractDecision.ts +0 -87
  108. package/src/packlets/decisions/abstractDecisionCollector.ts +0 -122
  109. package/src/packlets/decisions/candidate.ts +0 -101
  110. package/src/packlets/decisions/common.ts +0 -37
  111. package/src/packlets/decisions/concreteDecision.ts +0 -157
  112. package/src/packlets/decisions/decision.ts +0 -172
  113. package/src/packlets/decisions/index.ts +0 -28
  114. package/src/packlets/import/fsItem.ts +0 -212
  115. package/src/packlets/import/importContext.ts +0 -183
  116. package/src/packlets/import/importManager.ts +0 -187
  117. package/src/packlets/import/importable.ts +0 -107
  118. package/src/packlets/import/importers/collectionImporter.ts +0 -153
  119. package/src/packlets/import/importers/fsItemImporter.ts +0 -154
  120. package/src/packlets/import/importers/importer.ts +0 -58
  121. package/src/packlets/import/importers/index.ts +0 -27
  122. package/src/packlets/import/importers/jsonImporter.ts +0 -133
  123. package/src/packlets/import/importers/pathImporter.ts +0 -134
  124. package/src/packlets/import/index.ts +0 -29
  125. package/src/packlets/qualifier-types/config/convert.ts +0 -108
  126. package/src/packlets/qualifier-types/config/index.ts +0 -27
  127. package/src/packlets/qualifier-types/config/json.ts +0 -126
  128. package/src/packlets/qualifier-types/convert.ts +0 -77
  129. package/src/packlets/qualifier-types/helpers.ts +0 -94
  130. package/src/packlets/qualifier-types/index.ts +0 -34
  131. package/src/packlets/qualifier-types/languageQualifierType.ts +0 -143
  132. package/src/packlets/qualifier-types/literalQualifierType.ts +0 -244
  133. package/src/packlets/qualifier-types/literalValueHierarchy.ts +0 -332
  134. package/src/packlets/qualifier-types/qualifierType.ts +0 -360
  135. package/src/packlets/qualifier-types/qualifierTypeCollector.ts +0 -102
  136. package/src/packlets/qualifier-types/territoryQualifierType.ts +0 -255
  137. package/src/packlets/qualifiers/convert/decls.ts +0 -90
  138. package/src/packlets/qualifiers/convert/index.ts +0 -24
  139. package/src/packlets/qualifiers/convert/qualifier.ts +0 -55
  140. package/src/packlets/qualifiers/index.ts +0 -31
  141. package/src/packlets/qualifiers/qualifier.ts +0 -169
  142. package/src/packlets/qualifiers/qualifierCollector.ts +0 -194
  143. package/src/packlets/qualifiers/qualifierDecl.ts +0 -80
  144. package/src/packlets/qualifiers/qualifierDefaultValueDecls.ts +0 -57
  145. package/src/packlets/qualifiers/qualifierDefaultValueToken.ts +0 -230
  146. package/src/packlets/resource-json/compiled/common.ts +0 -35
  147. package/src/packlets/resource-json/compiled/convert.ts +0 -143
  148. package/src/packlets/resource-json/compiled/index.ts +0 -27
  149. package/src/packlets/resource-json/compiled/json.ts +0 -239
  150. package/src/packlets/resource-json/convert.ts +0 -236
  151. package/src/packlets/resource-json/helpers.ts +0 -284
  152. package/src/packlets/resource-json/index.ts +0 -33
  153. package/src/packlets/resource-json/json.ts +0 -295
  154. package/src/packlets/resource-json/normalized.ts +0 -211
  155. package/src/packlets/resource-json/resourceDeclCollection.ts +0 -117
  156. package/src/packlets/resource-json/resourceDeclContainer.ts +0 -48
  157. package/src/packlets/resource-json/resourceDeclTree.ts +0 -116
  158. package/src/packlets/resource-types/config/convert.ts +0 -36
  159. package/src/packlets/resource-types/config/index.ts +0 -27
  160. package/src/packlets/resource-types/config/json.ts +0 -30
  161. package/src/packlets/resource-types/helpers.ts +0 -44
  162. package/src/packlets/resource-types/index.ts +0 -30
  163. package/src/packlets/resource-types/jsonResourceType.ts +0 -104
  164. package/src/packlets/resource-types/resourceType.ts +0 -259
  165. package/src/packlets/resource-types/resourceTypeCollector.ts +0 -79
  166. package/src/packlets/resources/candidateReducer.ts +0 -331
  167. package/src/packlets/resources/common.ts +0 -114
  168. package/src/packlets/resources/index.ts +0 -28
  169. package/src/packlets/resources/resource.ts +0 -307
  170. package/src/packlets/resources/resourceBuilder.ts +0 -269
  171. package/src/packlets/resources/resourceCandidate.ts +0 -333
  172. package/src/packlets/resources/resourceManagerBuilder.ts +0 -1169
  173. package/src/packlets/runtime/cacheListener.ts +0 -113
  174. package/src/packlets/runtime/cacheMetrics.ts +0 -206
  175. package/src/packlets/runtime/compiledResourceCollection.ts +0 -607
  176. package/src/packlets/runtime/conditionSetResolutionResult.ts +0 -160
  177. package/src/packlets/runtime/context/contextQualifierProvider.ts +0 -117
  178. package/src/packlets/runtime/context/contextQualifierProviderValidator.ts +0 -281
  179. package/src/packlets/runtime/context/index.ts +0 -26
  180. package/src/packlets/runtime/context/simpleContextQualifierProvider.ts +0 -225
  181. package/src/packlets/runtime/context/validatingSimpleContextQualifierProvider.ts +0 -96
  182. package/src/packlets/runtime/iResourceManager.ts +0 -130
  183. package/src/packlets/runtime/index.ts +0 -35
  184. package/src/packlets/runtime/resource-tree/common.ts +0 -126
  185. package/src/packlets/runtime/resource-tree/index.ts +0 -26
  186. package/src/packlets/runtime/resource-tree/readOnlyResourceTree.ts +0 -342
  187. package/src/packlets/runtime/resource-tree/resourceTreeChildren.ts +0 -125
  188. package/src/packlets/runtime/resource-tree/resourceTreeChildrenValidator.ts +0 -187
  189. package/src/packlets/runtime/resourceResolver.ts +0 -626
  190. package/src/packlets/runtime/validate.ts +0 -63
  191. package/src/packlets/zip-archive/convert.ts +0 -121
  192. package/src/packlets/zip-archive/index.ts +0 -76
  193. package/src/packlets/zip-archive/json.ts +0 -91
  194. package/src/packlets/zip-archive/types.ts +0 -140
  195. package/src/packlets/zip-archive/zipArchiveCreator.ts +0 -229
  196. package/src/packlets/zip-archive/zipArchiveFormat.ts +0 -158
  197. package/src/packlets/zip-archive/zipArchiveLoader.ts +0 -370
@@ -1,173 +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, MessageAggregator } from '@fgv/ts-utils';
24
- import { ResourceManagerBuilder } from '../resources';
25
- import { ResourceCandidate } from '../resources';
26
- import { SystemConfiguration, PredefinedSystemConfiguration } from '../config';
27
- import { Condition, ConditionSet } from '../conditions';
28
-
29
- /**
30
- * Normalizes ResourceManagerBuilder instances to ensure consistent ordering
31
- * of internal entities, enabling order-independent bundle checksums.
32
- *
33
- * The normalization process rebuilds the ResourceManagerBuilder from the ground up
34
- * in a canonical order to ensure identical index assignments regardless of
35
- * original construction order.
36
- * @public
37
- */
38
- export class BundleNormalizer {
39
- /**
40
- * Creates a normalized ResourceManagerBuilder from an existing builder.
41
- * The normalized builder will have identical entities but arranged in
42
- * canonical order to ensure consistent index assignments.
43
- *
44
- * @param originalBuilder - The ResourceManagerBuilder to normalize
45
- * @param systemConfig - The SystemConfiguration used to create the original builder
46
- * @returns Success with the normalized ResourceManagerBuilder if successful, Failure otherwise
47
- */
48
- public static normalize(
49
- originalBuilder: ResourceManagerBuilder,
50
- systemConfig: SystemConfiguration
51
- ): Result<ResourceManagerBuilder> {
52
- // Create a fresh builder using the same system configuration
53
- return ResourceManagerBuilder.create({
54
- qualifiers: systemConfig.qualifiers,
55
- resourceTypes: systemConfig.resourceTypes
56
- }).onSuccess((normalizedBuilder) => {
57
- return BundleNormalizer._addNormalizedResources(originalBuilder, normalizedBuilder).onSuccess(() =>
58
- succeed(normalizedBuilder)
59
- );
60
- });
61
- }
62
-
63
- /**
64
- * Creates a normalized ResourceManagerBuilder using a predefined system configuration.
65
- * This is a convenience method for the common case of using predefined configurations.
66
- *
67
- * @param originalBuilder - The ResourceManagerBuilder to normalize
68
- * @param configName - The name of the predefined system configuration used
69
- * @returns Success with the normalized ResourceManagerBuilder if successful, Failure otherwise
70
- */
71
- public static normalizeFromPredefined(
72
- originalBuilder: ResourceManagerBuilder,
73
- configName: PredefinedSystemConfiguration
74
- ): Result<ResourceManagerBuilder> {
75
- return ResourceManagerBuilder.createPredefined(configName).onSuccess((normalizedBuilder) => {
76
- return BundleNormalizer._addNormalizedResources(originalBuilder, normalizedBuilder).onSuccess(() =>
77
- succeed(normalizedBuilder)
78
- );
79
- });
80
- }
81
-
82
- /**
83
- * Normalizes all conditions from the original builder by adding them to the
84
- * normalized builder in sorted order using loose condition declarations.
85
- *
86
- * @param originalBuilder - The source ResourceManagerBuilder
87
- * @param normalizedBuilder - The target normalized ResourceManagerBuilder
88
- * @returns Success if all conditions were normalized successfully, Failure otherwise
89
- * @internal
90
- */
91
- private static _normalizeConditions(
92
- originalBuilder: ResourceManagerBuilder,
93
- normalizedBuilder: ResourceManagerBuilder
94
- ): Result<boolean> {
95
- const conditions = Array.from(originalBuilder.conditions.values()).sort(Condition.compare);
96
-
97
- const errors = new MessageAggregator();
98
- for (const condition of conditions) {
99
- const looseDecl = condition.toLooseConditionDecl();
100
- normalizedBuilder.addCondition(looseDecl).aggregateError(errors);
101
- }
102
-
103
- return errors.returnOrReport(succeed(true));
104
- }
105
-
106
- /**
107
- * Normalizes all condition sets from the original builder by adding them to the
108
- * normalized builder in sorted order using loose condition set declarations.
109
- *
110
- * @param originalBuilder - The source ResourceManagerBuilder
111
- * @param normalizedBuilder - The target normalized ResourceManagerBuilder
112
- * @returns Success if all condition sets were normalized successfully, Failure otherwise
113
- * @internal
114
- */
115
- private static _normalizeConditionSets(
116
- originalBuilder: ResourceManagerBuilder,
117
- normalizedBuilder: ResourceManagerBuilder
118
- ): Result<boolean> {
119
- const conditionSets = Array.from(originalBuilder.conditionSets.values()).sort(ConditionSet.compare);
120
-
121
- const errors = new MessageAggregator();
122
- for (const conditionSet of conditionSets) {
123
- const conditions = conditionSet.toConditionSetArrayDecl();
124
- normalizedBuilder.addConditionSet(conditions).aggregateError(errors);
125
- }
126
-
127
- return errors.returnOrReport(succeed(true));
128
- }
129
-
130
- /**
131
- * Normalizes all candidates by sorting them first by resource ID, then by condition set.
132
- *
133
- * @param originalBuilder - The source ResourceManagerBuilder
134
- * @param normalizedBuilder - The target normalized ResourceManagerBuilder
135
- * @returns Success if all candidates were normalized successfully, Failure otherwise
136
- * @internal
137
- */
138
- private static _normalizeCandidates(
139
- originalBuilder: ResourceManagerBuilder,
140
- normalizedBuilder: ResourceManagerBuilder
141
- ): Result<boolean> {
142
- const candidates = Array.from(originalBuilder.getAllCandidates()).sort((c1, c2) => {
143
- const idCompare = c1.id.localeCompare(c2.id);
144
- return idCompare !== 0 ? idCompare : ResourceCandidate.compare(c1, c2);
145
- });
146
-
147
- const errors = new MessageAggregator();
148
- for (const candidate of candidates) {
149
- const decl = candidate.toLooseResourceCandidateDecl();
150
- normalizedBuilder.addLooseCandidate(decl).aggregateError(errors);
151
- }
152
-
153
- return errors.returnOrReport(succeed(true));
154
- }
155
-
156
- /**
157
- * Adds normalized resources to the target builder by first normalizing conditions,
158
- * then condition sets, then candidates.
159
- *
160
- * @param originalBuilder - The source ResourceManagerBuilder
161
- * @param normalizedBuilder - The target normalized ResourceManagerBuilder
162
- * @returns Success if all resources were added successfully, Failure otherwise
163
- * @internal
164
- */
165
- private static _addNormalizedResources(
166
- originalBuilder: ResourceManagerBuilder,
167
- normalizedBuilder: ResourceManagerBuilder
168
- ): Result<boolean> {
169
- return BundleNormalizer._normalizeConditions(originalBuilder, normalizedBuilder)
170
- .onSuccess(() => BundleNormalizer._normalizeConditionSets(originalBuilder, normalizedBuilder))
171
- .onSuccess(() => BundleNormalizer._normalizeCandidates(originalBuilder, normalizedBuilder));
172
- }
173
- }
@@ -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
- }