UNPKG

@baqhub/sdk

Version:

The official JavaScript SDK for the BAQ federated app platform.

93 lines (92 loc) 3.68 kB
"use strict"; 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, };