@prezly/theme-kit-core
Version:
Data layer and utility library for developing Prezly themes with JavaScript
355 lines (351 loc) • 13.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.allStories = void 0;
exports.createClient = createClient;
exports.story = exports.stories = exports.galleries = void 0;
var _sdk = require("@prezly/sdk");
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); }); }; }
var stories;
var allStories;
var story;
var galleries;
/**
* Sort order to list stories chronologically, with pinned stories on top.
*/
var CHRONOLOGICALLY = _sdk.SortOrder.combine(_sdk.SortOrder.desc('is_pinned'), _sdk.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'];
function createClient(prezly, newsroomUuid, newsroomThemeUuid) {
var {
formats = [_sdk.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 => _sdk.Category.translations(category).some(translation => translation.slug === arg));
})();
},
translatedCategories(locale, categories) {
return _asyncToGenerator(function* () {
return _sdk.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: _sdk.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 _sdk.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,
categories,
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': categories !== null && categories !== void 0 && categories.length ? {
$all: categories.map(_ref => {
var {
id
} = _ref;
return id;
})
} : undefined,
'newsroom.uuid': {
$in: [newsroomUuid]
},
locale: localeCode ? {
$in: [localeCode]
} : undefined,
status: {
$in: [_sdk.Story.Status.PUBLISHED]
},
visibility: {
$in: [_sdk.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: [..._sdk.Stories.EXTENDED_STORY_INCLUDED_EXTRA_FIELDS, ...include]
});
} catch (error) {
if (error instanceof _sdk.ApiError && isNotAvailableError(error)) {
return null;
}
throw error;
}
}
try {
return yield prezly.stories.getBySlug(params.slug, {
formats,
query: {
'newsroom.uuid': {
$in: [newsroomUuid]
},
status: {
$in: [_sdk.Story.Status.PUBLISHED, _sdk.Story.Status.EMBARGO]
},
visibility: {
$in: [_sdk.Story.Visibility.PUBLIC, _sdk.Story.Visibility.PRIVATE, _sdk.Story.Visibility.EMBARGO]
}
},
include: [..._sdk.Stories.EXTENDED_STORY_INCLUDED_EXTRA_FIELDS, ...include]
});
} catch (error) {
if (error instanceof _sdk.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;
}