@europeana/portal
Version:
Europeana Portal
857 lines (742 loc) • 26.5 kB
JavaScript
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__) {
;
// 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