payload
Version:
Node, React, Headless CMS and Application Framework built on Next.js
101 lines (100 loc) • 3.79 kB
JavaScript
// @ts-strict-ignore
import { getDataLoader } from '../collections/dataloader.js';
import { getLocalI18n } from '../translations/getLocalI18n.js';
import { sanitizeFallbackLocale } from '../utilities/sanitizeFallbackLocale.js';
function getRequestContext(req = {
context: null
}, context = {}) {
if (req.context) {
if (Object.keys(req.context).length === 0 && req.context.constructor === Object) {
// if req.context is `{}` avoid unnecessary spread
return context;
} else {
return {
...req.context,
...context
};
}
} else {
return context;
}
}
const attachFakeURLProperties = (req, urlSuffix)=>{
/**
* *NOTE*
* If no URL is provided, the local API was called outside
* the context of a request. Therefore we create a fake URL object.
* `ts-expect-error` is used below for properties that are 'read-only'.
* Since they do not exist yet we can safely ignore the error.
*/ let urlObject;
function getURLObject() {
if (urlObject) {
return urlObject;
}
const fallbackURL = `http://${req.host || 'localhost'}${urlSuffix || ''}`;
const urlToUse = req?.url || req.payload.config?.serverURL ? `${req.payload.config.serverURL}${urlSuffix || ''}` : fallbackURL;
try {
urlObject = new URL(urlToUse);
} catch (_err) {
req.payload.logger.error(`Failed to create URL object from URL: ${urlToUse}, falling back to ${fallbackURL}`);
urlObject = new URL(fallbackURL);
}
return urlObject;
}
if (!req.host) {
req.host = getURLObject().host;
}
if (!req.protocol) {
req.protocol = getURLObject().protocol;
}
if (!req.pathname) {
req.pathname = getURLObject().pathname;
}
if (!req.searchParams) {
// @ts-expect-error eslint-disable-next-line no-param-reassign
req.searchParams = getURLObject().searchParams;
}
if (!req.origin) {
// @ts-expect-error eslint-disable-next-line no-param-reassign
req.origin = getURLObject().origin;
}
if (!req?.url) {
// @ts-expect-error eslint-disable-next-line no-param-reassign
req.url = getURLObject().href;
}
};
export const createLocalReq = async ({ context, fallbackLocale, locale: localeArg, req = {}, urlSuffix, user }, payload)=>{
const localization = payload.config?.localization;
if (localization) {
const locale = localeArg === '*' ? 'all' : localeArg;
const defaultLocale = localization.defaultLocale;
const localeCandidate = locale || req?.locale || req?.query?.locale;
req.locale = localeCandidate && typeof localeCandidate === 'string' ? localeCandidate : defaultLocale;
const sanitizedFallback = sanitizeFallbackLocale({
fallbackLocale,
locale: req.locale,
localization
});
req.fallbackLocale = sanitizedFallback;
}
const i18n = req?.i18n || await getLocalI18n({
config: payload.config,
language: payload.config.i18n.fallbackLanguage
});
if (!req.headers) {
// @ts-expect-error eslint-disable-next-line no-param-reassign
req.headers = new Headers();
}
req.context = getRequestContext(req, context);
req.payloadAPI = req?.payloadAPI || 'local';
req.payload = payload;
req.i18n = i18n;
req.t = i18n.t;
req.user = user || req?.user || null;
req.payloadDataLoader = req?.payloadDataLoader || getDataLoader(req);
req.routeParams = req?.routeParams || {};
req.query = req?.query || {};
attachFakeURLProperties(req, urlSuffix);
return req;
};
//# sourceMappingURL=createLocalReq.js.map