@fgv/ts-res 5.0.0-22 → 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 (189) hide show
  1. package/README.md +665 -44
  2. package/dist/ts-res.d.ts +421 -19
  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/packlets/resources/candidateValue.js +128 -0
  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/resource-tree/common.d.ts +1 -1
  46. package/lib/test/unit/qualifier-types/testQualifierType.d.ts +4 -0
  47. package/lib/test/unit/qualifier-types/testQualifierType.js +24 -0
  48. package/lib/test/unit/resource-types/testDerivedResourceType.d.ts +1 -0
  49. package/lib/test/unit/resource-types/testDerivedResourceType.js +3 -0
  50. package/lib/test/unit/resources/candidateValue.test.d.ts +2 -0
  51. package/lib/test/unit/resources/candidateValueCollector.test.d.ts +2 -0
  52. package/package.json +7 -7
  53. package/src/index.ts +0 -75
  54. package/src/packlets/bundle/bundleBuilder.ts +0 -159
  55. package/src/packlets/bundle/bundleLoader.ts +0 -157
  56. package/src/packlets/bundle/bundleNormalizer.ts +0 -173
  57. package/src/packlets/bundle/bundleUtils.ts +0 -142
  58. package/src/packlets/bundle/convert.ts +0 -87
  59. package/src/packlets/bundle/index.ts +0 -52
  60. package/src/packlets/bundle/model.ts +0 -138
  61. package/src/packlets/common/conditions.ts +0 -226
  62. package/src/packlets/common/convert.ts +0 -184
  63. package/src/packlets/common/helpers/conditions.ts +0 -84
  64. package/src/packlets/common/helpers/context.ts +0 -88
  65. package/src/packlets/common/helpers/index.ts +0 -26
  66. package/src/packlets/common/helpers/qualifierDefaultValues.ts +0 -91
  67. package/src/packlets/common/helpers/resources.ts +0 -96
  68. package/src/packlets/common/index.ts +0 -30
  69. package/src/packlets/common/resources.ts +0 -105
  70. package/src/packlets/common/validate/conditions.ts +0 -595
  71. package/src/packlets/common/validate/index.ts +0 -27
  72. package/src/packlets/common/validate/regularExpressions.ts +0 -92
  73. package/src/packlets/common/validate/resources.ts +0 -170
  74. package/src/packlets/conditions/condition.ts +0 -351
  75. package/src/packlets/conditions/conditionCollector.ts +0 -103
  76. package/src/packlets/conditions/conditionDecls.ts +0 -50
  77. package/src/packlets/conditions/conditionSet.ts +0 -318
  78. package/src/packlets/conditions/conditionSetCollector.ts +0 -127
  79. package/src/packlets/conditions/conditionSetDecls.ts +0 -41
  80. package/src/packlets/conditions/conditionToken.ts +0 -180
  81. package/src/packlets/conditions/convert/conditionSetDecls.ts +0 -72
  82. package/src/packlets/conditions/convert/decls.ts +0 -95
  83. package/src/packlets/conditions/convert/index.ts +0 -24
  84. package/src/packlets/conditions/index.ts +0 -33
  85. package/src/packlets/config/common.ts +0 -107
  86. package/src/packlets/config/configInitFactory.ts +0 -142
  87. package/src/packlets/config/convert.ts +0 -61
  88. package/src/packlets/config/index.ts +0 -30
  89. package/src/packlets/config/json.ts +0 -43
  90. package/src/packlets/config/predefined/default.ts +0 -150
  91. package/src/packlets/config/predefined/extended.ts +0 -198
  92. package/src/packlets/config/predefined/index.ts +0 -26
  93. package/src/packlets/config/systemConfiguration.ts +0 -217
  94. package/src/packlets/context/contextDecls.ts +0 -76
  95. package/src/packlets/context/contextToken.ts +0 -252
  96. package/src/packlets/context/convert/decls.ts +0 -126
  97. package/src/packlets/context/convert/index.ts +0 -23
  98. package/src/packlets/context/index.ts +0 -27
  99. package/src/packlets/decisions/abstractDecision.ts +0 -87
  100. package/src/packlets/decisions/abstractDecisionCollector.ts +0 -122
  101. package/src/packlets/decisions/candidate.ts +0 -101
  102. package/src/packlets/decisions/common.ts +0 -37
  103. package/src/packlets/decisions/concreteDecision.ts +0 -157
  104. package/src/packlets/decisions/decision.ts +0 -172
  105. package/src/packlets/decisions/index.ts +0 -28
  106. package/src/packlets/import/fsItem.ts +0 -212
  107. package/src/packlets/import/importContext.ts +0 -183
  108. package/src/packlets/import/importManager.ts +0 -187
  109. package/src/packlets/import/importable.ts +0 -107
  110. package/src/packlets/import/importers/collectionImporter.ts +0 -153
  111. package/src/packlets/import/importers/fsItemImporter.ts +0 -154
  112. package/src/packlets/import/importers/importer.ts +0 -58
  113. package/src/packlets/import/importers/index.ts +0 -27
  114. package/src/packlets/import/importers/jsonImporter.ts +0 -133
  115. package/src/packlets/import/importers/pathImporter.ts +0 -134
  116. package/src/packlets/import/index.ts +0 -29
  117. package/src/packlets/qualifier-types/config/convert.ts +0 -108
  118. package/src/packlets/qualifier-types/config/index.ts +0 -27
  119. package/src/packlets/qualifier-types/config/json.ts +0 -126
  120. package/src/packlets/qualifier-types/convert.ts +0 -77
  121. package/src/packlets/qualifier-types/helpers.ts +0 -94
  122. package/src/packlets/qualifier-types/index.ts +0 -34
  123. package/src/packlets/qualifier-types/languageQualifierType.ts +0 -143
  124. package/src/packlets/qualifier-types/literalQualifierType.ts +0 -244
  125. package/src/packlets/qualifier-types/literalValueHierarchy.ts +0 -332
  126. package/src/packlets/qualifier-types/qualifierType.ts +0 -360
  127. package/src/packlets/qualifier-types/qualifierTypeCollector.ts +0 -102
  128. package/src/packlets/qualifier-types/territoryQualifierType.ts +0 -255
  129. package/src/packlets/qualifiers/convert/decls.ts +0 -90
  130. package/src/packlets/qualifiers/convert/index.ts +0 -24
  131. package/src/packlets/qualifiers/convert/qualifier.ts +0 -55
  132. package/src/packlets/qualifiers/index.ts +0 -31
  133. package/src/packlets/qualifiers/qualifier.ts +0 -169
  134. package/src/packlets/qualifiers/qualifierCollector.ts +0 -194
  135. package/src/packlets/qualifiers/qualifierDecl.ts +0 -80
  136. package/src/packlets/qualifiers/qualifierDefaultValueDecls.ts +0 -57
  137. package/src/packlets/qualifiers/qualifierDefaultValueToken.ts +0 -230
  138. package/src/packlets/resource-json/compiled/common.ts +0 -35
  139. package/src/packlets/resource-json/compiled/convert.ts +0 -143
  140. package/src/packlets/resource-json/compiled/index.ts +0 -27
  141. package/src/packlets/resource-json/compiled/json.ts +0 -239
  142. package/src/packlets/resource-json/convert.ts +0 -236
  143. package/src/packlets/resource-json/helpers.ts +0 -284
  144. package/src/packlets/resource-json/index.ts +0 -33
  145. package/src/packlets/resource-json/json.ts +0 -295
  146. package/src/packlets/resource-json/normalized.ts +0 -211
  147. package/src/packlets/resource-json/resourceDeclCollection.ts +0 -117
  148. package/src/packlets/resource-json/resourceDeclContainer.ts +0 -48
  149. package/src/packlets/resource-json/resourceDeclTree.ts +0 -116
  150. package/src/packlets/resource-types/config/convert.ts +0 -38
  151. package/src/packlets/resource-types/config/index.ts +0 -27
  152. package/src/packlets/resource-types/config/json.ts +0 -33
  153. package/src/packlets/resource-types/helpers.ts +0 -44
  154. package/src/packlets/resource-types/index.ts +0 -30
  155. package/src/packlets/resource-types/jsonResourceType.ts +0 -102
  156. package/src/packlets/resource-types/resourceType.ts +0 -292
  157. package/src/packlets/resource-types/resourceTypeCollector.ts +0 -79
  158. package/src/packlets/resources/candidateReducer.ts +0 -331
  159. package/src/packlets/resources/common.ts +0 -114
  160. package/src/packlets/resources/index.ts +0 -28
  161. package/src/packlets/resources/resource.ts +0 -307
  162. package/src/packlets/resources/resourceBuilder.ts +0 -269
  163. package/src/packlets/resources/resourceCandidate.ts +0 -333
  164. package/src/packlets/resources/resourceManagerBuilder.ts +0 -1169
  165. package/src/packlets/runtime/cacheListener.ts +0 -113
  166. package/src/packlets/runtime/cacheMetrics.ts +0 -206
  167. package/src/packlets/runtime/compiledResourceCollection.ts +0 -607
  168. package/src/packlets/runtime/conditionSetResolutionResult.ts +0 -160
  169. package/src/packlets/runtime/context/contextQualifierProvider.ts +0 -117
  170. package/src/packlets/runtime/context/contextQualifierProviderValidator.ts +0 -281
  171. package/src/packlets/runtime/context/index.ts +0 -26
  172. package/src/packlets/runtime/context/simpleContextQualifierProvider.ts +0 -225
  173. package/src/packlets/runtime/context/validatingSimpleContextQualifierProvider.ts +0 -96
  174. package/src/packlets/runtime/iResourceManager.ts +0 -130
  175. package/src/packlets/runtime/index.ts +0 -35
  176. package/src/packlets/runtime/resource-tree/common.ts +0 -126
  177. package/src/packlets/runtime/resource-tree/index.ts +0 -26
  178. package/src/packlets/runtime/resource-tree/readOnlyResourceTree.ts +0 -342
  179. package/src/packlets/runtime/resource-tree/resourceTreeChildren.ts +0 -125
  180. package/src/packlets/runtime/resource-tree/resourceTreeChildrenValidator.ts +0 -187
  181. package/src/packlets/runtime/resourceResolver.ts +0 -712
  182. package/src/packlets/runtime/validate.ts +0 -63
  183. package/src/packlets/zip-archive/convert.ts +0 -121
  184. package/src/packlets/zip-archive/index.ts +0 -76
  185. package/src/packlets/zip-archive/json.ts +0 -91
  186. package/src/packlets/zip-archive/types.ts +0 -140
  187. package/src/packlets/zip-archive/zipArchiveCreator.ts +0 -229
  188. package/src/packlets/zip-archive/zipArchiveFormat.ts +0 -158
  189. package/src/packlets/zip-archive/zipArchiveLoader.ts +0 -370
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-res",
3
- "version": "5.0.0-22",
3
+ "version": "5.0.0-23",
4
4
  "description": "Multi-dimensional Resource Runtime",
