@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
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2025 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.TestDerivedResourceType = void 0;
25
+ const ts_utils_1 = require("@fgv/ts-utils");
26
+ const common_1 = require("../../../packlets/common");
27
+ // eslint-disable-next-line @rushstack/packlets/mechanics
28
+ const resourceType_1 = require("../../../packlets/resource-types/resourceType");
29
+ /**
30
+ * A derived resource type for testing that demonstrates:
31
+ * 1. Custom validation logic
32
+ * 2. Using a resource resolver to look up template values
33
+ * 3. Type-specific defaults and error handling
34
+ */
35
+ class TestDerivedResourceType extends resourceType_1.ResourceType {
36
+ constructor(key, index, template, templateResourceId) {
37
+ super(key, index, template);
38
+ this.systemTypeName = common_1.Convert.resourceTypeName
39
+ .convert('test-derived')
40
+ .orThrow();
41
+ this._templateResourceId = templateResourceId;
42
+ }
43
+ /**
44
+ * Factory method to create a new TestDerivedResourceType instance.
45
+ */
46
+ static create(params) {
47
+ var _a;
48
+ return common_1.Convert.resourceTypeName.convert((_a = params === null || params === void 0 ? void 0 : params.key) !== null && _a !== void 0 ? _a : 'test-derived').onSuccess((key) => {
49
+ return (0, ts_utils_1.captureResult)(() => new TestDerivedResourceType(key, params === null || params === void 0 ? void 0 : params.index, params === null || params === void 0 ? void 0 : params.template, params === null || params === void 0 ? void 0 : params.templateResourceId));
50
+ });
51
+ }
52
+ /**
53
+ * Validates a resource candidate declaration with custom logic.
54
+ */
55
+ validateDeclaration(props) {
56
+ // Custom validation: merge method must be 'replace' for full candidates
57
+ if (props.completeness === 'full' && props.mergeMethod !== 'replace') {
58
+ return (0, ts_utils_1.fail)(`${this.key}: Full candidates must use 'replace' merge method, got '${props.mergeMethod}'`);
59
+ }
60
+ return this.validate(props.json, props.completeness);
61
+ }
62
+ validate(json, completeness) {
63
+ if (typeof json !== 'object' || json === null || Array.isArray(json)) {
64
+ return (0, ts_utils_1.fail)(`${this.key}: Expected JSON object, got ${typeof json}`);
65
+ }
66
+ const obj = json;
67
+ // Validate required title field for full resources
68
+ if (completeness === 'full' && (typeof obj.title !== 'string' || !obj.title.trim())) {
69
+ return (0, ts_utils_1.fail)(`${this.key}: 'title' field is required and must be a non-empty string`);
70
+ }
71
+ // Validate optional description
72
+ if (obj.description !== undefined && typeof obj.description !== 'string') {
73
+ return (0, ts_utils_1.fail)(`${this.key}: 'description' field must be a string if provided`);
74
+ }
75
+ // Validate optional metadata
76
+ if (obj.metadata !== undefined) {
77
+ if (typeof obj.metadata !== 'object' || obj.metadata === null || Array.isArray(obj.metadata)) {
78
+ return (0, ts_utils_1.fail)(`${this.key}: 'metadata' field must be an object if provided`);
79
+ }
80
+ }
81
+ const result = Object.assign(Object.assign(Object.assign({}, (obj.title && { title: obj.title })), (obj.description && { description: obj.description })), (obj.metadata && { metadata: obj.metadata }));
82
+ return (0, ts_utils_1.succeed)(result);
83
+ }
84
+ /**
85
+ * Override to demonstrate looking up template values from another resource.
86
+ */
87
+ getDefaultTemplateCandidate(json, conditions, resolver) {
88
+ // If a template resource ID is configured and resolver is available, try to resolve it
89
+ if (this._templateResourceId && resolver && !json) {
90
+ return resolver
91
+ .resolveComposedResourceValue(this._templateResourceId)
92
+ .onFailure((error) => (0, ts_utils_1.fail)(`${this.key}: Failed to resolve template resource '${this._templateResourceId}': ${error}`))
93
+ .onSuccess((resolvedValue) => {
94
+ // Use the resolved value as our JSON template
95
+ return super.getDefaultTemplateCandidate(resolvedValue, conditions, resolver);
96
+ });
97
+ }
98
+ // Use provided JSON or fall back to base implementation
99
+ return super.getDefaultTemplateCandidate(json, conditions, resolver);
100
+ }
101
+ /**
102
+ * Override createTemplate to add additional validation for the derived type.
103
+ */
104
+ createTemplate(resourceId, init, conditions, resolver) {
105
+ // Additional validation: warn if trying to use resolver functionality without a resolver
106
+ if (this._templateResourceId && !resolver) {
107
+ return (0, ts_utils_1.fail)(`${this.key}: Template resource ID '${this._templateResourceId}' is configured but no resolver provided`);
108
+ }
109
+ return super.createTemplate(resourceId, init, conditions, resolver);
110
+ }
111
+ }
112
+ exports.TestDerivedResourceType = TestDerivedResourceType;
113
+ //# sourceMappingURL=testDerivedResourceType.js.map
@@ -0,0 +1,2 @@
1
+ import '@fgv/ts-utils-jest';
2
+ //# sourceMappingURL=candidateValue.test.d.ts.map
@@ -0,0 +1,2 @@
1
+ import '@fgv/ts-utils-jest';
2
+ //# sourceMappingURL=candidateValueCollector.test.d.ts.map
@@ -0,0 +1,2 @@
1
+ import '@fgv/ts-utils-jest';
2
+ //# sourceMappingURL=resourceResolver.coverage.test.d.ts.map
@@ -0,0 +1,2 @@
1
+ import '@fgv/ts-utils-jest';
2
+ //# sourceMappingURL=resourceResolver.newFeatures.test.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fgv/ts-res",
3
- "version": "5.0.0-21",
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-21",
48
- "@fgv/ts-extras": "5.0.0-21"
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-utils": "5.0.0-21",
54
- "@fgv/ts-json-base": "5.0.0-21",
55
- "@fgv/ts-bcp47": "5.0.0-21",
56
- "@fgv/ts-json": "5.0.0-21"
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
- }