@baqhub/sdk
Version:
The official JavaScript SDK for the BAQ federated app platform.
93 lines (92 loc) • 3.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.QueryLink = exports.QueryLinkType = void 0;
const tslib_1 = require("tslib");
const jsonpath_plus_1 = require("jsonpath-plus");
const compact_js_1 = tslib_1.__importDefault(require("lodash/compact.js"));
const type_js_1 = require("../../helpers/type.js");
const pathHelpers_js_1 = require("./pathHelpers.js");
const queryLinkValue_js_1 = require("./queryLinkValue.js");
//
// Model.
//
var QueryLinkType;
(function (QueryLinkType) {
QueryLinkType["LINK"] = "link";
QueryLinkType["PATH_LINK"] = "path_link";
QueryLinkType["EMPTY_PATH_LINK"] = "empty_path_link";
})(QueryLinkType || (exports.QueryLinkType = QueryLinkType = {}));
//
// I/O.
//
function buildLink(value) {
return [QueryLinkType.LINK, value];
}
function buildPathLink(path, value) {
return [QueryLinkType.PATH_LINK, path, value];
}
function buildEmptyPathLink(path) {
return [QueryLinkType.EMPTY_PATH_LINK, path];
}
function queryLinkToString(queryLink) {
switch (queryLink[0]) {
case QueryLinkType.LINK:
return queryLinkValue_js_1.QueryLinkValue.toString(queryLink[1]);
case QueryLinkType.PATH_LINK: {
const normalizedPath = (0, pathHelpers_js_1.normalizePath)(queryLink[1]);
const valueString = queryLinkValue_js_1.QueryLinkValue.toString(queryLink[2]);
return `${normalizedPath}=${valueString}`;
}
case QueryLinkType.EMPTY_PATH_LINK:
return `${(0, pathHelpers_js_1.normalizePath)(queryLink[1])}=`;
default:
(0, type_js_1.unreachable)(queryLink[0]);
}
}
// TODO: Implement link detection for accurate comparison.
function recordHasLinkAtPath(path, value, record) {
const recordValues = (0, jsonpath_plus_1.JSONPath)({ path, json: record });
return recordValues.some(v => queryLinkValue_js_1.QueryLinkValue.is(value, v));
}
// TODO: Implement link detection for accurate comparison.
function recordHasEmptyPathLink(path, record) {
const recordValues = (0, jsonpath_plus_1.JSONPath)({ path, json: record });
return (0, compact_js_1.default)(recordValues).length === 0;
}
function linkIsInRecord(record, queryLink) {
switch (queryLink[0]) {
case QueryLinkType.LINK:
throw new Error("TODO: Implement local link detection.");
case QueryLinkType.PATH_LINK:
return recordHasLinkAtPath(queryLink[1], queryLink[2], record);
case QueryLinkType.EMPTY_PATH_LINK:
return recordHasEmptyPathLink(queryLink[1], record);
default:
(0, type_js_1.unreachable)(queryLink[0]);
}
}
function queryLinkIsSuperset(link1, link2) {
switch (link1[0]) {
case QueryLinkType.LINK:
return ((link2[0] === QueryLinkType.LINK &&
queryLinkValue_js_1.QueryLinkValue.match(link1[1], link2[1])) ||
(link2[0] === QueryLinkType.PATH_LINK &&
queryLinkValue_js_1.QueryLinkValue.match(link1[1], link2[2])));
case QueryLinkType.PATH_LINK:
return (link2[0] === QueryLinkType.PATH_LINK &&
link1[1] === link2[1] &&
queryLinkValue_js_1.QueryLinkValue.match(link1[2], link2[2]));
case QueryLinkType.EMPTY_PATH_LINK:
return (link2[0] === QueryLinkType.EMPTY_PATH_LINK && link1[1] === link2[1]);
default:
(0, type_js_1.unreachable)(link1[0]);
}
}
exports.QueryLink = {
link: buildLink,
pathLink: buildPathLink,
emptyPathLink: buildEmptyPathLink,
isInRecord: linkIsInRecord,
toString: queryLinkToString,
isSuperset: queryLinkIsSuperset,
};