@payloadcms/next 3.25.0 → 3.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/Nav/index.client.d.ts.map +1 -1
- package/dist/elements/Nav/index.client.js +18 -9
- package/dist/elements/Nav/index.client.js.map +1 -1
- package/dist/elements/Nav/index.scss +27 -26
- package/dist/layouts/Root/index.d.ts.map +1 -1
- package/dist/layouts/Root/index.js +17 -18
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/prod/styles.css +1 -1
- package/dist/utilities/handleServerFunctions.d.ts.map +1 -1
- package/dist/utilities/handleServerFunctions.js +5 -1
- package/dist/utilities/handleServerFunctions.js.map +1 -1
- package/dist/utilities/initPage/index.d.ts +1 -1
- package/dist/utilities/initPage/index.d.ts.map +1 -1
- package/dist/utilities/initPage/index.js +26 -24
- package/dist/utilities/initPage/index.js.map +1 -1
- package/dist/utilities/initPage/types.d.ts +11 -0
- package/dist/utilities/initPage/types.d.ts.map +1 -1
- package/dist/utilities/initPage/types.js.map +1 -1
- package/dist/utilities/initReq.d.ts +16 -2
- package/dist/utilities/initReq.d.ts.map +1 -1
- package/dist/utilities/initReq.js +83 -54
- package/dist/utilities/initReq.js.map +1 -1
- package/dist/utilities/selectiveCache.d.ts +12 -0
- package/dist/utilities/selectiveCache.d.ts.map +1 -0
- package/dist/utilities/selectiveCache.js +38 -0
- package/dist/utilities/selectiveCache.js.map +1 -0
- package/dist/views/List/index.d.ts +1 -1
- package/dist/views/List/index.d.ts.map +1 -1
- package/dist/views/List/index.js +11 -1
- package/dist/views/List/index.js.map +1 -1
- package/dist/views/NotFound/index.d.ts.map +1 -1
- package/dist/views/NotFound/index.js +2 -1
- package/dist/views/NotFound/index.js.map +1 -1
- package/dist/views/Verify/index.js +1 -1
- package/dist/views/Verify/index.js.map +1 -1
- package/dist/views/Version/index.d.ts.map +1 -1
- package/dist/views/Version/index.js +16 -15
- package/dist/views/Version/index.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleServerFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/handleServerFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAYpE,eAAO,MAAM,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"handleServerFunctions.d.ts","sourceRoot":"","sources":["../../src/utilities/handleServerFunctions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAYpE,eAAO,MAAM,qBAAqB,EAAE,qBAgCnC,CAAA"}
|
|
@@ -15,7 +15,11 @@ export const handleServerFunctions = async args => {
|
|
|
15
15
|
} = args;
|
|
16
16
|
const {
|
|
17
17
|
req
|
|
18
|
-
} = await initReq(
|
|
18
|
+
} = await initReq({
|
|
19
|
+
configPromise,
|
|
20
|
+
importMap,
|
|
21
|
+
key: 'RootLayout'
|
|
22
|
+
});
|
|
19
23
|
const augmentedArgs = {
|
|
20
24
|
...fnArgs,
|
|
21
25
|
importMap,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleServerFunctions.js","names":["copyDataFromLocaleHandler","buildFormStateHandler","buildTableStateHandler","schedulePublishHandler","renderDocumentHandler","renderDocumentSlotsHandler","renderListHandler","initReq","handleServerFunctions","args","name","fnKey","fnArgs","config","configPromise","importMap","req","augmentedArgs","serverFunctions","fn","Error"],"sources":["../../src/utilities/handleServerFunctions.ts"],"sourcesContent":["import type { ServerFunction, ServerFunctionHandler } from 'payload'\n\nimport { copyDataFromLocaleHandler } from '@payloadcms/ui/rsc'\nimport { buildFormStateHandler } from '@payloadcms/ui/utilities/buildFormState'\nimport { buildTableStateHandler } from '@payloadcms/ui/utilities/buildTableState'\nimport { schedulePublishHandler } from '@payloadcms/ui/utilities/schedulePublishHandler'\n\nimport { renderDocumentHandler } from '../views/Document/handleServerFunction.js'\nimport { renderDocumentSlotsHandler } from '../views/Document/renderDocumentSlots.js'\nimport { renderListHandler } from '../views/List/handleServerFunction.js'\nimport { initReq } from './initReq.js'\n\nexport const handleServerFunctions: ServerFunctionHandler = async (args) => {\n const { name: fnKey, args: fnArgs, config: configPromise, importMap } = args\n\n const { req } = await initReq(configPromise)\n\n const augmentedArgs: Parameters<ServerFunction>[0] = {\n ...fnArgs,\n importMap,\n req,\n }\n\n const serverFunctions = {\n 'copy-data-from-locale': copyDataFromLocaleHandler as any as ServerFunction,\n 'form-state': buildFormStateHandler as any as ServerFunction,\n 'render-document': renderDocumentHandler as any as ServerFunction,\n 'render-document-slots': renderDocumentSlotsHandler as any as ServerFunction,\n 'render-list': renderListHandler as any as ServerFunction,\n 'schedule-publish': schedulePublishHandler as any as ServerFunction,\n 'table-state': buildTableStateHandler as any as ServerFunction,\n }\n\n const fn = serverFunctions[fnKey]\n\n if (!fn) {\n throw new Error(`Unknown Server Function: ${fnKey}`)\n }\n\n return fn(augmentedArgs)\n}\n"],"mappings":"AAEA,SAASA,yBAAyB,QAAQ;AAC1C,SAASC,qBAAqB,QAAQ;AACtC,SAASC,sBAAsB,QAAQ;AACvC,SAASC,sBAAsB,QAAQ;AAEvC,SAASC,qBAAqB,QAAQ;AACtC,SAASC,0BAA0B,QAAQ;AAC3C,SAASC,iBAAiB,QAAQ;AAClC,SAASC,OAAO,QAAQ;AAExB,OAAO,MAAMC,qBAAA,GAA+C,MAAOC,IAAA;EACjE,MAAM;IAAEC,IAAA,EAAMC,KAAK;IAAEF,IAAA,EAAMG,MAAM;IAAEC,MAAA,EAAQC,aAAa;IAAEC;EAAS,CAAE,GAAGN,IAAA;EAExE,MAAM;IAAEO;EAAG,CAAE,GAAG,MAAMT,OAAA,
|
|
1
|
+
{"version":3,"file":"handleServerFunctions.js","names":["copyDataFromLocaleHandler","buildFormStateHandler","buildTableStateHandler","schedulePublishHandler","renderDocumentHandler","renderDocumentSlotsHandler","renderListHandler","initReq","handleServerFunctions","args","name","fnKey","fnArgs","config","configPromise","importMap","req","key","augmentedArgs","serverFunctions","fn","Error"],"sources":["../../src/utilities/handleServerFunctions.ts"],"sourcesContent":["import type { ServerFunction, ServerFunctionHandler } from 'payload'\n\nimport { copyDataFromLocaleHandler } from '@payloadcms/ui/rsc'\nimport { buildFormStateHandler } from '@payloadcms/ui/utilities/buildFormState'\nimport { buildTableStateHandler } from '@payloadcms/ui/utilities/buildTableState'\nimport { schedulePublishHandler } from '@payloadcms/ui/utilities/schedulePublishHandler'\n\nimport { renderDocumentHandler } from '../views/Document/handleServerFunction.js'\nimport { renderDocumentSlotsHandler } from '../views/Document/renderDocumentSlots.js'\nimport { renderListHandler } from '../views/List/handleServerFunction.js'\nimport { initReq } from './initReq.js'\n\nexport const handleServerFunctions: ServerFunctionHandler = async (args) => {\n const { name: fnKey, args: fnArgs, config: configPromise, importMap } = args\n\n const { req } = await initReq({\n configPromise,\n importMap,\n key: 'RootLayout',\n })\n\n const augmentedArgs: Parameters<ServerFunction>[0] = {\n ...fnArgs,\n importMap,\n req,\n }\n\n const serverFunctions = {\n 'copy-data-from-locale': copyDataFromLocaleHandler as any as ServerFunction,\n 'form-state': buildFormStateHandler as any as ServerFunction,\n 'render-document': renderDocumentHandler as any as ServerFunction,\n 'render-document-slots': renderDocumentSlotsHandler as any as ServerFunction,\n 'render-list': renderListHandler as any as ServerFunction,\n 'schedule-publish': schedulePublishHandler as any as ServerFunction,\n 'table-state': buildTableStateHandler as any as ServerFunction,\n }\n\n const fn = serverFunctions[fnKey]\n\n if (!fn) {\n throw new Error(`Unknown Server Function: ${fnKey}`)\n }\n\n return fn(augmentedArgs)\n}\n"],"mappings":"AAEA,SAASA,yBAAyB,QAAQ;AAC1C,SAASC,qBAAqB,QAAQ;AACtC,SAASC,sBAAsB,QAAQ;AACvC,SAASC,sBAAsB,QAAQ;AAEvC,SAASC,qBAAqB,QAAQ;AACtC,SAASC,0BAA0B,QAAQ;AAC3C,SAASC,iBAAiB,QAAQ;AAClC,SAASC,OAAO,QAAQ;AAExB,OAAO,MAAMC,qBAAA,GAA+C,MAAOC,IAAA;EACjE,MAAM;IAAEC,IAAA,EAAMC,KAAK;IAAEF,IAAA,EAAMG,MAAM;IAAEC,MAAA,EAAQC,aAAa;IAAEC;EAAS,CAAE,GAAGN,IAAA;EAExE,MAAM;IAAEO;EAAG,CAAE,GAAG,MAAMT,OAAA,CAAQ;IAC5BO,aAAA;IACAC,SAAA;IACAE,GAAA,EAAK;EACP;EAEA,MAAMC,aAAA,GAA+C;IACnD,GAAGN,MAAM;IACTG,SAAA;IACAC;EACF;EAEA,MAAMG,eAAA,GAAkB;IACtB,yBAAyBnB,yBAAA;IACzB,cAAcC,qBAAA;IACd,mBAAmBG,qBAAA;IACnB,yBAAyBC,0BAAA;IACzB,eAAeC,iBAAA;IACf,oBAAoBH,sBAAA;IACpB,eAAeD;EACjB;EAEA,MAAMkB,EAAA,GAAKD,eAAe,CAACR,KAAA,CAAM;EAEjC,IAAI,CAACS,EAAA,EAAI;IACP,MAAM,IAAIC,KAAA,CAAM,4BAA4BV,KAAA,EAAO;EACrD;EAEA,OAAOS,EAAA,CAAGF,aAAA;AACZ","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { InitPageResult } from 'payload';
|
|
2
2
|
import type { Args } from './types.js';
|
|
3
|
-
export declare const initPage: ({ config: configPromise, importMap, route, searchParams, }: Args) => Promise<InitPageResult>;
|
|
3
|
+
export declare const initPage: ({ config: configPromise, importMap, route, searchParams, useLayoutReq, }: Args) => Promise<InitPageResult>;
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/initPage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/initPage/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,SAAS,CAAA;AAM9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAQtC,eAAO,MAAM,QAAQ,6EAMlB,IAAI,KAAG,OAAO,CAAC,cAAc,CAkG/B,CAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import { headers as getHeaders } from 'next/headers.js';
|
|
2
1
|
import { notFound } from 'next/navigation.js';
|
|
3
|
-
import {
|
|
2
|
+
import { isEntityHidden } from 'payload';
|
|
4
3
|
import * as qs from 'qs-esm';
|
|
5
4
|
import { initReq } from '../initReq.js';
|
|
6
5
|
import { getRouteInfo } from './handleAdminPage.js';
|
|
@@ -11,16 +10,35 @@ export const initPage = async ({
|
|
|
11
10
|
config: configPromise,
|
|
12
11
|
importMap,
|
|
13
12
|
route,
|
|
14
|
-
searchParams
|
|
13
|
+
searchParams,
|
|
14
|
+
useLayoutReq
|
|
15
15
|
}) => {
|
|
16
|
-
const headers = await getHeaders();
|
|
17
|
-
const payload = await getPayload({
|
|
18
|
-
config: configPromise,
|
|
19
|
-
importMap
|
|
20
|
-
});
|
|
21
16
|
const queryString = `${qs.stringify(searchParams ?? {}, {
|
|
22
17
|
addQueryPrefix: true
|
|
23
18
|
})}`;
|
|
19
|
+
const {
|
|
20
|
+
cookies,
|
|
21
|
+
locale,
|
|
22
|
+
permissions,
|
|
23
|
+
req,
|
|
24
|
+
req: {
|
|
25
|
+
payload
|
|
26
|
+
}
|
|
27
|
+
} = await initReq({
|
|
28
|
+
configPromise,
|
|
29
|
+
importMap,
|
|
30
|
+
key: useLayoutReq ? 'RootLayout' : 'initPage',
|
|
31
|
+
overrides: {
|
|
32
|
+
fallbackLocale: false,
|
|
33
|
+
req: {
|
|
34
|
+
query: qs.parse(queryString, {
|
|
35
|
+
depth: 10,
|
|
36
|
+
ignoreQueryPrefix: true
|
|
37
|
+
})
|
|
38
|
+
},
|
|
39
|
+
urlSuffix: `${route}${searchParams ? queryString : ''}`
|
|
40
|
+
}
|
|
41
|
+
});
|
|
24
42
|
const {
|
|
25
43
|
collections,
|
|
26
44
|
globals,
|
|
@@ -28,22 +46,6 @@ export const initPage = async ({
|
|
|
28
46
|
admin: adminRoute
|
|
29
47
|
}
|
|
30
48
|
} = payload.config;
|
|
31
|
-
const cookies = parseCookies(headers);
|
|
32
|
-
const {
|
|
33
|
-
locale,
|
|
34
|
-
permissions,
|
|
35
|
-
req
|
|
36
|
-
} = await initReq(payload.config, {
|
|
37
|
-
fallbackLocale: false,
|
|
38
|
-
req: {
|
|
39
|
-
headers,
|
|
40
|
-
query: qs.parse(queryString, {
|
|
41
|
-
depth: 10,
|
|
42
|
-
ignoreQueryPrefix: true
|
|
43
|
-
}),
|
|
44
|
-
url: `${payload.config.serverURL}${route}${searchParams ? queryString : ''}`
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
49
|
const languageOptions = Object.entries(payload.config.i18n.supportedLanguages || {}).reduce((acc, [language, languageConfig]) => {
|
|
48
50
|
if (Object.keys(payload.config.i18n.supportedLanguages).includes(language)) {
|
|
49
51
|
acc.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["
|
|
1
|
+
{"version":3,"file":"index.js","names":["notFound","isEntityHidden","qs","initReq","getRouteInfo","handleAuthRedirect","isCustomAdminView","isPublicAdminRoute","initPage","config","configPromise","importMap","route","searchParams","useLayoutReq","queryString","stringify","addQueryPrefix","cookies","locale","permissions","req","payload","key","overrides","fallbackLocale","query","parse","depth","ignoreQueryPrefix","urlSuffix","collections","globals","routes","admin","adminRoute","languageOptions","Object","entries","i18n","supportedLanguages","reduce","acc","language","languageConfig","keys","includes","push","label","translations","general","thisLanguage","value","visibleEntities","map","slug","hidden","user","filter","Boolean","redirectTo","canAccessAdmin","collectionConfig","collectionSlug","docID","globalConfig","globalSlug","defaultIDType","db"],"sources":["../../../src/utilities/initPage/index.ts"],"sourcesContent":["import type { InitPageResult, VisibleEntities } from 'payload'\n\nimport { notFound } from 'next/navigation.js'\nimport { isEntityHidden } from 'payload'\nimport * as qs from 'qs-esm'\n\nimport type { Args } from './types.js'\n\nimport { initReq } from '../initReq.js'\nimport { getRouteInfo } from './handleAdminPage.js'\nimport { handleAuthRedirect } from './handleAuthRedirect.js'\nimport { isCustomAdminView } from './isCustomAdminView.js'\nimport { isPublicAdminRoute } from './shared.js'\n\nexport const initPage = async ({\n config: configPromise,\n importMap,\n route,\n searchParams,\n useLayoutReq,\n}: Args): Promise<InitPageResult> => {\n const queryString = `${qs.stringify(searchParams ?? {}, { addQueryPrefix: true })}`\n\n const {\n cookies,\n locale,\n permissions,\n req,\n req: { payload },\n } = await initReq({\n configPromise,\n importMap,\n key: useLayoutReq ? 'RootLayout' : 'initPage',\n overrides: {\n fallbackLocale: false,\n req: {\n query: qs.parse(queryString, {\n depth: 10,\n ignoreQueryPrefix: true,\n }),\n },\n urlSuffix: `${route}${searchParams ? queryString : ''}`,\n },\n })\n\n const {\n collections,\n globals,\n routes: { admin: adminRoute },\n } = payload.config\n\n const languageOptions = Object.entries(payload.config.i18n.supportedLanguages || {}).reduce(\n (acc, [language, languageConfig]) => {\n if (Object.keys(payload.config.i18n.supportedLanguages).includes(language)) {\n acc.push({\n label: languageConfig.translations.general.thisLanguage,\n value: language,\n })\n }\n\n return acc\n },\n [],\n )\n\n const visibleEntities: VisibleEntities = {\n collections: collections\n .map(({ slug, admin: { hidden } }) =>\n !isEntityHidden({ hidden, user: req.user }) ? slug : null,\n )\n .filter(Boolean),\n globals: globals\n .map(({ slug, admin: { hidden } }) =>\n !isEntityHidden({ hidden, user: req.user }) ? slug : null,\n )\n .filter(Boolean),\n }\n\n let redirectTo = null\n\n if (\n !permissions.canAccessAdmin &&\n !isPublicAdminRoute({ adminRoute, config: payload.config, route }) &&\n !isCustomAdminView({ adminRoute, config: payload.config, route })\n ) {\n redirectTo = handleAuthRedirect({\n config: payload.config,\n route,\n searchParams,\n user: req.user,\n })\n }\n\n const { collectionConfig, collectionSlug, docID, globalConfig, globalSlug } = getRouteInfo({\n adminRoute,\n config: payload.config,\n defaultIDType: payload.db.defaultIDType,\n payload,\n route,\n })\n\n if ((collectionSlug && !collectionConfig) || (globalSlug && !globalConfig)) {\n return notFound()\n }\n\n return {\n collectionConfig,\n cookies,\n docID,\n globalConfig,\n languageOptions,\n locale,\n permissions,\n redirectTo,\n req,\n translations: req.i18n.translations,\n visibleEntities,\n }\n}\n"],"mappings":"AAEA,SAASA,QAAQ,QAAQ;AACzB,SAASC,cAAc,QAAQ;AAC/B,YAAYC,EAAA,MAAQ;AAIpB,SAASC,OAAO,QAAQ;AACxB,SAASC,YAAY,QAAQ;AAC7B,SAASC,kBAAkB,QAAQ;AACnC,SAASC,iBAAiB,QAAQ;AAClC,SAASC,kBAAkB,QAAQ;AAEnC,OAAO,MAAMC,QAAA,GAAW,MAAAA,CAAO;EAC7BC,MAAA,EAAQC,aAAa;EACrBC,SAAS;EACTC,KAAK;EACLC,YAAY;EACZC;AAAY,CACP;EACL,MAAMC,WAAA,GAAc,GAAGb,EAAA,CAAGc,SAAS,CAACH,YAAA,IAAgB,CAAC,GAAG;IAAEI,cAAA,EAAgB;EAAK,IAAI;EAEnF,MAAM;IACJC,OAAO;IACPC,MAAM;IACNC,WAAW;IACXC,GAAG;IACHA,GAAA,EAAK;MAAEC;IAAO;EAAE,CACjB,GAAG,MAAMnB,OAAA,CAAQ;IAChBO,aAAA;IACAC,SAAA;IACAY,GAAA,EAAKT,YAAA,GAAe,eAAe;IACnCU,SAAA,EAAW;MACTC,cAAA,EAAgB;MAChBJ,GAAA,EAAK;QACHK,KAAA,EAAOxB,EAAA,CAAGyB,KAAK,CAACZ,WAAA,EAAa;UAC3Ba,KAAA,EAAO;UACPC,iBAAA,EAAmB;QACrB;MACF;MACAC,SAAA,EAAW,GAAGlB,KAAA,GAAQC,YAAA,GAAeE,WAAA,GAAc;IACrD;EACF;EAEA,MAAM;IACJgB,WAAW;IACXC,OAAO;IACPC,MAAA,EAAQ;MAAEC,KAAA,EAAOC;IAAU;EAAE,CAC9B,GAAGb,OAAA,CAAQb,MAAM;EAElB,MAAM2B,eAAA,GAAkBC,MAAA,CAAOC,OAAO,CAAChB,OAAA,CAAQb,MAAM,CAAC8B,IAAI,CAACC,kBAAkB,IAAI,CAAC,GAAGC,MAAM,CACzF,CAACC,GAAA,EAAK,CAACC,QAAA,EAAUC,cAAA,CAAe;IAC9B,IAAIP,MAAA,CAAOQ,IAAI,CAACvB,OAAA,CAAQb,MAAM,CAAC8B,IAAI,CAACC,kBAAkB,EAAEM,QAAQ,CAACH,QAAA,GAAW;MAC1ED,GAAA,CAAIK,IAAI,CAAC;QACPC,KAAA,EAAOJ,cAAA,CAAeK,YAAY,CAACC,OAAO,CAACC,YAAY;QACvDC,KAAA,EAAOT;MACT;IACF;IAEA,OAAOD,GAAA;EACT,GACA,EAAE;EAGJ,MAAMW,eAAA,GAAmC;IACvCtB,WAAA,EAAaA,WAAA,CACVuB,GAAG,CAAC,CAAC;MAAEC,IAAI;MAAErB,KAAA,EAAO;QAAEsB;MAAM;IAAE,CAAE,KAC/B,CAACvD,cAAA,CAAe;MAAEuD,MAAA;MAAQC,IAAA,EAAMpC,GAAA,CAAIoC;IAAK,KAAKF,IAAA,GAAO,MAEtDG,MAAM,CAACC,OAAA;IACV3B,OAAA,EAASA,OAAA,CACNsB,GAAG,CAAC,CAAC;MAAEC,IAAI;MAAErB,KAAA,EAAO;QAAEsB;MAAM;IAAE,CAAE,KAC/B,CAACvD,cAAA,CAAe;MAAEuD,MAAA;MAAQC,IAAA,EAAMpC,GAAA,CAAIoC;IAAK,KAAKF,IAAA,GAAO,MAEtDG,MAAM,CAACC,OAAA;EACZ;EAEA,IAAIC,UAAA,GAAa;EAEjB,IACE,CAACxC,WAAA,CAAYyC,cAAc,IAC3B,CAACtD,kBAAA,CAAmB;IAAE4B,UAAA;IAAY1B,MAAA,EAAQa,OAAA,CAAQb,MAAM;IAAEG;EAAM,MAChE,CAACN,iBAAA,CAAkB;IAAE6B,UAAA;IAAY1B,MAAA,EAAQa,OAAA,CAAQb,MAAM;IAAEG;EAAM,IAC/D;IACAgD,UAAA,GAAavD,kBAAA,CAAmB;MAC9BI,MAAA,EAAQa,OAAA,CAAQb,MAAM;MACtBG,KAAA;MACAC,YAAA;MACA4C,IAAA,EAAMpC,GAAA,CAAIoC;IACZ;EACF;EAEA,MAAM;IAAEK,gBAAgB;IAAEC,cAAc;IAAEC,KAAK;IAAEC,YAAY;IAAEC;EAAU,CAAE,GAAG9D,YAAA,CAAa;IACzF+B,UAAA;IACA1B,MAAA,EAAQa,OAAA,CAAQb,MAAM;IACtB0D,aAAA,EAAe7C,OAAA,CAAQ8C,EAAE,CAACD,aAAa;IACvC7C,OAAA;IACAV;EACF;EAEA,IAAImD,cAAC,IAAkB,CAACD,gBAAA,IAAsBI,UAAA,IAAc,CAACD,YAAA,EAAe;IAC1E,OAAOjE,QAAA;EACT;EAEA,OAAO;IACL8D,gBAAA;IACA5C,OAAA;IACA8C,KAAA;IACAC,YAAA;IACA7B,eAAA;IACAjB,MAAA;IACAC,WAAA;IACAwC,UAAA;IACAvC,GAAA;IACA4B,YAAA,EAAc5B,GAAA,CAAIkB,IAAI,CAACU,YAAY;IACnCI;EACF;AACF","ignoreList":[]}
|
|
@@ -21,5 +21,16 @@ export type Args = {
|
|
|
21
21
|
searchParams: {
|
|
22
22
|
[key: string]: string | string[] | undefined;
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* If `useLayoutReq` is `true`, this page will use the cached `req` created by the root layout
|
|
26
|
+
* instead of creating a new one.
|
|
27
|
+
*
|
|
28
|
+
* This improves performance for pages that are able to share the same `req` as the root layout,
|
|
29
|
+
* as permissions do not need to be re-calculated.
|
|
30
|
+
*
|
|
31
|
+
* If the page has unique query and url params that need to be part of the `req` object, or if you
|
|
32
|
+
* need permissions calculation to respect those you should not use this property.
|
|
33
|
+
*/
|
|
34
|
+
useLayoutReq?: boolean;
|
|
24
35
|
};
|
|
25
36
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utilities/initPage/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzD,MAAM,MAAM,IAAI,GAAG;IACjB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,SAAS,EAAE,SAAS,CAAA;IACpB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9C;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/utilities/initPage/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAEzD,MAAM,MAAM,IAAI,GAAG;IACjB;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IAClD,SAAS,EAAE,SAAS,CAAA;IACpB;;;OAGG;IACH,2BAA2B,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;IAC9C;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAA;IAC9D;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/utilities/initPage/types.ts"],"sourcesContent":["import type { ImportMap, SanitizedConfig } from 'payload'\n\nexport type Args = {\n /**\n * Your sanitized Payload config.\n * If unresolved, this function will await the promise.\n */\n config: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n /**\n * If true, redirects unauthenticated users to the admin login page.\n * If a string is provided, the user will be redirected to that specific URL.\n */\n redirectUnauthenticatedUser?: boolean | string\n /**\n * The current route, i.e. `/admin/collections/posts`.\n */\n route: string\n /**\n * The search parameters of the current route provided to all pages in Next.js.\n */\n searchParams: { [key: string]: string | string[] | undefined }\n}\n"],"mappings":"AAEA","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/utilities/initPage/types.ts"],"sourcesContent":["import type { ImportMap, SanitizedConfig } from 'payload'\n\nexport type Args = {\n /**\n * Your sanitized Payload config.\n * If unresolved, this function will await the promise.\n */\n config: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n /**\n * If true, redirects unauthenticated users to the admin login page.\n * If a string is provided, the user will be redirected to that specific URL.\n */\n redirectUnauthenticatedUser?: boolean | string\n /**\n * The current route, i.e. `/admin/collections/posts`.\n */\n route: string\n /**\n * The search parameters of the current route provided to all pages in Next.js.\n */\n searchParams: { [key: string]: string | string[] | undefined }\n /**\n * If `useLayoutReq` is `true`, this page will use the cached `req` created by the root layout\n * instead of creating a new one.\n *\n * This improves performance for pages that are able to share the same `req` as the root layout,\n * as permissions do not need to be re-calculated.\n *\n * If the page has unique query and url params that need to be part of the `req` object, or if you\n * need permissions calculation to respect those you should not use this property.\n */\n useLayoutReq?: boolean\n}\n"],"mappings":"AAEA","ignoreList":[]}
|
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AcceptedLanguages } from '@payloadcms/translations';
|
|
2
|
+
import type { ImportMap, Locale, PayloadRequest, SanitizedConfig, SanitizedPermissions } from 'payload';
|
|
3
|
+
import { headers as getHeaders } from 'next/headers.js';
|
|
2
4
|
import { createLocalReq } from 'payload';
|
|
3
5
|
type Result = {
|
|
6
|
+
cookies: Map<string, string>;
|
|
7
|
+
headers: Awaited<ReturnType<typeof getHeaders>>;
|
|
8
|
+
languageCode: AcceptedLanguages;
|
|
4
9
|
locale?: Locale;
|
|
5
10
|
permissions: SanitizedPermissions;
|
|
6
11
|
req: PayloadRequest;
|
|
7
12
|
};
|
|
8
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Initializes a full request object, including the `req` object and access control.
|
|
15
|
+
* As access control and getting the request locale is dependent on the current URL and
|
|
16
|
+
*/
|
|
17
|
+
export declare const initReq: ({ configPromise, importMap, key, overrides, }: {
|
|
18
|
+
configPromise: Promise<SanitizedConfig> | SanitizedConfig;
|
|
19
|
+
importMap: ImportMap;
|
|
20
|
+
key: string;
|
|
21
|
+
overrides?: Parameters<typeof createLocalReq>[0];
|
|
22
|
+
}) => Promise<Result>;
|
|
9
23
|
export {};
|
|
10
24
|
//# sourceMappingURL=initReq.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initReq.d.ts","sourceRoot":"","sources":["../../src/utilities/initReq.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"initReq.d.ts","sourceRoot":"","sources":["../../src/utilities/initReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAA;AACnF,OAAO,KAAK,EACV,SAAS,EACT,MAAM,EAEN,cAAc,EACd,eAAe,EACf,oBAAoB,EAErB,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EACL,cAAc,EAMf,MAAM,SAAS,CAAA;AAKhB,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAA;IAC/C,YAAY,EAAE,iBAAiB,CAAA;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,oBAAoB,CAAA;IACjC,GAAG,EAAE,cAAc,CAAA;CACpB,CAAA;AAcD;;;GAGG;AACH,eAAO,MAAM,OAAO,kDAKjB;IACD,aAAa,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAA;IACzD,SAAS,EAAE,SAAS,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;CACjD,KAAG,OAAO,CAAC,MAAM,CAuEjB,CAAA"}
|
|
@@ -1,63 +1,92 @@
|
|
|
1
1
|
import { initI18n } from '@payloadcms/translations';
|
|
2
2
|
import { headers as getHeaders } from 'next/headers.js';
|
|
3
3
|
import { createLocalReq, executeAuthStrategies, getAccessResults, getPayload, getRequestLanguage, parseCookies } from 'payload';
|
|
4
|
-
import { cache } from 'react';
|
|
5
4
|
import { getRequestLocale } from './getRequestLocale.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
import { selectiveCache } from './selectiveCache.js';
|
|
6
|
+
// Create cache instances for different parts of our application
|
|
7
|
+
const partialReqCache = selectiveCache('partialReq');
|
|
8
|
+
const reqCache = selectiveCache('req');
|
|
9
|
+
/**
|
|
10
|
+
* Initializes a full request object, including the `req` object and access control.
|
|
11
|
+
* As access control and getting the request locale is dependent on the current URL and
|
|
12
|
+
*/
|
|
13
|
+
export const initReq = async function ({
|
|
14
|
+
configPromise,
|
|
15
|
+
importMap,
|
|
16
|
+
key,
|
|
17
|
+
overrides
|
|
18
|
+
}) {
|
|
11
19
|
const headers = await getHeaders();
|
|
12
20
|
const cookies = parseCookies(headers);
|
|
13
|
-
const
|
|
14
|
-
config
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
});
|
|
34
|
-
const {
|
|
35
|
-
req: reqOverrides,
|
|
36
|
-
...optionsOverrides
|
|
37
|
-
} = overrides || {};
|
|
38
|
-
const req = await createLocalReq({
|
|
39
|
-
req: {
|
|
21
|
+
const partialResult = await partialReqCache.get(async () => {
|
|
22
|
+
const config = await configPromise;
|
|
23
|
+
const payload = await getPayload({
|
|
24
|
+
config,
|
|
25
|
+
importMap
|
|
26
|
+
});
|
|
27
|
+
const languageCode = getRequestLanguage({
|
|
28
|
+
config,
|
|
29
|
+
cookies,
|
|
30
|
+
headers
|
|
31
|
+
});
|
|
32
|
+
const i18n = await initI18n({
|
|
33
|
+
config: config.i18n,
|
|
34
|
+
context: 'client',
|
|
35
|
+
language: languageCode
|
|
36
|
+
});
|
|
37
|
+
const {
|
|
38
|
+
responseHeaders,
|
|
39
|
+
user
|
|
40
|
+
} = await executeAuthStrategies({
|
|
40
41
|
headers,
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
payload
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
i18n,
|
|
46
|
+
languageCode,
|
|
47
|
+
payload,
|
|
48
|
+
responseHeaders,
|
|
49
|
+
user
|
|
50
|
+
};
|
|
51
|
+
}, 'global');
|
|
52
|
+
return reqCache.get(async () => {
|
|
53
|
+
const {
|
|
54
|
+
i18n,
|
|
55
|
+
languageCode,
|
|
56
|
+
payload,
|
|
43
57
|
responseHeaders,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
58
|
+
user
|
|
59
|
+
} = partialResult;
|
|
60
|
+
const {
|
|
61
|
+
req: reqOverrides,
|
|
62
|
+
...optionsOverrides
|
|
63
|
+
} = overrides || {};
|
|
64
|
+
const req = await createLocalReq({
|
|
65
|
+
req: {
|
|
66
|
+
headers,
|
|
67
|
+
host: headers.get('host'),
|
|
68
|
+
i18n: i18n,
|
|
69
|
+
responseHeaders,
|
|
70
|
+
user,
|
|
71
|
+
...(reqOverrides || {})
|
|
72
|
+
},
|
|
73
|
+
...(optionsOverrides || {})
|
|
74
|
+
}, payload);
|
|
75
|
+
const locale = await getRequestLocale({
|
|
76
|
+
req
|
|
77
|
+
});
|
|
78
|
+
req.locale = locale?.code;
|
|
79
|
+
const permissions = await getAccessResults({
|
|
80
|
+
req
|
|
81
|
+
});
|
|
82
|
+
return {
|
|
83
|
+
cookies,
|
|
84
|
+
headers,
|
|
85
|
+
languageCode,
|
|
86
|
+
locale,
|
|
87
|
+
permissions,
|
|
88
|
+
req
|
|
89
|
+
};
|
|
90
|
+
}, key);
|
|
91
|
+
};
|
|
63
92
|
//# sourceMappingURL=initReq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","
|
|
1
|
+
{"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","getRequestLocale","selectiveCache","partialReqCache","reqCache","initReq","configPromise","importMap","key","overrides","cookies","partialResult","get","config","payload","languageCode","i18n","context","language","responseHeaders","user","req","reqOverrides","optionsOverrides","host","locale","code","permissions"],"sources":["../../src/utilities/initReq.ts"],"sourcesContent":["import type { AcceptedLanguages, I18n, I18nClient } from '@payloadcms/translations'\nimport type {\n ImportMap,\n Locale,\n Payload,\n PayloadRequest,\n SanitizedConfig,\n SanitizedPermissions,\n User,\n} from 'payload'\n\nimport { initI18n } from '@payloadcms/translations'\nimport { headers as getHeaders } from 'next/headers.js'\nimport {\n createLocalReq,\n executeAuthStrategies,\n getAccessResults,\n getPayload,\n getRequestLanguage,\n parseCookies,\n} from 'payload'\n\nimport { getRequestLocale } from './getRequestLocale.js'\nimport { selectiveCache } from './selectiveCache.js'\n\ntype Result = {\n cookies: Map<string, string>\n headers: Awaited<ReturnType<typeof getHeaders>>\n languageCode: AcceptedLanguages\n locale?: Locale\n permissions: SanitizedPermissions\n req: PayloadRequest\n}\n\ntype PartialResult = {\n i18n: I18nClient\n languageCode: AcceptedLanguages\n payload: Payload\n responseHeaders: Headers\n user: null | User\n}\n\n// Create cache instances for different parts of our application\nconst partialReqCache = selectiveCache<PartialResult>('partialReq')\nconst reqCache = selectiveCache<Result>('req')\n\n/**\n * Initializes a full request object, including the `req` object and access control.\n * As access control and getting the request locale is dependent on the current URL and\n */\nexport const initReq = async function ({\n configPromise,\n importMap,\n key,\n overrides,\n}: {\n configPromise: Promise<SanitizedConfig> | SanitizedConfig\n importMap: ImportMap\n key: string\n overrides?: Parameters<typeof createLocalReq>[0]\n}): Promise<Result> {\n const headers = await getHeaders()\n const cookies = parseCookies(headers)\n\n const partialResult = await partialReqCache.get(async () => {\n const config = await configPromise\n const payload = await getPayload({ config, importMap })\n const languageCode = getRequestLanguage({\n config,\n cookies,\n headers,\n })\n const i18n: I18nClient = await initI18n({\n config: config.i18n,\n context: 'client',\n language: languageCode,\n })\n\n const { responseHeaders, user } = await executeAuthStrategies({\n headers,\n payload,\n })\n\n return {\n i18n,\n languageCode,\n payload,\n responseHeaders,\n user,\n }\n }, 'global')\n\n return reqCache.get(async () => {\n const { i18n, languageCode, payload, responseHeaders, user } = partialResult\n\n const { req: reqOverrides, ...optionsOverrides } = overrides || {}\n\n const req = await createLocalReq(\n {\n req: {\n headers,\n host: headers.get('host'),\n i18n: i18n as I18n,\n responseHeaders,\n user,\n ...(reqOverrides || {}),\n },\n ...(optionsOverrides || {}),\n },\n payload,\n )\n\n const locale = await getRequestLocale({\n req,\n })\n\n req.locale = locale?.code\n\n const permissions = await getAccessResults({\n req,\n })\n\n return {\n cookies,\n headers,\n languageCode,\n locale,\n permissions,\n req,\n }\n }, key)\n}\n"],"mappings":"AAWA,SAASA,QAAQ,QAAQ;AACzB,SAASC,OAAA,IAAWC,UAAU,QAAQ;AACtC,SACEC,cAAc,EACdC,qBAAqB,EACrBC,gBAAgB,EAChBC,UAAU,EACVC,kBAAkB,EAClBC,YAAY,QACP;AAEP,SAASC,gBAAgB,QAAQ;AACjC,SAASC,cAAc,QAAQ;AAmB/B;AACA,MAAMC,eAAA,GAAkBD,cAAA,CAA8B;AACtD,MAAME,QAAA,GAAWF,cAAA,CAAuB;AAExC;;;;AAIA,OAAO,MAAMG,OAAA,GAAU,eAAAA,CAAgB;EACrCC,aAAa;EACbC,SAAS;EACTC,GAAG;EACHC;AAAS,CAMV;EACC,MAAMhB,OAAA,GAAU,MAAMC,UAAA;EACtB,MAAMgB,OAAA,GAAUV,YAAA,CAAaP,OAAA;EAE7B,MAAMkB,aAAA,GAAgB,MAAMR,eAAA,CAAgBS,GAAG,CAAC;IAC9C,MAAMC,MAAA,GAAS,MAAMP,aAAA;IACrB,MAAMQ,OAAA,GAAU,MAAMhB,UAAA,CAAW;MAAEe,MAAA;MAAQN;IAAU;IACrD,MAAMQ,YAAA,GAAehB,kBAAA,CAAmB;MACtCc,MAAA;MACAH,OAAA;MACAjB;IACF;IACA,MAAMuB,IAAA,GAAmB,MAAMxB,QAAA,CAAS;MACtCqB,MAAA,EAAQA,MAAA,CAAOG,IAAI;MACnBC,OAAA,EAAS;MACTC,QAAA,EAAUH;IACZ;IAEA,MAAM;MAAEI,eAAe;MAAEC;IAAI,CAAE,GAAG,MAAMxB,qBAAA,CAAsB;MAC5DH,OAAA;MACAqB;IACF;IAEA,OAAO;MACLE,IAAA;MACAD,YAAA;MACAD,OAAA;MACAK,eAAA;MACAC;IACF;EACF,GAAG;EAEH,OAAOhB,QAAA,CAASQ,GAAG,CAAC;IAClB,MAAM;MAAEI,IAAI;MAAED,YAAY;MAAED,OAAO;MAAEK,eAAe;MAAEC;IAAI,CAAE,GAAGT,aAAA;IAE/D,MAAM;MAAEU,GAAA,EAAKC,YAAY;MAAE,GAAGC;IAAA,CAAkB,GAAGd,SAAA,IAAa,CAAC;IAEjE,MAAMY,GAAA,GAAM,MAAM1B,cAAA,CAChB;MACE0B,GAAA,EAAK;QACH5B,OAAA;QACA+B,IAAA,EAAM/B,OAAA,CAAQmB,GAAG,CAAC;QAClBI,IAAA,EAAMA,IAAA;QACNG,eAAA;QACAC,IAAA;QACA,IAAIE,YAAA,IAAgB,CAAC,CAAC;MACxB;MACA,IAAIC,gBAAA,IAAoB,CAAC,CAAC;IAC5B,GACAT,OAAA;IAGF,MAAMW,MAAA,GAAS,MAAMxB,gBAAA,CAAiB;MACpCoB;IACF;IAEAA,GAAA,CAAII,MAAM,GAAGA,MAAA,EAAQC,IAAA;IAErB,MAAMC,WAAA,GAAc,MAAM9B,gBAAA,CAAiB;MACzCwB;IACF;IAEA,OAAO;MACLX,OAAA;MACAjB,OAAA;MACAsB,YAAA;MACAU,MAAA;MACAE,WAAA;MACAN;IACF;EACF,GAAGb,GAAA;AACL","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type CachedValue = object;
|
|
2
|
+
/**
|
|
3
|
+
* Creates a selective cache function that provides more control over React's request-level caching behavior.
|
|
4
|
+
*
|
|
5
|
+
* @param namespace - A namespace to group related cached values
|
|
6
|
+
* @returns A function that manages cached values within the specified namespace
|
|
7
|
+
*/
|
|
8
|
+
export declare function selectiveCache<TValue extends object = CachedValue>(namespace: string): {
|
|
9
|
+
get: (factory: () => Promise<TValue>, ...cacheArgs: any[]) => Promise<TValue>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=selectiveCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectiveCache.d.ts","sourceRoot":"","sources":["../../src/utilities/selectiveCache.ts"],"names":[],"mappings":"AAEA,KAAK,WAAW,GAAG,MAAM,CAAA;AAazB;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,SAAS,MAAM,GAAG,WAAW,EAAE,SAAS,EAAE,MAAM;mBAejD,MAAM,OAAO,CAAC,MAAM,CAAC,0BAAiB,OAAO,CAAC,MAAM,CAAC;EAoBxF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { cache } from 'react';
|
|
2
|
+
// Module-scoped cache container that holds all cached, stable containers
|
|
3
|
+
// - these may hold the stable value, or a promise to the stable value
|
|
4
|
+
const globalCacheContainer = {};
|
|
5
|
+
/**
|
|
6
|
+
* Creates a selective cache function that provides more control over React's request-level caching behavior.
|
|
7
|
+
*
|
|
8
|
+
* @param namespace - A namespace to group related cached values
|
|
9
|
+
* @returns A function that manages cached values within the specified namespace
|
|
10
|
+
*/
|
|
11
|
+
export function selectiveCache(namespace) {
|
|
12
|
+
// Create a stable namespace container if it doesn't exist
|
|
13
|
+
if (!globalCacheContainer[namespace]) {
|
|
14
|
+
globalCacheContainer[namespace] = cache((...args) => ({
|
|
15
|
+
value: null
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Gets or creates a cached value for a specific key within the namespace
|
|
20
|
+
*
|
|
21
|
+
* @param key - The key to identify the cached value
|
|
22
|
+
* @param factory - A function that produces the value if not cached
|
|
23
|
+
* @returns The cached or newly created value
|
|
24
|
+
*/
|
|
25
|
+
const getCached = async (factory, ...cacheArgs) => {
|
|
26
|
+
const stableObjectFn = globalCacheContainer[namespace];
|
|
27
|
+
const stableObject = stableObjectFn(...cacheArgs);
|
|
28
|
+
if (stableObject?.value && 'then' in stableObject.value && typeof stableObject.value?.then === 'function') {
|
|
29
|
+
return await stableObject.value;
|
|
30
|
+
}
|
|
31
|
+
stableObject.value = factory();
|
|
32
|
+
return await stableObject.value;
|
|
33
|
+
};
|
|
34
|
+
return {
|
|
35
|
+
get: getCached
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=selectiveCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectiveCache.js","names":["cache","globalCacheContainer","selectiveCache","namespace","args","value","getCached","factory","cacheArgs","stableObjectFn","stableObject","then","get"],"sources":["../../src/utilities/selectiveCache.ts"],"sourcesContent":["import { cache } from 'react'\n\ntype CachedValue = object\n\n// Module-scoped cache container that holds all cached, stable containers\n// - these may hold the stable value, or a promise to the stable value\nconst globalCacheContainer: Record<\n string,\n <TValue extends object = CachedValue>(\n ...args: unknown[]\n ) => {\n value: null | Promise<TValue> | TValue\n }\n> = {}\n\n/**\n * Creates a selective cache function that provides more control over React's request-level caching behavior.\n *\n * @param namespace - A namespace to group related cached values\n * @returns A function that manages cached values within the specified namespace\n */\nexport function selectiveCache<TValue extends object = CachedValue>(namespace: string) {\n // Create a stable namespace container if it doesn't exist\n if (!globalCacheContainer[namespace]) {\n globalCacheContainer[namespace] = cache((...args) => ({\n value: null,\n }))\n }\n\n /**\n * Gets or creates a cached value for a specific key within the namespace\n *\n * @param key - The key to identify the cached value\n * @param factory - A function that produces the value if not cached\n * @returns The cached or newly created value\n */\n const getCached = async (factory: () => Promise<TValue>, ...cacheArgs): Promise<TValue> => {\n const stableObjectFn = globalCacheContainer[namespace]\n const stableObject = stableObjectFn<TValue>(...cacheArgs)\n\n if (\n stableObject?.value &&\n 'then' in stableObject.value &&\n typeof stableObject.value?.then === 'function'\n ) {\n return await stableObject.value\n }\n\n stableObject.value = factory()\n\n return await stableObject.value\n }\n\n return {\n get: getCached,\n }\n}\n"],"mappings":"AAAA,SAASA,KAAK,QAAQ;AAItB;AACA;AACA,MAAMC,oBAAA,GAOF,CAAC;AAEL;;;;;;AAMA,OAAO,SAASC,eAAoDC,SAAiB;EACnF;EACA,IAAI,CAACF,oBAAoB,CAACE,SAAA,CAAU,EAAE;IACpCF,oBAAoB,CAACE,SAAA,CAAU,GAAGH,KAAA,CAAM,CAAC,GAAGI,IAAA,MAAU;MACpDC,KAAA,EAAO;IACT;EACF;EAEA;;;;;;;EAOA,MAAMC,SAAA,GAAY,MAAAA,CAAOC,OAAA,EAAgC,GAAGC,SAAA;IAC1D,MAAMC,cAAA,GAAiBR,oBAAoB,CAACE,SAAA,CAAU;IACtD,MAAMO,YAAA,GAAeD,cAAA,IAA0BD,SAAA;IAE/C,IACEE,YAAA,EAAcL,KAAA,IACd,UAAUK,YAAA,CAAaL,KAAK,IAC5B,OAAOK,YAAA,CAAaL,KAAK,EAAEM,IAAA,KAAS,YACpC;MACA,OAAO,MAAMD,YAAA,CAAaL,KAAK;IACjC;IAEAK,YAAA,CAAaL,KAAK,GAAGE,OAAA;IAErB,OAAO,MAAMG,YAAA,CAAaL,KAAK;EACjC;EAEA,OAAO;IACLO,GAAA,EAAKN;EACP;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/List/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/List/index.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,oBAAoB,EAGzB,KAAK,SAAS,EAIf,MAAM,SAAS,CAAA;AAEhB,OAAO,KAAmB,MAAM,OAAO,CAAA;AAKvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,KAAK,kBAAkB,GAAG;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mBAAmB,EAAE,OAAO,CAAA;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAA;IAClC,KAAK,EAAE,SAAS,CAAA;CACjB,GAAG,oBAAoB,CAAA;AAExB,eAAO,MAAM,cAAc,SACnB,kBAAkB,KACvB,OAAO,CAAC;IACT,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;CACtB,CAsNA,CAAA;AAED,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAWjD,CAAA"}
|
package/dist/views/List/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerCompo
|
|
|
4
4
|
import { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc';
|
|
5
5
|
import { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared';
|
|
6
6
|
import { notFound } from 'next/navigation.js';
|
|
7
|
-
import { isNumber } from 'payload/shared';
|
|
7
|
+
import { isNumber, transformColumnsToPreferences } from 'payload/shared';
|
|
8
8
|
import React, { Fragment } from 'react';
|
|
9
9
|
import { renderListViewSlots } from './renderListViewSlots.js';
|
|
10
10
|
import { resolveAllFilterOptions } from './resolveAllFilterOptions.js';
|
|
@@ -47,10 +47,17 @@ export const renderListView = async args => {
|
|
|
47
47
|
throw new Error('not-found');
|
|
48
48
|
}
|
|
49
49
|
const query = queryFromArgs || queryFromReq;
|
|
50
|
+
const columns = transformColumnsToPreferences(query?.columns);
|
|
51
|
+
/**
|
|
52
|
+
* @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc.
|
|
53
|
+
* This will ensure that prefs are only updated when explicitly set by the user
|
|
54
|
+
* This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie
|
|
55
|
+
*/
|
|
50
56
|
const listPreferences = await upsertPreferences({
|
|
51
57
|
key: `${collectionSlug}-list`,
|
|
52
58
|
req,
|
|
53
59
|
value: {
|
|
60
|
+
columns,
|
|
54
61
|
limit: isNumber(query?.limit) ? Number(query.limit) : undefined,
|
|
55
62
|
sort: query?.sort
|
|
56
63
|
}
|
|
@@ -108,6 +115,7 @@ export const renderListView = async args => {
|
|
|
108
115
|
clientCollectionConfig,
|
|
109
116
|
collectionConfig,
|
|
110
117
|
columnPreferences: listPreferences?.columns,
|
|
118
|
+
columns,
|
|
111
119
|
customCellProps,
|
|
112
120
|
docs: data.docs,
|
|
113
121
|
drawerSlug,
|
|
@@ -160,9 +168,11 @@ export const renderListView = async args => {
|
|
|
160
168
|
children: [/*#__PURE__*/_jsx(HydrateAuthProvider, {
|
|
161
169
|
permissions: permissions
|
|
162
170
|
}), /*#__PURE__*/_jsx(ListQueryProvider, {
|
|
171
|
+
columns: transformColumnsToPreferences(columnState),
|
|
163
172
|
data: data,
|
|
164
173
|
defaultLimit: limit,
|
|
165
174
|
defaultSort: sort,
|
|
175
|
+
listPreferences: listPreferences,
|
|
166
176
|
modifySearchParams: !isInDrawer,
|
|
167
177
|
children: RenderServerComponent({
|
|
168
178
|
clientProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["DefaultListView","HydrateAuthProvider","ListQueryProvider","RenderServerComponent","renderFilters","renderTable","upsertPreferences","formatAdminURL","mergeListSearchAndWhere","notFound","isNumber","React","Fragment","renderListViewSlots","resolveAllFilterOptions","generateListMetadata","renderListView","args","clientConfig","customCellProps","disableBulkDelete","disableBulkEdit","drawerSlug","enableRowSelections","initPageResult","overrideEntityVisibility","params","query","queryFromArgs","searchParams","collectionConfig","slug","collectionSlug","locale","fullLocale","permissions","req","i18n","payload","config","queryFromReq","user","visibleEntities","collections","read","Error","listPreferences","key","value","limit","Number","undefined","sort","routes","admin","adminRoute","includes","page","pagination","defaultLimit","defaultSort","where","search","baseListFilter","and","filter","Boolean","data","find","collection","depth","draft","fallbackLocale","includeLockStatus","overrideAccess","clientCollectionConfig","c","columnState","Table","columnPreferences","columns","docs","useAsTitle","renderedFilters","fields","importMap","resolvedFilterOptions","staticDescription","description","t","newDocumentURL","path","hasCreatePermission","create","serverProps","listSearchableFields","listViewSlots","clientProps","isInDrawer","List","_jsxs","_jsx","modifySearchParams","Component","components","views","list","Fallback","ListView","RenderedList","error","message","console"],"sources":["../../../src/views/List/index.tsx"],"sourcesContent":["import type {\n AdminViewServerProps,\n ListPreferences,\n ListQuery,\n ListViewClientProps,\n ListViewServerPropsOnly,\n Where,\n} from 'payload'\n\nimport { DefaultListView, HydrateAuthProvider, ListQueryProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc'\nimport { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared'\nimport { notFound } from 'next/navigation.js'\nimport { isNumber } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nimport { renderListViewSlots } from './renderListViewSlots.js'\nimport { resolveAllFilterOptions } from './resolveAllFilterOptions.js'\n\nexport { generateListMetadata } from './meta.js'\n\ntype RenderListViewArgs = {\n customCellProps?: Record<string, any>\n disableBulkDelete?: boolean\n disableBulkEdit?: boolean\n drawerSlug?: string\n enableRowSelections: boolean\n overrideEntityVisibility?: boolean\n query: ListQuery\n} & AdminViewServerProps\n\nexport const renderListView = async (\n args: RenderListViewArgs,\n): Promise<{\n List: React.ReactNode\n}> => {\n const {\n clientConfig,\n customCellProps,\n disableBulkDelete,\n disableBulkEdit,\n drawerSlug,\n enableRowSelections,\n initPageResult,\n overrideEntityVisibility,\n params,\n query: queryFromArgs,\n searchParams,\n } = args\n\n const {\n collectionConfig,\n collectionConfig: { slug: collectionSlug },\n locale: fullLocale,\n permissions,\n req,\n req: {\n i18n,\n locale,\n payload,\n payload: { config },\n query: queryFromReq,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n if (!permissions?.collections?.[collectionSlug]?.read) {\n throw new Error('not-found')\n }\n\n const query = queryFromArgs || queryFromReq\n\n const listPreferences = await upsertPreferences<ListPreferences>({\n key: `${collectionSlug}-list`,\n req,\n value: {\n limit: isNumber(query?.limit) ? Number(query.limit) : undefined,\n sort: query?.sort as string,\n },\n })\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n if (collectionConfig) {\n if (!visibleEntities.collections.includes(collectionSlug) && !overrideEntityVisibility) {\n throw new Error('not-found')\n }\n\n const page = isNumber(query?.page) ? Number(query.page) : 0\n\n const limit = listPreferences?.limit || collectionConfig.admin.pagination.defaultLimit\n\n const sort =\n listPreferences?.sort ||\n (typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined)\n\n let where = mergeListSearchAndWhere({\n collectionConfig,\n search: typeof query?.search === 'string' ? query.search : undefined,\n where: (query?.where as Where) || undefined,\n })\n\n if (typeof collectionConfig.admin?.baseListFilter === 'function') {\n const baseListFilter = await collectionConfig.admin.baseListFilter({\n limit,\n page,\n req,\n sort,\n })\n\n if (baseListFilter) {\n where = {\n and: [where, baseListFilter].filter(Boolean),\n }\n }\n }\n\n const data = await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit,\n locale,\n overrideAccess: false,\n page,\n req,\n sort,\n user,\n where: where || {},\n })\n\n const clientCollectionConfig = clientConfig.collections.find((c) => c.slug === collectionSlug)\n\n const { columnState, Table } = renderTable({\n clientCollectionConfig,\n collectionConfig,\n columnPreferences: listPreferences?.columns,\n customCellProps,\n docs: data.docs,\n drawerSlug,\n enableRowSelections,\n i18n: req.i18n,\n payload,\n useAsTitle: collectionConfig.admin.useAsTitle,\n })\n\n const renderedFilters = renderFilters(collectionConfig.fields, req.payload.importMap)\n\n const resolvedFilterOptions = await resolveAllFilterOptions({\n fields: collectionConfig.fields,\n req,\n })\n\n const staticDescription =\n typeof collectionConfig.admin.description === 'function'\n ? collectionConfig.admin.description({ t: i18n.t })\n : collectionConfig.admin.description\n\n const newDocumentURL = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/create`,\n })\n\n const hasCreatePermission = permissions?.collections?.[collectionSlug]?.create\n\n const serverProps: ListViewServerPropsOnly = {\n collectionConfig,\n data,\n i18n,\n limit,\n listPreferences,\n listSearchableFields: collectionConfig.admin.listSearchableFields,\n locale: fullLocale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const listViewSlots = renderListViewSlots({\n clientProps: {\n collectionSlug,\n hasCreatePermission,\n newDocumentURL,\n },\n collectionConfig,\n description: staticDescription,\n payload,\n serverProps,\n })\n\n const isInDrawer = Boolean(drawerSlug)\n\n return {\n List: (\n <Fragment>\n <HydrateAuthProvider permissions={permissions} />\n <ListQueryProvider\n data={data}\n defaultLimit={limit}\n defaultSort={sort}\n modifySearchParams={!isInDrawer}\n >\n {RenderServerComponent({\n clientProps: {\n ...listViewSlots,\n collectionSlug,\n columnState,\n disableBulkDelete,\n disableBulkEdit,\n enableRowSelections,\n hasCreatePermission,\n listPreferences,\n newDocumentURL,\n renderedFilters,\n resolvedFilterOptions,\n Table,\n } satisfies ListViewClientProps,\n Component: collectionConfig?.admin?.components?.views?.list?.Component,\n Fallback: DefaultListView,\n importMap: payload.importMap,\n serverProps,\n })}\n </ListQueryProvider>\n </Fragment>\n ),\n }\n }\n\n throw new Error('not-found')\n}\n\nexport const ListView: React.FC<RenderListViewArgs> = async (args) => {\n try {\n const { List: RenderedList } = await renderListView({ ...args, enableRowSelections: true })\n return RenderedList\n } catch (error) {\n if (error.message === 'not-found') {\n notFound()\n } else {\n console.error(error) // eslint-disable-line no-console\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["DefaultListView","HydrateAuthProvider","ListQueryProvider","RenderServerComponent","renderFilters","renderTable","upsertPreferences","formatAdminURL","mergeListSearchAndWhere","notFound","isNumber","transformColumnsToPreferences","React","Fragment","renderListViewSlots","resolveAllFilterOptions","generateListMetadata","renderListView","args","clientConfig","customCellProps","disableBulkDelete","disableBulkEdit","drawerSlug","enableRowSelections","initPageResult","overrideEntityVisibility","params","query","queryFromArgs","searchParams","collectionConfig","slug","collectionSlug","locale","fullLocale","permissions","req","i18n","payload","config","queryFromReq","user","visibleEntities","collections","read","Error","columns","listPreferences","key","value","limit","Number","undefined","sort","routes","admin","adminRoute","includes","page","pagination","defaultLimit","defaultSort","where","search","baseListFilter","and","filter","Boolean","data","find","collection","depth","draft","fallbackLocale","includeLockStatus","overrideAccess","clientCollectionConfig","c","columnState","Table","columnPreferences","docs","useAsTitle","renderedFilters","fields","importMap","resolvedFilterOptions","staticDescription","description","t","newDocumentURL","path","hasCreatePermission","create","serverProps","listSearchableFields","listViewSlots","clientProps","isInDrawer","List","_jsxs","_jsx","modifySearchParams","Component","components","views","list","Fallback","ListView","RenderedList","error","message","console"],"sources":["../../../src/views/List/index.tsx"],"sourcesContent":["import { DefaultListView, HydrateAuthProvider, ListQueryProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { renderFilters, renderTable, upsertPreferences } from '@payloadcms/ui/rsc'\nimport { formatAdminURL, mergeListSearchAndWhere } from '@payloadcms/ui/shared'\nimport { notFound } from 'next/navigation.js'\nimport {\n type AdminViewServerProps,\n type ColumnPreference,\n type ListPreferences,\n type ListQuery,\n type ListViewClientProps,\n type ListViewServerPropsOnly,\n type Where,\n} from 'payload'\nimport { isNumber, transformColumnsToPreferences } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nimport { renderListViewSlots } from './renderListViewSlots.js'\nimport { resolveAllFilterOptions } from './resolveAllFilterOptions.js'\n\nexport { generateListMetadata } from './meta.js'\n\ntype RenderListViewArgs = {\n customCellProps?: Record<string, any>\n disableBulkDelete?: boolean\n disableBulkEdit?: boolean\n drawerSlug?: string\n enableRowSelections: boolean\n overrideEntityVisibility?: boolean\n query: ListQuery\n} & AdminViewServerProps\n\nexport const renderListView = async (\n args: RenderListViewArgs,\n): Promise<{\n List: React.ReactNode\n}> => {\n const {\n clientConfig,\n customCellProps,\n disableBulkDelete,\n disableBulkEdit,\n drawerSlug,\n enableRowSelections,\n initPageResult,\n overrideEntityVisibility,\n params,\n query: queryFromArgs,\n searchParams,\n } = args\n\n const {\n collectionConfig,\n collectionConfig: { slug: collectionSlug },\n locale: fullLocale,\n permissions,\n req,\n req: {\n i18n,\n locale,\n payload,\n payload: { config },\n query: queryFromReq,\n user,\n },\n visibleEntities,\n } = initPageResult\n\n if (!permissions?.collections?.[collectionSlug]?.read) {\n throw new Error('not-found')\n }\n\n const query = queryFromArgs || queryFromReq\n\n const columns: ColumnPreference[] = transformColumnsToPreferences(\n query?.columns as ColumnPreference[] | string,\n )\n\n /**\n * @todo: find a pattern to avoid setting preferences on hard navigation, i.e. direct links, page refresh, etc.\n * This will ensure that prefs are only updated when explicitly set by the user\n * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie\n */\n const listPreferences = await upsertPreferences<ListPreferences>({\n key: `${collectionSlug}-list`,\n req,\n value: {\n columns,\n limit: isNumber(query?.limit) ? Number(query.limit) : undefined,\n sort: query?.sort as string,\n },\n })\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n if (collectionConfig) {\n if (!visibleEntities.collections.includes(collectionSlug) && !overrideEntityVisibility) {\n throw new Error('not-found')\n }\n\n const page = isNumber(query?.page) ? Number(query.page) : 0\n\n const limit = listPreferences?.limit || collectionConfig.admin.pagination.defaultLimit\n\n const sort =\n listPreferences?.sort ||\n (typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined)\n\n let where = mergeListSearchAndWhere({\n collectionConfig,\n search: typeof query?.search === 'string' ? query.search : undefined,\n where: (query?.where as Where) || undefined,\n })\n\n if (typeof collectionConfig.admin?.baseListFilter === 'function') {\n const baseListFilter = await collectionConfig.admin.baseListFilter({\n limit,\n page,\n req,\n sort,\n })\n\n if (baseListFilter) {\n where = {\n and: [where, baseListFilter].filter(Boolean),\n }\n }\n }\n\n const data = await payload.find({\n collection: collectionSlug,\n depth: 0,\n draft: true,\n fallbackLocale: false,\n includeLockStatus: true,\n limit,\n locale,\n overrideAccess: false,\n page,\n req,\n sort,\n user,\n where: where || {},\n })\n\n const clientCollectionConfig = clientConfig.collections.find((c) => c.slug === collectionSlug)\n\n const { columnState, Table } = renderTable({\n clientCollectionConfig,\n collectionConfig,\n columnPreferences: listPreferences?.columns,\n columns,\n customCellProps,\n docs: data.docs,\n drawerSlug,\n enableRowSelections,\n i18n: req.i18n,\n payload,\n useAsTitle: collectionConfig.admin.useAsTitle,\n })\n\n const renderedFilters = renderFilters(collectionConfig.fields, req.payload.importMap)\n\n const resolvedFilterOptions = await resolveAllFilterOptions({\n fields: collectionConfig.fields,\n req,\n })\n\n const staticDescription =\n typeof collectionConfig.admin.description === 'function'\n ? collectionConfig.admin.description({ t: i18n.t })\n : collectionConfig.admin.description\n\n const newDocumentURL = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}/create`,\n })\n\n const hasCreatePermission = permissions?.collections?.[collectionSlug]?.create\n\n const serverProps: ListViewServerPropsOnly = {\n collectionConfig,\n data,\n i18n,\n limit,\n listPreferences,\n listSearchableFields: collectionConfig.admin.listSearchableFields,\n locale: fullLocale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n }\n\n const listViewSlots = renderListViewSlots({\n clientProps: {\n collectionSlug,\n hasCreatePermission,\n newDocumentURL,\n },\n collectionConfig,\n description: staticDescription,\n payload,\n serverProps,\n })\n\n const isInDrawer = Boolean(drawerSlug)\n\n return {\n List: (\n <Fragment>\n <HydrateAuthProvider permissions={permissions} />\n <ListQueryProvider\n columns={transformColumnsToPreferences(columnState)}\n data={data}\n defaultLimit={limit}\n defaultSort={sort}\n listPreferences={listPreferences}\n modifySearchParams={!isInDrawer}\n >\n {RenderServerComponent({\n clientProps: {\n ...listViewSlots,\n collectionSlug,\n columnState,\n disableBulkDelete,\n disableBulkEdit,\n enableRowSelections,\n hasCreatePermission,\n listPreferences,\n newDocumentURL,\n renderedFilters,\n resolvedFilterOptions,\n Table,\n } satisfies ListViewClientProps,\n Component: collectionConfig?.admin?.components?.views?.list?.Component,\n Fallback: DefaultListView,\n importMap: payload.importMap,\n serverProps,\n })}\n </ListQueryProvider>\n </Fragment>\n ),\n }\n }\n\n throw new Error('not-found')\n}\n\nexport const ListView: React.FC<RenderListViewArgs> = async (args) => {\n try {\n const { List: RenderedList } = await renderListView({ ...args, enableRowSelections: true })\n return RenderedList\n } catch (error) {\n if (error.message === 'not-found') {\n notFound()\n } else {\n console.error(error) // eslint-disable-line no-console\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|