@fgv/ts-res 5.0.1-1 → 5.0.1-3
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 +15 -15
- package/dist/tsdoc-metadata.json +1 -1
- package/lib/packlets/common/helpers/resources.d.ts +1 -1
- package/lib/packlets/common/helpers/resources.js +3 -2
- package/lib/packlets/common/validate/conditions.js +14 -14
- package/lib/packlets/common/validate/resources.js +7 -7
- package/lib/packlets/conditions/conditionSet.js +1 -1
- package/lib/packlets/config/common.js +1 -0
- package/lib/packlets/config/configInitFactory.js +1 -0
- package/lib/packlets/config/systemConfiguration.js +1 -0
- package/lib/packlets/context/convert/decls.js +1 -1
- package/lib/packlets/import/importers/collectionImporter.js +1 -1
- package/lib/packlets/import/importers/jsonImporter.js +1 -1
- package/lib/packlets/qualifier-types/helpers.js +5 -4
- package/lib/packlets/qualifier-types/languageQualifierType.d.ts +4 -4
- package/lib/packlets/qualifier-types/literalQualifierType.d.ts +4 -4
- package/lib/packlets/qualifier-types/literalQualifierType.js +1 -1
- package/lib/packlets/qualifier-types/literalValueHierarchy.js +7 -6
- package/lib/packlets/qualifier-types/qualifierType.d.ts +5 -5
- package/lib/packlets/qualifier-types/qualifierType.js +1 -0
- package/lib/packlets/qualifier-types/territoryQualifierType.d.ts +4 -4
- package/lib/packlets/qualifier-types/territoryQualifierType.js +1 -1
- package/lib/packlets/resource-json/helpers.js +4 -0
- package/lib/packlets/resource-types/helpers.js +1 -0
- package/lib/packlets/resource-types/resourceType.js +1 -0
- package/lib/packlets/resources/candidateValue.js +1 -0
- package/lib/packlets/resources/candidateValueCollector.js +4 -2
- package/lib/packlets/resources/deltaGenerator.js +8 -10
- package/lib/packlets/resources/resourceBuilder.js +4 -0
- package/lib/packlets/resources/resourceManagerBuilder.js +6 -0
- package/lib/packlets/runtime/compiledResourceCollection.js +1 -0
- package/lib/packlets/runtime/context/simpleContextQualifierProvider.js +4 -3
- package/lib/packlets/runtime/resource-tree/resourceTreeChildren.js +3 -0
- package/lib/packlets/runtime/resourceResolver.js +2 -4
- package/lib/packlets/runtime/resourceTreeResolver.js +2 -0
- package/package.json +20 -20
package/dist/ts-res.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { FileTree } from '@fgv/ts-json-base';
|
|
|
7
7
|
import { Hash } from '@fgv/ts-utils';
|
|
8
8
|
import { ICollectible } from '@fgv/ts-utils';
|
|
9
9
|
import { IReadOnlyResultMap } from '@fgv/ts-utils';
|
|
10
|
-
import {
|
|
10
|
+
import { JsonCompatibleType } from '@fgv/ts-json-base';
|
|
11
11
|
import { JsonObject } from '@fgv/ts-json-base';
|
|
12
12
|
import { JsonValue } from '@fgv/ts-json-base';
|
|
13
13
|
import { Logging } from '@fgv/ts-utils';
|
|
@@ -2876,7 +2876,7 @@ declare function getDirectoryName(path: string): string;
|
|
|
2876
2876
|
/**
|
|
2877
2877
|
* Gets the name for a resource ID.
|
|
2878
2878
|
* @param id - The resource ID to get the name for.
|
|
2879
|
-
* @returns
|
|
2879
|
+
* @returns `Success` with the resource name if found, or `Failure` with an error message if not.
|
|
2880
2880
|
* @public
|
|
2881
2881
|
*/
|
|
2882
2882
|
declare function getNameForResourceId(id: string | undefined): Result<ResourceName>;
|
|
@@ -4960,13 +4960,13 @@ declare interface IQualifierType<TCFGJSON extends JsonObject = JsonObject> exten
|
|
|
4960
4960
|
* Gets the configuration for this qualifier type.
|
|
4961
4961
|
* @returns `Success` with the configuration if successful, `Failure` with an error message otherwise.
|
|
4962
4962
|
*/
|
|
4963
|
-
getConfigurationJson(): Result<
|
|
4963
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config_2.IQualifierTypeConfig<TCFGJSON>>>;
|
|
4964
4964
|
/**
|
|
4965
4965
|
* Validates configuration JSON data for this qualifier type.
|
|
4966
4966
|
* @param from - The unknown data to validate as configuration JSON.
|
|
4967
4967
|
* @returns `Success` with validated JSON configuration if valid, `Failure` with an error message otherwise.
|
|
4968
4968
|
*/
|
|
4969
|
-
validateConfigurationJson(from: unknown): Result<
|
|
4969
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config_2.IQualifierTypeConfig<TCFGJSON>>>;
|
|
4970
4970
|
}
|
|
4971
4971
|
|
|
4972
4972
|
/**
|
|
@@ -6568,7 +6568,7 @@ declare const LanguagePrioritySystemConfiguration: ISystemConfiguration;
|
|
|
6568
6568
|
* Accepts a list of language tags in the context by default.
|
|
6569
6569
|
* @public
|
|
6570
6570
|
*/
|
|
6571
|
-
declare class LanguageQualifierType extends QualifierType<
|
|
6571
|
+
declare class LanguageQualifierType extends QualifierType<JsonCompatibleType<Config_2.ILanguageQualifierTypeConfig>> {
|
|
6572
6572
|
/**
|
|
6573
6573
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
6574
6574
|
*/
|
|
@@ -6611,11 +6611,11 @@ declare class LanguageQualifierType extends QualifierType<JsonCompatible<Config_
|
|
|
6611
6611
|
/**
|
|
6612
6612
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
6613
6613
|
*/
|
|
6614
|
-
getConfigurationJson(): Result<
|
|
6614
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config_2.ISystemLanguageQualifierTypeConfig>>;
|
|
6615
6615
|
/**
|
|
6616
6616
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
6617
6617
|
*/
|
|
6618
|
-
validateConfigurationJson(from: unknown): Result<
|
|
6618
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config_2.ISystemLanguageQualifierTypeConfig>>;
|
|
6619
6619
|
/**
|
|
6620
6620
|
* Validates a {@link QualifierTypes.Config.ISystemLanguageQualifierTypeConfig | strongly typed configuration object}
|
|
6621
6621
|
* for this qualifier type.
|
|
@@ -6646,7 +6646,7 @@ declare const languageQualifierTypeConfig: ObjectConverter<Model_2.ILanguageQual
|
|
|
6646
6646
|
* optionally case-sensitive or matching against an ordered list of values at runtime.
|
|
6647
6647
|
* @public
|
|
6648
6648
|
*/
|
|
6649
|
-
declare class LiteralQualifierType extends QualifierType<
|
|
6649
|
+
declare class LiteralQualifierType extends QualifierType<JsonCompatibleType<Config_2.ILiteralQualifierTypeConfig>> {
|
|
6650
6650
|
/**
|
|
6651
6651
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
6652
6652
|
*/
|
|
@@ -6695,11 +6695,11 @@ declare class LiteralQualifierType extends QualifierType<JsonCompatible<Config_2
|
|
|
6695
6695
|
/**
|
|
6696
6696
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
6697
6697
|
*/
|
|
6698
|
-
getConfigurationJson(): Result<
|
|
6698
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config_2.ISystemLiteralQualifierTypeConfig>>;
|
|
6699
6699
|
/**
|
|
6700
6700
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
6701
6701
|
*/
|
|
6702
|
-
validateConfigurationJson(from: unknown): Result<
|
|
6702
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config_2.ISystemLiteralQualifierTypeConfig>>;
|
|
6703
6703
|
/**
|
|
6704
6704
|
* Validates a {@link QualifierTypes.Config.ISystemLiteralQualifierTypeConfig | strongly typed configuration object}
|
|
6705
6705
|
* for this qualifier type.
|
|
@@ -7717,11 +7717,11 @@ export declare abstract class QualifierType<TCFGJSON extends JsonObject = JsonOb
|
|
|
7717
7717
|
/**
|
|
7718
7718
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
7719
7719
|
*/
|
|
7720
|
-
abstract getConfigurationJson(): Result<
|
|
7720
|
+
abstract getConfigurationJson(): Result<JsonCompatibleType<Config_2.IQualifierTypeConfig<TCFGJSON>>>;
|
|
7721
7721
|
/**
|
|
7722
7722
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
7723
7723
|
*/
|
|
7724
|
-
abstract validateConfigurationJson(from: unknown): Result<
|
|
7724
|
+
abstract validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config_2.IQualifierTypeConfig<TCFGJSON>>>;
|
|
7725
7725
|
/**
|
|
7726
7726
|
* {@inheritdoc QualifierTypes.IQualifierType.setIndex}
|
|
7727
7727
|
*/
|
|
@@ -10010,7 +10010,7 @@ declare const TerritoryPrioritySystemConfiguration: ISystemConfiguration;
|
|
|
10010
10010
|
* implementation handles incorrect casing.
|
|
10011
10011
|
* @public
|
|
10012
10012
|
*/
|
|
10013
|
-
declare class TerritoryQualifierType extends QualifierType<
|
|
10013
|
+
declare class TerritoryQualifierType extends QualifierType<JsonCompatibleType<Config_2.ITerritoryQualifierTypeConfig>> {
|
|
10014
10014
|
/**
|
|
10015
10015
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
10016
10016
|
*/
|
|
@@ -10065,11 +10065,11 @@ declare class TerritoryQualifierType extends QualifierType<JsonCompatible<Config
|
|
|
10065
10065
|
/**
|
|
10066
10066
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
10067
10067
|
*/
|
|
10068
|
-
getConfigurationJson(): Result<
|
|
10068
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config_2.ISystemTerritoryQualifierTypeConfig>>;
|
|
10069
10069
|
/**
|
|
10070
10070
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
10071
10071
|
*/
|
|
10072
|
-
validateConfigurationJson(from: unknown): Result<
|
|
10072
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config_2.ISystemTerritoryQualifierTypeConfig>>;
|
|
10073
10073
|
/**
|
|
10074
10074
|
* Validates a {@link QualifierTypes.Config.ISystemTerritoryQualifierTypeConfig | strongly typed configuration object}
|
|
10075
10075
|
* for this qualifier type.
|
package/dist/tsdoc-metadata.json
CHANGED
|
@@ -34,7 +34,7 @@ export declare function joinOptionalResourceIds(...ids: (string | undefined)[]):
|
|
|
34
34
|
/**
|
|
35
35
|
* Gets the name for a resource ID.
|
|
36
36
|
* @param id - The resource ID to get the name for.
|
|
37
|
-
* @returns
|
|
37
|
+
* @returns `Success` with the resource name if found, or `Failure` with an error message if not.
|
|
38
38
|
* @public
|
|
39
39
|
*/
|
|
40
40
|
export declare function getNameForResourceId(id: string | undefined): Result<ResourceName>;
|
|
@@ -87,12 +87,13 @@ function joinOptionalResourceIds(...ids) {
|
|
|
87
87
|
/**
|
|
88
88
|
* Gets the name for a resource ID.
|
|
89
89
|
* @param id - The resource ID to get the name for.
|
|
90
|
-
* @returns
|
|
90
|
+
* @returns `Success` with the resource name if found, or `Failure` with an error message if not.
|
|
91
91
|
* @public
|
|
92
92
|
*/
|
|
93
93
|
function getNameForResourceId(id) {
|
|
94
94
|
return splitResourceId(id).onSuccess((parts) => {
|
|
95
|
-
|
|
95
|
+
/* c8 ignore next 1 - tested but coverage having issues */
|
|
96
|
+
return parts.length > 0 ? (0, ts_utils_1.succeed)(parts[parts.length - 1]) : fail(`${id}: invalid resource id`);
|
|
96
97
|
});
|
|
97
98
|
}
|
|
98
99
|
//# sourceMappingURL=resources.js.map
|
|
@@ -316,7 +316,7 @@ function toQualifierTypeIndex(index) {
|
|
|
316
316
|
function toQualifierMatchScore(value) {
|
|
317
317
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
318
318
|
if (!isValidQualifierMatchScore(value)) {
|
|
319
|
-
return (0, ts_utils_1.fail)(`${value}:
|
|
319
|
+
return (0, ts_utils_1.fail)(`${value}: invalid match score`);
|
|
320
320
|
}
|
|
321
321
|
return (0, ts_utils_1.succeed)(value);
|
|
322
322
|
}
|
|
@@ -330,7 +330,7 @@ function toQualifierMatchScore(value) {
|
|
|
330
330
|
function toConditionPriority(priority) {
|
|
331
331
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
332
332
|
if (!isValidConditionPriority(priority)) {
|
|
333
|
-
return (0, ts_utils_1.fail)(`${priority}:
|
|
333
|
+
return (0, ts_utils_1.fail)(`${priority}: invalid priority`);
|
|
334
334
|
}
|
|
335
335
|
return (0, ts_utils_1.succeed)(priority);
|
|
336
336
|
}
|
|
@@ -344,7 +344,7 @@ function toConditionPriority(priority) {
|
|
|
344
344
|
function toConditionIndex(index) {
|
|
345
345
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
346
346
|
if (!isValidConditionIndex(index)) {
|
|
347
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
347
|
+
return (0, ts_utils_1.fail)(`${index}: invalid condition index`);
|
|
348
348
|
}
|
|
349
349
|
return (0, ts_utils_1.succeed)(index);
|
|
350
350
|
}
|
|
@@ -357,7 +357,7 @@ function toConditionIndex(index) {
|
|
|
357
357
|
*/
|
|
358
358
|
function toConditionOperator(operator) {
|
|
359
359
|
if (!isValidConditionOperator(operator)) {
|
|
360
|
-
return (0, ts_utils_1.fail)(`${operator}:
|
|
360
|
+
return (0, ts_utils_1.fail)(`${operator}: invalid condition operator`);
|
|
361
361
|
}
|
|
362
362
|
return (0, ts_utils_1.succeed)(operator);
|
|
363
363
|
}
|
|
@@ -371,7 +371,7 @@ function toConditionOperator(operator) {
|
|
|
371
371
|
function toConditionKey(key) {
|
|
372
372
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
373
373
|
if (!isValidConditionKey(key)) {
|
|
374
|
-
return (0, ts_utils_1.fail)(`${key}:
|
|
374
|
+
return (0, ts_utils_1.fail)(`${key}: invalid condition key`);
|
|
375
375
|
}
|
|
376
376
|
return (0, ts_utils_1.succeed)(key);
|
|
377
377
|
}
|
|
@@ -385,7 +385,7 @@ function toConditionKey(key) {
|
|
|
385
385
|
function toConditionToken(token) {
|
|
386
386
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
387
387
|
if (!isValidConditionToken(token)) {
|
|
388
|
-
return (0, ts_utils_1.fail)(`${token}:
|
|
388
|
+
return (0, ts_utils_1.fail)(`${token}: invalid condition token`);
|
|
389
389
|
}
|
|
390
390
|
return (0, ts_utils_1.succeed)(token);
|
|
391
391
|
}
|
|
@@ -399,7 +399,7 @@ function toConditionToken(token) {
|
|
|
399
399
|
function toConditionSetIndex(index) {
|
|
400
400
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
401
401
|
if (!isValidConditionSetIndex(index)) {
|
|
402
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
402
|
+
return (0, ts_utils_1.fail)(`${index}: invalid condition set index`);
|
|
403
403
|
}
|
|
404
404
|
return (0, ts_utils_1.succeed)(index);
|
|
405
405
|
}
|
|
@@ -413,7 +413,7 @@ function toConditionSetIndex(index) {
|
|
|
413
413
|
function toConditionSetKey(key) {
|
|
414
414
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
415
415
|
if (!isValidConditionSetKey(key)) {
|
|
416
|
-
return (0, ts_utils_1.fail)(`${key}:
|
|
416
|
+
return (0, ts_utils_1.fail)(`${key}: invalid condition set key`);
|
|
417
417
|
}
|
|
418
418
|
return (0, ts_utils_1.succeed)(key);
|
|
419
419
|
}
|
|
@@ -427,7 +427,7 @@ function toConditionSetKey(key) {
|
|
|
427
427
|
function toConditionSetToken(token) {
|
|
428
428
|
/* c8 ignore next 3 - functional code path tested but coverage intermittently missed */
|
|
429
429
|
if (!isValidConditionSetToken(token)) {
|
|
430
|
-
return (0, ts_utils_1.fail)(`${token}:
|
|
430
|
+
return (0, ts_utils_1.fail)(`${token}: invalid condition set token`);
|
|
431
431
|
}
|
|
432
432
|
return (0, ts_utils_1.succeed)(token);
|
|
433
433
|
}
|
|
@@ -440,7 +440,7 @@ function toConditionSetToken(token) {
|
|
|
440
440
|
*/
|
|
441
441
|
function toConditionSetHash(hash) {
|
|
442
442
|
if (!isValidConditionSetHash(hash)) {
|
|
443
|
-
return (0, ts_utils_1.fail)(`${hash}:
|
|
443
|
+
return (0, ts_utils_1.fail)(`${hash}: invalid condition set hash`);
|
|
444
444
|
}
|
|
445
445
|
return (0, ts_utils_1.succeed)(hash);
|
|
446
446
|
}
|
|
@@ -454,7 +454,7 @@ function toConditionSetHash(hash) {
|
|
|
454
454
|
function toDecisionKey(key) {
|
|
455
455
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
456
456
|
if (!isValidDecisionKey(key)) {
|
|
457
|
-
return (0, ts_utils_1.fail)(`${key}:
|
|
457
|
+
return (0, ts_utils_1.fail)(`${key}: invalid decision key`);
|
|
458
458
|
}
|
|
459
459
|
return (0, ts_utils_1.succeed)(key);
|
|
460
460
|
}
|
|
@@ -468,7 +468,7 @@ function toDecisionKey(key) {
|
|
|
468
468
|
function toDecisionIndex(index) {
|
|
469
469
|
/* c8 ignore next 3 - coverage is having a bad day */
|
|
470
470
|
if (!isValidDecisionIndex(index)) {
|
|
471
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
471
|
+
return (0, ts_utils_1.fail)(`${index}: invalid decision index`);
|
|
472
472
|
}
|
|
473
473
|
return (0, ts_utils_1.succeed)(index);
|
|
474
474
|
}
|
|
@@ -513,7 +513,7 @@ function isValidContextToken(token) {
|
|
|
513
513
|
function toContextQualifierToken(token) {
|
|
514
514
|
/* c8 ignore next 3 - functional code path tested but coverage intermittently missed */
|
|
515
515
|
if (!isValidContextQualifierToken(token)) {
|
|
516
|
-
return (0, ts_utils_1.fail)(`${token}:
|
|
516
|
+
return (0, ts_utils_1.fail)(`${token}: invalid context qualifier token`);
|
|
517
517
|
}
|
|
518
518
|
return (0, ts_utils_1.succeed)(token);
|
|
519
519
|
}
|
|
@@ -527,7 +527,7 @@ function toContextQualifierToken(token) {
|
|
|
527
527
|
function toContextToken(token) {
|
|
528
528
|
/* c8 ignore next 3 - functional code path tested but coverage intermittently missed */
|
|
529
529
|
if (!isValidContextToken(token)) {
|
|
530
|
-
return (0, ts_utils_1.fail)(`${token}:
|
|
530
|
+
return (0, ts_utils_1.fail)(`${token}: invalid context token`);
|
|
531
531
|
}
|
|
532
532
|
return (0, ts_utils_1.succeed)(token);
|
|
533
533
|
}
|
|
@@ -119,7 +119,7 @@ function isValidCandidateValueKey(key) {
|
|
|
119
119
|
function toResourceName(name) {
|
|
120
120
|
/* c8 ignore next 3 - coverage having issues */
|
|
121
121
|
if (!isValidResourceName(name)) {
|
|
122
|
-
return (0, ts_utils_1.fail)(`${name}:
|
|
122
|
+
return (0, ts_utils_1.fail)(`${name}: invalid resource name.`);
|
|
123
123
|
}
|
|
124
124
|
return (0, ts_utils_1.succeed)(name);
|
|
125
125
|
}
|
|
@@ -134,7 +134,7 @@ function toResourceName(name) {
|
|
|
134
134
|
function toResourceId(id) {
|
|
135
135
|
/* c8 ignore next 3 - defensive coding: resource ID validation should prevent invalid IDs */
|
|
136
136
|
if (!isValidResourceId(id)) {
|
|
137
|
-
return (0, ts_utils_1.fail)(`${id}:
|
|
137
|
+
return (0, ts_utils_1.fail)(`${id}: invalid resource ID.`);
|
|
138
138
|
}
|
|
139
139
|
return (0, ts_utils_1.succeed)(id);
|
|
140
140
|
}
|
|
@@ -159,7 +159,7 @@ function toOptionalResourceId(id) {
|
|
|
159
159
|
*/
|
|
160
160
|
function toResourceIndex(index) {
|
|
161
161
|
if (!isValidResourceIndex(index)) {
|
|
162
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
162
|
+
return (0, ts_utils_1.fail)(`${index}: invalid resource index.`);
|
|
163
163
|
}
|
|
164
164
|
return (0, ts_utils_1.succeed)(index);
|
|
165
165
|
}
|
|
@@ -174,7 +174,7 @@ function toResourceIndex(index) {
|
|
|
174
174
|
function toResourceTypeName(name) {
|
|
175
175
|
/* c8 ignore next 3 - coverage having issues */
|
|
176
176
|
if (!isValidResourceTypeName(name)) {
|
|
177
|
-
return (0, ts_utils_1.fail)(`${name}:
|
|
177
|
+
return (0, ts_utils_1.fail)(`${name}: invalid resource type name.`);
|
|
178
178
|
}
|
|
179
179
|
return (0, ts_utils_1.succeed)(name);
|
|
180
180
|
}
|
|
@@ -189,7 +189,7 @@ function toResourceTypeName(name) {
|
|
|
189
189
|
function toResourceTypeIndex(index) {
|
|
190
190
|
/* c8 ignore next 3 - coverage having issues */
|
|
191
191
|
if (!isValidResourceTypeIndex(index)) {
|
|
192
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
192
|
+
return (0, ts_utils_1.fail)(`${index}: invalid resource type index.`);
|
|
193
193
|
}
|
|
194
194
|
return (0, ts_utils_1.succeed)(index);
|
|
195
195
|
}
|
|
@@ -204,7 +204,7 @@ function toResourceTypeIndex(index) {
|
|
|
204
204
|
function toCandidateValueKey(key) {
|
|
205
205
|
/* c8 ignore next 3 - coverage having issues */
|
|
206
206
|
if (!isValidCandidateValueKey(key)) {
|
|
207
|
-
return (0, ts_utils_1.fail)(`${key}:
|
|
207
|
+
return (0, ts_utils_1.fail)(`${key}: invalid candidate value key.`);
|
|
208
208
|
}
|
|
209
209
|
return (0, ts_utils_1.succeed)(key);
|
|
210
210
|
}
|
|
@@ -219,7 +219,7 @@ function toCandidateValueKey(key) {
|
|
|
219
219
|
function toCandidateValueIndex(index) {
|
|
220
220
|
/* c8 ignore next 3 - coverage having issues */
|
|
221
221
|
if (!isValidCandidateValueIndex(index)) {
|
|
222
|
-
return (0, ts_utils_1.fail)(`${index}:
|
|
222
|
+
return (0, ts_utils_1.fail)(`${index}: invalid candidate value index.`);
|
|
223
223
|
}
|
|
224
224
|
return (0, ts_utils_1.succeed)(index);
|
|
225
225
|
}
|
|
@@ -185,9 +185,9 @@ class ConditionSet {
|
|
|
185
185
|
const conditions = Object.entries(conditionSet).map(([qualifierName, value]) => {
|
|
186
186
|
if (typeof value === 'string') {
|
|
187
187
|
return { qualifierName, value };
|
|
188
|
+
/* c8 ignore next 3 - edge case */
|
|
188
189
|
}
|
|
189
190
|
else {
|
|
190
|
-
/* c8 ignore next 1 - edge case: object spread pattern rarely used */
|
|
191
191
|
return Object.assign({ qualifierName }, value);
|
|
192
192
|
}
|
|
193
193
|
});
|
|
@@ -123,6 +123,7 @@ class BuiltInQualifierTypeFactory {
|
|
|
123
123
|
if (QualifierTypes.Config.isSystemQualifierTypeConfig(config)) {
|
|
124
124
|
return QualifierTypes.createQualifierTypeFromSystemConfig(config);
|
|
125
125
|
}
|
|
126
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
126
127
|
return (0, ts_utils_1.fail)(`${config.name}: unknown built-in qualifier type (${config.systemType})`);
|
|
127
128
|
}
|
|
128
129
|
}
|
|
@@ -122,6 +122,7 @@ class SystemConfiguration {
|
|
|
122
122
|
*/
|
|
123
123
|
static create(config, initParams) {
|
|
124
124
|
if (initParams === null || initParams === void 0 ? void 0 : initParams.qualifierDefaultValues) {
|
|
125
|
+
/* c8 ignore next 9 - functional code tested but coverage intermittently missed */
|
|
125
126
|
return updateSystemConfigurationQualifierDefaultValues(config, initParams.qualifierDefaultValues).onSuccess((updatedConfig) => (0, ts_utils_1.captureResult)(() => new SystemConfiguration(updatedConfig, (0, ts_utils_1.omit)(initParams, ['qualifierDefaultValues']))));
|
|
126
127
|
}
|
|
127
128
|
return (0, ts_utils_1.captureResult)(() => new SystemConfiguration(config, initParams));
|
|
@@ -67,8 +67,8 @@ exports.validatedContextQualifierValueDecl = ts_utils_1.Converters.generic((from
|
|
|
67
67
|
* @public
|
|
68
68
|
*/
|
|
69
69
|
exports.validatedContextDecl = ts_utils_1.Converters.generic((from, __self, context) => {
|
|
70
|
+
/* c8 ignore next 3 - functional code path tested but coverage intermittently missed */
|
|
70
71
|
if (!context) {
|
|
71
|
-
/* c8 ignore next 2 - functional code path tested but coverage intermittently missed */
|
|
72
72
|
return ts_utils_1.Failure.with('validatedContextDecl converter requires a context');
|
|
73
73
|
}
|
|
74
74
|
return exports.contextDecl.convert(from).onSuccess((decl) => {
|
|
@@ -91,7 +91,7 @@ class CollectionImporter {
|
|
|
91
91
|
if (!(0, importable_1.isImportable)(item) || (item.type !== 'resourceCollection' && item.type !== 'resourceTree')) {
|
|
92
92
|
/* c8 ignore next 1 - defense in depth */
|
|
93
93
|
const name = (_b = (_a = item.context) === null || _a === void 0 ? void 0 : _a.baseId) !== null && _b !== void 0 ? _b : 'unknown';
|
|
94
|
-
return (0, ts_utils_1.failWithDetail)(`${name}:
|
|
94
|
+
return (0, ts_utils_1.failWithDetail)(`${name}: invalid resource collection importable (${item.type})`, 'skipped');
|
|
95
95
|
}
|
|
96
96
|
const container = item.type === 'resourceCollection' ? item.collection : item.tree;
|
|
97
97
|
return importContext_1.ImportContext.forContainerImport(container.context, item.context)
|
|
@@ -89,7 +89,7 @@ class JsonImporter {
|
|
|
89
89
|
if (!(0, importable_1.isImportable)(item) || item.type !== 'json') {
|
|
90
90
|
/* c8 ignore next 3 - functional code path tested but coverage intermittently missed */
|
|
91
91
|
const name = (_b = (_a = item.context) === null || _a === void 0 ? void 0 : _a.baseId) !== null && _b !== void 0 ? _b : 'unknown';
|
|
92
|
-
return (0, ts_utils_1.failWithDetail)(`${name}:
|
|
92
|
+
return (0, ts_utils_1.failWithDetail)(`${name}: invalid JSON importable (${item.type})`, 'skipped');
|
|
93
93
|
}
|
|
94
94
|
return (this._tryImportResourceCollection(item)
|
|
95
95
|
.onFailure(() => this._tryImportResourceTree(item))
|
|
@@ -88,9 +88,9 @@ function createQualifierTypeFromConfig(typeConfig) {
|
|
|
88
88
|
return Config.Convert.literalQualifierTypeConfig
|
|
89
89
|
.convert(childConfig)
|
|
90
90
|
.onSuccess((configuration) => literalQualifierType_1.LiteralQualifierType.createFromConfig(Object.assign(Object.assign({}, typeConfig), { configuration })));
|
|
91
|
-
default:
|
|
92
|
-
return (0, ts_utils_1.fail)(`Unknown qualifier type: ${typeConfig.systemType}`);
|
|
93
91
|
}
|
|
92
|
+
/* c8 ignore next 1 - defense in depth */
|
|
93
|
+
return (0, ts_utils_1.fail)(`Unknown qualifier type: ${typeConfig.systemType}`);
|
|
94
94
|
}
|
|
95
95
|
/**
|
|
96
96
|
* Creates a {@link QualifierTypes.SystemQualifierType | SystemQualifierType} from a system configuration object.
|
|
@@ -111,8 +111,9 @@ function createQualifierTypeFromSystemConfig(typeConfig) {
|
|
|
111
111
|
return territoryQualifierType_1.TerritoryQualifierType.createFromConfig(typeConfig);
|
|
112
112
|
case 'literal':
|
|
113
113
|
return literalQualifierType_1.LiteralQualifierType.createFromConfig(typeConfig);
|
|
114
|
-
default:
|
|
115
|
-
return (0, ts_utils_1.fail)(`${systemType}: Unknown system qualifier type.`);
|
|
116
114
|
}
|
|
115
|
+
/* c8 ignore next 3 - should not happen */
|
|
116
|
+
// @ts-expect-error
|
|
117
|
+
return (0, ts_utils_1.fail)(`${systemType}: Unknown system qualifier type.`);
|
|
117
118
|
}
|
|
118
119
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -2,7 +2,7 @@ import { Result } from '@fgv/ts-utils';
|
|
|
2
2
|
import { ConditionOperator, QualifierConditionValue, QualifierContextValue, QualifierMatchScore, QualifierTypeName } from '../common';
|
|
3
3
|
import { IQualifierTypeCreateParams, QualifierType } from './qualifierType';
|
|
4
4
|
import * as Config from './config';
|
|
5
|
-
import {
|
|
5
|
+
import { JsonCompatibleType } from '@fgv/ts-json-base';
|
|
6
6
|
/**
|
|
7
7
|
* Interface defining the parameters that can be used to create a new
|
|
8
8
|
* {@link QualifierTypes.LanguageQualifierType | LanguageQualifierType}.
|
|
@@ -25,7 +25,7 @@ export interface ILanguageQualifierTypeCreateParams extends Partial<IQualifierTy
|
|
|
25
25
|
* Accepts a list of language tags in the context by default.
|
|
26
26
|
* @public
|
|
27
27
|
*/
|
|
28
|
-
export declare class LanguageQualifierType extends QualifierType<
|
|
28
|
+
export declare class LanguageQualifierType extends QualifierType<JsonCompatibleType<Config.ILanguageQualifierTypeConfig>> {
|
|
29
29
|
/**
|
|
30
30
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
31
31
|
*/
|
|
@@ -68,11 +68,11 @@ export declare class LanguageQualifierType extends QualifierType<JsonCompatible<
|
|
|
68
68
|
/**
|
|
69
69
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
70
70
|
*/
|
|
71
|
-
getConfigurationJson(): Result<
|
|
71
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config.ISystemLanguageQualifierTypeConfig>>;
|
|
72
72
|
/**
|
|
73
73
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
74
74
|
*/
|
|
75
|
-
validateConfigurationJson(from: unknown): Result<
|
|
75
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config.ISystemLanguageQualifierTypeConfig>>;
|
|
76
76
|
/**
|
|
77
77
|
* Validates a {@link QualifierTypes.Config.ISystemLanguageQualifierTypeConfig | strongly typed configuration object}
|
|
78
78
|
* for this qualifier type.
|
|
@@ -3,7 +3,7 @@ import { ConditionOperator, QualifierConditionValue, QualifierContextValue, Qual
|
|
|
3
3
|
import { QualifierType } from './qualifierType';
|
|
4
4
|
import { LiteralValueHierarchy } from './literalValueHierarchy';
|
|
5
5
|
import * as Config from './config';
|
|
6
|
-
import {
|
|
6
|
+
import { JsonCompatibleType } from '@fgv/ts-json-base';
|
|
7
7
|
/**
|
|
8
8
|
* Interface defining the parameters that can be used to create a new
|
|
9
9
|
* {@link QualifierTypes.LiteralQualifierType | LiteralQualifierType}.
|
|
@@ -44,7 +44,7 @@ export interface ILiteralQualifierTypeCreateParams {
|
|
|
44
44
|
* optionally case-sensitive or matching against an ordered list of values at runtime.
|
|
45
45
|
* @public
|
|
46
46
|
*/
|
|
47
|
-
export declare class LiteralQualifierType extends QualifierType<
|
|
47
|
+
export declare class LiteralQualifierType extends QualifierType<JsonCompatibleType<Config.ILiteralQualifierTypeConfig>> {
|
|
48
48
|
/**
|
|
49
49
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
50
50
|
*/
|
|
@@ -93,11 +93,11 @@ export declare class LiteralQualifierType extends QualifierType<JsonCompatible<C
|
|
|
93
93
|
/**
|
|
94
94
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
95
95
|
*/
|
|
96
|
-
getConfigurationJson(): Result<
|
|
96
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config.ISystemLiteralQualifierTypeConfig>>;
|
|
97
97
|
/**
|
|
98
98
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
99
99
|
*/
|
|
100
|
-
validateConfigurationJson(from: unknown): Result<
|
|
100
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config.ISystemLiteralQualifierTypeConfig>>;
|
|
101
101
|
/**
|
|
102
102
|
* Validates a {@link QualifierTypes.Config.ISystemLiteralQualifierTypeConfig | strongly typed configuration object}
|
|
103
103
|
* for this qualifier type.
|
|
@@ -230,7 +230,7 @@ class LiteralQualifierType extends qualifierType_1.QualifierType {
|
|
|
230
230
|
static toLiteralConditionValue(from) {
|
|
231
231
|
return LiteralQualifierType.isValidLiteralConditionValue(from)
|
|
232
232
|
? (0, ts_utils_1.succeed)(from)
|
|
233
|
-
: (0, ts_utils_1.fail)(`${from}:
|
|
233
|
+
: (0, ts_utils_1.fail)(`${from}: invalid literal condition value.`);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
exports.LiteralQualifierType = LiteralQualifierType;
|
|
@@ -102,7 +102,7 @@ class LiteralValueHierarchy {
|
|
|
102
102
|
if (ancestors.isSuccess()) {
|
|
103
103
|
return ancestors.value.includes(possibleAncestor);
|
|
104
104
|
}
|
|
105
|
-
/* c8 ignore next
|
|
105
|
+
/* c8 ignore next 2 - edge case: ancestor validation fallback */
|
|
106
106
|
return false;
|
|
107
107
|
}
|
|
108
108
|
/**
|
|
@@ -133,11 +133,11 @@ class LiteralValueHierarchy {
|
|
|
133
133
|
// For open hierarchies, skip validation and allow any values
|
|
134
134
|
if (!this.isOpenValues) {
|
|
135
135
|
// Validate that both condition and context exist in the hierarchy
|
|
136
|
-
/* c8 ignore next
|
|
136
|
+
/* c8 ignore next 3 - functional error case tested but coverage intermittently missed */
|
|
137
137
|
if (!this.values.has(condition)) {
|
|
138
138
|
return common_1.NoMatch;
|
|
139
139
|
}
|
|
140
|
-
/* c8 ignore next
|
|
140
|
+
/* c8 ignore next 3 - functional error case tested but coverage intermittently missed */
|
|
141
141
|
if (!this.values.has(context)) {
|
|
142
142
|
return common_1.NoMatch;
|
|
143
143
|
}
|
|
@@ -168,6 +168,7 @@ class LiteralValueHierarchy {
|
|
|
168
168
|
var _a;
|
|
169
169
|
const errors = new ts_utils_1.MessageAggregator();
|
|
170
170
|
const values = params.values;
|
|
171
|
+
/* c8 ignore next 1 - defense in depth */
|
|
171
172
|
const hierarchy = (_a = params.hierarchy) !== null && _a !== void 0 ? _a : {};
|
|
172
173
|
// If no values are provided, collect all values from the hierarchy
|
|
173
174
|
let allValues;
|
|
@@ -191,7 +192,7 @@ class LiteralValueHierarchy {
|
|
|
191
192
|
}
|
|
192
193
|
const parent = valueMap.get(parentName);
|
|
193
194
|
if (!parent) {
|
|
194
|
-
errors.addMessage(`${valueName}: parent ${parentName} is
|
|
195
|
+
errors.addMessage(`${valueName}: parent ${parentName} is invalid literal value.`);
|
|
195
196
|
continue;
|
|
196
197
|
}
|
|
197
198
|
let ancestor = parent.parent;
|
|
@@ -202,14 +203,14 @@ class LiteralValueHierarchy {
|
|
|
202
203
|
ancestors.push(ancestor.name);
|
|
203
204
|
/* c8 ignore next 1 - defensive coding: ancestor.parent === value is very difficult to reach */
|
|
204
205
|
if (ancestor.parent === parent || ancestor.parent === value) {
|
|
205
|
-
/* c8 ignore next
|
|
206
|
+
/* c8 ignore next 4 - defensive coding: circular reference error reporting intermittently missed */
|
|
206
207
|
errors.addMessage(`${valueName}: Circular reference detected: ${ancestors.join('->')}`);
|
|
207
208
|
circular = true;
|
|
208
209
|
break;
|
|
209
210
|
}
|
|
210
211
|
ancestor = ancestor.parent;
|
|
211
212
|
}
|
|
212
|
-
/* c8 ignore next
|
|
213
|
+
/* c8 ignore next 3 - defensive coding: circular reference handling intermittently missed */
|
|
213
214
|
if (circular) {
|
|
214
215
|
continue;
|
|
215
216
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Collections, ICollectible, Result } from '@fgv/ts-utils';
|
|
2
2
|
import { ConditionOperator, QualifierConditionValue, QualifierContextValue, QualifierMatchScore, QualifierTypeIndex, QualifierTypeName } from '../common';
|
|
3
|
-
import {
|
|
3
|
+
import { JsonCompatibleType, JsonObject } from '@fgv/ts-json-base';
|
|
4
4
|
import * as Config from './config';
|
|
5
5
|
/**
|
|
6
6
|
* Interface for a qualifier type. A qualifier type implements the build and
|
|
@@ -83,13 +83,13 @@ export interface IQualifierType<TCFGJSON extends JsonObject = JsonObject> extend
|
|
|
83
83
|
* Gets the configuration for this qualifier type.
|
|
84
84
|
* @returns `Success` with the configuration if successful, `Failure` with an error message otherwise.
|
|
85
85
|
*/
|
|
86
|
-
getConfigurationJson(): Result<
|
|
86
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config.IQualifierTypeConfig<TCFGJSON>>>;
|
|
87
87
|
/**
|
|
88
88
|
* Validates configuration JSON data for this qualifier type.
|
|
89
89
|
* @param from - The unknown data to validate as configuration JSON.
|
|
90
90
|
* @returns `Success` with validated JSON configuration if valid, `Failure` with an error message otherwise.
|
|
91
91
|
*/
|
|
92
|
-
validateConfigurationJson(from: unknown): Result<
|
|
92
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config.IQualifierTypeConfig<TCFGJSON>>>;
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* Parameters used to create a base {@link QualifierTypes.QualifierType | qualifier type}.
|
|
@@ -172,11 +172,11 @@ export declare abstract class QualifierType<TCFGJSON extends JsonObject = JsonOb
|
|
|
172
172
|
/**
|
|
173
173
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
174
174
|
*/
|
|
175
|
-
abstract getConfigurationJson(): Result<
|
|
175
|
+
abstract getConfigurationJson(): Result<JsonCompatibleType<Config.IQualifierTypeConfig<TCFGJSON>>>;
|
|
176
176
|
/**
|
|
177
177
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
178
178
|
*/
|
|
179
|
-
abstract validateConfigurationJson(from: unknown): Result<
|
|
179
|
+
abstract validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config.IQualifierTypeConfig<TCFGJSON>>>;
|
|
180
180
|
/**
|
|
181
181
|
* {@inheritdoc QualifierTypes.IQualifierType.setIndex}
|
|
182
182
|
*/
|
|
@@ -78,6 +78,7 @@ class QualifierType {
|
|
|
78
78
|
if (this.isValidConditionValue(conditionValue) && this.isValidContextValue(contextValue)) {
|
|
79
79
|
return this._matchOne(conditionValue, contextValue, 'matches') !== common_1.NoMatch;
|
|
80
80
|
}
|
|
81
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
81
82
|
return false;
|
|
82
83
|
}
|
|
83
84
|
/**
|
|
@@ -3,7 +3,7 @@ import { QualifierConditionValue, QualifierContextValue, QualifierMatchScore, Co
|
|
|
3
3
|
import { QualifierType } from './qualifierType';
|
|
4
4
|
import { LiteralValueHierarchy } from './literalValueHierarchy';
|
|
5
5
|
import * as Config from './config';
|
|
6
|
-
import {
|
|
6
|
+
import { JsonCompatibleType } from '@fgv/ts-json-base';
|
|
7
7
|
/**
|
|
8
8
|
* Parameters used to create a new {@link QualifierTypes.TerritoryQualifierType | TerritoryQualifierType} instance.
|
|
9
9
|
* @public
|
|
@@ -42,7 +42,7 @@ export interface ITerritoryQualifierTypeCreateParams {
|
|
|
42
42
|
* implementation handles incorrect casing.
|
|
43
43
|
* @public
|
|
44
44
|
*/
|
|
45
|
-
export declare class TerritoryQualifierType extends QualifierType<
|
|
45
|
+
export declare class TerritoryQualifierType extends QualifierType<JsonCompatibleType<Config.ITerritoryQualifierTypeConfig>> {
|
|
46
46
|
/**
|
|
47
47
|
* {@inheritdoc QualifierTypes.IQualifierType.systemTypeName}
|
|
48
48
|
*/
|
|
@@ -97,11 +97,11 @@ export declare class TerritoryQualifierType extends QualifierType<JsonCompatible
|
|
|
97
97
|
/**
|
|
98
98
|
* {@inheritdoc QualifierTypes.IQualifierType.getConfigurationJson}
|
|
99
99
|
*/
|
|
100
|
-
getConfigurationJson(): Result<
|
|
100
|
+
getConfigurationJson(): Result<JsonCompatibleType<Config.ISystemTerritoryQualifierTypeConfig>>;
|
|
101
101
|
/**
|
|
102
102
|
* {@inheritdoc QualifierTypes.IQualifierType.validateConfigurationJson}
|
|
103
103
|
*/
|
|
104
|
-
validateConfigurationJson(from: unknown): Result<
|
|
104
|
+
validateConfigurationJson(from: unknown): Result<JsonCompatibleType<Config.ISystemTerritoryQualifierTypeConfig>>;
|
|
105
105
|
/**
|
|
106
106
|
* Validates a {@link QualifierTypes.Config.ISystemTerritoryQualifierTypeConfig | strongly typed configuration object}
|
|
107
107
|
* for this qualifier type.
|
|
@@ -230,7 +230,7 @@ class TerritoryQualifierType extends qualifierType_1.QualifierType {
|
|
|
230
230
|
const normalized = value.toUpperCase();
|
|
231
231
|
return TerritoryQualifierType.isValidTerritoryConditionValue(normalized, acceptLowercase)
|
|
232
232
|
? (0, ts_utils_1.succeed)(normalized)
|
|
233
|
-
: (0, ts_utils_1.fail)(`${value}:
|
|
233
|
+
: (0, ts_utils_1.fail)(`${value}: invalid territory code`);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
236
|
exports.TerritoryQualifierType = TerritoryQualifierType;
|
|
@@ -112,6 +112,7 @@ function mergeLooseCandidate(candidate, baseName, baseConditions) {
|
|
|
112
112
|
if (!Json.isLooseResourceCandidateDecl(candidate) && !baseName) {
|
|
113
113
|
return (0, ts_utils_1.fail)('id is required in mergeLooseCandidate');
|
|
114
114
|
}
|
|
115
|
+
/* c8 ignore next 7 - functional code tested but coverage intermittently missed */
|
|
115
116
|
return common_1.Helpers.joinResourceIds(baseName, candidateId).onSuccess((id) => {
|
|
116
117
|
var _a;
|
|
117
118
|
/* c8 ignore next 1 - defense in depth */
|
|
@@ -157,6 +158,7 @@ function mergeImporterCandidate(candidate, baseName, baseConditions) {
|
|
|
157
158
|
});
|
|
158
159
|
}
|
|
159
160
|
else {
|
|
161
|
+
/* c8 ignore next 5 - functional code tested but coverage intermittently missed */
|
|
160
162
|
/* c8 ignore next 1 - defense in depth */
|
|
161
163
|
const conditions = [...(baseConditions !== null && baseConditions !== void 0 ? baseConditions : []), ...((_a = candidate.conditions) !== null && _a !== void 0 ? _a : [])];
|
|
162
164
|
return (0, ts_utils_1.succeed)(Object.assign(Object.assign({}, candidate), { conditions }));
|
|
@@ -189,6 +191,7 @@ function mergeLooseResource(resource, baseName, baseConditions) {
|
|
|
189
191
|
if (!baseName && !Json.isLooseResourceDecl(resource)) {
|
|
190
192
|
return (0, ts_utils_1.fail)('id is required in mergeLooseResource');
|
|
191
193
|
}
|
|
194
|
+
/* c8 ignore next 10 - functional code tested but coverage intermittently missed */
|
|
192
195
|
return common_1.Helpers.joinResourceIds(baseName, resourceId).onSuccess((id) => {
|
|
193
196
|
var _a;
|
|
194
197
|
return (0, ts_utils_1.mapResults)(
|
|
@@ -249,6 +252,7 @@ function mergeImporterResource(resource, baseName, baseConditions) {
|
|
|
249
252
|
});
|
|
250
253
|
}
|
|
251
254
|
else {
|
|
255
|
+
/* c8 ignore next 8 - functional code tested but coverage intermittently missed */
|
|
252
256
|
return (0, ts_utils_1.mapResults)(
|
|
253
257
|
/* c8 ignore next 1 - defense in depth */
|
|
254
258
|
((_a = resource.candidates) !== null && _a !== void 0 ? _a : []).map((candidate) => mergeChildCandidate(candidate, baseConditions))).onSuccess((candidates) => {
|
|
@@ -39,6 +39,7 @@ function createResourceTypeFromConfig(config) {
|
|
|
39
39
|
.convert(config.name)
|
|
40
40
|
.onSuccess((key) => jsonResourceType_1.JsonResourceType.create({ key }));
|
|
41
41
|
}
|
|
42
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
42
43
|
return (0, ts_utils_1.fail)(`${config.typeName}: Unknown resource type.`);
|
|
43
44
|
}
|
|
44
45
|
//# sourceMappingURL=helpers.js.map
|
|
@@ -51,6 +51,7 @@ class ResourceType {
|
|
|
51
51
|
index: index !== undefined ? common_1.Validate.toResourceTypeIndex(index).orThrow() : undefined,
|
|
52
52
|
indexConverter: common_1.Convert.resourceTypeIndex
|
|
53
53
|
});
|
|
54
|
+
/* c8 ignore next 1 - defense in depth */
|
|
54
55
|
this._template = template !== null && template !== void 0 ? template : {};
|
|
55
56
|
}
|
|
56
57
|
/**
|
|
@@ -90,6 +90,7 @@ class CandidateValue {
|
|
|
90
90
|
*/
|
|
91
91
|
constructor(params) {
|
|
92
92
|
var _a;
|
|
93
|
+
/* c8 ignore next 1 - defense in depth */
|
|
93
94
|
const normalizer = (_a = params.normalizer) !== null && _a !== void 0 ? _a : new ts_utils_1.Hash.Crc32Normalizer();
|
|
94
95
|
// Normalize the JSON value
|
|
95
96
|
const normalizedResult = normalizer.normalize(params.json);
|
|
@@ -38,7 +38,7 @@ class CandidateValueCollector extends ts_utils_1.ValidatingCollector {
|
|
|
38
38
|
* @param params - Parameters to create the collector.
|
|
39
39
|
* @internal
|
|
40
40
|
*/
|
|
41
|
-
constructor(params
|
|
41
|
+
constructor(params) {
|
|
42
42
|
var _a, _b;
|
|
43
43
|
super({
|
|
44
44
|
converters: new ts_utils_1.Collections.KeyValueConverters({
|
|
@@ -46,7 +46,9 @@ class CandidateValueCollector extends ts_utils_1.ValidatingCollector {
|
|
|
46
46
|
value: (from) => this._toCandidateValue(from)
|
|
47
47
|
})
|
|
48
48
|
});
|
|
49
|
-
|
|
49
|
+
/* c8 ignore next 3 - defense in depth */
|
|
50
|
+
params = params !== null && params !== void 0 ? params : {};
|
|
51
|
+
this.normalizer = (_a = params.normalizer) !== null && _a !== void 0 ? _a : new ts_utils_1.Hash.Crc32Normalizer();
|
|
50
52
|
(_b = params.candidateValues) === null || _b === void 0 ? void 0 : _b.forEach((candidateValue) => this.validating.add(candidateValue));
|
|
51
53
|
}
|
|
52
54
|
/**
|
|
@@ -101,6 +101,7 @@ class DeltaGenerator {
|
|
|
101
101
|
* @internal
|
|
102
102
|
*/
|
|
103
103
|
_enumerateTargetResources(requestedIds, context) {
|
|
104
|
+
/* c8 ignore next 20 - functional code tested but coverage intermittently missed */
|
|
104
105
|
if (requestedIds && requestedIds.length > 0) {
|
|
105
106
|
this._logger.info(`Using ${requestedIds.length} specified resource IDs`);
|
|
106
107
|
// Validate the requested IDs
|
|
@@ -187,6 +188,7 @@ class DeltaGenerator {
|
|
|
187
188
|
for (const resourceId of resourceIds) {
|
|
188
189
|
this._logger.detail(`Processing resource: ${resourceId}`);
|
|
189
190
|
const result = this._generateResourceDelta(clonedManager, resourceId, context, skipUnchanged);
|
|
191
|
+
/* c8 ignore next 3 - functional code tested but coverage intermittently missed */
|
|
190
192
|
if (result.isFailure()) {
|
|
191
193
|
errors.addMessage(`${resourceId}: ${result.message}`);
|
|
192
194
|
continue;
|
|
@@ -205,6 +207,7 @@ class DeltaGenerator {
|
|
|
205
207
|
}
|
|
206
208
|
}
|
|
207
209
|
this._logger.info(`Processed ${processedCount} resources: ${changedCount} updated, ${newCount} new, ${skippedCount} skipped`);
|
|
210
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
208
211
|
if (errors.hasMessages) {
|
|
209
212
|
return (0, ts_utils_1.fail)(`Delta generation failed with errors:\n${errors.toString()}`);
|
|
210
213
|
}
|
|
@@ -238,6 +241,7 @@ class DeltaGenerator {
|
|
|
238
241
|
this._logger.detail(`${resourceId}: Baseline-only resource detected, skipping (delete merge method not yet implemented)`);
|
|
239
242
|
return (0, ts_utils_1.succeed)({ type: 'skipped', resourceId });
|
|
240
243
|
}
|
|
244
|
+
/* c8 ignore next 4 - defense in depth should not happen in practice */
|
|
241
245
|
if (!baselineExists && !deltaExists) {
|
|
242
246
|
// Resource doesn't exist in either resolver - this shouldn't happen due to enumeration logic
|
|
243
247
|
return (0, ts_utils_1.fail)(`Resource ${resourceId} not found in either baseline or delta resolvers`);
|
|
@@ -277,6 +281,7 @@ class DeltaGenerator {
|
|
|
277
281
|
* @internal
|
|
278
282
|
*/
|
|
279
283
|
_createNewResourceCandidate(manager, resourceId, value, context) {
|
|
284
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
280
285
|
if (!(0, ts_json_base_1.isJsonObject)(value)) {
|
|
281
286
|
return (0, ts_utils_1.fail)(`Resource value must be a JSON object, got ${typeof value}`);
|
|
282
287
|
}
|
|
@@ -288,11 +293,7 @@ class DeltaGenerator {
|
|
|
288
293
|
mergeMethod: 'replace',
|
|
289
294
|
resourceTypeName: 'json' // Use 'json' resource type for new JSON resources
|
|
290
295
|
};
|
|
291
|
-
|
|
292
|
-
if (result.isFailure()) {
|
|
293
|
-
return (0, ts_utils_1.fail)(result.message);
|
|
294
|
-
}
|
|
295
|
-
return (0, ts_utils_1.succeed)(undefined);
|
|
296
|
+
return manager.addLooseCandidate(candidateDecl).asResult.onSuccess(() => (0, ts_utils_1.succeed)(undefined));
|
|
296
297
|
}
|
|
297
298
|
/**
|
|
298
299
|
* Creates a delta candidate for an updated resource.
|
|
@@ -317,6 +318,7 @@ class DeltaGenerator {
|
|
|
317
318
|
}
|
|
318
319
|
// Use onlyInB (second object) which contains new/changed properties
|
|
319
320
|
const deltaChanges = diff.onlyInB;
|
|
321
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
320
322
|
if (!(0, ts_json_base_1.isJsonObject)(deltaChanges)) {
|
|
321
323
|
return (0, ts_utils_1.fail)(`Delta changes must be a JSON object, got ${typeof deltaChanges}`);
|
|
322
324
|
}
|
|
@@ -332,11 +334,7 @@ class DeltaGenerator {
|
|
|
332
334
|
mergeMethod: 'augment',
|
|
333
335
|
resourceTypeName: undefined // Will be inferred by the manager
|
|
334
336
|
};
|
|
335
|
-
|
|
336
|
-
if (result.isFailure()) {
|
|
337
|
-
return (0, ts_utils_1.fail)(result.message);
|
|
338
|
-
}
|
|
339
|
-
return (0, ts_utils_1.succeed)(undefined);
|
|
337
|
+
return manager.addLooseCandidate(candidateDecl).asResult.onSuccess(() => (0, ts_utils_1.succeed)(undefined));
|
|
340
338
|
});
|
|
341
339
|
}
|
|
342
340
|
}
|
|
@@ -104,6 +104,7 @@ class ResourceBuilder {
|
|
|
104
104
|
.onSuccess((added, detail) => {
|
|
105
105
|
if (detail === 'exists') {
|
|
106
106
|
/* c8 ignore next 5 - defensive coding: conflicting candidates with same conditions should not occur */
|
|
107
|
+
/* c8 ignore next 6 - functional code tested but coverage intermittently missed */
|
|
107
108
|
if (!resourceCandidate_1.ResourceCandidate.equal(added, candidate)) {
|
|
108
109
|
return (0, ts_utils_1.failWithDetail)(`${this.id}: conflicting candidates.`, 'exists');
|
|
109
110
|
}
|
|
@@ -130,6 +131,7 @@ class ResourceBuilder {
|
|
|
130
131
|
}
|
|
131
132
|
if (decl.resourceTypeName !== undefined) {
|
|
132
133
|
const rt = this.setResourceType(decl.resourceTypeName);
|
|
134
|
+
/* c8 ignore next 3 - functional code tested but coverage intermittently missed */
|
|
133
135
|
if (rt.isFailure()) {
|
|
134
136
|
return (0, ts_utils_1.failWithDetail)(rt.message, 'type-mismatch');
|
|
135
137
|
}
|
|
@@ -145,10 +147,12 @@ class ResourceBuilder {
|
|
|
145
147
|
*/
|
|
146
148
|
setResourceType(resourceTypeName) {
|
|
147
149
|
var _a;
|
|
150
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
148
151
|
if (((_a = this._resourceType) === null || _a === void 0 ? void 0 : _a.key) === resourceTypeName) {
|
|
149
152
|
return (0, ts_utils_1.succeed)(this);
|
|
150
153
|
}
|
|
151
154
|
else if (this._resourceType !== undefined) {
|
|
155
|
+
/* c8 ignore next 4 - functional code tested but coverage intermittently missed */
|
|
152
156
|
return (0, ts_utils_1.fail)(`${this.id}: conflicting resource types ${this._resourceType.key} !== ${resourceTypeName}.`);
|
|
153
157
|
}
|
|
154
158
|
return this._resourceTypes.validating.get(resourceTypeName).onSuccess((resourceType) => {
|
|
@@ -538,6 +538,7 @@ class ResourceManagerBuilder {
|
|
|
538
538
|
.convert(collectionData)
|
|
539
539
|
.onSuccess((compiledCollection) => {
|
|
540
540
|
// Apply hash-based normalization only if requested
|
|
541
|
+
/* c8 ignore next 5 - functional code tested but coverage intermittently missed */
|
|
541
542
|
if ((options === null || options === void 0 ? void 0 : options.normalized) === true) {
|
|
542
543
|
const normalizer = new ts_utils_1.Hash.Crc32Normalizer();
|
|
543
544
|
return normalizer
|
|
@@ -584,6 +585,7 @@ class ResourceManagerBuilder {
|
|
|
584
585
|
processedResourceIds.add(resourceDecl.id);
|
|
585
586
|
// Apply edits if there are candidates for this resource
|
|
586
587
|
const editedDeclResult = ResourceManagerBuilder._applyEditsToResourceDeclaration(resourceDecl, candidatesByResource, this._conditions);
|
|
588
|
+
/* c8 ignore next 2 - functional code tested but coverage intermittently missed */
|
|
587
589
|
if (editedDeclResult.isFailure()) {
|
|
588
590
|
return (0, ts_utils_1.fail)(`${resourceDecl.id}: Failed to apply edits: ${editedDeclResult.message}`);
|
|
589
591
|
}
|
|
@@ -596,11 +598,13 @@ class ResourceManagerBuilder {
|
|
|
596
598
|
}
|
|
597
599
|
// Handle any remaining candidates that target new resources not in the original collection
|
|
598
600
|
const errors = new ts_utils_1.MessageAggregator();
|
|
601
|
+
/* c8 ignore next 9 - functional code tested but coverage intermittently missed */
|
|
599
602
|
for (const [resourceId, candidates] of candidatesByResource) {
|
|
600
603
|
if (!processedResourceIds.has(resourceId)) {
|
|
601
604
|
// Create a new resource declaration for candidates targeting a new resource ID
|
|
602
605
|
ResourceManagerBuilder._createResourceDeclFromCandidates(resourceId, candidates, this._conditions)
|
|
603
606
|
.withErrorFormat((e) => `${resourceId}: Failed to create new resource from candidates: ${e}`)
|
|
607
|
+
/* c8 ignore next 7 - functional code tested but coverage intermittently missed */
|
|
604
608
|
.onSuccess((newResourceDecl) => {
|
|
605
609
|
return newManager
|
|
606
610
|
.addResource(newResourceDecl)
|
|
@@ -661,6 +665,7 @@ class ResourceManagerBuilder {
|
|
|
661
665
|
if (message !== undefined) {
|
|
662
666
|
return (0, ts_utils_1.fail)(`Invalid resource ID "${resourceDecl.id}": ${message}`);
|
|
663
667
|
}
|
|
668
|
+
/* c8 ignore next 4 - functional code tested but coverage intermittently missed */
|
|
664
669
|
const editCandidates = candidatesByResource.get(resourceId);
|
|
665
670
|
if (!editCandidates || editCandidates.length === 0) {
|
|
666
671
|
return (0, ts_utils_1.succeed)(resourceDecl);
|
|
@@ -680,6 +685,7 @@ class ResourceManagerBuilder {
|
|
|
680
685
|
}
|
|
681
686
|
// Then, apply edits (this replaces any colliding original candidates)
|
|
682
687
|
// Convert edit candidates (which have ids) to child candidates (without ids) for merging
|
|
688
|
+
/* c8 ignore next 37 - functional code tested but coverage intermittently missed */
|
|
683
689
|
for (const editCandidate of editCandidates) {
|
|
684
690
|
const conditionTokenResult = conditions_1.ConditionSet.getKeyFromLooseDecl(editCandidate.conditions, conditionCollector);
|
|
685
691
|
if (conditionTokenResult.isFailure()) {
|
|
@@ -425,6 +425,7 @@ class CompiledResourceCollection {
|
|
|
425
425
|
const resourceMap = new ts_utils_1.ValidatingResultMap({
|
|
426
426
|
converters: new ts_utils_1.Collections.KeyValueConverters({
|
|
427
427
|
key: common_1.Convert.resourceId,
|
|
428
|
+
/* c8 ignore next 3 - covered but coverage is confused */
|
|
428
429
|
value: (from) => {
|
|
429
430
|
return Validate.resource.validate(from);
|
|
430
431
|
}
|
|
@@ -155,19 +155,20 @@ class SimpleContextQualifierProvider extends contextQualifierProvider_1.ContextQ
|
|
|
155
155
|
if (nameOrIndexOrQualifier instanceof qualifiers_1.Qualifier) {
|
|
156
156
|
return (0, ts_utils_1.succeed)(nameOrIndexOrQualifier);
|
|
157
157
|
}
|
|
158
|
+
/* c8 ignore next 16 - functional code tested but coverage intermittently missed */
|
|
158
159
|
if (typeof nameOrIndexOrQualifier === 'string') {
|
|
159
160
|
return this.qualifiers.validating
|
|
160
161
|
.get(nameOrIndexOrQualifier)
|
|
161
|
-
.withErrorFormat((error) => `${nameOrIndexOrQualifier}:
|
|
162
|
+
.withErrorFormat((error) => `${nameOrIndexOrQualifier}: invalid qualifier name.`);
|
|
162
163
|
}
|
|
163
164
|
if (typeof nameOrIndexOrQualifier === 'number') {
|
|
164
165
|
return this.qualifiers
|
|
165
166
|
.getAt(nameOrIndexOrQualifier)
|
|
166
|
-
.withErrorFormat((error) => `${nameOrIndexOrQualifier}:
|
|
167
|
+
.withErrorFormat((error) => `${nameOrIndexOrQualifier}: invalid qualifier index.`);
|
|
167
168
|
}
|
|
168
169
|
return SimpleContextQualifierProvider._qualifierNameFromQualifierLike(nameOrIndexOrQualifier)
|
|
169
170
|
.onSuccess((qualifierName) => this.qualifiers.validating.get(qualifierName))
|
|
170
|
-
.withErrorFormat((error) => `${nameOrIndexOrQualifier}:
|
|
171
|
+
.withErrorFormat((error) => `${nameOrIndexOrQualifier}: invalid Qualifier, name or index.`);
|
|
171
172
|
}
|
|
172
173
|
/**
|
|
173
174
|
* Resolves a qualifier name from a name, index, or qualifier object.
|
|
@@ -46,6 +46,7 @@ class ReadOnlyResourceTreeChildren extends ts_utils_1.ResultMap {
|
|
|
46
46
|
if (node.isLeaf) {
|
|
47
47
|
return (0, ts_utils_1.succeed)(node).withDetail('success');
|
|
48
48
|
}
|
|
49
|
+
/* c8 ignore next 3 - functional code tested but coverage intermittently missed */
|
|
49
50
|
return (0, ts_utils_1.fail)(`${name}: not a resource${this.path ? ` in ${this.path}` : ''}.`).withDetail('failure');
|
|
50
51
|
});
|
|
51
52
|
}
|
|
@@ -54,6 +55,7 @@ class ReadOnlyResourceTreeChildren extends ts_utils_1.ResultMap {
|
|
|
54
55
|
if (node.isBranch) {
|
|
55
56
|
return (0, ts_utils_1.succeed)(node).withDetail('success');
|
|
56
57
|
}
|
|
58
|
+
/* c8 ignore next 3 - functional code tested but coverage intermittently missed */
|
|
57
59
|
return (0, ts_utils_1.fail)(`${name}: not a branch${this.path ? ` in ${this.path}` : ''}.`).withDetail('failure');
|
|
58
60
|
});
|
|
59
61
|
}
|
|
@@ -90,6 +92,7 @@ class ReadOnlyResourceTreeChildren extends ts_utils_1.ResultMap {
|
|
|
90
92
|
if (node.isBranch) {
|
|
91
93
|
return (0, ts_utils_1.succeed)(node).withDetail('success');
|
|
92
94
|
}
|
|
95
|
+
/* c8 ignore next 3 - functional code tested but coverage intermittently missed */
|
|
93
96
|
return (0, ts_utils_1.fail)(`${id}: not a branch${this.path ? ` in ${this.path}` : ''}.`).withDetail('failure');
|
|
94
97
|
});
|
|
95
98
|
}
|
|
@@ -245,7 +245,7 @@ class ResourceResolver {
|
|
|
245
245
|
for (let instanceIndex = 0; instanceIndex < decision.candidates.length; instanceIndex++) {
|
|
246
246
|
const candidate = decision.candidates[instanceIndex];
|
|
247
247
|
const conditionSetResult = this.resolveConditionSet(candidate.conditionSet);
|
|
248
|
-
/* c8 ignore next 4 - defensive
|
|
248
|
+
/* c8 ignore next 4 - defensive in depth */
|
|
249
249
|
if (conditionSetResult.isFailure()) {
|
|
250
250
|
(_b = this._listener) === null || _b === void 0 ? void 0 : _b.onCacheError('decision', decisionIndex);
|
|
251
251
|
return (0, ts_utils_1.fail)(`${decision.key}: Failed to resolve condition set": ${conditionSetResult.message}`);
|
|
@@ -259,7 +259,6 @@ class ResourceResolver {
|
|
|
259
259
|
});
|
|
260
260
|
}
|
|
261
261
|
else if (resolution.matchType === 'matchAsDefault') {
|
|
262
|
-
/* c8 ignore next 4 - edge case: default matching instances rarely used in practice */
|
|
263
262
|
matchingDefaultInstanceResults.push({
|
|
264
263
|
index: instanceIndex,
|
|
265
264
|
result: resolution
|
|
@@ -316,7 +315,6 @@ class ResourceResolver {
|
|
|
316
315
|
return (0, ts_utils_1.succeed)(bestCandidate);
|
|
317
316
|
}
|
|
318
317
|
resolveAllResourceCandidates(idOrResource) {
|
|
319
|
-
/* c8 ignore next 4 - defensive coding: string resource resolution should use direct resource calls */
|
|
320
318
|
if (typeof idOrResource === 'string') {
|
|
321
319
|
return this.resourceManager
|
|
322
320
|
.getBuiltResource(idOrResource)
|
|
@@ -349,7 +347,7 @@ class ResourceResolver {
|
|
|
349
347
|
}
|
|
350
348
|
// Add all default matches after regular matches (already sorted by priority)
|
|
351
349
|
for (const candidateIndex of resolution.defaultInstanceIndices) {
|
|
352
|
-
/* c8 ignore next 3 -
|
|
350
|
+
/* c8 ignore next 3 - defense in depth should not happen */
|
|
353
351
|
if (candidateIndex >= resource.candidates.length) {
|
|
354
352
|
return (0, ts_utils_1.fail)(`Invalid candidate index ${candidateIndex} for resource "${resource.id}"`);
|
|
355
353
|
}
|
|
@@ -103,6 +103,7 @@ class ResourceTreeResolver {
|
|
|
103
103
|
}).onSuccess((value) => {
|
|
104
104
|
// Only convert undefined to {} if emptyBranchMode is 'allow'
|
|
105
105
|
// For 'omit' mode or custom handlers returning undefined, preserve undefined
|
|
106
|
+
/* c8 ignore next 3 - defense in depth */
|
|
106
107
|
return (0, ts_utils_1.succeed)(value === undefined && emptyBranchMode === 'allow' ? {} : value);
|
|
107
108
|
});
|
|
108
109
|
}
|
|
@@ -173,6 +174,7 @@ class ResourceTreeResolver {
|
|
|
173
174
|
if (node.isLeaf) {
|
|
174
175
|
return (0, ts_utils_1.fail)(`Internal error: processBranchNode called on leaf node at ${path}`);
|
|
175
176
|
}
|
|
177
|
+
/* c8 ignore next 2 - ?? is defense in depth */
|
|
176
178
|
const resourceErrorMode = (_a = options.onResourceError) !== null && _a !== void 0 ? _a : 'fail';
|
|
177
179
|
const emptyBranchMode = (_b = options.onEmptyBranch) !== null && _b !== void 0 ? _b : 'allow';
|
|
178
180
|
const aggregator = new ts_utils_1.MessageAggregator();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fgv/ts-res",
|
|
3
|
-
"version": "5.0.1-
|
|
3
|
+
"version": "5.0.1-3",
|
|
4
4
|
"description": "Multi-dimensional Resource Runtime",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "dist/ts-res.d.ts",
|
|
@@ -18,14 +18,14 @@
|
|
|
18
18
|
"homepage": "https://github.com/ErikFortune/fgv/tree/main/libraries/ts-res#readme",
|
|
19
19
|
"sideEffects": false,
|
|
20
20
|
"devDependencies": {
|
|
21
|
-
"@microsoft/api-documenter": "^7.
|
|
22
|
-
"@microsoft/api-extractor": "^7.
|
|
21
|
+
"@microsoft/api-documenter": "^7.27.3",
|
|
22
|
+
"@microsoft/api-extractor": "^7.53.3",
|
|
23
23
|
"@types/jest": "^29.5.14",
|
|
24
24
|
"@types/luxon": "^3.7.1",
|
|
25
25
|
"@types/node": "^20.14.9",
|
|
26
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
27
|
-
"@typescript-eslint/parser": "^8.
|
|
28
|
-
"eslint": "^9.
|
|
26
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
27
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
28
|
+
"eslint": "^9.39.0",
|
|
29
29
|
"eslint-config-prettier": "^10.1.8",
|
|
30
30
|
"eslint-plugin-import": "^2.32.0",
|
|
31
31
|
"eslint-plugin-node": "^11.1.0",
|
|
@@ -33,27 +33,27 @@
|
|
|
33
33
|
"eslint-plugin-promise": "^7.2.1",
|
|
34
34
|
"jest": "^29.7.0",
|
|
35
35
|
"prettier": "^3.6.2",
|
|
36
|
-
"rimraf": "^6.0
|
|
37
|
-
"ts-jest": "^29.4.
|
|
36
|
+
"rimraf": "^6.1.0",
|
|
37
|
+
"ts-jest": "^29.4.5",
|
|
38
38
|
"ts-node": "^10.9.2",
|
|
39
|
-
"typescript": "5.
|
|
40
|
-
"eslint-plugin-n": "^17.
|
|
41
|
-
"@rushstack/eslint-config": "4.
|
|
42
|
-
"@rushstack/heft": "
|
|
43
|
-
"@rushstack/heft-jest-plugin": "
|
|
44
|
-
"@rushstack/heft-node-rig": "2.
|
|
39
|
+
"typescript": "5.9.3",
|
|
40
|
+
"eslint-plugin-n": "^17.23.1",
|
|
41
|
+
"@rushstack/eslint-config": "4.5.3",
|
|
42
|
+
"@rushstack/heft": "1.1.3",
|
|
43
|
+
"@rushstack/heft-jest-plugin": "1.1.3",
|
|
44
|
+
"@rushstack/heft-node-rig": "2.11.4",
|
|
45
45
|
"@types/heft-jest": "1.0.6",
|
|
46
46
|
"eslint-plugin-tsdoc": "~0.4.0",
|
|
47
|
-
"@fgv/ts-utils-jest": "5.0.1-
|
|
48
|
-
"@fgv/ts-extras": "5.0.1-
|
|
47
|
+
"@fgv/ts-utils-jest": "5.0.1-3",
|
|
48
|
+
"@fgv/ts-extras": "5.0.1-3"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"luxon": "^3.7.2",
|
|
52
52
|
"fflate": "~0.8.2",
|
|
53
|
-
"@fgv/ts-utils": "5.0.1-
|
|
54
|
-
"@fgv/ts-json
|
|
55
|
-
"@fgv/ts-json": "5.0.1-
|
|
56
|
-
"@fgv/ts-bcp47": "5.0.1-
|
|
53
|
+
"@fgv/ts-utils": "5.0.1-3",
|
|
54
|
+
"@fgv/ts-json": "5.0.1-3",
|
|
55
|
+
"@fgv/ts-json-base": "5.0.1-3",
|
|
56
|
+
"@fgv/ts-bcp47": "5.0.1-3"
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
59
|
"build": "heft build --clean",
|