UNPKG

@prezly/theme-kit-core

Version:

Data layer and utility library for developing Prezly themes with JavaScript

342 lines (339 loc) 13.5 kB
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); } function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; } import { ApiError, Category, NewsroomGallery, SortOrder, Stories, Story } from '@prezly/sdk'; export var stories; export var allStories; export var story; export var galleries; /** * Sort order to list stories chronologically, with pinned stories on top. */ var CHRONOLOGICALLY = SortOrder.combine(SortOrder.desc('is_pinned'), SortOrder.desc('published_at')); /** * Do not cache these methods, as they are derivatives of other cached methods. */ var UNCACHED_METHODS = ['themeSettings', 'language', 'usedLanguages', 'locales', 'defaultLanguage', 'defaultLocale', 'languageOrDefault', 'companyInformation', 'notifications', 'category', 'translatedCategory', 'translatedCategories']; export function createClient(prezly, newsroomUuid, newsroomThemeUuid) { var { formats = [Story.FormatVersion.SLATEJS_V4], cache } = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var client = { newsroom() { return prezly.newsrooms.get(newsroomUuid); }, theme() { return newsroomThemeUuid ? prezly.newsroomThemes.get(newsroomUuid, newsroomThemeUuid) : undefined; }, themeSettings() { return _asyncToGenerator(function* () { var theme = yield client.theme(); return theme === null || theme === void 0 ? void 0 : theme.settings; })(); }, languages() { return prezly.newsroomLanguages.list(newsroomUuid).then(data => data.languages); }, usedLanguages() { return _asyncToGenerator(function* () { var languages = yield client.languages(); return languages.filter(lang => lang.public_stories_count > 0); })(); }, locales() { return _asyncToGenerator(function* () { var languages = yield client.languages(); return languages.map(lang => lang.code); })(); }, defaultLanguage() { return _asyncToGenerator(function* () { var languages = yield client.languages(); var defaultLanguage = languages.find(lang => lang.is_default); if (!defaultLanguage) { throw new Error('A newsroom is expected to always have a default language. Something is wrong.'); } return defaultLanguage; })(); }, companyInformation(code) { return _asyncToGenerator(function* () { var languageSettings = code ? yield client.languageOrDefault(code) : yield client.defaultLanguage(); return languageSettings.company_information; })(); }, notifications(locale) { return _asyncToGenerator(function* () { var languageSettings = yield client.languageOrDefault(locale); return languageSettings.notifications; })(); }, defaultLocale() { return _asyncToGenerator(function* () { var defaultLanguage = yield client.defaultLanguage(); return defaultLanguage.code; })(); }, language(code) { return _asyncToGenerator(function* () { var languages = yield client.languages(); return languages.find(lang => !code && lang.is_default || lang.locale.code === code); })(); }, languageOrDefault(code) { return _asyncToGenerator(function* () { var _yield$client$languag; return (_yield$client$languag = yield client.language(code)) !== null && _yield$client$languag !== void 0 ? _yield$client$languag : yield client.defaultLanguage(); })(); }, categories() { return prezly.newsroomCategories.list(newsroomUuid, { sortOrder: '+order' }); }, category(arg) { return _asyncToGenerator(function* () { var categories = yield client.categories(); if (typeof arg === 'number') { return categories.find(category => category.id === arg); } return categories.find(category => Category.translations(category).some(translation => translation.slug === arg)); })(); }, translatedCategories(locale, categories) { return _asyncToGenerator(function* () { return Category.translations(categories !== null && categories !== void 0 ? categories : yield client.categories(), locale); })(); }, translatedCategory(locale, slug) { return _asyncToGenerator(function* () { var translations = yield client.translatedCategories(locale); return translations.find(category => category.slug === slug); })(); }, featuredContacts() { return prezly.newsroomContacts.search(newsroomUuid, { query: { is_featured: true } }); }, galleries() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; var { offset, limit, type } = params; return prezly.newsroomGalleries.search(newsroomUuid, { limit, offset, scope: { status: NewsroomGallery.Status.PUBLIC, is_empty: false, type } }); }, gallery(uuid) { return _asyncToGenerator(function* () { try { return yield prezly.newsroomGalleries.get(newsroomUuid, uuid); } catch (error) { if (error instanceof ApiError && isNotAvailableError(error)) { return null; } throw error; } })(); }, stories(params) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var { search, query, offset = 0, limit, category, locale, highlighted = 0, tags } = params; var { include = [] } = options; var localeCode = locale && typeof locale === 'object' ? locale.code : locale; return prezly.stories.search({ sortOrder: CHRONOLOGICALLY, formats, limit: offset === 0 ? limit + highlighted : limit, offset: offset > 0 ? offset + highlighted : offset, search, query: mergeQueries(query, { ["category.id"]: category ? { $any: [category.id] } : undefined, ["newsroom.uuid"]: { $in: [newsroomUuid] }, ["locale"]: localeCode ? { $in: [localeCode] } : undefined, ["status"]: { $in: [Story.Status.PUBLISHED] }, ["visibility"]: { $in: [Story.Visibility.PUBLIC] }, ["tag.name"]: tags !== null && tags !== void 0 && tags.length ? { $any: tags } : undefined }), include }); }, allStories() { var _arguments = arguments; return _asyncToGenerator(function* () { var params = _arguments.length > 0 && _arguments[0] !== undefined ? _arguments[0] : {}; var options = _arguments.length > 1 && _arguments[1] !== undefined ? _arguments[1] : {}; var { include = [] } = options; var newsroom = yield client.newsroom(); var chunkSize = 200; // Note: This is a counter of ALL stories, public, private, or drafts. // Depending on the specific newsroom data, the rate of overfetching may be significant. var maxStories = newsroom.stories_number; var pages = Math.ceil(maxStories / chunkSize); var promises = Array.from({ length: pages }, (_, chunkIndex) => client.stories(_objectSpread(_objectSpread({}, params), {}, { limit: chunkSize, offset: chunkIndex * chunkSize }), { include })); return (yield Promise.all(promises)).flatMap(response => response.stories); })(); }, story(params) { var _arguments2 = arguments; return _asyncToGenerator(function* () { var options = _arguments2.length > 1 && _arguments2[1] !== undefined ? _arguments2[1] : {}; var { include = [] } = options; if (params.uuid) { try { return yield prezly.stories.get(params.uuid, { formats, include: [...Stories.EXTENDED_STORY_INCLUDED_EXTRA_FIELDS, ...include] }); } catch (error) { if (error instanceof ApiError && isNotAvailableError(error)) { return null; } throw error; } } try { return yield prezly.stories.getBySlug(params.slug, { formats, query: { ["newsroom.uuid"]: { $in: [newsroomUuid] }, ["status"]: { $in: [Story.Status.PUBLISHED, Story.Status.EMBARGO] }, ["visibility"]: { $in: [Story.Visibility.PUBLIC, Story.Visibility.PRIVATE, Story.Visibility.EMBARGO] } }, include: [...Stories.EXTENDED_STORY_INCLUDED_EXTRA_FIELDS, ...include] }); } catch (error) { if (error instanceof ApiError && isNotAvailableError(error)) { return null; } throw error; } })(); } }; if (cache) { injectCache(client, cache.storage.namespace("".concat(newsroomUuid, ":").concat(newsroomThemeUuid, ":").concat(formats.join(','), ":")), cache.latestVersion, UNCACHED_METHODS); } return client; } function injectCache(client, cache, latestVersion) { var uncachedMethods = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; var methodCalls = new Map(); var methodNames = Object.keys(client); methodNames.forEach(methodName => { if (uncachedMethods.includes(methodName)) { // Do not cache this method. return; } var uncachedFn = client[methodName].bind(client); client[methodName] = /*#__PURE__*/_asyncToGenerator(function* () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } var cacheKey = "".concat(methodName, ":").concat(JSON.stringify(args)); var dedupeKey = "".concat(latestVersion, ":").concat(cacheKey); // Dedupe requests var pending = methodCalls.get(dedupeKey); if (pending) return pending; function invoke() { return _invoke.apply(this, arguments); } function _invoke() { _invoke = _asyncToGenerator(function* () { var cached = yield cache.get(cacheKey, latestVersion); if (cached) return cached; var value = yield uncachedFn(...args); cache.set(cacheKey, value, latestVersion); methodCalls.delete(dedupeKey); return value; }); return _invoke.apply(this, arguments); } var invokation = invoke(); methodCalls.set(dedupeKey, invokation); return invokation; }); }); } function mergeQueries() { for (var _len2 = arguments.length, queries = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { queries[_key2] = arguments[_key2]; } var queryObjects = queries.filter(query => Boolean(query)).map(query => { if (typeof query === 'string') { return JSON.parse(query); } return query; }).filter(query => Boolean(query)).filter(query => Object.keys(query).length > 0); if (queryObjects.length === 0) { return undefined; } if (queryObjects.length === 1) { return queryObjects[0]; } return { $and: queryObjects }; } var ERROR_CODE_NOT_FOUND = 404; var ERROR_CODE_FORBIDDEN = 403; var ERROR_CODE_GONE = 410; function isNotAvailableError(error) { return error.status === ERROR_CODE_NOT_FOUND || error.status === ERROR_CODE_GONE || error.status === ERROR_CODE_FORBIDDEN; }