@fgv/ts-res 5.0.0-7 → 5.0.0-9
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.
- package/dist/ts-res.d.ts +542 -98
- package/lib/index.d.ts +3 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +6 -1
- package/lib/index.js.map +1 -1
- package/lib/packlets/bundle/bundleBuilder.d.ts +41 -0
- package/lib/packlets/bundle/bundleBuilder.d.ts.map +1 -0
- package/lib/packlets/bundle/bundleBuilder.js +131 -0
- package/lib/packlets/bundle/bundleBuilder.js.map +1 -0
- package/lib/packlets/bundle/bundleLoader.d.ts +72 -0
- package/lib/packlets/bundle/bundleLoader.d.ts.map +1 -0
- package/lib/packlets/bundle/bundleLoader.js +104 -0
- package/lib/packlets/bundle/bundleLoader.js.map +1 -0
- package/lib/packlets/bundle/bundleNormalizer.d.ts +73 -0
- package/lib/packlets/bundle/bundleNormalizer.d.ts.map +1 -0
- package/lib/packlets/bundle/bundleNormalizer.js +142 -0
- package/lib/packlets/bundle/bundleNormalizer.js.map +1 -0
- package/lib/packlets/bundle/bundleUtils.d.ts +70 -0
- package/lib/packlets/bundle/bundleUtils.d.ts.map +1 -0
- package/lib/packlets/bundle/bundleUtils.js +119 -0
- package/lib/packlets/bundle/bundleUtils.js.map +1 -0
- package/lib/packlets/bundle/convert.d.ts +33 -0
- package/lib/packlets/bundle/convert.d.ts.map +1 -0
- package/lib/packlets/bundle/convert.js +78 -0
- package/lib/packlets/bundle/convert.js.map +1 -0
- package/lib/packlets/bundle/index.d.ts +19 -0
- package/lib/packlets/bundle/index.d.ts.map +1 -0
- package/lib/packlets/bundle/index.js +72 -0
- package/lib/packlets/bundle/index.js.map +1 -0
- package/lib/packlets/bundle/model.d.ts +100 -0
- package/lib/packlets/bundle/model.d.ts.map +1 -0
- package/lib/packlets/bundle/model.js +24 -0
- package/lib/packlets/bundle/model.js.map +1 -0
- package/lib/packlets/resources/resourceManagerBuilder.d.ts +15 -1
- package/lib/packlets/resources/resourceManagerBuilder.d.ts.map +1 -1
- package/lib/packlets/resources/resourceManagerBuilder.js +31 -0
- package/lib/packlets/resources/resourceManagerBuilder.js.map +1 -1
- package/lib/packlets/runtime/resourceResolver.d.ts +21 -0
- package/lib/packlets/runtime/resourceResolver.d.ts.map +1 -1
- package/lib/packlets/runtime/resourceResolver.js +24 -6
- package/lib/packlets/runtime/resourceResolver.js.map +1 -1
- package/package.json +12 -12
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Hash } from '@fgv/ts-utils';
|
|
2
|
+
import { Model as ConfigModel } from '../config';
|
|
3
|
+
import { Compiled as ResourceJsonCompiled } from '../resource-json';
|
|
4
|
+
/**
|
|
5
|
+
* Metadata for a resource bundle, including build information and integrity verification.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export interface IBundleMetadata {
|
|
9
|
+
/**
|
|
10
|
+
* ISO timestamp indicating when the bundle was built.
|
|
11
|
+
*/
|
|
12
|
+
dateBuilt: string;
|
|
13
|
+
/**
|
|
14
|
+
* SHA-256 checksum of the serialized compiled resource collection for integrity verification.
|
|
15
|
+
*/
|
|
16
|
+
checksum: string;
|
|
17
|
+
/**
|
|
18
|
+
* Optional version identifier for the bundle.
|
|
19
|
+
*/
|
|
20
|
+
version?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Optional human-readable description of the bundle.
|
|
23
|
+
*/
|
|
24
|
+
description?: string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Optional export metadata for tracking bundle export information.
|
|
28
|
+
* @public
|
|
29
|
+
*/
|
|
30
|
+
export interface IBundleExportMetadata {
|
|
31
|
+
/**
|
|
32
|
+
* ISO timestamp indicating when the bundle was exported.
|
|
33
|
+
*/
|
|
34
|
+
exportedAt: string;
|
|
35
|
+
/**
|
|
36
|
+
* Tool or application that exported the bundle.
|
|
37
|
+
*/
|
|
38
|
+
exportedFrom: string;
|
|
39
|
+
/**
|
|
40
|
+
* Type of bundle export (e.g., 'ts-res-bundle', 'ts-res-bundle-filtered').
|
|
41
|
+
*/
|
|
42
|
+
type: string;
|
|
43
|
+
/**
|
|
44
|
+
* Optional filter context if the bundle represents filtered data.
|
|
45
|
+
*/
|
|
46
|
+
filterContext?: Record<string, unknown>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* A complete resource bundle that encapsulates built resources, configuration, and metadata.
|
|
50
|
+
* Bundles provide a portable, integrity-verified way to distribute pre-compiled resource collections.
|
|
51
|
+
* @public
|
|
52
|
+
*/
|
|
53
|
+
export interface IBundle {
|
|
54
|
+
/**
|
|
55
|
+
* Metadata about the bundle including build date and integrity checksum.
|
|
56
|
+
*/
|
|
57
|
+
metadata: IBundleMetadata;
|
|
58
|
+
/**
|
|
59
|
+
* The system configuration that was used to build the resources in this bundle.
|
|
60
|
+
*/
|
|
61
|
+
config: ConfigModel.ISystemConfiguration;
|
|
62
|
+
/**
|
|
63
|
+
* The compiled resource collection containing all resources, conditions, and decisions.
|
|
64
|
+
*/
|
|
65
|
+
compiledCollection: ResourceJsonCompiled.ICompiledResourceCollection;
|
|
66
|
+
/**
|
|
67
|
+
* Optional export metadata for tracking when and how the bundle was exported.
|
|
68
|
+
*/
|
|
69
|
+
exportMetadata?: IBundleExportMetadata;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Optional parameters for bundle creation.
|
|
73
|
+
* @public
|
|
74
|
+
*/
|
|
75
|
+
export interface IBundleCreateParams {
|
|
76
|
+
/**
|
|
77
|
+
* Optional version identifier to include in the bundle metadata.
|
|
78
|
+
*/
|
|
79
|
+
version?: string;
|
|
80
|
+
/**
|
|
81
|
+
* Optional description to include in the bundle metadata.
|
|
82
|
+
*/
|
|
83
|
+
description?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Optional custom build date. If not provided, the current date will be used.
|
|
86
|
+
*/
|
|
87
|
+
dateBuilt?: string;
|
|
88
|
+
/**
|
|
89
|
+
* Optional hash normalizer for generating checksums. If not provided,
|
|
90
|
+
* a CRC32 normalizer will be used for browser compatibility.
|
|
91
|
+
*/
|
|
92
|
+
hashNormalizer?: Hash.HashingNormalizer;
|
|
93
|
+
/**
|
|
94
|
+
* Whether to normalize the ResourceManagerBuilder before bundle creation.
|
|
95
|
+
* When true, the builder is reconstructed in canonical order to ensure
|
|
96
|
+
* order-independent checksums. Defaults to false for Phase 1 compatibility.
|
|
97
|
+
*/
|
|
98
|
+
normalize?: boolean;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/packlets/bundle/model.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,QAAQ,IAAI,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,YAAY,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;OAEG;IACH,MAAM,EAAE,WAAW,CAAC,oBAAoB,CAAC;IAEzC;;OAEG;IACH,kBAAkB,EAAE,oBAAoB,CAAC,2BAA2B,CAAC;IAErE;;OAEG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,cAAc,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAExC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/packlets/bundle/model.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Hash } from '@fgv/ts-utils';\nimport { Model as ConfigModel } from '../config';\nimport { Compiled as ResourceJsonCompiled } from '../resource-json';\n\n/**\n * Metadata for a resource bundle, including build information and integrity verification.\n * @public\n */\nexport interface IBundleMetadata {\n /**\n * ISO timestamp indicating when the bundle was built.\n */\n dateBuilt: string;\n\n /**\n * SHA-256 checksum of the serialized compiled resource collection for integrity verification.\n */\n checksum: string;\n\n /**\n * Optional version identifier for the bundle.\n */\n version?: string;\n\n /**\n * Optional human-readable description of the bundle.\n */\n description?: string;\n}\n\n/**\n * Optional export metadata for tracking bundle export information.\n * @public\n */\nexport interface IBundleExportMetadata {\n /**\n * ISO timestamp indicating when the bundle was exported.\n */\n exportedAt: string;\n\n /**\n * Tool or application that exported the bundle.\n */\n exportedFrom: string;\n\n /**\n * Type of bundle export (e.g., 'ts-res-bundle', 'ts-res-bundle-filtered').\n */\n type: string;\n\n /**\n * Optional filter context if the bundle represents filtered data.\n */\n filterContext?: Record<string, unknown>;\n}\n\n/**\n * A complete resource bundle that encapsulates built resources, configuration, and metadata.\n * Bundles provide a portable, integrity-verified way to distribute pre-compiled resource collections.\n * @public\n */\nexport interface IBundle {\n /**\n * Metadata about the bundle including build date and integrity checksum.\n */\n metadata: IBundleMetadata;\n\n /**\n * The system configuration that was used to build the resources in this bundle.\n */\n config: ConfigModel.ISystemConfiguration;\n\n /**\n * The compiled resource collection containing all resources, conditions, and decisions.\n */\n compiledCollection: ResourceJsonCompiled.ICompiledResourceCollection;\n\n /**\n * Optional export metadata for tracking when and how the bundle was exported.\n */\n exportMetadata?: IBundleExportMetadata;\n}\n\n/**\n * Optional parameters for bundle creation.\n * @public\n */\nexport interface IBundleCreateParams {\n /**\n * Optional version identifier to include in the bundle metadata.\n */\n version?: string;\n\n /**\n * Optional description to include in the bundle metadata.\n */\n description?: string;\n\n /**\n * Optional custom build date. If not provided, the current date will be used.\n */\n dateBuilt?: string;\n\n /**\n * Optional hash normalizer for generating checksums. If not provided,\n * a CRC32 normalizer will be used for browser compatibility.\n */\n hashNormalizer?: Hash.HashingNormalizer;\n\n /**\n * Whether to normalize the ResourceManagerBuilder before bundle creation.\n * When true, the builder is reconstructed in canonical order to ensure\n * order-independent checksums. Defaults to false for Phase 1 compatibility.\n */\n normalize?: boolean;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Collections, DetailedResult, Result, ValidatingResultMap } from '@fgv/ts-utils';
|
|
2
|
-
import { ConditionCollector, ConditionSetCollector, ReadOnlyConditionCollector, ReadOnlyConditionSetCollector } from '../conditions';
|
|
2
|
+
import { ConditionCollector, ConditionSetCollector, ReadOnlyConditionCollector, ReadOnlyConditionSetCollector, Condition, ConditionSet } from '../conditions';
|
|
3
3
|
import { AbstractDecisionCollector, ReadOnlyAbstractDecisionCollector } from '../decisions';
|
|
4
4
|
import { IReadOnlyQualifierCollector } from '../qualifiers';
|
|
5
5
|
import { ReadOnlyResourceTypeCollector } from '../resource-types';
|
|
@@ -115,6 +115,20 @@ export declare class ResourceManagerBuilder implements IResourceManager {
|
|
|
115
115
|
*/
|
|
116
116
|
addLooseCandidate(decl: ResourceJson.Json.ILooseResourceCandidateDecl): DetailedResult<ResourceCandidate, ResourceBuilderResultDetail>;
|
|
117
117
|
addResource(decl: ResourceJson.Json.ILooseResourceDecl): DetailedResult<ResourceBuilder, ResourceBuilderResultDetail>;
|
|
118
|
+
/**
|
|
119
|
+
* Adds a condition to the manager.
|
|
120
|
+
* @param decl - The condition declaration to add.
|
|
121
|
+
* @returns `Success` with the condition if successful, or `Failure` with an error message if not.
|
|
122
|
+
* @public
|
|
123
|
+
*/
|
|
124
|
+
addCondition(decl: ResourceJson.Json.ILooseConditionDecl): Result<Condition>;
|
|
125
|
+
/**
|
|
126
|
+
* Adds a condition set to the manager.
|
|
127
|
+
* @param decl - The condition set declaration to add.
|
|
128
|
+
* @returns `Success` with the condition set if successful, or `Failure` with an error message if not.
|
|
129
|
+
* @public
|
|
130
|
+
*/
|
|
131
|
+
addConditionSet(conditions: ResourceJson.Normalized.ConditionSetDecl): Result<ConditionSet>;
|
|
118
132
|
/**
|
|
119
133
|
* Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} present in the manager.
|
|
120
134
|
* @returns `Success` with the {@link Resources.ResourceBuilder | resource builder} if successful,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resourceManagerBuilder.d.ts","sourceRoot":"","sources":["../../../src/packlets/resources/resourceManagerBuilder.ts"],"names":[],"mappings":"AAsBA,OAAO,EAEL,WAAW,EACX,cAAc,EAMd,MAAM,EAGN,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,
|
|
1
|
+
{"version":3,"file":"resourceManagerBuilder.d.ts","sourceRoot":"","sources":["../../../src/packlets/resources/resourceManagerBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -241,6 +241,37 @@ class ResourceManagerBuilder {
|
|
|
241
241
|
})
|
|
242
242
|
.withDetail('failure', detail);
|
|
243
243
|
}
|
|
244
|
+
/**
|
|
245
|
+
* Adds a condition to the manager.
|
|
246
|
+
* @param decl - The condition declaration to add.
|
|
247
|
+
* @returns `Success` with the condition if successful, or `Failure` with an error message if not.
|
|
248
|
+
* @public
|
|
249
|
+
*/
|
|
250
|
+
addCondition(decl) {
|
|
251
|
+
return conditions_1.Convert.validatedConditionDecl
|
|
252
|
+
.convert(decl, { qualifiers: this.qualifiers })
|
|
253
|
+
.onSuccess((validated) => {
|
|
254
|
+
return conditions_1.Condition.getKeyForDecl(validated).onSuccess((key) => {
|
|
255
|
+
return this._conditions.validating.getOrAdd(key, () => conditions_1.Condition.create(validated));
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Adds a condition set to the manager.
|
|
261
|
+
* @param decl - The condition set declaration to add.
|
|
262
|
+
* @returns `Success` with the condition set if successful, or `Failure` with an error message if not.
|
|
263
|
+
* @public
|
|
264
|
+
*/
|
|
265
|
+
addConditionSet(conditions) {
|
|
266
|
+
const decl = { conditions: [...conditions] };
|
|
267
|
+
return conditions_1.Convert.validatedConditionSetDecl
|
|
268
|
+
.convert(decl, { conditions: this._conditions })
|
|
269
|
+
.onSuccess((validated) => {
|
|
270
|
+
return conditions_1.ConditionSet.getKeyForDecl(validated).onSuccess((key) => {
|
|
271
|
+
return this._conditionSets.validating.getOrAdd(key, () => conditions_1.ConditionSet.create(validated));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
244
275
|
/**
|
|
245
276
|
* Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} present in the manager.
|
|
246
277
|
* @returns `Success` with the {@link Resources.ResourceBuilder | resource builder} if successful,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resourceManagerBuilder.js","sourceRoot":"","sources":["../../../src/packlets/resources/resourceManagerBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport {\n captureResult,\n Collections,\n DetailedResult,\n fail,\n failWithDetail,\n Hash,\n mapResults,\n MessageAggregator,\n Result,\n succeed,\n succeedWithDetail,\n ValidatingResultMap\n} from '@fgv/ts-utils';\nimport {\n ConditionCollector,\n ConditionSet,\n ConditionSetCollector,\n ReadOnlyConditionCollector,\n ReadOnlyConditionSetCollector,\n Convert as ConditionsConvert\n} from '../conditions';\nimport { AbstractDecisionCollector, ReadOnlyAbstractDecisionCollector } from '../decisions';\nimport { IReadOnlyQualifierCollector } from '../qualifiers';\nimport { ReadOnlyResourceTypeCollector } from '../resource-types';\nimport { Convert, ResourceId, Validate } from '../common';\nimport { IResourceManager } from '../runtime';\nimport { ResourceBuilder, ResourceBuilderResultDetail } from './resourceBuilder';\nimport { Resource } from './resource';\nimport { ResourceCandidate } from './resourceCandidate';\nimport { IResourceDeclarationOptions, IResourceManagerCloneOptions } from './common';\nimport * as ResourceJson from '../resource-json';\nimport * as Context from '../context';\nimport * as Config from '../config';\n\n/**\n * Interface for parameters to the {@link Resources.ResourceManagerBuilder.create | ResourceManagerBuilder create method}.\n * @public\n */\nexport interface IResourceManagerBuilderCreateParams {\n qualifiers: IReadOnlyQualifierCollector;\n resourceTypes: ReadOnlyResourceTypeCollector;\n}\n\n/**\n * Error details that can be returned by a {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @public\n */\nexport type ResourceManagerBuilderResultDetail =\n | Collections.ResultMapResultDetail\n | ResourceBuilderResultDetail;\n\n/**\n * Builder for a collection of {@link Resources.Resource | resources}. Collects\n * {@link Resources.ResourceCandidate | candidates} for each resource into a\n * {@link Resources.ResourceBuilder | ResourceBuilder} per resource, validates them against each other,\n * and builds a collection of {@link Resources.Resource | resources} once all candidates are collected.\n * @public\n */\nexport class ResourceManagerBuilder implements IResourceManager {\n public readonly qualifiers: IReadOnlyQualifierCollector;\n public readonly resourceTypes: ReadOnlyResourceTypeCollector;\n\n protected readonly _conditions: ConditionCollector;\n protected readonly _conditionSets: ConditionSetCollector;\n protected readonly _decisions: AbstractDecisionCollector;\n protected readonly _resources: ValidatingResultMap<ResourceId, ResourceBuilder>;\n public readonly _builtResources: ValidatingResultMap<ResourceId, Resource>;\n\n protected _built: boolean;\n\n /**\n * A {@link Conditions.ConditionCollector | ConditionCollector} which\n * contains the {@link Conditions.Condition | conditions} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get conditions(): ReadOnlyConditionCollector {\n return this._conditions;\n }\n\n /**\n * A {@link Conditions.ConditionSetCollector | ConditionSetCollector} which\n * contains the {@link Conditions.ConditionSet | condition sets} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get conditionSets(): ReadOnlyConditionSetCollector {\n return this._conditionSets;\n }\n\n /**\n * A {@link Decisions.AbstractDecisionCollector | AbstractDecisionCollector} which\n * contains the {@link Decisions.Decision | abstract decisions} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get decisions(): ReadOnlyAbstractDecisionCollector {\n return this._decisions;\n }\n\n /**\n * A read-only map of {@link Resources.ResourceBuilder | resource builders} used by the manager.\n */\n public get resources(): Collections.IReadOnlyValidatingResultMap<ResourceId, ResourceBuilder> {\n return this._resources;\n }\n\n /**\n * The number of {@link Resources.Resource | resources} contained by the manager.\n */\n public get size(): number {\n return this._resources.size;\n }\n\n /**\n * {@inheritdoc Runtime.IResourceManager.numResources}\n */\n public get numResources(): number {\n return this._resources.size;\n }\n\n /**\n * The number of candidates in this resource manager.\n */\n protected _numCandidates?: number;\n\n /**\n * {@inheritdoc Runtime.IResourceManager.numCandidates}\n */\n public get numCandidates(): number {\n if (this._numCandidates === undefined) {\n this._numCandidates = this.getAllCandidates().length;\n }\n return this._numCandidates;\n }\n\n /**\n * {@inheritdoc Runtime.IResourceManager.builtResources}\n */\n public get builtResources(): Collections.IReadOnlyValidatingResultMap<ResourceId, Resource> {\n return this._performBuild().orThrow();\n }\n\n /**\n * Constructor for a {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object.\n * @param params - Parameters to create a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @public\n */\n protected constructor(params: IResourceManagerBuilderCreateParams) {\n this.qualifiers = params.qualifiers;\n this.resourceTypes = params.resourceTypes;\n this._conditions = ConditionCollector.create({ qualifiers: params.qualifiers }).orThrow();\n this._conditionSets = ConditionSetCollector.create({ conditions: this._conditions }).orThrow();\n this._decisions = AbstractDecisionCollector.create({ conditionSets: this._conditionSets }).orThrow();\n this._resources = new ValidatingResultMap({\n converters: new Collections.KeyValueConverters<ResourceId, ResourceBuilder>({\n key: Convert.resourceId,\n /* c8 ignore next 2 - defense in depth against internal error */\n value: (from: unknown) =>\n from instanceof ResourceBuilder ? succeed(from) : fail('not a resource builder')\n })\n });\n this._builtResources = new ValidatingResultMap({\n converters: new Collections.KeyValueConverters<ResourceId, Resource>({\n key: Convert.resourceId,\n /* c8 ignore next 1 - defense in depth against internal error */\n value: (from: unknown) => (from instanceof Resource ? succeed(from) : fail('not a resource'))\n })\n });\n this._built = false;\n }\n\n /**\n * Creates a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object.\n * @param params - Parameters to create a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @returns `Success` with the new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public static create(params: IResourceManagerBuilderCreateParams): Result<ResourceManagerBuilder> {\n return captureResult(() => new ResourceManagerBuilder(params));\n }\n\n /**\n * Creates a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object from a predefined system configuration.\n * @param name - The name of the predefined system configuration to use.\n * @param qualifierDefaultValues - Optional default values for qualifiers.\n * @returns `Success` with the new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public static createPredefined(\n name: Config.PredefinedSystemConfiguration,\n qualifierDefaultValues?: Config.ISystemConfigurationInitParams['qualifierDefaultValues']\n ): Result<ResourceManagerBuilder> {\n return Config.getPredefinedSystemConfiguration(\n name,\n qualifierDefaultValues ? { qualifierDefaultValues } : undefined\n ).onSuccess((systemConfig) => {\n return ResourceManagerBuilder.create({\n qualifiers: systemConfig.qualifiers,\n resourceTypes: systemConfig.resourceTypes\n });\n });\n }\n\n /**\n * Given a {@link ResourceJson.Json.ILooseResourceCandidateDecl | resource candidate declaration}, builds and adds\n * a {@link Resources.ResourceCandidate | candidate} to the manager.\n * @param candidate - The {@link Resources.ResourceCandidate | candidate} to add.\n * @returns `Success` with the candidate if successful, or `Failure` with an error message if not.\n * @public\n */\n public addLooseCandidate(\n decl: ResourceJson.Json.ILooseResourceCandidateDecl\n ): DetailedResult<ResourceCandidate, ResourceBuilderResultDetail> {\n const { value: id, message } = Validate.toResourceId(decl.id);\n if (message !== undefined) {\n return failWithDetail(`${id}: invalid id - ${message}`, 'failure');\n }\n\n const builderResult = this._resources.getOrAdd(id, () =>\n ResourceBuilder.create({\n id,\n resourceTypes: this.resourceTypes,\n conditionSets: this._conditionSets,\n decisions: this._decisions\n })\n );\n /* c8 ignore next 6 - defense in depth against internal error */\n if (builderResult.isFailure()) {\n return failWithDetail(\n `${id}: unable to get or add resource\\n${builderResult.message}`,\n builderResult.detail\n );\n }\n return builderResult.value.addLooseCandidate(decl).onSuccess((c, d) => {\n this._builtResources.delete(id);\n this._built = false;\n this._numCandidates = undefined;\n return succeedWithDetail(c, d);\n });\n }\n\n public addResource(\n decl: ResourceJson.Json.ILooseResourceDecl\n ): DetailedResult<ResourceBuilder, ResourceBuilderResultDetail> {\n const { value: id, message } = Validate.toResourceId(decl.id);\n if (message !== undefined) {\n return failWithDetail(`${id}: invalid id - ${message}`, 'failure');\n }\n\n const {\n value: builder,\n message: getOrAddMessage,\n detail\n } = this._resources.getOrAdd(id, () =>\n ResourceBuilder.create({\n id,\n typeName: decl.resourceTypeName,\n resourceTypes: this.resourceTypes,\n conditionSets: this._conditionSets,\n decisions: this._decisions\n })\n );\n /* c8 ignore next 3 - defense in depth against internal error */\n if (getOrAddMessage !== undefined) {\n return failWithDetail(`${id}: unable to get or add resource\\n${getOrAddMessage}`, detail);\n }\n\n if (detail === 'exists') {\n const { message } = builder.setResourceType(decl.resourceTypeName);\n if (message !== undefined) {\n return failWithDetail(`${id}: unable to set resource type\\n${message}`, 'type-mismatch');\n }\n }\n\n const candidates = decl.candidates ?? [];\n return mapResults(candidates.map((c) => builder.addChildCandidate(c)))\n .onSuccess(() => {\n return succeed(builder);\n })\n .withDetail('failure', detail);\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} present in the manager.\n * @returns `Success` with the {@link Resources.ResourceBuilder | resource builder} if successful,\n * or `Failure` with an error message if not.\n */\n public getAllResources(): ReadonlyArray<ResourceBuilder> {\n return Array.from(this._resources.values()).sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | resource candidates} present in the manager.\n */\n public getAllCandidates(): ReadonlyArray<ResourceCandidate> {\n return this.getAllResources().flatMap((r) => r.candidates);\n }\n\n /**\n * Gets an individual {@link Resources.Resource | built resource} from the manager.\n * @param id - The {@link ResourceId | id} of the resource to get.\n * @returns `Success` with the resource if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltResource(id: string): Result<Resource> {\n return this._resources.validating\n .get(id)\n .onSuccess((builder) => this._builtResources.validating.getOrAdd(id, () => builder.build()));\n }\n\n /**\n * Validates a context declaration against the qualifiers managed by this resource manager.\n * @param context - The context declaration to validate\n * @returns Success with the validated context if successful, Failure otherwise\n * @public\n */\n /* c8 ignore next 5 - functional code path tested but coverage intermittently missed */\n public validateContext(context: Context.IContextDecl): Result<Context.IValidatedContextDecl> {\n return Context.Convert.validatedContextDecl.convert(context, {\n qualifiers: this.qualifiers\n });\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} in the manager.\n * @returns `Success` with an array of resources if successful, or `Failure` with an error message if not.\n * @public\n */\n public getAllBuiltResources(): Result<ReadonlyArray<Resource>> {\n return this.build().onSuccess((manager) =>\n succeed(Array.from(manager._builtResources.values()).sort((a, b) => a.id.localeCompare(b.id)))\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} in the manager.\n * @returns `Success` with an array of resources if successful, or `Failure` with an error message if not.\n * @public\n */\n public getAllBuiltCandidates(): Result<ReadonlyArray<ResourceCandidate>> {\n return this.getAllBuiltResources().onSuccess((built) => succeed(built.flatMap((r) => r.candidates)));\n }\n\n /**\n * Internal helper method that performs the actual building of resources.\n * @returns `Success` with the built resources if all resources were built successfully, `Failure` otherwise.\n * @internal\n */\n public _performBuild(): Result<Collections.IReadOnlyValidatingResultMap<ResourceId, Resource>> {\n if (this._built) {\n return succeed(this._builtResources);\n }\n\n const errors: MessageAggregator = new MessageAggregator();\n this._resources.forEach((r, id) => {\n this._builtResources.getOrAdd(id, () => r.build()).aggregateError(errors);\n });\n /* c8 ignore next 3 - defense in depth against internal error */\n if (errors.hasMessages) {\n return fail(`build failed: ${errors.toString()}`);\n }\n this._built = true;\n return succeed(this._builtResources);\n }\n\n /**\n * Builds the {@link Resources.Resource | resources} from the collected {@link Resources.ResourceCandidate | candidates}.\n * @returns `Success` with the {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public build(): Result<this> {\n return this._performBuild().onSuccess(() => succeed(this));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | resource candidates} that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns A read-only array of {@link Resources.ResourceCandidate | candidates} that can match the context.\n * @public\n */\n public getCandidatesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): ReadonlyArray<ResourceCandidate> {\n return this.getAllCandidates().filter((candidate) => candidate.canMatchPartialContext(context, options));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} that have at least one candidate\n * that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns A read-only array of {@link Resources.ResourceBuilder | resource builders} with matching candidates.\n * @public\n */\n public getResourcesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): ReadonlyArray<ResourceBuilder> {\n return this.getAllResources().filter(\n (resource) => resource.getCandidatesForContext(context, options).length > 0\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | built resource candidates} that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns `Success` with an array of {@link Resources.ResourceCandidate | candidates} if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltCandidatesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): Result<ReadonlyArray<ResourceCandidate>> {\n return this.getAllBuiltCandidates().onSuccess((candidates) =>\n succeed(candidates.filter((candidate) => candidate.canMatchPartialContext(context, options)))\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} that have at least one candidate\n * that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns `Success` with an array of {@link Resources.Resource | resources} if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltResourcesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): Result<ReadonlyArray<Resource>> {\n return this.getAllBuiltResources().onSuccess((resources) =>\n succeed(resources.filter((resource) => resource.getCandidatesForContext(context, options).length > 0))\n );\n }\n\n /**\n * Gets a compiled resource collection from the current state of the resource manager builder.\n * This method generates an optimized, index-based representation of all resources, conditions,\n * and decisions that can be used for serialization or efficient runtime processing.\n * @param options - Optional compilation options controlling the output format.\n * @returns Success with the compiled resource collection if successful, Failure otherwise.\n * @public\n */\n public getCompiledResourceCollection(\n options?: ResourceJson.Compiled.ICompiledResourceOptions\n ): Result<ResourceJson.Compiled.ICompiledResourceCollection> {\n // Build resources first to ensure all data is available\n const buildResult = this._performBuild();\n if (buildResult.isFailure()) {\n return fail(`Failed to build resources: ${buildResult.message}`);\n }\n\n // Generate compiled data from internal collections using the new toCompiled methods\n // Note: All objects have a defined index property due to the collector pattern - indices are assigned during collection building\n const compiledData = {\n qualifierTypes: Array.from(this.qualifiers.qualifierTypes.values()).map((qt) => ({\n name: qt.name\n })),\n qualifiers: Array.from(this.qualifiers.values()).map((q) => ({\n name: q.name,\n type: q.type.index!,\n defaultPriority: q.defaultPriority\n })),\n resourceTypes: Array.from(this.resourceTypes.values()).map((rt) => ({\n name: rt.key\n })),\n conditions: Array.from(this._conditions.values()).map((c) => c.toCompiled(options)),\n conditionSets: Array.from(this._conditionSets.values()).map((cs) => cs.toCompiled(options)),\n decisions: Array.from(this._decisions.values()).map((d) => d.toCompiled(options)),\n resources: Array.from(this._builtResources.values()).map((r) => r.toCompiled(options))\n };\n\n // Apply validation through the converter\n return ResourceJson.Compiled.Convert.compiledResourceCollection.convert(compiledData);\n }\n\n /**\n * Gets a resource collection declaration containing all built resources in a flat array structure.\n * This method returns all built resources as an {@link ResourceJson.Normalized.IResourceCollectionDecl | IResourceCollectionDecl}\n * that can be used for serialization, export, or re-import. Resources are sorted by ID for consistent ordering.\n * @param options - Optional {@link Resources.IResourceDeclarationOptions | declaration options} controlling the output format.\n * If `options.normalized` is `true`, applies hash-based normalization for additional consistency guarantees.\n * @returns Success with the resource collection declaration if successful, Failure otherwise.\n * @public\n */\n public getResourceCollectionDecl(\n options?: IResourceDeclarationOptions\n ): Result<ResourceJson.Normalized.IResourceCollectionDecl> {\n return this._performBuild().onSuccess(() => {\n // Get all built resources and convert to loose resource declarations\n const resources = Array.from(this._builtResources.values()).map((resource) =>\n resource.toLooseResourceDecl(options)\n );\n\n // Sort resources by ID for consistent ordering\n resources.sort((a, b) => a.id.localeCompare(b.id));\n\n // Create the collection declaration structure\n const collectionData = {\n resources\n };\n\n // Convert and validate using the normalized converter\n return ResourceJson.Convert.resourceCollectionDecl\n .convert(collectionData)\n .onSuccess((compiledCollection) => {\n // Apply hash-based normalization only if requested\n if (options?.normalized === true) {\n const normalizer = new Hash.Crc32Normalizer();\n return normalizer\n .normalize(compiledCollection)\n .withErrorFormat((e) => `Failed to normalize resource collection: ${e}`);\n }\n return succeed(compiledCollection);\n });\n });\n }\n\n /**\n * Creates a filtered clone of this ResourceManagerBuilder using the specified context.\n * This is a convenience method that creates a new ResourceManagerBuilder with the same\n * configuration but filtered to include only candidates that match the provided context.\n * If candidates are provided for editing, they will be applied with collision detection.\n * @param options - Options for the cloning operation, including the strongly-typed filterForContext property and optional candidates for edits.\n * @returns A Result containing the new filtered ResourceManagerBuilder.\n * @public\n */\n /* c8 ignore next 21 - functional code path tested but coverage intermittently missed */\n public clone(options?: IResourceManagerCloneOptions): Result<ResourceManagerBuilder> {\n return this.getResourceCollectionDecl(options).onSuccess((collection) => {\n return ResourceManagerBuilder.create({\n qualifiers: this.qualifiers,\n resourceTypes: this.resourceTypes\n }).onSuccess((newManager) => {\n // Check if we have candidates to apply as edits\n const editCandidates = options?.candidates || [];\n const candidatesByResourceResult =\n editCandidates.length > 0\n ? ResourceManagerBuilder._createCandidatesByResourceMap(editCandidates)\n : succeed(new Map());\n\n return candidatesByResourceResult.onSuccess((candidatesByResource) => {\n // Track which resource IDs have been processed from the original collection\n const processedResourceIds = new Set<ResourceId>();\n\n // Add each resource from the filtered collection to the new manager\n if (collection.resources) {\n for (const resourceDecl of collection.resources) {\n processedResourceIds.add(resourceDecl.id as ResourceId);\n\n // Apply edits if there are candidates for this resource\n const editedDeclResult = ResourceManagerBuilder._applyEditsToResourceDeclaration(\n resourceDecl,\n candidatesByResource,\n this._conditions\n );\n\n if (editedDeclResult.isFailure()) {\n return fail(`${resourceDecl.id}: Failed to apply edits: ${editedDeclResult.message}`);\n }\n\n const addResult = newManager.addResource(editedDeclResult.value);\n if (addResult.isFailure()) {\n return fail(\n `${resourceDecl.id}: Failed to add resource to cloned manager: ${addResult.message}`\n );\n }\n }\n }\n\n // Handle any remaining candidates that target new resources not in the original collection\n const errors = new MessageAggregator();\n for (const [resourceId, candidates] of candidatesByResource) {\n if (!processedResourceIds.has(resourceId)) {\n // Create a new resource declaration for candidates targeting a new resource ID\n ResourceManagerBuilder._createResourceDeclFromCandidates(\n resourceId,\n candidates,\n this._conditions\n )\n .withErrorFormat((e) => `${resourceId}: Failed to create new resource from candidates: ${e}`)\n .onSuccess((newResourceDecl) => {\n return newManager\n .addResource(newResourceDecl)\n .withErrorFormat(\n (e) => `${resourceId}: Failed to add new resource to cloned manager: ${e}`\n );\n })\n .aggregateError(errors);\n }\n }\n\n return errors.returnOrReport(succeed(newManager));\n });\n });\n });\n }\n\n /**\n * Creates a resource ID keyed map from an array of loose resource candidate declarations.\n * This enables efficient detection of edit collisions by grouping candidates by their target resource.\n * @param candidates - Array of loose resource candidate declarations to organize\n * @returns A Result containing a Map where keys are validated ResourceIds and values are arrays of candidates for that resource\n * @internal\n */\n private static _createCandidatesByResourceMap(\n candidates: ReadonlyArray<ResourceJson.Json.ILooseResourceCandidateDecl>\n ): Result<Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>> {\n const candidatesByResource = new Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>();\n\n for (const candidate of candidates) {\n const { value: resourceId, message } = Validate.toResourceId(candidate.id);\n if (message !== undefined) {\n return fail(`Invalid resource ID \"${candidate.id}\": ${message}`);\n }\n\n const existingCandidates = candidatesByResource.get(resourceId);\n if (existingCandidates) {\n existingCandidates.push(candidate);\n } else {\n candidatesByResource.set(resourceId, [candidate]);\n }\n }\n\n return succeed(candidatesByResource);\n }\n\n /**\n * Generates a proper ConditionSet token for collision detection using the existing ConditionSet.getKeyForDecl method.\n * @param conditionSet - The condition set to generate a token for\n * @param conditionCollector - The condition collector needed for validation context\n * @returns A Result containing the ConditionSet token if successful, or failure if validation fails\n * @internal\n */\n private static _getConditionSetToken(\n conditionSet: ResourceJson.Json.ConditionSetDecl | undefined,\n conditionCollector: ConditionCollector\n ): Result<string> {\n if (!conditionSet) {\n return succeed(ConditionSet.UnconditionalKey);\n }\n\n // Convert ConditionSetDecl to IConditionSetDecl format\n let conditionSetDecl: { conditions: ResourceJson.Json.ILooseConditionDecl[] };\n\n if (Array.isArray(conditionSet)) {\n // ConditionSetDeclAsArray: array of ILooseConditionDecl\n conditionSetDecl = { conditions: conditionSet };\n } else {\n // ConditionSetDeclAsRecord: Record<string, string | IChildConditionDecl>\n const conditions = Object.entries(conditionSet).map(([qualifierName, value]) => {\n if (typeof value === 'string') {\n return { qualifierName, value };\n } else {\n return { qualifierName, ...value };\n }\n });\n conditionSetDecl = { conditions };\n }\n\n // Validate and convert to IValidatedConditionSetDecl\n return ConditionsConvert.validatedConditionSetDecl\n .convert(conditionSetDecl, { conditions: conditionCollector })\n .onSuccess((validatedDecl) => {\n // Use proper ConditionSet.getKeyForDecl method to generate the token\n return ConditionSet.getKeyForDecl(validatedDecl);\n });\n }\n\n /**\n * Applies candidate edits to a resource declaration, handling collisions using condition set tokens.\n * If there's no collision, adds the candidate. If there's a collision, replaces the original candidate with the edit.\n * @param resourceDecl - The original resource declaration to potentially modify\n * @param candidatesByResource - Map of resource IDs to arrays of candidate edits\n * @param conditionCollector - The condition collector needed for generating condition tokens\n * @returns A Result containing the resource declaration to use (original or modified)\n * @internal\n */\n private static _applyEditsToResourceDeclaration(\n resourceDecl: ResourceJson.Json.ILooseResourceDecl,\n candidatesByResource: Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>,\n conditionCollector: ConditionCollector\n ): Result<ResourceJson.Json.ILooseResourceDecl> {\n const { value: resourceId, message } = Validate.toResourceId(resourceDecl.id);\n if (message !== undefined) {\n return fail(`Invalid resource ID \"${resourceDecl.id}\": ${message}`);\n }\n\n const editCandidates = candidatesByResource.get(resourceId);\n if (!editCandidates || editCandidates.length === 0) {\n return succeed(resourceDecl);\n }\n\n // Use Map approach: apply original candidates first, then replace with edits on collision\n const candidatesByConditionKey = new Map<string, ResourceJson.Json.IChildResourceCandidateDecl>();\n\n // First, add all original candidates keyed by their condition set token\n for (const candidate of resourceDecl.candidates || []) {\n const conditionTokenResult = ResourceManagerBuilder._getConditionSetToken(\n candidate.conditions,\n conditionCollector\n );\n if (conditionTokenResult.isFailure()) {\n return fail(\n `Failed to generate condition token for original candidate: ${conditionTokenResult.message}`\n );\n }\n candidatesByConditionKey.set(conditionTokenResult.value, candidate);\n }\n\n // Then, apply edits (this replaces any colliding original candidates)\n // Convert edit candidates (which have ids) to child candidates (without ids) for merging\n for (const editCandidate of editCandidates) {\n const conditionTokenResult = ResourceManagerBuilder._getConditionSetToken(\n editCandidate.conditions,\n conditionCollector\n );\n if (conditionTokenResult.isFailure()) {\n return fail(`Failed to generate condition token for edit candidate: ${conditionTokenResult.message}`);\n }\n\n const childCandidate: ResourceJson.Json.IChildResourceCandidateDecl = {\n json: editCandidate.json,\n conditions: editCandidate.conditions,\n isPartial: editCandidate.isPartial,\n mergeMethod: editCandidate.mergeMethod\n };\n candidatesByConditionKey.set(conditionTokenResult.value, childCandidate);\n }\n\n // Extract the final merged candidate list\n const mergedCandidates = Array.from(candidatesByConditionKey.values());\n\n const modifiedDecl: ResourceJson.Json.ILooseResourceDecl = {\n ...resourceDecl,\n candidates: mergedCandidates\n };\n\n return succeed(modifiedDecl);\n }\n\n /**\n * Creates a new resource declaration from an array of candidate declarations.\n * This is used when cloning to create new resources that don't exist in the original manager.\n * @param resourceId - The validated resource ID for the new resource\n * @param candidates - Array of loose candidate declarations for the new resource\n * @param conditionCollector - The condition collector for validation context\n * @returns A Result containing the new resource declaration if successful, or failure if validation fails\n * @internal\n */\n private static _createResourceDeclFromCandidates(\n resourceId: ResourceId,\n candidates: ResourceJson.Json.ILooseResourceCandidateDecl[],\n conditionCollector: ConditionCollector\n ): Result<ResourceJson.Json.ILooseResourceDecl> {\n // Convert candidate declarations to child candidate declarations\n const childCandidates: ResourceJson.Json.IChildResourceCandidateDecl[] = [];\n\n // Ensure we have candidates\n if (candidates.length === 0) {\n return fail('Cannot create resource declaration from empty candidates array');\n }\n\n // Extract resourceTypeName from the first candidate (all candidates for the same resource should have the same type)\n const resourceTypeName = candidates[0].resourceTypeName;\n if (!resourceTypeName) {\n return fail('resourceTypeName is required for new resource candidates');\n }\n\n for (const candidate of candidates) {\n const childCandidate: ResourceJson.Json.IChildResourceCandidateDecl = {\n json: candidate.json,\n conditions: candidate.conditions,\n isPartial: candidate.isPartial,\n mergeMethod: candidate.mergeMethod\n };\n childCandidates.push(childCandidate);\n }\n\n // Create the new resource declaration\n const newResourceDecl: ResourceJson.Json.ILooseResourceDecl = {\n id: resourceId,\n candidates: childCandidates,\n resourceTypeName\n };\n\n return succeed(newResourceDecl);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"resourceManagerBuilder.js","sourceRoot":"","sources":["../../../src/packlets/resources/resourceManagerBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (c) 2025 Erik Fortune\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport {\n captureResult,\n Collections,\n DetailedResult,\n fail,\n failWithDetail,\n Hash,\n mapResults,\n MessageAggregator,\n Result,\n succeed,\n succeedWithDetail,\n ValidatingResultMap\n} from '@fgv/ts-utils';\nimport {\n ConditionCollector,\n ConditionSetCollector,\n ReadOnlyConditionCollector,\n ReadOnlyConditionSetCollector,\n Convert as ConditionsConvert,\n Condition,\n ConditionSet,\n IConditionSetDecl\n} from '../conditions';\nimport { AbstractDecisionCollector, ReadOnlyAbstractDecisionCollector } from '../decisions';\nimport { IReadOnlyQualifierCollector } from '../qualifiers';\nimport { ReadOnlyResourceTypeCollector } from '../resource-types';\nimport { Convert, ResourceId, Validate } from '../common';\nimport { IResourceManager } from '../runtime';\nimport { ResourceBuilder, ResourceBuilderResultDetail } from './resourceBuilder';\nimport { Resource } from './resource';\nimport { ResourceCandidate } from './resourceCandidate';\nimport { IResourceDeclarationOptions, IResourceManagerCloneOptions } from './common';\nimport * as ResourceJson from '../resource-json';\nimport * as Context from '../context';\nimport * as Config from '../config';\n\n/**\n * Interface for parameters to the {@link Resources.ResourceManagerBuilder.create | ResourceManagerBuilder create method}.\n * @public\n */\nexport interface IResourceManagerBuilderCreateParams {\n qualifiers: IReadOnlyQualifierCollector;\n resourceTypes: ReadOnlyResourceTypeCollector;\n}\n\n/**\n * Error details that can be returned by a {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @public\n */\nexport type ResourceManagerBuilderResultDetail =\n | Collections.ResultMapResultDetail\n | ResourceBuilderResultDetail;\n\n/**\n * Builder for a collection of {@link Resources.Resource | resources}. Collects\n * {@link Resources.ResourceCandidate | candidates} for each resource into a\n * {@link Resources.ResourceBuilder | ResourceBuilder} per resource, validates them against each other,\n * and builds a collection of {@link Resources.Resource | resources} once all candidates are collected.\n * @public\n */\nexport class ResourceManagerBuilder implements IResourceManager {\n public readonly qualifiers: IReadOnlyQualifierCollector;\n public readonly resourceTypes: ReadOnlyResourceTypeCollector;\n\n protected readonly _conditions: ConditionCollector;\n protected readonly _conditionSets: ConditionSetCollector;\n protected readonly _decisions: AbstractDecisionCollector;\n protected readonly _resources: ValidatingResultMap<ResourceId, ResourceBuilder>;\n public readonly _builtResources: ValidatingResultMap<ResourceId, Resource>;\n\n protected _built: boolean;\n\n /**\n * A {@link Conditions.ConditionCollector | ConditionCollector} which\n * contains the {@link Conditions.Condition | conditions} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get conditions(): ReadOnlyConditionCollector {\n return this._conditions;\n }\n\n /**\n * A {@link Conditions.ConditionSetCollector | ConditionSetCollector} which\n * contains the {@link Conditions.ConditionSet | condition sets} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get conditionSets(): ReadOnlyConditionSetCollector {\n return this._conditionSets;\n }\n\n /**\n * A {@link Decisions.AbstractDecisionCollector | AbstractDecisionCollector} which\n * contains the {@link Decisions.Decision | abstract decisions} used so far by\n * the {@link Resources.ResourceCandidate | resource candidates} in this manager.\n */\n public get decisions(): ReadOnlyAbstractDecisionCollector {\n return this._decisions;\n }\n\n /**\n * A read-only map of {@link Resources.ResourceBuilder | resource builders} used by the manager.\n */\n public get resources(): Collections.IReadOnlyValidatingResultMap<ResourceId, ResourceBuilder> {\n return this._resources;\n }\n\n /**\n * The number of {@link Resources.Resource | resources} contained by the manager.\n */\n public get size(): number {\n return this._resources.size;\n }\n\n /**\n * {@inheritdoc Runtime.IResourceManager.numResources}\n */\n public get numResources(): number {\n return this._resources.size;\n }\n\n /**\n * The number of candidates in this resource manager.\n */\n protected _numCandidates?: number;\n\n /**\n * {@inheritdoc Runtime.IResourceManager.numCandidates}\n */\n public get numCandidates(): number {\n if (this._numCandidates === undefined) {\n this._numCandidates = this.getAllCandidates().length;\n }\n return this._numCandidates;\n }\n\n /**\n * {@inheritdoc Runtime.IResourceManager.builtResources}\n */\n public get builtResources(): Collections.IReadOnlyValidatingResultMap<ResourceId, Resource> {\n return this._performBuild().orThrow();\n }\n\n /**\n * Constructor for a {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object.\n * @param params - Parameters to create a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @public\n */\n protected constructor(params: IResourceManagerBuilderCreateParams) {\n this.qualifiers = params.qualifiers;\n this.resourceTypes = params.resourceTypes;\n this._conditions = ConditionCollector.create({ qualifiers: params.qualifiers }).orThrow();\n this._conditionSets = ConditionSetCollector.create({ conditions: this._conditions }).orThrow();\n this._decisions = AbstractDecisionCollector.create({ conditionSets: this._conditionSets }).orThrow();\n this._resources = new ValidatingResultMap({\n converters: new Collections.KeyValueConverters<ResourceId, ResourceBuilder>({\n key: Convert.resourceId,\n /* c8 ignore next 2 - defense in depth against internal error */\n value: (from: unknown) =>\n from instanceof ResourceBuilder ? succeed(from) : fail('not a resource builder')\n })\n });\n this._builtResources = new ValidatingResultMap({\n converters: new Collections.KeyValueConverters<ResourceId, Resource>({\n key: Convert.resourceId,\n /* c8 ignore next 1 - defense in depth against internal error */\n value: (from: unknown) => (from instanceof Resource ? succeed(from) : fail('not a resource'))\n })\n });\n this._built = false;\n }\n\n /**\n * Creates a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object.\n * @param params - Parameters to create a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder}.\n * @returns `Success` with the new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public static create(params: IResourceManagerBuilderCreateParams): Result<ResourceManagerBuilder> {\n return captureResult(() => new ResourceManagerBuilder(params));\n }\n\n /**\n * Creates a new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object from a predefined system configuration.\n * @param name - The name of the predefined system configuration to use.\n * @param qualifierDefaultValues - Optional default values for qualifiers.\n * @returns `Success` with the new {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public static createPredefined(\n name: Config.PredefinedSystemConfiguration,\n qualifierDefaultValues?: Config.ISystemConfigurationInitParams['qualifierDefaultValues']\n ): Result<ResourceManagerBuilder> {\n return Config.getPredefinedSystemConfiguration(\n name,\n qualifierDefaultValues ? { qualifierDefaultValues } : undefined\n ).onSuccess((systemConfig) => {\n return ResourceManagerBuilder.create({\n qualifiers: systemConfig.qualifiers,\n resourceTypes: systemConfig.resourceTypes\n });\n });\n }\n\n /**\n * Given a {@link ResourceJson.Json.ILooseResourceCandidateDecl | resource candidate declaration}, builds and adds\n * a {@link Resources.ResourceCandidate | candidate} to the manager.\n * @param candidate - The {@link Resources.ResourceCandidate | candidate} to add.\n * @returns `Success` with the candidate if successful, or `Failure` with an error message if not.\n * @public\n */\n public addLooseCandidate(\n decl: ResourceJson.Json.ILooseResourceCandidateDecl\n ): DetailedResult<ResourceCandidate, ResourceBuilderResultDetail> {\n const { value: id, message } = Validate.toResourceId(decl.id);\n if (message !== undefined) {\n return failWithDetail(`${id}: invalid id - ${message}`, 'failure');\n }\n\n const builderResult = this._resources.getOrAdd(id, () =>\n ResourceBuilder.create({\n id,\n resourceTypes: this.resourceTypes,\n conditionSets: this._conditionSets,\n decisions: this._decisions\n })\n );\n /* c8 ignore next 6 - defense in depth against internal error */\n if (builderResult.isFailure()) {\n return failWithDetail(\n `${id}: unable to get or add resource\\n${builderResult.message}`,\n builderResult.detail\n );\n }\n return builderResult.value.addLooseCandidate(decl).onSuccess((c, d) => {\n this._builtResources.delete(id);\n this._built = false;\n this._numCandidates = undefined;\n return succeedWithDetail(c, d);\n });\n }\n\n public addResource(\n decl: ResourceJson.Json.ILooseResourceDecl\n ): DetailedResult<ResourceBuilder, ResourceBuilderResultDetail> {\n const { value: id, message } = Validate.toResourceId(decl.id);\n if (message !== undefined) {\n return failWithDetail(`${id}: invalid id - ${message}`, 'failure');\n }\n\n const {\n value: builder,\n message: getOrAddMessage,\n detail\n } = this._resources.getOrAdd(id, () =>\n ResourceBuilder.create({\n id,\n typeName: decl.resourceTypeName,\n resourceTypes: this.resourceTypes,\n conditionSets: this._conditionSets,\n decisions: this._decisions\n })\n );\n /* c8 ignore next 3 - defense in depth against internal error */\n if (getOrAddMessage !== undefined) {\n return failWithDetail(`${id}: unable to get or add resource\\n${getOrAddMessage}`, detail);\n }\n\n if (detail === 'exists') {\n const { message } = builder.setResourceType(decl.resourceTypeName);\n if (message !== undefined) {\n return failWithDetail(`${id}: unable to set resource type\\n${message}`, 'type-mismatch');\n }\n }\n\n const candidates = decl.candidates ?? [];\n return mapResults(candidates.map((c) => builder.addChildCandidate(c)))\n .onSuccess(() => {\n return succeed(builder);\n })\n .withDetail('failure', detail);\n }\n\n /**\n * Adds a condition to the manager.\n * @param decl - The condition declaration to add.\n * @returns `Success` with the condition if successful, or `Failure` with an error message if not.\n * @public\n */\n public addCondition(decl: ResourceJson.Json.ILooseConditionDecl): Result<Condition> {\n return ConditionsConvert.validatedConditionDecl\n .convert(decl, { qualifiers: this.qualifiers })\n .onSuccess((validated) => {\n return Condition.getKeyForDecl(validated).onSuccess((key) => {\n return this._conditions.validating.getOrAdd(key, () => Condition.create(validated));\n });\n });\n }\n\n /**\n * Adds a condition set to the manager.\n * @param decl - The condition set declaration to add.\n * @returns `Success` with the condition set if successful, or `Failure` with an error message if not.\n * @public\n */\n public addConditionSet(conditions: ResourceJson.Normalized.ConditionSetDecl): Result<ConditionSet> {\n const decl: IConditionSetDecl = { conditions: [...conditions] };\n return ConditionsConvert.validatedConditionSetDecl\n .convert(decl, { conditions: this._conditions })\n .onSuccess((validated) => {\n return ConditionSet.getKeyForDecl(validated).onSuccess((key) => {\n return this._conditionSets.validating.getOrAdd(key, () => ConditionSet.create(validated));\n });\n });\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} present in the manager.\n * @returns `Success` with the {@link Resources.ResourceBuilder | resource builder} if successful,\n * or `Failure` with an error message if not.\n */\n public getAllResources(): ReadonlyArray<ResourceBuilder> {\n return Array.from(this._resources.values()).sort((a, b) => a.id.localeCompare(b.id));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | resource candidates} present in the manager.\n */\n public getAllCandidates(): ReadonlyArray<ResourceCandidate> {\n return this.getAllResources().flatMap((r) => r.candidates);\n }\n\n /**\n * Gets an individual {@link Resources.Resource | built resource} from the manager.\n * @param id - The {@link ResourceId | id} of the resource to get.\n * @returns `Success` with the resource if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltResource(id: string): Result<Resource> {\n return this._resources.validating\n .get(id)\n .onSuccess((builder) => this._builtResources.validating.getOrAdd(id, () => builder.build()));\n }\n\n /**\n * Validates a context declaration against the qualifiers managed by this resource manager.\n * @param context - The context declaration to validate\n * @returns Success with the validated context if successful, Failure otherwise\n * @public\n */\n /* c8 ignore next 5 - functional code path tested but coverage intermittently missed */\n public validateContext(context: Context.IContextDecl): Result<Context.IValidatedContextDecl> {\n return Context.Convert.validatedContextDecl.convert(context, {\n qualifiers: this.qualifiers\n });\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} in the manager.\n * @returns `Success` with an array of resources if successful, or `Failure` with an error message if not.\n * @public\n */\n public getAllBuiltResources(): Result<ReadonlyArray<Resource>> {\n return this.build().onSuccess((manager) =>\n succeed(Array.from(manager._builtResources.values()).sort((a, b) => a.id.localeCompare(b.id)))\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} in the manager.\n * @returns `Success` with an array of resources if successful, or `Failure` with an error message if not.\n * @public\n */\n public getAllBuiltCandidates(): Result<ReadonlyArray<ResourceCandidate>> {\n return this.getAllBuiltResources().onSuccess((built) => succeed(built.flatMap((r) => r.candidates)));\n }\n\n /**\n * Internal helper method that performs the actual building of resources.\n * @returns `Success` with the built resources if all resources were built successfully, `Failure` otherwise.\n * @internal\n */\n public _performBuild(): Result<Collections.IReadOnlyValidatingResultMap<ResourceId, Resource>> {\n if (this._built) {\n return succeed(this._builtResources);\n }\n\n const errors: MessageAggregator = new MessageAggregator();\n this._resources.forEach((r, id) => {\n this._builtResources.getOrAdd(id, () => r.build()).aggregateError(errors);\n });\n /* c8 ignore next 3 - defense in depth against internal error */\n if (errors.hasMessages) {\n return fail(`build failed: ${errors.toString()}`);\n }\n this._built = true;\n return succeed(this._builtResources);\n }\n\n /**\n * Builds the {@link Resources.Resource | resources} from the collected {@link Resources.ResourceCandidate | candidates}.\n * @returns `Success` with the {@link Resources.ResourceManagerBuilder | ResourceManagerBuilder} object if successful,\n * or `Failure` with an error message if not.\n * @public\n */\n public build(): Result<this> {\n return this._performBuild().onSuccess(() => succeed(this));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | resource candidates} that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns A read-only array of {@link Resources.ResourceCandidate | candidates} that can match the context.\n * @public\n */\n public getCandidatesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): ReadonlyArray<ResourceCandidate> {\n return this.getAllCandidates().filter((candidate) => candidate.canMatchPartialContext(context, options));\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceBuilder | resource builders} that have at least one candidate\n * that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns A read-only array of {@link Resources.ResourceBuilder | resource builders} with matching candidates.\n * @public\n */\n public getResourcesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): ReadonlyArray<ResourceBuilder> {\n return this.getAllResources().filter(\n (resource) => resource.getCandidatesForContext(context, options).length > 0\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.ResourceCandidate | built resource candidates} that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns `Success` with an array of {@link Resources.ResourceCandidate | candidates} if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltCandidatesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): Result<ReadonlyArray<ResourceCandidate>> {\n return this.getAllBuiltCandidates().onSuccess((candidates) =>\n succeed(candidates.filter((candidate) => candidate.canMatchPartialContext(context, options)))\n );\n }\n\n /**\n * Gets a read-only array of all {@link Resources.Resource | built resources} that have at least one candidate\n * that can match the supplied context.\n * @param context - The {@link Context.IValidatedContextDecl | context} to match against.\n * @param options - {@link Context.IContextMatchOptions | options} for the context match.\n * @returns `Success` with an array of {@link Resources.Resource | resources} if successful, or `Failure` with an error message if not.\n * @public\n */\n public getBuiltResourcesForContext(\n context: Context.IValidatedContextDecl,\n options?: Context.IContextMatchOptions\n ): Result<ReadonlyArray<Resource>> {\n return this.getAllBuiltResources().onSuccess((resources) =>\n succeed(resources.filter((resource) => resource.getCandidatesForContext(context, options).length > 0))\n );\n }\n\n /**\n * Gets a compiled resource collection from the current state of the resource manager builder.\n * This method generates an optimized, index-based representation of all resources, conditions,\n * and decisions that can be used for serialization or efficient runtime processing.\n * @param options - Optional compilation options controlling the output format.\n * @returns Success with the compiled resource collection if successful, Failure otherwise.\n * @public\n */\n public getCompiledResourceCollection(\n options?: ResourceJson.Compiled.ICompiledResourceOptions\n ): Result<ResourceJson.Compiled.ICompiledResourceCollection> {\n // Build resources first to ensure all data is available\n const buildResult = this._performBuild();\n if (buildResult.isFailure()) {\n return fail(`Failed to build resources: ${buildResult.message}`);\n }\n\n // Generate compiled data from internal collections using the new toCompiled methods\n // Note: All objects have a defined index property due to the collector pattern - indices are assigned during collection building\n const compiledData = {\n qualifierTypes: Array.from(this.qualifiers.qualifierTypes.values()).map((qt) => ({\n name: qt.name\n })),\n qualifiers: Array.from(this.qualifiers.values()).map((q) => ({\n name: q.name,\n type: q.type.index!,\n defaultPriority: q.defaultPriority\n })),\n resourceTypes: Array.from(this.resourceTypes.values()).map((rt) => ({\n name: rt.key\n })),\n conditions: Array.from(this._conditions.values()).map((c) => c.toCompiled(options)),\n conditionSets: Array.from(this._conditionSets.values()).map((cs) => cs.toCompiled(options)),\n decisions: Array.from(this._decisions.values()).map((d) => d.toCompiled(options)),\n resources: Array.from(this._builtResources.values()).map((r) => r.toCompiled(options))\n };\n\n // Apply validation through the converter\n return ResourceJson.Compiled.Convert.compiledResourceCollection.convert(compiledData);\n }\n\n /**\n * Gets a resource collection declaration containing all built resources in a flat array structure.\n * This method returns all built resources as an {@link ResourceJson.Normalized.IResourceCollectionDecl | IResourceCollectionDecl}\n * that can be used for serialization, export, or re-import. Resources are sorted by ID for consistent ordering.\n * @param options - Optional {@link Resources.IResourceDeclarationOptions | declaration options} controlling the output format.\n * If `options.normalized` is `true`, applies hash-based normalization for additional consistency guarantees.\n * @returns Success with the resource collection declaration if successful, Failure otherwise.\n * @public\n */\n public getResourceCollectionDecl(\n options?: IResourceDeclarationOptions\n ): Result<ResourceJson.Normalized.IResourceCollectionDecl> {\n return this._performBuild().onSuccess(() => {\n // Get all built resources and convert to loose resource declarations\n const resources = Array.from(this._builtResources.values()).map((resource) =>\n resource.toLooseResourceDecl(options)\n );\n\n // Sort resources by ID for consistent ordering\n resources.sort((a, b) => a.id.localeCompare(b.id));\n\n // Create the collection declaration structure\n const collectionData = {\n resources\n };\n\n // Convert and validate using the normalized converter\n return ResourceJson.Convert.resourceCollectionDecl\n .convert(collectionData)\n .onSuccess((compiledCollection) => {\n // Apply hash-based normalization only if requested\n if (options?.normalized === true) {\n const normalizer = new Hash.Crc32Normalizer();\n return normalizer\n .normalize(compiledCollection)\n .withErrorFormat((e) => `Failed to normalize resource collection: ${e}`);\n }\n return succeed(compiledCollection);\n });\n });\n }\n\n /**\n * Creates a filtered clone of this ResourceManagerBuilder using the specified context.\n * This is a convenience method that creates a new ResourceManagerBuilder with the same\n * configuration but filtered to include only candidates that match the provided context.\n * If candidates are provided for editing, they will be applied with collision detection.\n * @param options - Options for the cloning operation, including the strongly-typed filterForContext property and optional candidates for edits.\n * @returns A Result containing the new filtered ResourceManagerBuilder.\n * @public\n */\n /* c8 ignore next 21 - functional code path tested but coverage intermittently missed */\n public clone(options?: IResourceManagerCloneOptions): Result<ResourceManagerBuilder> {\n return this.getResourceCollectionDecl(options).onSuccess((collection) => {\n return ResourceManagerBuilder.create({\n qualifiers: this.qualifiers,\n resourceTypes: this.resourceTypes\n }).onSuccess((newManager) => {\n // Check if we have candidates to apply as edits\n const editCandidates = options?.candidates || [];\n const candidatesByResourceResult =\n editCandidates.length > 0\n ? ResourceManagerBuilder._createCandidatesByResourceMap(editCandidates)\n : succeed(new Map());\n\n return candidatesByResourceResult.onSuccess((candidatesByResource) => {\n // Track which resource IDs have been processed from the original collection\n const processedResourceIds = new Set<ResourceId>();\n\n // Add each resource from the filtered collection to the new manager\n if (collection.resources) {\n for (const resourceDecl of collection.resources) {\n processedResourceIds.add(resourceDecl.id as ResourceId);\n\n // Apply edits if there are candidates for this resource\n const editedDeclResult = ResourceManagerBuilder._applyEditsToResourceDeclaration(\n resourceDecl,\n candidatesByResource,\n this._conditions\n );\n\n if (editedDeclResult.isFailure()) {\n return fail(`${resourceDecl.id}: Failed to apply edits: ${editedDeclResult.message}`);\n }\n\n const addResult = newManager.addResource(editedDeclResult.value);\n if (addResult.isFailure()) {\n return fail(\n `${resourceDecl.id}: Failed to add resource to cloned manager: ${addResult.message}`\n );\n }\n }\n }\n\n // Handle any remaining candidates that target new resources not in the original collection\n const errors = new MessageAggregator();\n for (const [resourceId, candidates] of candidatesByResource) {\n if (!processedResourceIds.has(resourceId)) {\n // Create a new resource declaration for candidates targeting a new resource ID\n ResourceManagerBuilder._createResourceDeclFromCandidates(\n resourceId,\n candidates,\n this._conditions\n )\n .withErrorFormat((e) => `${resourceId}: Failed to create new resource from candidates: ${e}`)\n .onSuccess((newResourceDecl) => {\n return newManager\n .addResource(newResourceDecl)\n .withErrorFormat(\n (e) => `${resourceId}: Failed to add new resource to cloned manager: ${e}`\n );\n })\n .aggregateError(errors);\n }\n }\n\n return errors.returnOrReport(succeed(newManager));\n });\n });\n });\n }\n\n /**\n * Creates a resource ID keyed map from an array of loose resource candidate declarations.\n * This enables efficient detection of edit collisions by grouping candidates by their target resource.\n * @param candidates - Array of loose resource candidate declarations to organize\n * @returns A Result containing a Map where keys are validated ResourceIds and values are arrays of candidates for that resource\n * @internal\n */\n private static _createCandidatesByResourceMap(\n candidates: ReadonlyArray<ResourceJson.Json.ILooseResourceCandidateDecl>\n ): Result<Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>> {\n const candidatesByResource = new Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>();\n\n for (const candidate of candidates) {\n const { value: resourceId, message } = Validate.toResourceId(candidate.id);\n if (message !== undefined) {\n return fail(`Invalid resource ID \"${candidate.id}\": ${message}`);\n }\n\n const existingCandidates = candidatesByResource.get(resourceId);\n if (existingCandidates) {\n existingCandidates.push(candidate);\n } else {\n candidatesByResource.set(resourceId, [candidate]);\n }\n }\n\n return succeed(candidatesByResource);\n }\n\n /**\n * Generates a proper ConditionSet token for collision detection using the existing ConditionSet.getKeyForDecl method.\n * @param conditionSet - The condition set to generate a token for\n * @param conditionCollector - The condition collector needed for validation context\n * @returns A Result containing the ConditionSet token if successful, or failure if validation fails\n * @internal\n */\n private static _getConditionSetToken(\n conditionSet: ResourceJson.Json.ConditionSetDecl | undefined,\n conditionCollector: ConditionCollector\n ): Result<string> {\n if (!conditionSet) {\n return succeed(ConditionSet.UnconditionalKey);\n }\n\n // Convert ConditionSetDecl to IConditionSetDecl format\n let conditionSetDecl: { conditions: ResourceJson.Json.ILooseConditionDecl[] };\n\n if (Array.isArray(conditionSet)) {\n // ConditionSetDeclAsArray: array of ILooseConditionDecl\n conditionSetDecl = { conditions: conditionSet };\n } else {\n // ConditionSetDeclAsRecord: Record<string, string | IChildConditionDecl>\n const conditions = Object.entries(conditionSet).map(([qualifierName, value]) => {\n if (typeof value === 'string') {\n return { qualifierName, value };\n } else {\n return { qualifierName, ...value };\n }\n });\n conditionSetDecl = { conditions };\n }\n\n // Validate and convert to IValidatedConditionSetDecl\n return ConditionsConvert.validatedConditionSetDecl\n .convert(conditionSetDecl, { conditions: conditionCollector })\n .onSuccess((validatedDecl) => {\n // Use proper ConditionSet.getKeyForDecl method to generate the token\n return ConditionSet.getKeyForDecl(validatedDecl);\n });\n }\n\n /**\n * Applies candidate edits to a resource declaration, handling collisions using condition set tokens.\n * If there's no collision, adds the candidate. If there's a collision, replaces the original candidate with the edit.\n * @param resourceDecl - The original resource declaration to potentially modify\n * @param candidatesByResource - Map of resource IDs to arrays of candidate edits\n * @param conditionCollector - The condition collector needed for generating condition tokens\n * @returns A Result containing the resource declaration to use (original or modified)\n * @internal\n */\n private static _applyEditsToResourceDeclaration(\n resourceDecl: ResourceJson.Json.ILooseResourceDecl,\n candidatesByResource: Map<ResourceId, ResourceJson.Json.ILooseResourceCandidateDecl[]>,\n conditionCollector: ConditionCollector\n ): Result<ResourceJson.Json.ILooseResourceDecl> {\n const { value: resourceId, message } = Validate.toResourceId(resourceDecl.id);\n if (message !== undefined) {\n return fail(`Invalid resource ID \"${resourceDecl.id}\": ${message}`);\n }\n\n const editCandidates = candidatesByResource.get(resourceId);\n if (!editCandidates || editCandidates.length === 0) {\n return succeed(resourceDecl);\n }\n\n // Use Map approach: apply original candidates first, then replace with edits on collision\n const candidatesByConditionKey = new Map<string, ResourceJson.Json.IChildResourceCandidateDecl>();\n\n // First, add all original candidates keyed by their condition set token\n for (const candidate of resourceDecl.candidates || []) {\n const conditionTokenResult = ResourceManagerBuilder._getConditionSetToken(\n candidate.conditions,\n conditionCollector\n );\n if (conditionTokenResult.isFailure()) {\n return fail(\n `Failed to generate condition token for original candidate: ${conditionTokenResult.message}`\n );\n }\n candidatesByConditionKey.set(conditionTokenResult.value, candidate);\n }\n\n // Then, apply edits (this replaces any colliding original candidates)\n // Convert edit candidates (which have ids) to child candidates (without ids) for merging\n for (const editCandidate of editCandidates) {\n const conditionTokenResult = ResourceManagerBuilder._getConditionSetToken(\n editCandidate.conditions,\n conditionCollector\n );\n if (conditionTokenResult.isFailure()) {\n return fail(`Failed to generate condition token for edit candidate: ${conditionTokenResult.message}`);\n }\n\n const childCandidate: ResourceJson.Json.IChildResourceCandidateDecl = {\n json: editCandidate.json,\n conditions: editCandidate.conditions,\n isPartial: editCandidate.isPartial,\n mergeMethod: editCandidate.mergeMethod\n };\n candidatesByConditionKey.set(conditionTokenResult.value, childCandidate);\n }\n\n // Extract the final merged candidate list\n const mergedCandidates = Array.from(candidatesByConditionKey.values());\n\n const modifiedDecl: ResourceJson.Json.ILooseResourceDecl = {\n ...resourceDecl,\n candidates: mergedCandidates\n };\n\n return succeed(modifiedDecl);\n }\n\n /**\n * Creates a new resource declaration from an array of candidate declarations.\n * This is used when cloning to create new resources that don't exist in the original manager.\n * @param resourceId - The validated resource ID for the new resource\n * @param candidates - Array of loose candidate declarations for the new resource\n * @param conditionCollector - The condition collector for validation context\n * @returns A Result containing the new resource declaration if successful, or failure if validation fails\n * @internal\n */\n private static _createResourceDeclFromCandidates(\n resourceId: ResourceId,\n candidates: ResourceJson.Json.ILooseResourceCandidateDecl[],\n conditionCollector: ConditionCollector\n ): Result<ResourceJson.Json.ILooseResourceDecl> {\n // Convert candidate declarations to child candidate declarations\n const childCandidates: ResourceJson.Json.IChildResourceCandidateDecl[] = [];\n\n // Ensure we have candidates\n if (candidates.length === 0) {\n return fail('Cannot create resource declaration from empty candidates array');\n }\n\n // Extract resourceTypeName from the first candidate (all candidates for the same resource should have the same type)\n const resourceTypeName = candidates[0].resourceTypeName;\n if (!resourceTypeName) {\n return fail('resourceTypeName is required for new resource candidates');\n }\n\n for (const candidate of candidates) {\n const childCandidate: ResourceJson.Json.IChildResourceCandidateDecl = {\n json: candidate.json,\n conditions: candidate.conditions,\n isPartial: candidate.isPartial,\n mergeMethod: candidate.mergeMethod\n };\n childCandidates.push(childCandidate);\n }\n\n // Create the new resource declaration\n const newResourceDecl: ResourceJson.Json.ILooseResourceDecl = {\n id: resourceId,\n candidates: childCandidates,\n resourceTypeName\n };\n\n return succeed(newResourceDecl);\n }\n}\n"]}
|
|
@@ -20,6 +20,19 @@ export type DecisionResolutionResult = {
|
|
|
20
20
|
instanceIndices: ReadonlyArray<number>;
|
|
21
21
|
defaultInstanceIndices: ReadonlyArray<number>;
|
|
22
22
|
};
|
|
23
|
+
/**
|
|
24
|
+
* Options for configuring a {@link Runtime.ResourceResolver | ResourceResolver}.
|
|
25
|
+
* @public
|
|
26
|
+
*/
|
|
27
|
+
export interface IResourceResolverOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Controls whether null values in resource composition should suppress properties
|
|
30
|
+
* instead of setting them to null. When true, properties with null values from
|
|
31
|
+
* higher-priority partial candidates will be omitted from the final composed resource.
|
|
32
|
+
* @defaultValue false
|
|
33
|
+
*/
|
|
34
|
+
suppressNullAsDelete?: boolean;
|
|
35
|
+
}
|
|
23
36
|
/**
|
|
24
37
|
* Parameters for creating a {@link Runtime.ResourceResolver | ResourceResolver}.
|
|
25
38
|
* @public
|
|
@@ -44,6 +57,10 @@ export interface IResourceResolverCreateParams {
|
|
|
44
57
|
* An optional listener for {@link Runtime.ResourceResolver | ResourceResolver} cache activity.
|
|
45
58
|
*/
|
|
46
59
|
listener?: IResourceResolverCacheListener;
|
|
60
|
+
/**
|
|
61
|
+
* Optional configuration options for the {@link Runtime.ResourceResolver | ResourceResolver}.
|
|
62
|
+
*/
|
|
63
|
+
options?: IResourceResolverOptions;
|
|
47
64
|
}
|
|
48
65
|
/**
|
|
49
66
|
* High-performance runtime resource resolver with O(1) condition caching.
|
|
@@ -64,6 +81,10 @@ export declare class ResourceResolver {
|
|
|
64
81
|
* The context qualifier provider that resolves qualifier values.
|
|
65
82
|
*/
|
|
66
83
|
readonly contextQualifierProvider: IContextQualifierProvider;
|
|
84
|
+
/**
|
|
85
|
+
* The configuration options for this resource resolver.
|
|
86
|
+
*/
|
|
87
|
+
readonly options: IResourceResolverOptions;
|
|
67
88
|
/**
|
|
68
89
|
* The cache array for resolved conditions, indexed by condition index for O(1) lookup.
|
|
69
90
|
* Each entry stores the resolved {@link Runtime.IConditionMatchResult | condition match result} for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resourceResolver.d.ts","sourceRoot":"","sources":["../../../src/packlets/runtime/resourceResolver.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,EAAgC,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,SAAS,EAA4B,MAAM,mBAAmB,CAAC;AAGxE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAEL,4BAA4B,EAC5B,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,OAAO,EAAE,KAAK,CAAA;CAAE,GAClB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,eAAe,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAAC,sBAAsB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAE7G;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C;;;OAGG;IACH,eAAe,EAAE,gBAAgB,CAAC;IAElC;;;OAGG;IACH,cAAc,EAAE,8BAA8B,CAAC;IAE/C;;;OAGG;IACH,wBAAwB,EAAE,yBAAyB,CAAC;IAEpD;;OAEG;IACH,QAAQ,CAAC,EAAE,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"resourceResolver.d.ts","sourceRoot":"","sources":["../../../src/packlets/runtime/resourceResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,9 +61,13 @@ class ResourceResolver {
|
|
|
61
61
|
* @param params - {@link Runtime.IResourceResolverCreateParams | Parameters} used to create the resolver.
|
|
62
62
|
*/
|
|
63
63
|
constructor(params) {
|
|
64
|
+
var _a, _b;
|
|
64
65
|
this.resourceManager = params.resourceManager;
|
|
65
66
|
this.qualifierTypes = params.qualifierTypes;
|
|
66
67
|
this.contextQualifierProvider = params.contextQualifierProvider;
|
|
68
|
+
this.options = {
|
|
69
|
+
suppressNullAsDelete: (_b = (_a = params.options) === null || _a === void 0 ? void 0 : _a.suppressNullAsDelete) !== null && _b !== void 0 ? _b : false
|
|
70
|
+
};
|
|
67
71
|
// Initialize condition cache array with size matching the condition collector
|
|
68
72
|
const conditionCollectorSize = this.resourceManager.conditions.size;
|
|
69
73
|
this._conditionCache = new Array(conditionCollectorSize);
|
|
@@ -157,8 +161,8 @@ class ResourceResolver {
|
|
|
157
161
|
let matchType = 'match';
|
|
158
162
|
for (const condition of conditionSet.conditions) {
|
|
159
163
|
const { value: conditionResult, message: conditionMessage } = this.resolveCondition(condition);
|
|
164
|
+
/* c8 ignore next 4 - defensive coding: extreme internal error scenario not reachable in normal operation */
|
|
160
165
|
if (conditionMessage !== undefined) {
|
|
161
|
-
/* c8 ignore next 2 - defensive coding: extreme internal error scenario not reachable in normal operation */
|
|
162
166
|
(_b = this._listener) === null || _b === void 0 ? void 0 : _b.onCacheError('conditionSet', conditionSetIndex);
|
|
163
167
|
return (0, ts_utils_1.fail)(`Failed to resolve condition "${condition.key}": ${conditionMessage}`);
|
|
164
168
|
}
|
|
@@ -227,8 +231,8 @@ class ResourceResolver {
|
|
|
227
231
|
for (let instanceIndex = 0; instanceIndex < decision.candidates.length; instanceIndex++) {
|
|
228
232
|
const candidate = decision.candidates[instanceIndex];
|
|
229
233
|
const conditionSetResult = this.resolveConditionSet(candidate.conditionSet);
|
|
234
|
+
/* c8 ignore next 4 - defensive coding: extreme internal error scenario not reachable in normal operation */
|
|
230
235
|
if (conditionSetResult.isFailure()) {
|
|
231
|
-
/* c8 ignore next 2 - defensive coding: extreme internal error scenario not reachable in normal operation */
|
|
232
236
|
(_b = this._listener) === null || _b === void 0 ? void 0 : _b.onCacheError('decision', decisionIndex);
|
|
233
237
|
return (0, ts_utils_1.fail)(`${decision.key}: Failed to resolve condition set": ${conditionSetResult.message}`);
|
|
234
238
|
}
|
|
@@ -374,9 +378,22 @@ class ResourceResolver {
|
|
|
374
378
|
// If no full candidate found, use the last candidate as the base
|
|
375
379
|
const baseCandidateIndex = fullCandidateIndex >= 0 ? fullCandidateIndex : candidates.length - 1;
|
|
376
380
|
const baseCandidate = candidates[baseCandidateIndex];
|
|
377
|
-
// If there are no partial candidates to merge,
|
|
381
|
+
// If there are no partial candidates to merge, but null-as-delete is enabled,
|
|
382
|
+
// still process through JsonEditor to handle null properties in the base candidate
|
|
378
383
|
if (partialCandidates.length === 0) {
|
|
379
|
-
|
|
384
|
+
if (this.options.suppressNullAsDelete || !(0, ts_json_base_1.isJsonObject)(baseCandidate.json)) {
|
|
385
|
+
return (0, ts_utils_1.succeed)(baseCandidate.json);
|
|
386
|
+
}
|
|
387
|
+
// Process single candidate through JsonEditor to apply null-as-delete
|
|
388
|
+
const editor = ts_json_1.JsonEditor.create({
|
|
389
|
+
merge: {
|
|
390
|
+
arrayMergeBehavior: 'replace',
|
|
391
|
+
nullAsDelete: true
|
|
392
|
+
}
|
|
393
|
+
}).orThrow(); // Should never fail with valid options
|
|
394
|
+
return editor
|
|
395
|
+
.mergeObjectsInPlace({}, [baseCandidate.json])
|
|
396
|
+
.withErrorFormat((err) => `${resource.id}: Composition failed: ${err}`);
|
|
380
397
|
}
|
|
381
398
|
const allCandidates = [
|
|
382
399
|
baseCandidate.json,
|
|
@@ -386,10 +403,11 @@ class ResourceResolver {
|
|
|
386
403
|
if (allCandidates.length !== partialCandidates.length + 1) {
|
|
387
404
|
return (0, ts_utils_1.fail)(`${resource.id}: Unable to compose non-object candidate values.`);
|
|
388
405
|
}
|
|
389
|
-
// Create JsonEditor with array replacement behavior for resource composition
|
|
406
|
+
// Create JsonEditor with array replacement behavior and null-as-delete for resource composition
|
|
390
407
|
const editor = ts_json_1.JsonEditor.create({
|
|
391
408
|
merge: {
|
|
392
|
-
arrayMergeBehavior: 'replace'
|
|
409
|
+
arrayMergeBehavior: 'replace',
|
|
410
|
+
nullAsDelete: !this.options.suppressNullAsDelete
|
|
393
411
|
}
|
|
394
412
|
}).orThrow(); // Should never fail with valid options
|
|
395
413
|
return editor
|