UNPKG

@europeana/portal

Version:
857 lines (742 loc) 26.5 kB
exports.ids = [104]; exports.modules = { /***/ 487: /***/ (function(module, exports, __webpack_require__) { // Custom Vue router query parsing and stringification // CommonJS due to needing to dynamically load qs for the router to have access // to it, and import('qs') returning a promise which is not resolved by the router. // // See https://github.com/nuxt/nuxt.js/issues/2098#issuecomment-417857694 const parseQuery = (query) => __webpack_require__(11).parse(query); // To ensure that `"query": ""` results in `?query=`, not `?query` const stringifyQuery = query => { const stringified = __webpack_require__(11).stringify(query, { arrayFormat: 'repeat' }); return stringified ? '?' + stringified : ''; }; module.exports = { parseQuery, stringifyQuery }; /***/ }), /***/ 532: /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; // ESM COMPAT FLAG __webpack_require__.r(__webpack_exports__); // EXPORTS __webpack_require__.d(__webpack_exports__, "cached", function() { return /* binding */ cached; }); // EXTERNAL MODULE: external "axios" var external_axios_ = __webpack_require__(7); var external_axios_default = /*#__PURE__*/__webpack_require__.n(external_axios_); // EXTERNAL MODULE: external "redis" var external_redis_ = __webpack_require__(191); var external_redis_default = /*#__PURE__*/__webpack_require__.n(external_redis_); // EXTERNAL MODULE: external "lodash/pick.js" var pick_js_ = __webpack_require__(192); var pick_js_default = /*#__PURE__*/__webpack_require__.n(pick_js_); // EXTERNAL MODULE: external "util" var external_util_ = __webpack_require__(193); // EXTERNAL MODULE: ./src/plugins/europeana/utils.js var utils = __webpack_require__(2); // CONCATENATED MODULE: ./src/cachers/utils.js const redisConfig = (config = {}) => { const redisOptions = { url: config.url }; if (config.tlsCa) { redisOptions.tls = { ca: [Buffer.from(config.tlsCa, 'base64')] }; } return redisOptions; }; const createRedisClient = (config = {}) => { const redisClient = external_redis_default.a.createClient(redisConfig(config)); redisClient.on('error', console.error); for (const fn of ['get', 'set', 'quit']) { redisClient[`${fn}Async`] = Object(external_util_["promisify"])(redisClient[fn]).bind(redisClient); } return redisClient; }; const createEuropeanaApiClient = (config = {}) => { return external_axios_default.a.create({ baseURL: config.url, params: { wskey: config.key } }); }; const errorMessage = error => { let message; if (error.response) { if (error.response.data.error) { message = error.response.data.error; } else { message = `${error.response.status} ${error.response.statusText}`; } } else { message = error.message; } return message; }; const dailyOffset = (setSize, subsetSize) => { const millisecondsPerDay = 1000 * 60 * 60 * 24; const unixDay = Math.floor(Date.now() / millisecondsPerDay); const offset = unixDay * subsetSize % setSize; return offset + subsetSize <= setSize ? offset : setSize - subsetSize; }; const daily = (set, subsetSize) => { if (!Array.isArray(set)) { return set; } const offset = dailyOffset(set.length, subsetSize); return set.slice(offset, offset + subsetSize); }; const localiseOne = (item, fields, locale) => { const localised = { ...item }; for (const field of [].concat(fields)) { if (localised[field]) { localised[field] = Object(utils["h" /* langMapValueForLocale */])(localised[field], locale).values[0]; } } return localised; }; const localise = (data, fields, locale) => { return mutateObjects(data, object => localiseOne(object, fields, locale)); }; const pick = (data, fields) => { return mutateObjects(data, object => pick_js_default()(object, fields)); }; const sort = (data, sortOn) => { const sortFn = typeof sortOn === 'function' ? sortOn : value => value[sortOn]; return data.sort((a, b) => sortFn(a).localeCompare(sortFn(b), undefined, { numeric: true, sensitivity: 'base' })); }; const mutateObjects = (data, mutator) => { if (Array.isArray(data)) { return data.map(mutator); } else if (typeof data === 'object') { return mutator(data); } else { return data; } }; // EXTERNAL MODULE: external "express" var external_express_ = __webpack_require__(194); var external_express_default = /*#__PURE__*/__webpack_require__.n(external_express_); // EXTERNAL MODULE: external "defu" var external_defu_ = __webpack_require__(65); var external_defu_default = /*#__PURE__*/__webpack_require__.n(external_defu_); // EXTERNAL MODULE: external "elastic-apm-node" var external_elastic_apm_node_ = __webpack_require__(25); var external_elastic_apm_node_default = /*#__PURE__*/__webpack_require__.n(external_elastic_apm_node_); // EXTERNAL MODULE: external "morgan" var external_morgan_ = __webpack_require__(195); var external_morgan_default = /*#__PURE__*/__webpack_require__.n(external_morgan_); // CONCATENATED MODULE: ./src/server-middleware/logging.js // Use morgan for request logging /* harmony default export */ var logging = (external_morgan_default()('combined')); // EXTERNAL MODULE: ./pkg-versions.js var pkg_versions = __webpack_require__(17); // EXTERNAL MODULE: ./src/plugins/i18n/locales.js var locales = __webpack_require__(18); // CONCATENATED MODULE: ./src/plugins/i18n/datetime.js const datetime_defaults = { short: { year: 'numeric', month: 'long', day: 'numeric' } }; /* harmony default export */ var datetime = ({ bg: datetime_defaults, cs: datetime_defaults, da: datetime_defaults, de: datetime_defaults, el: datetime_defaults, en: datetime_defaults, es: datetime_defaults, et: datetime_defaults, eu: datetime_defaults, fi: datetime_defaults, fr: datetime_defaults, ga: datetime_defaults, hr: datetime_defaults, hu: datetime_defaults, it: datetime_defaults, lt: datetime_defaults, lv: datetime_defaults, mt: datetime_defaults, nl: datetime_defaults, pl: datetime_defaults, pt: datetime_defaults, ro: datetime_defaults, sk: datetime_defaults, sl: datetime_defaults, sv: datetime_defaults }); // EXTERNAL MODULE: ./src/plugins/vue-router.cjs var vue_router = __webpack_require__(487); // EXTERNAL MODULE: external "decamelize" var external_decamelize_ = __webpack_require__(196); var external_decamelize_default = /*#__PURE__*/__webpack_require__.n(external_decamelize_); // CONCATENATED MODULE: ./src/features/toggles.js /* harmony default export */ var toggles = ([{ name: 'abTests' }, { name: 'acceptEntityRecommendations' }, { name: 'acceptSetRecommendations' }, { name: 'entityManagement' }, { name: 'fieldBoosting' }, { name: 'jiraServiceDeskFeedbackForm' }, { name: 'newHomepage' }, { name: 'rejectEntityRecommendations' }, { name: 'setGalleries' }, { name: 'storiesPageAllTags' }, { name: 'translatedItems' }]); // CONCATENATED MODULE: ./src/features/index.js const featureIsEnabled = value => Boolean(Number(value)); const featureNotificationExpiration = value => { const date = new Date(value); return date.toString() === 'Invalid Date' ? null : date; }; /* harmony default export */ var features = (() => toggles.reduce((memo, featureToggle) => { const envKey = `ENABLE_${external_decamelize_default()(featureToggle.name).toUpperCase()}`; memo[featureToggle.name] = featureIsEnabled(process.env[envKey]); return memo; }, {})); // CONCATENATED MODULE: ./nuxt.config.js var _process$env$AXIOS_LO, _process$env$AXIOS_LO2; /* eslint-disable camelcase */ /* ** Nuxt config ** Docs: https://nuxtjs.org/docs/configuration-glossary/ */ const APP_SITE_NAME = 'Europeana'; const APP_PKG_NAME = '@europeana/portal'; const buildPublicPath = () => { if (featureIsEnabled(process.env.ENABLE_JSDELIVR_BUILD_PUBLIC_PATH)) { return `https://cdn.jsdelivr.net/npm/${APP_PKG_NAME}@${pkg_versions["a" /* default */][APP_PKG_NAME]}/.nuxt/dist/client`; } else { return process.env.NUXT_BUILD_PUBLIC_PATH; } }; /* harmony default export */ var nuxt_config = ({ /* ** Runtime config */ publicRuntimeConfig: { app: { // TODO: rename env vars to prefix w/ APP_, except feature toggles baseUrl: process.env.PORTAL_BASE_URL, internalLinkDomain: process.env.INTERNAL_LINK_DOMAIN, featureNotification: process.env.APP_FEATURE_NOTIFICATION, featureNotificationExpiration: featureNotificationExpiration(process.env.APP_FEATURE_NOTIFICATION_EXPIRATION), schemaOrgDatasetId: process.env.SCHEMA_ORG_DATASET_ID, siteName: APP_SITE_NAME, search: { translateLocales: (process.env.APP_SEARCH_TRANSLATE_LOCALES || '').split(',') } }, auth: { strategies: { keycloak: { client_id: process.env.OAUTH_CLIENT, origin: process.env.OAUTH_ORIGIN || 'https://auth.europeana.eu', scope: (process.env.OAUTH_SCOPE || 'openid,profile,email,usersets').split(','), realm: process.env.OAUTH_REALM || 'europeana', response_type: process.env.OAUTH_RESPONSE_TYPE || 'code', access_type: process.env.OAUTH_ACCESS_TYPE || 'online', grant_type: process.env.OAUTH_GRANT_TYPE || 'authorization_code', token_type: process.env.OAUTH_TOKEN_TYPE || 'Bearer' } } }, axios: { baseURL: process.env.PORTAL_BASE_URL }, axiosLogger: { clearParams: ((_process$env$AXIOS_LO = process.env.AXIOS_LOGGER_CLEAR_PARAMS) === null || _process$env$AXIOS_LO === void 0 ? void 0 : _process$env$AXIOS_LO.split(',')) || ['wskey'], httpMethods: (_process$env$AXIOS_LO2 = process.env.AXIOS_LOGGER_HTTP_METHODS) === null || _process$env$AXIOS_LO2 === void 0 ? void 0 : _process$env$AXIOS_LO2.toUpperCase().split(',') }, contentful: { spaceId: process.env.CTF_SPACE_ID, environmentId: process.env.CTF_ENVIRONMENT_ID, accessToken: { delivery: process.env.CTF_CDA_ACCESS_TOKEN, preview: process.env.CTF_CPA_ACCESS_TOKEN }, graphQlOrigin: process.env.CTF_GRAPHQL_ORIGIN }, elastic: { apm: { // Doc: https://www.elastic.co/guide/en/apm/agent/rum-js/current/configuration.html serverUrl: process.env.ELASTIC_APM_SERVER_URL, environment: process.env.ELASTIC_APM_ENVIRONMENT || 'development', logLevel: process.env.ELASTIC_APM_LOG_LEVEL || 'info', serviceName: 'portal-js', serviceVersion: pkg_versions["a" /* default */][APP_PKG_NAME], frameworkName: 'Nuxt', frameworkVersion: pkg_versions["a" /* default */]['@nuxt/core'], ignoreUrls: [/^\/(_nuxt|__webpack_hmr)\//], ignoreUserAgents: ['kube-probe/'] } }, europeana: { apis: { annotation: { url: process.env.EUROPEANA_ANNOTATION_API_URL, key: process.env.EUROPEANA_ANNOTATION_API_KEY || process.env.EUROPEANA_API_KEY }, entity: { url: process.env.EUROPEANA_ENTITY_API_URL || 'https://api.europeana.eu/entity', key: process.env.EUROPEANA_ENTITY_API_KEY || process.env.EUROPEANA_API_KEY }, newspaper: { url: process.env.EUROPEANA_NEWSPAPER_API_URL }, recommendation: { url: process.env.EUROPEANA_RECOMMENDATION_API_URL }, record: { url: process.env.EUROPEANA_RECORD_API_URL || 'https://api.europeana.eu/record', key: process.env.EUROPEANA_RECORD_API_KEY || process.env.EUROPEANA_API_KEY }, thumbnail: { url: process.env.EUROPEANA_THUMBNAIL_API_URL }, set: { url: process.env.EUROPEANA_SET_API_URL, key: process.env.EUROPEANA_SET_API_KEY || process.env.EUROPEANA_API_KEY }, entityManagement: { url: process.env.EUROPEANA_ENTITY_MANAGEMENT_API_URL }, iiifPresentation: { media: { url: process.env.EUROPEANA_MEDIA_IIIF_PRESENTATION_API_URL || 'https://iiif.europeana.eu/presentation' } } }, proxy: { media: { url: process.env.EUROPEANA_MEDIA_PROXY_URL } } }, features: features(), hotjar: { id: process.env.HOTJAR_ID, sv: process.env.HOTJAR_SNIPPET_VERSION }, http: { ports: { http: process.env.HTTP_PORT, https: process.env.HTTPS_PORT }, sslNegotiation: { enabled: featureIsEnabled(process.env.ENABLE_SSL_NEGOTIATION), datasetBlacklist: (process.env.SSL_DATASET_BLACKLIST || '').split(',') } }, matomo: { host: process.env.MATOMO_HOST, siteId: process.env.MATOMO_SITE_ID, loadWait: { delay: process.env.MATOMO_LOAD_WAIT_DELAY, retries: process.env.MATOMO_LOAD_WAIT_RETRIES } }, oauth: { origin: process.env.OAUTH_ORIGIN, realm: process.env.OAUTH_REALM, client: process.env.OAUTH_CLIENT, scope: process.env.OAUTH_SCOPE, responseType: process.env.OAUTH_RESPONSE_TYPE, accessType: process.env.OAUTH_ACCESS_TYPE, grantType: process.env.OAUTH_GRANT_TYPE, tokenType: process.env.OAUTH_TOKEN_TYPE } }, privateRuntimeConfig: { contentful: { graphQlOrigin: process.env.CTF_GRAPHQL_ORIGIN_PRIVATE || process.env.CTF_GRAPHQL_ORIGIN }, jira: { origin: process.env.JIRA_API_ORIGIN, username: process.env.JIRA_API_USERNAME, password: process.env.JIRA_API_PASSWORD, serviceDesk: { serviceDeskId: process.env.JIRA_API_SERVICE_DESK_ID, requestTypeId: process.env.JIRA_API_SERVICE_DESK_REQUEST_TYPE_ID, customFields: { pageUrl: process.env.JIRA_API_SERVICE_DESK_CUSTOM_FIELD_PAGE_URL, browser: process.env.JIRA_API_SERVICE_DESK_CUSTOM_FIELD_BROWSER, screensize: process.env.JIRA_API_SERVICE_DESK_CUSTOM_FIELD_SCREENSIZE } } }, redis: { url: process.env.REDIS_URL, tlsCa: process.env.REDIS_TLS_CA } }, /* ** Headers of the page */ head: { title: APP_SITE_NAME, htmlAttrs: { lang: 'en' }, meta: [{ charset: 'utf-8' }, { name: 'viewport', content: 'width=device-width, initial-scale=1' }, { hid: 'description', name: 'description', content: APP_SITE_NAME }], link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }] }, /* ** Customize the progress-bar color */ loading: { // Show progress bar immediately when testing, to aid detection that page // has started loading, then finished. throttle: process.env.NUXT_LOADING_THROTTLE || 200, css: false, duration: 2500, continuous: true }, /* ** Global CSS */ css: ['./assets/scss/style'], // BootstrapVue // Doc: https://bootstrap-vue.js.org/docs/ bootstrapVue: { // Set these two settings to `false` to prevent auto-importing of Bootstrap(Vue) // CSS. It will then need to be manually imported, e.g. with // assets/scss/bootstrap.scss bootstrapCSS: false, bootstrapVueCSS: false, // Tree shake plugins // // NOTE: do not register plugins globally (here) unless they are used widely; // import them locally into the views that need them instead. This // is to prevent large amounts of unused JS being sent upfront to clients. // As a general rule, only register globally if at least three views // use the plugin's components/directives. Also consider how often // those components are rendered based on placement in layout and // usage patterns by users, and the plugin's bundled size. componentPlugins: ['BadgePlugin', 'ButtonPlugin', 'CardPlugin', 'DropdownPlugin', 'FormCheckboxPlugin', 'FormGroupPlugin', 'FormInputPlugin', 'FormPlugin', 'FormRadioPlugin', 'FormTextareaPlugin', 'ImagePlugin', 'InputGroupPlugin', 'JumbotronPlugin', 'LayoutPlugin', 'LinkPlugin', 'ListGroupPlugin', 'ModalPlugin', 'NavbarPlugin', 'SidebarPlugin', 'ToastPlugin'] }, /* ** Plugins to load before mounting the App */ plugins: ['~/plugins/vue-matomo.client', '~/plugins/i18n/iso-locale', '~/plugins/hotjar.client', '~/plugins/link', '~/plugins/page', '~/plugins/vue-filters', '~/plugins/vue-directives', '~/plugins/vue-announcer.client', '~/plugins/vue-masonry.client', '~/plugins/vue-scrollto.client', '~/plugins/ab-testing', '~/plugins/features'], buildModules: ['~/modules/contentful-graphql', '~/modules/axios-logger', '~/modules/http', '~/modules/query-sanitiser', '@nuxtjs/auth'], /* ** Nuxt.js modules */ modules: ['~/modules/elastic-apm', '@nuxtjs/axios', 'bootstrap-vue/nuxt', 'cookie-universal-nuxt', ['@nuxtjs/i18n', { locales: locales["a" /* default */], baseUrl: ({ $config }) => $config.app.baseUrl, defaultLocale: 'en', lazy: true, langDir: 'lang/', strategy: 'prefix', vueI18n: { fallbackLocale: 'en', silentFallbackWarn: true, dateTimeFormats: datetime }, // Disable redirects to account pages parsePages: false, pages: { 'account/callback': false, 'account/logout': false }, // Enable browser language detection to automatically redirect user // to their preferred language as they visit your app for the first time // Set to false to disable // NB: do not enable this in portal.js; our own l10n middleware handles it. detectBrowserLanguage: false, vuex: { // Module namespace moduleName: 'i18n', syncLocale: true, syncRouteParams: true } }]], auth: { // Redirect routes: 'callback' option for keycloak redirects, // 'login' option for unauthorised redirection // 'home' option for redirection after login // no redirect on logout redirect: { login: '/account/login', logout: false, callback: '/account/callback', home: '/account' }, fullPathRedirect: true, strategies: { local: false, // Include oauth2 so that ~/plugins/authScheme can extend it _oauth2: { _scheme: 'oauth2' }, keycloak: { _scheme: '~/plugins/authScheme' } }, defaultStrategy: 'keycloak', plugins: ['~/plugins/apis', '~/plugins/user-likes.client'] }, router: { middleware: ['trailing-slash', 'legacy/index', 'l10n'], extendRoutes(routes) { const nuxtHomeRouteIndex = routes.findIndex(route => route.name === 'home'); routes[nuxtHomeRouteIndex] = { name: 'home', path: '/', component: 'src/pages/home/index.vue' }; const nuxtCollectionsPersonsOrPlacesRouteIndex = routes.findIndex(route => route.name === 'collections-persons-or-places'); routes.splice(nuxtCollectionsPersonsOrPlacesRouteIndex, 1); routes.push({ name: 'collections-persons', path: '/collections/persons', component: 'src/pages/collections/persons-or-places.vue' }); routes.push({ name: 'collections-places', path: '/collections/places', component: 'src/pages/collections/persons-or-places.vue' }); routes.push({ name: 'slug', path: '/*', component: 'src/pages/index.vue' }); }, linkExactActiveClass: 'exact-active-link', parseQuery: vue_router["parseQuery"], stringifyQuery: vue_router["stringifyQuery"] }, serverMiddleware: [// We can't use /api as that's reserved on www.europeana.eu for (deprecated) // access to Europeana APIs. { path: '/_api', handler: '~/server-middleware/api' }, { path: '/robots.txt', handler: '~/server-middleware/robots.txt' }, '~/server-middleware/logging', '~/server-middleware/referrer-policy', '~/server-middleware/record-json'], /* ** Build configuration */ build: { // Do not enable extractCSS as it is unreliable. // See: https://github.com/nuxt/nuxt.js/issues/4219 extractCSS: false, extend(config, { isClient }) { // Extend webpack config only for client bundle if (isClient) { // Build source maps to aid debugging in production builds config.devtool = 'source-map'; } }, // Prevent irrelevant postcss warnings // See https://github.com/postcss/postcss/issues/1375 postcss: null, publicPath: buildPublicPath(), // swiper v8 (and its dependencies) is pure ESM and needs to be transpiled to be used by Vue2 transpile: ['dom7', 'ssr-window', 'swiper'] }, /* ** Enable modern builds */ modern: true, /* ** Render configuration */ render: { // Disable compression: leave it to a gateway/reverse proxy like NGINX or // Cloudflare. compressor: false, static: { maxAge: '1d' } }, srcDir: 'src/', // Opt-out of telemetry telemetry: false, watch: ['~/**/*.graphql'] }); // CONCATENATED MODULE: ./src/server-middleware/api/debug/memory-usage.js /* harmony default export */ var memory_usage = ((req, res) => res.json(process.memoryUsage())); // EXTERNAL MODULE: ./src/plugins/vue-filters.js var vue_filters = __webpack_require__(22); // CONCATENATED MODULE: ./src/server-middleware/api/jira/service-desk.js const JIRA_SERVICE_DESK_API_PATH = '/rest/servicedeskapi/request'; const JSON_CONTENT_TYPE = 'application/json'; const jiraData = (options, req) => { const { customFields } = options.serviceDesk; const data = { serviceDeskId: options.serviceDesk.serviceDeskId, requestTypeId: options.serviceDesk.requestTypeId, requestFieldValues: { summary: Object(vue_filters["b" /* truncate */])(req.body.feedback, 50), description: req.body.feedback } }; if (customFields) { if (customFields.pageUrl && req.body.pageUrl) { data.requestFieldValues[customFields.pageUrl] = req.body.pageUrl; } if (customFields.browser && req.body.browser) { data.requestFieldValues[customFields.browser] = req.body.browser; } if (customFields.screensize && req.body.screensize) { data.requestFieldValues[customFields.screensize] = req.body.screensize; } } if (req.body.email) { data.raiseOnBehalfOf = req.body.email; } return data; }; const validateFeedbackLength = feedback => Object(vue_filters["c" /* wordLength */])(feedback) >= 5; const validateFeedback = feedback => new Promise((resolve, reject) => { if (validateFeedbackLength(feedback)) { resolve(); } else { reject({ status: 400, message: 'Invalid feedback.' }); } }); const jiraOptions = options => ({ auth: { username: options.username, password: options.password }, headers: { 'Accept': JSON_CONTENT_TYPE, 'Content-Type': JSON_CONTENT_TYPE } }); // Docs: https://developer.atlassian.com/cloud/jira/service-desk/rest/api-group-request/#api-rest-servicedeskapi-request-post /* harmony default export */ var service_desk = ((options = {}) => (req, res) => { return validateFeedback(req.body.feedback).then(() => external_axios_default.a.create({ baseURL: options.origin }).post(JIRA_SERVICE_DESK_API_PATH, jiraData(options, req), jiraOptions(options)).then(jiraRes => res.sendStatus(jiraRes.status))).catch(error => errorHandler(res, error)); }); // CONCATENATED MODULE: ./src/server-middleware/api/version.js // Outputs as plain text the version of the app that is running /* harmony default export */ var version = ((req, res) => { res.setHeader('Content-Type', 'text/plain'); res.end(pkg_versions["a" /* default */]['@europeana/portal']); }); // CONCATENATED MODULE: ./src/server-middleware/api/index.js const app = external_express_default()(); app.disable('x-powered-by'); // Security: do not disclose technology fingerprints app.use(external_express_default.a.json()); app.use(logging); let runtimeConfig; app.use((res, req, next) => { if (!runtimeConfig) { // Load Nuxt config once, at runtime runtimeConfig = external_defu_default()(nuxt_config.privateRuntimeConfig, nuxt_config.publicRuntimeConfig); } next(); }); app.use((req, res, next) => { if (external_elastic_apm_node_default.a.isStarted()) { // Elastic APM Node agent instruments Express requests automatically, but // omits any prefix such as /_api/, so override the transactions name here // to restore it form the original URL. external_elastic_apm_node_default.a.setTransactionName(`${req.method} ${req.originalUrl.split('?')[0]}`); } next(); }); app.get('/debug/memory-usage', memory_usage); // Redirection of some deprecated API URL paths. // // TODO: remove redirection of deprecated routes after new routes are // well-established in production // // Deprecated with v1.63.0: app.get('/items/typeCounts', (req, res) => res.redirect('/_api/cache/items/type-counts')); app.get('/cache/*', (req, res) => cache(req.params[0], runtimeConfig)(req, res)); app.post('/jira/service-desk', (req, res) => service_desk(runtimeConfig.jira)(req, res)); app.get('/version', version); app.all('/*', (req, res) => res.sendStatus(404)); const errorHandler = (res, error) => { let status = error.status || 500; let message = error.message; if (error.response) { status = error.response.status; message = error.response.data.errorMessage; } res.status(status).set('Content-Type', 'text/plain').send(message); }; /* harmony default export */ var api = (app); // CONCATENATED MODULE: ./src/server-middleware/api/cache/index.js const cacheKey = id => `@europeana:portal.js:${id.replace(/\//g, ':')}`; const cached = (id, config = {}, options = {}) => { const defaults = { parse: true }; const settings = { ...defaults, ...options }; if (!config.redis.url) { return Promise.reject(new Error('No cache configured.')); } const redisClient = createRedisClient(config.redis); const key = cacheKey(id); return redisClient.getAsync(key).then(value => settings.parse ? JSON.parse(value) : value).then(body => { redisClient.quitAsync(); return body; }); }; /* harmony default export */ var cache = __webpack_exports__["default"] = ((id, config = {}) => (req, res) => { return cached(id, config, { parse: false }).then(data => { res.set('Content-Type', 'application/json'); res.send(data); }).catch(error => errorHandler(res, error)); }); /***/ }) };; //# sourceMappingURL=104.js.map