5
5
  "main": "lib/index.js",
6
6
  "types": "dist/ts-res.d.ts",
@@ -44,16 +44,16 @@
44
44
  "@rushstack/heft-node-rig": "~2.9.3",
45
45
  "@types/heft-jest": "1.0.6",
46
46
  "eslint-plugin-tsdoc": "~0.4.0",
47
- "@fgv/ts-utils-jest": "5.0.0-22",
48
- "@fgv/ts-extras": "5.0.0-22"
47
+ "@fgv/ts-utils-jest": "5.0.0-23",
48
+ "@fgv/ts-extras": "5.0.0-23"
49
49
  },
50
50
  "dependencies": {
51
51
  "luxon": "^3.7.1",
52
52
  "fflate": "~0.8.2",
53
- "@fgv/ts-bcp47": "5.0.0-22",
54
- "@fgv/ts-utils": "5.0.0-22",
55
- "@fgv/ts-json-base": "5.0.0-22",
56
- "@fgv/ts-json": "5.0.0-22"
53
+ "@fgv/ts-utils": "5.0.0-23",
54
+ "@fgv/ts-json-base": "5.0.0-23",
55
+ "@fgv/ts-json": "5.0.0-23",
56
+ "@fgv/ts-bcp47": "5.0.0-23"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "heft build --clean",
package/src/index.ts DELETED
@@ -1,75 +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 * as Bundle from './packlets/bundle';
24
- import * as QualifierTypes from './packlets/qualifier-types';
25
- import * as Qualifiers from './packlets/qualifiers';
26
- import * as Conditions from './packlets/conditions';
27
- import * as Config from './packlets/config';
28
- import * as Context from './packlets/context';
29
- import * as Decisions from './packlets/decisions';
30
- import * as ResourceJson from './packlets/resource-json';
31
- import * as Resources from './packlets/resources';
32
- import * as ResourceTypes from './packlets/resource-types';
33
- import * as Import from './packlets/import';
34
- import * as Runtime from './packlets/runtime';
35
- import * as ZipArchive from './packlets/zip-archive';
36
-
37
- export * from './packlets/common';
38
-
39
- import { Condition, ConditionSet } from './packlets/conditions';
40
- import { Decision } from './packlets/decisions';
41
- import { QualifierType } from './packlets/qualifier-types';
42
- import { Qualifier } from './packlets/qualifiers';
43
- import { ResourceType } from './packlets/resource-types';
44
- import { Resource, ResourceCandidate, ResourceManagerBuilder } from './packlets/resources';
45
- import { IResourceManager, ResourceResolver } from './packlets/runtime';
46
- import { BundleBuilder, BundleLoader } from './packlets/bundle';
47
-
48
- export {
49
- Bundle,
50
- BundleBuilder,
51
- BundleLoader,
52
- Condition,
53
- Conditions,
54
- ConditionSet,
55
- Config,
56
- Context,
57
- Decision,
58
- Decisions,
59
- Import,
60
- IResourceManager,
61
- Qualifier,
62
- QualifierType,
63
- QualifierTypes,
64
- Qualifiers,
65
- Resource,
66
- ResourceCandidate,
67
- ResourceJson,
68
- ResourceResolver,
69
- ResourceManagerBuilder,
70
- ResourceType,
71
- ResourceTypes,
72
- Resources,
73
- Runtime,
74
- ZipArchive
75
- };
@@ -1,159 +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, Hash } from '@fgv/ts-utils';
24
- import { ResourceManagerBuilder } from '../resources';
25
- import {
26
- SystemConfiguration,
27
- PredefinedSystemConfiguration,
28
- getPredefinedSystemConfiguration
29
- } from '../config';
30
- import { IBundle, IBundleCreateParams, IBundleMetadata } from './model';
31
- import { BundleNormalizer } from './bundleNormalizer';
32
-
33
- /**
34
- * Builder for creating resource bundles from a ResourceManagerBuilder.
35
- * Handles the compilation, configuration extraction, and integrity verification
36
- * needed to create a complete, portable bundle.
37
- * @public
38
- */
39
- export class BundleBuilder {
40
- /**
41
- * Creates a resource bundle from a ResourceManagerBuilder.
42
- * @param builder - The ResourceManagerBuilder containing the resources to bundle
43
- * @param systemConfig - The SystemConfiguration used to create the builder
44
- * @param params - Optional parameters for bundle creation
45
- * @returns Success with the created bundle if successful, Failure with error message otherwise
46
- * @public
47
- */
48
- public static create(
49
- builder: ResourceManagerBuilder,
50
- systemConfig: SystemConfiguration,
51
- params?: IBundleCreateParams
52
- ): Result<IBundle> {
53
- /* c8 ignore next 2 - defense in depth */
54
- params = params ?? {};
55
- const hashNormalizer = params.hashNormalizer ?? new Hash.Crc32Normalizer();
56
-
57
- const builderToUse =
58
- params.normalize === true
59
- ? BundleNormalizer.normalize(builder, systemConfig)
60
- : /* c8 ignore next 1 - is tested but coverage gets confused */
61
- succeed(builder);
62
-
63
- return builderToUse.onSuccess((targetBuilder) => {
64
- return systemConfig.getConfig().onSuccess((config) => {
65
- return targetBuilder.getCompiledResourceCollection().onSuccess((compiledCollection) => {
66
- return BundleBuilder._generateChecksum(compiledCollection, hashNormalizer).onSuccess((checksum) => {
67
- /* c8 ignore next 1 - defense in depth */
68
- const dateBuilt = params.dateBuilt ?? new Date().toISOString();
69
-
70
- const metadata: IBundleMetadata = {
71
- dateBuilt,
72
- checksum,
73
- version: params.version,
74
- description: params.description
75
- };
76
-
77
- const bundle: IBundle = {
78
- metadata,
79
- config,
80
- compiledCollection
81
- };
82
-
83
- return succeed(bundle);
84
- });
85
- });
86
- });
87
- });
88
- }
89
-
90
- /**
91
- * Creates a resource bundle from a ResourceManagerBuilder using a predefined system configuration.
92
- * This is a convenience method for the common case of using predefined configurations.
93
- * @param builder - The ResourceManagerBuilder containing the resources to bundle
94
- * @param configName - The name of the predefined system configuration used
95
- * @param params - Optional parameters for bundle creation
96
- * @returns Success with the created bundle if successful, Failure with error message otherwise
97
- * @public
98
- */
99
- public static createFromPredefined(
100
- builder: ResourceManagerBuilder,
101
- configName: PredefinedSystemConfiguration,
102
- params?: IBundleCreateParams
103
- ): Result<IBundle> {
104
- /* c8 ignore next 1 */
105
- params = params ?? {};
106
- const hashNormalizer = params.hashNormalizer ?? new Hash.Crc32Normalizer();
107
-
108
- // Determine which builder to use based on normalization setting
109
- const builderToUse = params.normalize
110
- ? BundleNormalizer.normalizeFromPredefined(builder, configName)
111
- : succeed(builder);
112
-
113
- return builderToUse.onSuccess((targetBuilder) => {
114
- return getPredefinedSystemConfiguration(configName).onSuccess((systemConfig) => {
115
- return systemConfig.getConfig().onSuccess((config) => {
116
- return targetBuilder.getCompiledResourceCollection().onSuccess((compiledCollection) => {
117
- return BundleBuilder._generateChecksum(compiledCollection, hashNormalizer).onSuccess(
118
- (checksum) => {
119
- /* c8 ignore next 1 - defense in depth */
120
- const dateBuilt = params.dateBuilt ?? new Date().toISOString();
121
-
122
- const metadata: IBundleMetadata = {
123
- dateBuilt,
124
- checksum,
125
- version: params.version,
126
- /* c8 ignore next 1 - defense in depth */
127
- description: params?.description
128
- };
129
-
130
- const bundle: IBundle = {
131
- metadata,
132
- config,
133
- compiledCollection
134
- };
135
-
136
- return succeed(bundle);
137
- }
138
- );
139
- });
140
- });
141
- });
142
- });
143
- }
144
-
145
- /**
146
- * Generates a hash checksum for the compiled resource collection.
147
- * The checksum is calculated using the provided hash normalizer.
148
- * @param compiledCollection - The compiled resource collection to generate checksum for
149
- * @param hashNormalizer - The hash normalizer to use for checksum generation
150
- * @returns Success with the checksum string if successful, Failure otherwise
151
- * @internal
152
- */
153
- private static _generateChecksum(
154
- compiledCollection: unknown,
155
- hashNormalizer: Hash.HashingNormalizer
156
- ): Result<string> {
157
- return hashNormalizer.computeHash(compiledCollection);
158
- }
159
- }
@@ -1,157 +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, Collections, Hash } from '@fgv/ts-utils';
24
- import { CompiledResourceCollection, IResourceManager } from '../runtime';
25
- import { SystemConfiguration } from '../config';
26
- import { ResourceType } from '../resource-types';
27
- import { QualifierType } from '../qualifier-types';
28
- import { IBundle } from './model';
29
-
30
- /**
31
- * Parameters for creating a BundleLoader.
32
- * @public
33
- */
34
- export interface IBundleLoaderCreateParams {
35
- /**
36
- * The bundle to load.
37
- */
38
- bundle: IBundle;
39
-
40
- /**
41
- * Whether to skip checksum verification during loading.
42
- * Default is false - checksum verification is performed.
43
- */
44
- skipChecksumVerification?: boolean;
45
-
46
- /**
47
- * Optional hash normalizer for verifying checksums. If not provided,
48
- * a CRC32 normalizer will be used for browser compatibility.
49
- * Must match the normalizer used during bundle creation.
50
- */
51
- hashNormalizer?: Hash.HashingNormalizer;
52
- }
53
-
54
- /**
55
- * Loader for creating an IResourceManager from a resource bundle.
56
- * Handles integrity verification and reconstruction of the runtime resource manager.
57
- * @public
58
- */
59
- export class BundleLoader {
60
- /**
61
- * Creates an IResourceManager from a resource bundle.
62
- * @param params - Parameters for bundle loading including the bundle and options
63
- * @returns Success with the IResourceManager if successful, Failure with error message otherwise
64
- * @public
65
- */
66
- public static createManagerFromBundle(params: IBundleLoaderCreateParams): Result<IResourceManager> {
67
- /* c8 ignore next 1 - defense in depth */
68
- const hashNormalizer = params.hashNormalizer ?? new Hash.Crc32Normalizer();
69
-
70
- return BundleLoader._verifyBundleIntegrity(
71
- params.bundle,
72
- params.skipChecksumVerification ?? false,
73
- hashNormalizer
74
- ).onSuccess(() => {
75
- return BundleLoader._createSystemConfiguration(params.bundle).onSuccess((systemConfig) => {
76
- return BundleLoader._createCompiledResourceCollection(
77
- params.bundle,
78
- systemConfig.qualifierTypes,
79
- systemConfig.resourceTypes
80
- );
81
- });
82
- });
83
- }
84
-
85
- /**
86
- * Verifies the integrity of a bundle by checking its checksum.
87
- * @param bundle - The bundle to verify
88
- * @param skipVerification - Whether to skip verification
89
- * @param hashNormalizer - The hash normalizer to use for verification
90
- * @returns Success if verification passes or is skipped, Failure otherwise
91
- * @internal
92
- */
93
- private static _verifyBundleIntegrity(
94
- bundle: IBundle,
95
- skipVerification: boolean,
96
- hashNormalizer: Hash.HashingNormalizer
97
- ): Result<boolean> {
98
- if (skipVerification) {
99
- return succeed(true);
100
- }
101
-
102
- return BundleLoader._generateChecksum(bundle.compiledCollection, hashNormalizer).onSuccess(
103
- (calculatedChecksum) => {
104
- if (calculatedChecksum !== bundle.metadata.checksum) {
105
- return fail(
106
- `Bundle integrity verification failed: expected checksum ${bundle.metadata.checksum}, got ${calculatedChecksum}`
107
- );
108
- }
109
- return succeed(true);
110
- }
111
- );
112
- }
113
-
114
- /**
115
- * Generates a hash checksum for the compiled resource collection.
116
- * @param compiledCollection - The compiled resource collection to generate checksum for
117
- * @param hashNormalizer - The hash normalizer to use for checksum generation
118
- * @returns Success with the checksum string if successful, Failure otherwise
119
- * @internal
120
- */
121
- private static _generateChecksum(
122
- compiledCollection: unknown,
123
- hashNormalizer: Hash.HashingNormalizer
124
- ): Result<string> {
125
- return hashNormalizer.computeHash(compiledCollection);
126
- }
127
-
128
- /**
129
- * Creates a SystemConfiguration from the bundle's configuration.
130
- * @param bundle - The bundle containing the configuration
131
- * @returns Success with the SystemConfiguration if successful, Failure otherwise
132
- * @internal
133
- */
134
- private static _createSystemConfiguration(bundle: IBundle): Result<SystemConfiguration> {
135
- return SystemConfiguration.create(bundle.config);
136
- }
137
-
138
- /**
139
- * Creates a CompiledResourceCollection from the bundle.
140
- * @param bundle - The bundle to load
141
- * @param qualifierTypes - The qualifier type collector from the system configuration
142
- * @param resourceTypes - The resource type collector from the system configuration
143
- * @returns Success with the CompiledResourceCollection if successful, Failure otherwise
144
- * @internal
145
- */
146
- private static _createCompiledResourceCollection(
147
- bundle: IBundle,
148
- qualifierTypes: Collections.IReadOnlyResultMap<string, QualifierType>,
149
- resourceTypes: Collections.IReadOnlyResultMap<string, ResourceType>
150
- ): Result<CompiledResourceCollection> {
151
- return CompiledResourceCollection.create({
152
- compiledCollection: bundle.compiledCollection,
153
- qualifierTypes,
154
- resourceTypes
155
- });
156
- }
157
- }
@@ -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
- }