@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
JavaScript
;
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;