UNPKG

@klevu/core

Version:

Typescript SDK that simplifies development on Klevu backend. Klevu provides advanced AI-powered search and discovery solutions for online retailers.

144 lines (143 loc) 6.31 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.removeListFilters = exports.KlevuFetch = exports.KlevuFetchOption = exports.klevuFetchCache = void 0; const index_js_1 = require("../index.js"); const index_js_2 = require("../models/index.js"); const injectFilterResult_js_1 = require("../modifiers/injectFilterResult/injectFilterResult.js"); const klevuFetchCache_js_1 = require("../store/klevuFetchCache.js"); const fetch_js_1 = require("./fetch.js"); const responseObject_js_1 = require("./responseObject.js"); exports.klevuFetchCache = new klevuFetchCache_js_1.KlevuFetchCache(); class KlevuFetchOption { constructor(params = {}) { this.params = params; } } exports.KlevuFetchOption = KlevuFetchOption; /** * Function that makes query to KlevuBackend. It can take amount of queries. * * @category KlevuFetch * @param functions list of functions to execute * @returns Tools to operate results */ function KlevuFetch(...functionPromises) { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function* () { if (functionPromises.length < 1) { throw new Error("At least one fetch function should be provided to fetch."); } const option = functionPromises.find((f) => f instanceof KlevuFetchOption); const functionPromisesWithoutOptions = functionPromises.filter((f) => !(f instanceof KlevuFetchOption)); const functions = yield Promise.all(functionPromisesWithoutOptions); const { recordQueries, suggestionQueries } = yield cleanAndProcessFunctions(functions); const withOverride = functions.find((f) => Boolean(f.configOverride)); const payload = { context: { apiKeys: [ (_b = (_a = withOverride === null || withOverride === void 0 ? void 0 : withOverride.configOverride) === null || _a === void 0 ? void 0 : _a.apiKey) !== null && _b !== void 0 ? _b : index_js_1.KlevuConfig.getDefault().apiKey, ], }, recordQueries: recordQueries.length > 0 ? recordQueries : undefined, suggestions: suggestionQueries.length > 0 ? suggestionQueries : undefined, }; const cached = exports.klevuFetchCache.check(payload); let response; const withoutSkip = recordQueries.filter((q) => q.typeOfRequest !== index_js_2.KlevuTypeOfRequest.Skip); if (withoutSkip.length > 0 || suggestionQueries.length > 0) { if (cached) { response = cached; } else { const res = yield (0, fetch_js_1.post)((_d = (_c = withOverride === null || withOverride === void 0 ? void 0 : withOverride.configOverride) === null || _c === void 0 ? void 0 : _c.url) !== null && _d !== void 0 ? _d : index_js_1.KlevuConfig.getDefault().url, payload); if (!res) { throw new Error("Couldn't fetch data"); } response = res; if (((_e = res.meta) === null || _e === void 0 ? void 0 : _e.responseCode) == 200) { exports.klevuFetchCache.cache(payload, response); } } } return new responseObject_js_1.KlevuResponseObject(response !== null && response !== void 0 ? response : { meta: { qTime: 0, responseCode: 204, }, queryResults: recordQueries.map((r) => ({ id: r.id, meta: {}, records: [], })), suggestionResults: [], }, functions, option); }); } exports.KlevuFetch = KlevuFetch; function cleanAndProcessFunctions(functions) { return __awaiter(this, void 0, void 0, function* () { const recordQueries = []; const suggestionQueries = []; for (const f of functions) { if (f.queries) { let qs = [...f.queries]; if (f.modifiers) { for (const modifier of f.modifiers) { if (modifier.modifyAfter) { qs = yield modifier.modifyAfter(qs, f); } } } recordQueries.push(...qs); } if (f.suggestions) { suggestionQueries.push(...f.suggestions); } } // Check for duplicate id's for (const query of recordQueries) { if (recordQueries.filter((q) => q.id === query.id).length !== 1) { throw new Error("Duplicate ids in request. Please provider unique ids for requests"); } } return { recordQueries, suggestionQueries, }; }); } /** * Removes list filters from query * * @param f * @param prevQueryResult * @returns */ function removeListFilters(f, prevQueryResult) { var _a; f.queries = (_a = f.queries) === null || _a === void 0 ? void 0 : _a.map((q) => { var _a, _b; if ((_a = q.filters) === null || _a === void 0 ? void 0 : _a.filtersToReturn) { (_b = q.filters) === null || _b === void 0 ? true : delete _b.filtersToReturn; } return q; }); if (f.modifiers) { const index = f.modifiers.findIndex((m) => m.klevuModifierId == "listfilters"); if (index > -1) { f.modifiers.splice(index, 1); } f.modifiers.push((0, injectFilterResult_js_1.injectFilterResult)(prevQueryResult)); } return f; } exports.removeListFilters = removeListFilters;