knowmax-quest-utils
Version:
Utilities for creating a Knowmax Quest client.
104 lines • 5.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseMetadataValueListWithPairId = exports.parseMetadataValueWithPairId = exports.parseMetadataValueWithPostfix = exports.parseMetadataValueWithPrefix = exports.formatMetadataValueWithPostfix = exports.formatMetadataValueWithPrefix = exports.metadataValues = exports.metadataValue = exports.formatMetadataLabel = exports.parseMetadataLabel = exports.metadataMatch = void 0;
/** Match given IMetadata value with given label specification.
* @param metadata value to evaluate.
* @param labelOrFamilyWithLabel Either string or array of strings which should be evaluated. Allowed formats: 'familylabel:label' and 'label'. In case of array, a match is considered if at least one value matches.
* @param origin Optional origin to match.
* @returns Boolean indicating match.
*/
const metadataMatch = (metadata, labelOrFamilyWithLabel, origin) => {
const list = typeof labelOrFamilyWithLabel === 'string' ? [labelOrFamilyWithLabel] : labelOrFamilyWithLabel;
return list.some((l) => {
if (origin && metadata.origin !== origin)
return false;
const { family, label } = (0, exports.parseMetadataLabel)(l);
return family ? metadata.familyLabel === family && metadata.label === label : metadata.label === label;
});
};
exports.metadataMatch = metadataMatch;
/** Parse optional family label and label from given label.
* @param label Allowed format: 'familylabel:label' and 'label'
* @returns Object containing optional familyLabel and label.
*/
const parseMetadataLabel = (label) => {
const index = label.indexOf(':');
return {
family: index > 1 ? label.substring(0, index) : undefined,
label: index >= 0 && index < label.length ? label.substring(index + 1) : label
};
};
exports.parseMetadataLabel = parseMetadataLabel;
/** Combine family label and label. */
const formatMetadataLabel = (familyLabel, label) => `${familyLabel}:${label}`;
exports.formatMetadataLabel = formatMetadataLabel;
/** Get first value from metadata matching family label and label. Returns undefined in case value not found. */
const metadataValue = (familyLabel, label, list) => list?.find((m) => m.label === label && m.familyLabel === familyLabel)?.value;
exports.metadataValue = metadataValue;
/** Get array with all values matching family label and label. Returns empty array in case no values found. */
const metadataValues = (familyLabel, label, list) => list ? list.filter((m) => m.label === label && m.familyLabel === familyLabel).map((m) => m.value) : [];
exports.metadataValues = metadataValues;
/** Format given prefix value in given value by convention "[prefix]value". */
const formatMetadataValueWithPrefix = (value, prefix) => `[${prefix}]${value}`;
exports.formatMetadataValueWithPrefix = formatMetadataValueWithPrefix;
/** Format given postfix value in given value by convention "value[postfix]" */
const formatMetadataValueWithPostfix = (value, postfix) => `${value}[${postfix}]`;
exports.formatMetadataValueWithPostfix = formatMetadataValueWithPostfix;
/** Parses prefix by convention using [prefix] from metadata value.
* @param value Metadata value to parse. Prefix formatted like [text] at beginning of value.
* @returns Tuple containing value and optional prefix.
*/
const parseMetadataValueWithPrefix = (value) => {
if (value.startsWith('[')) {
const index = value.indexOf(']');
if (index > 0) {
return [value.substring(index + 1), value.substring(1, index)];
}
}
return [value, undefined];
};
exports.parseMetadataValueWithPrefix = parseMetadataValueWithPrefix;
/** Parses postfix by convention using [postfix] from metadata value.
* @param value Metadata value to parse. Postfix formatted like [text] at end of value.
* @returns Tuple containing value and optional postfix.
*/
const parseMetadataValueWithPostfix = (value) => {
if (value.endsWith(']')) {
const index = value.lastIndexOf('[');
if (index > 0) {
return [value.substring(0, index), value.substring(index + 1, value.length - 1)];
}
}
return [value, undefined];
};
exports.parseMetadataValueWithPostfix = parseMetadataValueWithPostfix;
/** Parses pair id and value from metadata values with pair id.
* @param value Metadata value to parse. Pair id formatted like [number] at beginning of value.
* @returns Tuple containing value and optional numeric pair id.
*/
const parseMetadataValueWithPairId = (value) => {
const [v, prefix] = (0, exports.parseMetadataValueWithPrefix)(value);
if (prefix) {
const id = parseInt(prefix);
if (!isNaN(id)) {
return [v, id];
}
}
return [value, undefined];
};
exports.parseMetadataValueWithPairId = parseMetadataValueWithPairId;
/** Parses list of IMetadata with pair id specified into IMetadata type expaned with pairId.
* @param data List of IMetadata to parse.
* @returns List of IMetadata extended numeric with pair id. Values without or invalid pair id are filtered out.
*/
const parseMetadataValueListWithPairId = (data) => {
return data
.map((item) => {
const [value, id] = (0, exports.parseMetadataValueWithPairId)(item.value);
return { ...item, value: value, pairId: id };
})
.filter((item) => item.pairId !== undefined && !isNaN(item.pairId))
.map((item) => ({ ...item, pairId: item.pairId ?? -1 }));
};
exports.parseMetadataValueListWithPairId = parseMetadataValueListWithPairId;
//# sourceMappingURL=metadata.js.map