@payloadcms/next 3.90.1 → 3.91.0-internal.07e4582
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/cjs/withPayload.cjs +3 -4
- package/dist/cjs/withPayload.cjs.map +3 -3
- package/dist/prod/styles.css +1 -1
- package/dist/utilities/handleAuthRedirect.d.ts.map +1 -1
- package/dist/utilities/handleAuthRedirect.js +4 -1
- package/dist/utilities/handleAuthRedirect.js.map +1 -1
- package/dist/utilities/handleAuthRedirect.spec.js +52 -0
- package/dist/utilities/handleAuthRedirect.spec.js.map +1 -0
- package/dist/views/Root/index.d.ts.map +1 -1
- package/dist/views/Root/index.js +26 -19
- package/dist/views/Root/index.js.map +1 -1
- package/dist/views/Root/isPathMatchingRoute.d.ts.map +1 -1
- package/dist/views/Root/isPathMatchingRoute.js +7 -5
- package/dist/views/Root/isPathMatchingRoute.js.map +1 -1
- package/dist/views/Root/isPathMatchingRoute.spec.js +7 -0
- package/dist/views/Root/isPathMatchingRoute.spec.js.map +1 -1
- package/dist/views/Version/Restore/index.d.ts.map +1 -1
- package/dist/views/Version/Restore/index.js +9 -6
- package/dist/views/Version/Restore/index.js.map +1 -1
- package/dist/withPayload/withPayload.js +3 -4
- package/dist/withPayload/withPayload.js.map +1 -1
- package/dist/withPayload/withPayload.spec.js +20 -0
- package/dist/withPayload/withPayload.spec.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleAuthRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/handleAuthRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAKxC,KAAK,IAAI,GAAG;IACV,MAAM,MAAA;IACN,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;IAClD,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,kBAAkB,0CAA2C,IAAI,KAAG,
|
|
1
|
+
{"version":3,"file":"handleAuthRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/handleAuthRedirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAKxC,KAAK,IAAI,GAAG;IACV,MAAM,MAAA;IACN,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;IAClD,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB,CAAA;AAED,eAAO,MAAM,kBAAkB,0CAA2C,IAAI,KAAG,MAuChF,CAAA"}
|
|
@@ -20,7 +20,10 @@ export const handleAuthRedirect = ({
|
|
|
20
20
|
if (searchParams && 'redirect' in searchParams) {
|
|
21
21
|
delete searchParams.redirect;
|
|
22
22
|
}
|
|
23
|
-
const redirectRoute = (route !== adminRoute ?
|
|
23
|
+
const redirectRoute = (route !== adminRoute ? formatAdminURL({
|
|
24
|
+
adminRoute: '/',
|
|
25
|
+
path: route
|
|
26
|
+
}) : '') + (Object.keys(searchParams ?? {}).length > 0 ? `${qs.stringify(searchParams, {
|
|
24
27
|
addQueryPrefix: true
|
|
25
28
|
})}` : '');
|
|
26
29
|
const redirectTo = formatAdminURL({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handleAuthRedirect.js","names":["formatAdminURL","qs","handleAuthRedirect","config","route","searchParams","user","admin","routes","login","loginRouteFromConfig","unauthorized","unauthorizedRoute","adminRoute","redirect","redirectRoute","Object","keys","length","stringify","addQueryPrefix","redirectTo","
|
|
1
|
+
{"version":3,"file":"handleAuthRedirect.js","names":["formatAdminURL","qs","handleAuthRedirect","config","route","searchParams","user","admin","routes","login","loginRouteFromConfig","unauthorized","unauthorizedRoute","adminRoute","redirect","redirectRoute","path","Object","keys","length","stringify","addQueryPrefix","redirectTo","parsedLoginRouteSearchParams","parse","split","searchParamsWithRedirect"],"sources":["../../src/utilities/handleAuthRedirect.ts"],"sourcesContent":["import type { TypedUser } from 'payload'\n\nimport { formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\n\ntype Args = {\n config\n route: string\n searchParams: { [key: string]: string | string[] }\n user?: TypedUser\n}\n\nexport const handleAuthRedirect = ({ config, route, searchParams, user }: Args): string => {\n const {\n admin: {\n routes: { login: loginRouteFromConfig, unauthorized: unauthorizedRoute },\n },\n routes: { admin: adminRoute },\n } = config\n\n if (searchParams && 'redirect' in searchParams) {\n delete searchParams.redirect\n }\n\n const redirectRoute =\n (route !== adminRoute\n ? formatAdminURL({\n adminRoute: '/',\n path: route as `/${string}`,\n })\n : '') +\n (Object.keys(searchParams ?? {}).length > 0\n ? `${qs.stringify(searchParams, { addQueryPrefix: true })}`\n : '')\n\n const redirectTo = formatAdminURL({\n adminRoute,\n path: user ? unauthorizedRoute : loginRouteFromConfig,\n })\n\n const parsedLoginRouteSearchParams = qs.parse(redirectTo.split('?')[1] ?? '')\n\n const searchParamsWithRedirect = `${qs.stringify(\n {\n ...parsedLoginRouteSearchParams,\n ...(redirectRoute ? { redirect: redirectRoute } : {}),\n },\n { addQueryPrefix: true },\n )}`\n\n return `${redirectTo.split('?', 1)[0]}${searchParamsWithRedirect}`\n}\n"],"mappings":"AAEA,SAASA,cAAc,QAAQ;AAC/B,YAAYC,EAAA,MAAQ;AASpB,OAAO,MAAMC,kBAAA,GAAqBA,CAAC;EAAEC,MAAM;EAAEC,KAAK;EAAEC,YAAY;EAAEC;AAAI,CAAQ;EAC5E,MAAM;IACJC,KAAA,EAAO;MACLC,MAAA,EAAQ;QAAEC,KAAA,EAAOC,oBAAoB;QAAEC,YAAA,EAAcC;MAAiB;IAAE,CACzE;IACDJ,MAAA,EAAQ;MAAED,KAAA,EAAOM;IAAU;EAAE,CAC9B,GAAGV,MAAA;EAEJ,IAAIE,YAAA,IAAgB,cAAcA,YAAA,EAAc;IAC9C,OAAOA,YAAA,CAAaS,QAAQ;EAC9B;EAEA,MAAMC,aAAA,GACJ,CAACX,KAAA,KAAUS,UAAA,GACPb,cAAA,CAAe;IACba,UAAA,EAAY;IACZG,IAAA,EAAMZ;EACR,KACA,EAAC,KACJa,MAAA,CAAOC,IAAI,CAACb,YAAA,IAAgB,CAAC,GAAGc,MAAM,GAAG,IACtC,GAAGlB,EAAA,CAAGmB,SAAS,CAACf,YAAA,EAAc;IAAEgB,cAAA,EAAgB;EAAK,IAAI,GACzD,EAAC;EAEP,MAAMC,UAAA,GAAatB,cAAA,CAAe;IAChCa,UAAA;IACAG,IAAA,EAAMV,IAAA,GAAOM,iBAAA,GAAoBF;EACnC;EAEA,MAAMa,4BAAA,GAA+BtB,EAAA,CAAGuB,KAAK,CAACF,UAAA,CAAWG,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI;EAE1E,MAAMC,wBAAA,GAA2B,GAAGzB,EAAA,CAAGmB,SAAS,CAC9C;IACE,GAAGG,4BAA4B;IAC/B,IAAIR,aAAA,GAAgB;MAAED,QAAA,EAAUC;IAAc,IAAI,CAAC,CAAC;EACtD,GACA;IAAEM,cAAA,EAAgB;EAAK,IACtB;EAEH,OAAO,GAAGC,UAAA,CAAWG,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,GAAGC,wBAAA,EAA0B;AACpE","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
2
|
+
import { handleAuthRedirect } from './handleAuthRedirect.js';
|
|
3
|
+
describe('handleAuthRedirect', () => {
|
|
4
|
+
const config = {
|
|
5
|
+
admin: {
|
|
6
|
+
routes: {
|
|
7
|
+
login: '/login',
|
|
8
|
+
unauthorized: '/unauthorized'
|
|
9
|
+
}
|
|
10
|
+
},
|
|
11
|
+
routes: {
|
|
12
|
+
admin: '/admin'
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const originalTrailingSlash = process.env.NEXT_TRAILING_SLASH;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
process.env.NEXT_TRAILING_SLASH = 'true';
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
if (originalTrailingSlash === undefined) {
|
|
21
|
+
delete process.env.NEXT_TRAILING_SLASH;
|
|
22
|
+
} else {
|
|
23
|
+
process.env.NEXT_TRAILING_SLASH = originalTrailingSlash;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
it('should use a canonical trailing-slash path in the redirect query', () => {
|
|
27
|
+
const result = handleAuthRedirect({
|
|
28
|
+
config,
|
|
29
|
+
route: '/admin/collections/posts',
|
|
30
|
+
searchParams: {}
|
|
31
|
+
});
|
|
32
|
+
expect(result).toBe('/admin/login/?redirect=%2Fadmin%2Fcollections%2Fposts%2F');
|
|
33
|
+
});
|
|
34
|
+
it('should not add a redirect query for the admin dashboard', () => {
|
|
35
|
+
const result = handleAuthRedirect({
|
|
36
|
+
config,
|
|
37
|
+
route: '/admin',
|
|
38
|
+
searchParams: {}
|
|
39
|
+
});
|
|
40
|
+
expect(result).toBe('/admin/login/');
|
|
41
|
+
});
|
|
42
|
+
it('should preserve non-trailing-slash URLs when trailing slashes are disabled', () => {
|
|
43
|
+
process.env.NEXT_TRAILING_SLASH = 'false';
|
|
44
|
+
const result = handleAuthRedirect({
|
|
45
|
+
config,
|
|
46
|
+
route: '/admin/collections/posts',
|
|
47
|
+
searchParams: {}
|
|
48
|
+
});
|
|
49
|
+
expect(result).toBe('/admin/login?redirect=%2Fadmin%2Fcollections%2Fposts');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=handleAuthRedirect.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handleAuthRedirect.spec.js","names":["afterEach","beforeEach","describe","expect","it","handleAuthRedirect","config","admin","routes","login","unauthorized","originalTrailingSlash","process","env","NEXT_TRAILING_SLASH","undefined","result","route","searchParams","toBe"],"sources":["../../src/utilities/handleAuthRedirect.spec.ts"],"sourcesContent":["import { afterEach, beforeEach, describe, expect, it } from 'vitest'\n\nimport { handleAuthRedirect } from './handleAuthRedirect.js'\n\ndescribe('handleAuthRedirect', () => {\n const config = {\n admin: {\n routes: {\n login: '/login',\n unauthorized: '/unauthorized',\n },\n },\n routes: {\n admin: '/admin',\n },\n }\n\n const originalTrailingSlash = process.env.NEXT_TRAILING_SLASH\n\n beforeEach(() => {\n process.env.NEXT_TRAILING_SLASH = 'true'\n })\n\n afterEach(() => {\n if (originalTrailingSlash === undefined) {\n delete process.env.NEXT_TRAILING_SLASH\n } else {\n process.env.NEXT_TRAILING_SLASH = originalTrailingSlash\n }\n })\n\n it('should use a canonical trailing-slash path in the redirect query', () => {\n const result = handleAuthRedirect({\n config,\n route: '/admin/collections/posts',\n searchParams: {},\n })\n\n expect(result).toBe('/admin/login/?redirect=%2Fadmin%2Fcollections%2Fposts%2F')\n })\n\n it('should not add a redirect query for the admin dashboard', () => {\n const result = handleAuthRedirect({\n config,\n route: '/admin',\n searchParams: {},\n })\n\n expect(result).toBe('/admin/login/')\n })\n\n it('should preserve non-trailing-slash URLs when trailing slashes are disabled', () => {\n process.env.NEXT_TRAILING_SLASH = 'false'\n\n const result = handleAuthRedirect({\n config,\n route: '/admin/collections/posts',\n searchParams: {},\n })\n\n expect(result).toBe('/admin/login?redirect=%2Fadmin%2Fcollections%2Fposts')\n })\n})\n"],"mappings":"AAAA,SAASA,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ;AAE5D,SAASC,kBAAkB,QAAQ;AAEnCH,QAAA,CAAS,sBAAsB;EAC7B,MAAMI,MAAA,GAAS;IACbC,KAAA,EAAO;MACLC,MAAA,EAAQ;QACNC,KAAA,EAAO;QACPC,YAAA,EAAc;MAChB;IACF;IACAF,MAAA,EAAQ;MACND,KAAA,EAAO;IACT;EACF;EAEA,MAAMI,qBAAA,GAAwBC,OAAA,CAAQC,GAAG,CAACC,mBAAmB;EAE7Db,UAAA,CAAW;IACTW,OAAA,CAAQC,GAAG,CAACC,mBAAmB,GAAG;EACpC;EAEAd,SAAA,CAAU;IACR,IAAIW,qBAAA,KAA0BI,SAAA,EAAW;MACvC,OAAOH,OAAA,CAAQC,GAAG,CAACC,mBAAmB;IACxC,OAAO;MACLF,OAAA,CAAQC,GAAG,CAACC,mBAAmB,GAAGH,qBAAA;IACpC;EACF;EAEAP,EAAA,CAAG,oEAAoE;IACrE,MAAMY,MAAA,GAASX,kBAAA,CAAmB;MAChCC,MAAA;MACAW,KAAA,EAAO;MACPC,YAAA,EAAc,CAAC;IACjB;IAEAf,MAAA,CAAOa,MAAA,EAAQG,IAAI,CAAC;EACtB;EAEAf,EAAA,CAAG,2DAA2D;IAC5D,MAAMY,MAAA,GAASX,kBAAA,CAAmB;MAChCC,MAAA;MACAW,KAAA,EAAO;MACPC,YAAA,EAAc,CAAC;IACjB;IAEAf,MAAA,CAAOa,MAAA,EAAQG,IAAI,CAAC;EACtB;EAEAf,EAAA,CAAG,8EAA8E;IAC/EQ,OAAA,CAAQC,GAAG,CAACC,mBAAmB,GAAG;IAElC,MAAME,MAAA,GAASX,kBAAA,CAAmB;MAChCC,MAAA;MACAW,KAAA,EAAO;MACPC,YAAA,EAAc,CAAC;IACjB;IAEAf,MAAA,CAAOa,MAAA,EAAQG,IAAI,CAAC;EACtB;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Root/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,KAAK,EAIV,SAAS,EAET,eAAe,EAEhB,MAAM,SAAS,CAAA;AAShB,OAAO,KAAK,MAAM,OAAO,CAAA;AAYzB,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAC9C,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEvB,eAAO,MAAM,QAAQ,oGAKlB;IACD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAC,CAAA;IACF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;QAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KACjC,CAAC,CAAA;CACH,+
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Root/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,KAAK,EAIV,SAAS,EAET,eAAe,EAEhB,MAAM,SAAS,CAAA;AAShB,OAAO,KAAK,MAAM,OAAO,CAAA;AAYzB,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAA;CAC9C,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEvB,eAAO,MAAM,QAAQ,oGAKlB;IACD,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,CAAA;IACzC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAA;IAC7B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACvB,QAAQ,EAAE,MAAM,EAAE,CAAA;KACnB,CAAC,CAAA;IACF,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;QAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA;KACjC,CAAC,CAAA;CACH,+BAkUA,CAAA"}
|
package/dist/views/Root/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerCompo
|
|
|
4
4
|
import { getVisibleEntities } from '@payloadcms/ui/shared';
|
|
5
5
|
import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig';
|
|
6
6
|
import { notFound, redirect } from 'next/navigation.js';
|
|
7
|
-
import { applyLocaleFiltering, formatAdminURL } from 'payload/shared';
|
|
7
|
+
import { applyLocaleFiltering, formatAdminURL, stripTrailingSlash } from 'payload/shared';
|
|
8
8
|
import * as qs from 'qs-esm';
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import { DefaultTemplate } from '../../templates/Default/index.js';
|
|
@@ -34,11 +34,17 @@ export const RootPage = async ({
|
|
|
34
34
|
admin: adminRoute
|
|
35
35
|
}
|
|
36
36
|
} = config;
|
|
37
|
+
const adminRouteURL = formatAdminURL({
|
|
38
|
+
adminRoute
|
|
39
|
+
});
|
|
37
40
|
const params = await paramsPromise;
|
|
38
|
-
|
|
41
|
+
// route with possible trailing slash
|
|
42
|
+
const currentRouteURL = formatAdminURL({
|
|
39
43
|
adminRoute,
|
|
40
44
|
path: Array.isArray(params.segments) ? `/${params.segments.join('/')}` : null
|
|
41
45
|
});
|
|
46
|
+
// route without possible trailing slash
|
|
47
|
+
const currentRouteToCompare = stripTrailingSlash(currentRouteURL);
|
|
42
48
|
const segments = Array.isArray(params.segments) ? params.segments : [];
|
|
43
49
|
const isCollectionRoute = segments[0] === 'collections';
|
|
44
50
|
const isGlobalRoute = segments[0] === 'globals';
|
|
@@ -56,7 +62,7 @@ export const RootPage = async ({
|
|
|
56
62
|
});
|
|
57
63
|
// Only redirect if there's NO custom view configured for /collections
|
|
58
64
|
if (!viewKey) {
|
|
59
|
-
redirect(
|
|
65
|
+
redirect(adminRouteURL);
|
|
60
66
|
}
|
|
61
67
|
}
|
|
62
68
|
if (segments[1]) {
|
|
@@ -76,7 +82,7 @@ export const RootPage = async ({
|
|
|
76
82
|
});
|
|
77
83
|
// Only redirect if there's NO custom view configured for /globals
|
|
78
84
|
if (!viewKey) {
|
|
79
|
-
redirect(
|
|
85
|
+
redirect(adminRouteURL);
|
|
80
86
|
}
|
|
81
87
|
}
|
|
82
88
|
if (segments[1]) {
|
|
@@ -113,21 +119,21 @@ export const RootPage = async ({
|
|
|
113
119
|
})
|
|
114
120
|
},
|
|
115
121
|
// intentionally omit `serverURL` to keep URL relative
|
|
116
|
-
urlSuffix: `${
|
|
122
|
+
urlSuffix: `${currentRouteURL}${searchParams ? queryString : ''}`
|
|
117
123
|
}
|
|
118
124
|
});
|
|
119
125
|
if (!permissions.canAccessAdmin && !isPublicAdminRoute({
|
|
120
126
|
adminRoute,
|
|
121
127
|
config: payload.config,
|
|
122
|
-
route:
|
|
128
|
+
route: currentRouteToCompare
|
|
123
129
|
}) && !isCustomAdminView({
|
|
124
130
|
adminRoute,
|
|
125
131
|
config: payload.config,
|
|
126
|
-
route:
|
|
132
|
+
route: currentRouteToCompare
|
|
127
133
|
})) {
|
|
128
134
|
redirect(handleAuthRedirect({
|
|
129
135
|
config: payload.config,
|
|
130
|
-
route:
|
|
136
|
+
route: currentRouteToCompare,
|
|
131
137
|
searchParams,
|
|
132
138
|
user: userWithReadAccess
|
|
133
139
|
}));
|
|
@@ -155,7 +161,7 @@ export const RootPage = async ({
|
|
|
155
161
|
adminRoute,
|
|
156
162
|
collectionConfig,
|
|
157
163
|
collectionPreferences,
|
|
158
|
-
currentRoute,
|
|
164
|
+
currentRoute: currentRouteToCompare,
|
|
159
165
|
globalConfig,
|
|
160
166
|
payload,
|
|
161
167
|
searchParams,
|
|
@@ -175,28 +181,29 @@ export const RootPage = async ({
|
|
|
175
181
|
notFound();
|
|
176
182
|
}
|
|
177
183
|
if (dbHasUser) {
|
|
178
|
-
redirect(
|
|
184
|
+
redirect(adminRouteURL);
|
|
179
185
|
}
|
|
180
186
|
}
|
|
181
187
|
const usersCollection = config.collections.find(({
|
|
182
188
|
slug
|
|
183
189
|
}) => slug === userSlug);
|
|
184
190
|
const disableLocalStrategy = usersCollection?.auth?.disableLocalStrategy;
|
|
185
|
-
const
|
|
191
|
+
const rawCreateFirstUserRoute = formatAdminURL({
|
|
186
192
|
adminRoute,
|
|
187
193
|
path: _createFirstUserRoute
|
|
188
194
|
});
|
|
189
|
-
|
|
190
|
-
|
|
195
|
+
const createFirstUserRoute = stripTrailingSlash(rawCreateFirstUserRoute);
|
|
196
|
+
if (disableLocalStrategy && currentRouteToCompare === createFirstUserRoute) {
|
|
197
|
+
redirect(adminRouteURL);
|
|
191
198
|
}
|
|
192
|
-
if (!dbHasUser &&
|
|
193
|
-
redirect(
|
|
199
|
+
if (!dbHasUser && currentRouteToCompare !== createFirstUserRoute && !disableLocalStrategy) {
|
|
200
|
+
redirect(rawCreateFirstUserRoute);
|
|
194
201
|
}
|
|
195
|
-
if (dbHasUser &&
|
|
196
|
-
redirect(
|
|
202
|
+
if (dbHasUser && currentRouteToCompare === createFirstUserRoute) {
|
|
203
|
+
redirect(adminRouteURL);
|
|
197
204
|
}
|
|
198
205
|
if (!DefaultView?.Component && !DefaultView?.payloadComponent && !dbHasUser) {
|
|
199
|
-
redirect(
|
|
206
|
+
redirect(adminRouteURL);
|
|
200
207
|
}
|
|
201
208
|
const clientConfig = getClientConfig({
|
|
202
209
|
config,
|
|
@@ -211,7 +218,7 @@ export const RootPage = async ({
|
|
|
211
218
|
});
|
|
212
219
|
// Ensure locale on req is still valid after filtering locales
|
|
213
220
|
if (clientConfig.localization && req.locale && !clientConfig.localization.localeCodes.includes(req.locale)) {
|
|
214
|
-
redirect(`${
|
|
221
|
+
redirect(`${currentRouteURL}${qs.stringify({
|
|
215
222
|
...searchParams,
|
|
216
223
|
locale: clientConfig.localization.localeCodes.includes(clientConfig.localization.defaultLocale) ? clientConfig.localization.defaultLocale : clientConfig.localization.localeCodes[0]
|
|
217
224
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["PageConfigProvider","RenderServerComponent","getVisibleEntities","getClientConfig","notFound","redirect","applyLocaleFiltering","formatAdminURL","qs","React","DefaultTemplate","MinimalTemplate","getPreferences","handleAuthRedirect","initReq","isCustomAdminView","isPublicAdminRoute","getCustomViewByRoute","getRouteData","RootPage","config","configPromise","importMap","params","paramsPromise","searchParams","searchParamsPromise","admin","routes","createFirstUser","_createFirstUserRoute","user","userSlug","adminRoute","currentRoute","path","Array","isArray","segments","join","isCollectionRoute","isGlobalRoute","collectionConfig","undefined","globalConfig","length","viewKey","collections","find","slug","globals","queryString","stringify","addQueryPrefix","cookies","locale","permissions","req","payload","userWithReadAccess","key","overrides","fallbackLocale","query","parse","depth","ignoreQueryPrefix","urlSuffix","canAccessAdmin","route","collectionPreferences","folders","id","then","res","value","browseByFolderSlugs","DefaultView","documentSubViewType","routeParams","templateClassName","templateType","viewActions","viewType","dbHasUser","db","findOne","collection","doc","Component","payloadComponent","usersCollection","disableLocalStrategy","auth","createFirstUserRoute","clientConfig","i18n","localization","localeCodes","includes","defaultLocale","visibleEntities","folderID","RenderedView","clientProps","collectionSlug","docID","globalSlug","Fallback","serverProps","initPageResult","languageOptions","Object","entries","supportedLanguages","reduce","acc","language","languageConfig","keys","push","label","translations","general","thisLanguage","_jsxs","_jsx","Fragment","className"],"sources":["../../../src/views/Root/index.tsx"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { Metadata } from 'next'\nimport type {\n AdminViewClientProps,\n AdminViewServerPropsOnly,\n CollectionPreferences,\n ImportMap,\n SanitizedCollectionConfig,\n SanitizedConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport { PageConfigProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { getVisibleEntities } from '@payloadcms/ui/shared'\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { notFound, redirect } from 'next/navigation.js'\nimport { applyLocaleFiltering, formatAdminURL } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React from 'react'\n\nimport { DefaultTemplate } from '../../templates/Default/index.js'\nimport { MinimalTemplate } from '../../templates/Minimal/index.js'\nimport { getPreferences } from '../../utilities/getPreferences.js'\nimport { handleAuthRedirect } from '../../utilities/handleAuthRedirect.js'\nimport { initReq } from '../../utilities/initReq.js'\nimport { isCustomAdminView } from '../../utilities/isCustomAdminView.js'\nimport { isPublicAdminRoute } from '../../utilities/isPublicAdminRoute.js'\nimport { getCustomViewByRoute } from './getCustomViewByRoute.js'\nimport { getRouteData } from './getRouteData.js'\n\nexport type GenerateViewMetadata = (args: {\n config: SanitizedConfig\n i18n: I18nClient\n isEditing?: boolean\n params?: { [key: string]: string | string[] }\n}) => Promise<Metadata>\n\nexport const RootPage = async ({\n config: configPromise,\n importMap,\n params: paramsPromise,\n searchParams: searchParamsPromise,\n}: {\n readonly config: Promise<SanitizedConfig>\n readonly importMap: ImportMap\n readonly params: Promise<{\n segments: string[]\n }>\n readonly searchParams: Promise<{\n [key: string]: string | string[]\n }>\n}) => {\n const config = await configPromise\n\n const {\n admin: {\n routes: { createFirstUser: _createFirstUserRoute },\n user: userSlug,\n },\n routes: { admin: adminRoute },\n } = config\n\n const params = await paramsPromise\n\n const currentRoute = formatAdminURL({\n adminRoute,\n path: Array.isArray(params.segments) ? `/${params.segments.join('/')}` : null,\n })\n\n const segments = Array.isArray(params.segments) ? params.segments : []\n const isCollectionRoute = segments[0] === 'collections'\n const isGlobalRoute = segments[0] === 'globals'\n let collectionConfig: SanitizedCollectionConfig = undefined\n let globalConfig: SanitizedGlobalConfig = undefined\n\n const searchParams = await searchParamsPromise\n\n // Redirect `${adminRoute}/collections` to `${adminRoute}`\n if (isCollectionRoute) {\n if (segments.length === 1) {\n const { viewKey } = getCustomViewByRoute({\n config,\n currentRoute: '/collections',\n })\n\n // Only redirect if there's NO custom view configured for /collections\n if (!viewKey) {\n redirect(adminRoute)\n }\n }\n\n if (segments[1]) {\n collectionConfig = config.collections.find(({ slug }) => slug === segments[1])\n }\n }\n\n // Redirect `${adminRoute}/globals` to `${adminRoute}`\n if (isGlobalRoute) {\n if (segments.length === 1) {\n const { viewKey } = getCustomViewByRoute({\n config,\n currentRoute: '/globals',\n })\n\n // Only redirect if there's NO custom view configured for /globals\n if (!viewKey) {\n redirect(adminRoute)\n }\n }\n\n if (segments[1]) {\n globalConfig = config.globals.find(({ slug }) => slug === segments[1])\n }\n }\n\n if ((isCollectionRoute && !collectionConfig) || (isGlobalRoute && !globalConfig)) {\n return notFound()\n }\n\n const queryString = `${qs.stringify(searchParams ?? {}, { addQueryPrefix: true })}`\n\n const {\n cookies,\n locale,\n permissions,\n req,\n req: { payload },\n user: userWithReadAccess,\n } = await initReq({\n configPromise: config,\n importMap,\n key: 'initPage',\n overrides: {\n fallbackLocale: false,\n req: {\n query: qs.parse(queryString, {\n depth: 10,\n ignoreQueryPrefix: true,\n }),\n },\n // intentionally omit `serverURL` to keep URL relative\n urlSuffix: `${currentRoute}${searchParams ? queryString : ''}`,\n },\n })\n\n if (\n !permissions.canAccessAdmin &&\n !isPublicAdminRoute({ adminRoute, config: payload.config, route: currentRoute }) &&\n !isCustomAdminView({ adminRoute, config: payload.config, route: currentRoute })\n ) {\n redirect(\n handleAuthRedirect({\n config: payload.config,\n route: currentRoute,\n searchParams,\n user: userWithReadAccess,\n }),\n )\n }\n\n let collectionPreferences: CollectionPreferences = undefined\n\n if (collectionConfig && segments.length === 2) {\n if (config.folders && collectionConfig.folders && segments[1] !== config.folders.slug) {\n await getPreferences<CollectionPreferences>(\n `collection-${collectionConfig.slug}`,\n req.payload,\n req.user.id,\n config.admin.user,\n ).then((res) => {\n if (res && res.value) {\n collectionPreferences = res.value\n }\n })\n }\n }\n\n const {\n browseByFolderSlugs,\n DefaultView,\n documentSubViewType,\n routeParams,\n templateClassName,\n templateType,\n viewActions,\n viewType,\n } = getRouteData({\n adminRoute,\n collectionConfig,\n collectionPreferences,\n currentRoute,\n globalConfig,\n payload,\n searchParams,\n segments,\n })\n\n req.routeParams = routeParams\n\n const dbHasUser =\n req.user ||\n (await req.payload.db\n .findOne({\n collection: userSlug,\n req,\n })\n ?.then((doc) => !!doc))\n\n /**\n * This function is responsible for handling the case where the view is not found.\n * The current route did not match any default views or custom route views.\n */\n if (!DefaultView?.Component && !DefaultView?.payloadComponent) {\n if (req?.user) {\n notFound()\n }\n\n if (dbHasUser) {\n redirect(adminRoute)\n }\n }\n\n const usersCollection = config.collections.find(({ slug }) => slug === userSlug)\n const disableLocalStrategy = usersCollection?.auth?.disableLocalStrategy\n\n const createFirstUserRoute = formatAdminURL({\n adminRoute,\n path: _createFirstUserRoute,\n })\n\n if (disableLocalStrategy && currentRoute === createFirstUserRoute) {\n redirect(adminRoute)\n }\n\n if (!dbHasUser && currentRoute !== createFirstUserRoute && !disableLocalStrategy) {\n redirect(createFirstUserRoute)\n }\n\n if (dbHasUser && currentRoute === createFirstUserRoute) {\n redirect(adminRoute)\n }\n\n if (!DefaultView?.Component && !DefaultView?.payloadComponent && !dbHasUser) {\n redirect(adminRoute)\n }\n\n const clientConfig = getClientConfig({\n config,\n i18n: req.i18n,\n importMap,\n user: viewType === 'createFirstUser' ? true : userWithReadAccess,\n })\n\n await applyLocaleFiltering({ clientConfig, config, req })\n\n // Ensure locale on req is still valid after filtering locales\n if (\n clientConfig.localization &&\n req.locale &&\n !clientConfig.localization.localeCodes.includes(req.locale)\n ) {\n redirect(\n `${currentRoute}${qs.stringify(\n {\n ...searchParams,\n locale: clientConfig.localization.localeCodes.includes(\n clientConfig.localization.defaultLocale,\n )\n ? clientConfig.localization.defaultLocale\n : clientConfig.localization.localeCodes[0],\n },\n { addQueryPrefix: true },\n )}`,\n )\n }\n\n const visibleEntities = getVisibleEntities({ req })\n\n const folderID = routeParams.folderID\n\n const RenderedView = RenderServerComponent({\n clientProps: {\n browseByFolderSlugs,\n clientConfig,\n collectionSlug: collectionConfig?.slug,\n docID: routeParams.id,\n documentSubViewType,\n folderID,\n globalSlug: globalConfig?.slug,\n viewType,\n } satisfies AdminViewClientProps,\n Component: DefaultView.payloadComponent,\n Fallback: DefaultView.Component,\n importMap,\n serverProps: {\n clientConfig,\n collectionConfig,\n docID: routeParams.id,\n folderID,\n globalConfig,\n i18n: req.i18n,\n importMap,\n initPageResult: {\n collectionConfig,\n cookies,\n docID: routeParams.id,\n globalConfig,\n languageOptions: Object.entries(req.payload.config.i18n.supportedLanguages || {}).reduce(\n (acc, [language, languageConfig]) => {\n if (Object.keys(req.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 locale,\n permissions,\n req,\n translations: req.i18n.translations,\n visibleEntities,\n },\n params,\n payload: req.payload,\n searchParams,\n user: userWithReadAccess,\n viewActions,\n } satisfies AdminViewServerPropsOnly,\n })\n\n return (\n <PageConfigProvider config={clientConfig}>\n {!templateType && <React.Fragment>{RenderedView}</React.Fragment>}\n {templateType === 'minimal' && (\n <MinimalTemplate className={templateClassName}>{RenderedView}</MinimalTemplate>\n )}\n {templateType === 'default' && (\n <DefaultTemplate\n collectionSlug={collectionConfig?.slug}\n docID={routeParams.id}\n documentSubViewType={documentSubViewType}\n globalSlug={globalConfig?.slug}\n i18n={req.i18n}\n locale={locale}\n params={params}\n payload={req.payload}\n permissions={permissions}\n req={req}\n searchParams={searchParams}\n user={userWithReadAccess}\n viewActions={viewActions}\n viewType={viewType}\n visibleEntities={{\n // The reason we are not passing in initPageResult.visibleEntities directly is due to a \"Cannot assign to read only property of object '#<Object>\" error introduced in React 19\n // which this caused as soon as initPageResult.visibleEntities is passed in\n collections: visibleEntities?.collections,\n globals: visibleEntities?.globals,\n }}\n >\n {RenderedView}\n </DefaultTemplate>\n )}\n </PageConfigProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["PageConfigProvider","RenderServerComponent","getVisibleEntities","getClientConfig","notFound","redirect","applyLocaleFiltering","formatAdminURL","stripTrailingSlash","qs","React","DefaultTemplate","MinimalTemplate","getPreferences","handleAuthRedirect","initReq","isCustomAdminView","isPublicAdminRoute","getCustomViewByRoute","getRouteData","RootPage","config","configPromise","importMap","params","paramsPromise","searchParams","searchParamsPromise","admin","routes","createFirstUser","_createFirstUserRoute","user","userSlug","adminRoute","adminRouteURL","currentRouteURL","path","Array","isArray","segments","join","currentRouteToCompare","isCollectionRoute","isGlobalRoute","collectionConfig","undefined","globalConfig","length","viewKey","currentRoute","collections","find","slug","globals","queryString","stringify","addQueryPrefix","cookies","locale","permissions","req","payload","userWithReadAccess","key","overrides","fallbackLocale","query","parse","depth","ignoreQueryPrefix","urlSuffix","canAccessAdmin","route","collectionPreferences","folders","id","then","res","value","browseByFolderSlugs","DefaultView","documentSubViewType","routeParams","templateClassName","templateType","viewActions","viewType","dbHasUser","db","findOne","collection","doc","Component","payloadComponent","usersCollection","disableLocalStrategy","auth","rawCreateFirstUserRoute","createFirstUserRoute","clientConfig","i18n","localization","localeCodes","includes","defaultLocale","visibleEntities","folderID","RenderedView","clientProps","collectionSlug","docID","globalSlug","Fallback","serverProps","initPageResult","languageOptions","Object","entries","supportedLanguages","reduce","acc","language","languageConfig","keys","push","label","translations","general","thisLanguage","_jsxs","_jsx","Fragment","className"],"sources":["../../../src/views/Root/index.tsx"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { Metadata } from 'next'\nimport type {\n AdminViewClientProps,\n AdminViewServerPropsOnly,\n CollectionPreferences,\n ImportMap,\n SanitizedCollectionConfig,\n SanitizedConfig,\n SanitizedGlobalConfig,\n} from 'payload'\n\nimport { PageConfigProvider } from '@payloadcms/ui'\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { getVisibleEntities } from '@payloadcms/ui/shared'\nimport { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'\nimport { notFound, redirect } from 'next/navigation.js'\nimport { applyLocaleFiltering, formatAdminURL, stripTrailingSlash } from 'payload/shared'\nimport * as qs from 'qs-esm'\nimport React from 'react'\n\nimport { DefaultTemplate } from '../../templates/Default/index.js'\nimport { MinimalTemplate } from '../../templates/Minimal/index.js'\nimport { getPreferences } from '../../utilities/getPreferences.js'\nimport { handleAuthRedirect } from '../../utilities/handleAuthRedirect.js'\nimport { initReq } from '../../utilities/initReq.js'\nimport { isCustomAdminView } from '../../utilities/isCustomAdminView.js'\nimport { isPublicAdminRoute } from '../../utilities/isPublicAdminRoute.js'\nimport { getCustomViewByRoute } from './getCustomViewByRoute.js'\nimport { getRouteData } from './getRouteData.js'\n\nexport type GenerateViewMetadata = (args: {\n config: SanitizedConfig\n i18n: I18nClient\n isEditing?: boolean\n params?: { [key: string]: string | string[] }\n}) => Promise<Metadata>\n\nexport const RootPage = async ({\n config: configPromise,\n importMap,\n params: paramsPromise,\n searchParams: searchParamsPromise,\n}: {\n readonly config: Promise<SanitizedConfig>\n readonly importMap: ImportMap\n readonly params: Promise<{\n segments: string[]\n }>\n readonly searchParams: Promise<{\n [key: string]: string | string[]\n }>\n}) => {\n const config = await configPromise\n\n const {\n admin: {\n routes: { createFirstUser: _createFirstUserRoute },\n user: userSlug,\n },\n routes: { admin: adminRoute },\n } = config\n const adminRouteURL = formatAdminURL({ adminRoute })\n\n const params = await paramsPromise\n\n // route with possible trailing slash\n const currentRouteURL = formatAdminURL({\n adminRoute,\n path: Array.isArray(params.segments) ? `/${params.segments.join('/')}` : null,\n })\n // route without possible trailing slash\n const currentRouteToCompare = stripTrailingSlash(currentRouteURL)\n\n const segments = Array.isArray(params.segments) ? params.segments : []\n const isCollectionRoute = segments[0] === 'collections'\n const isGlobalRoute = segments[0] === 'globals'\n let collectionConfig: SanitizedCollectionConfig = undefined\n let globalConfig: SanitizedGlobalConfig = undefined\n\n const searchParams = await searchParamsPromise\n\n // Redirect `${adminRoute}/collections` to `${adminRoute}`\n if (isCollectionRoute) {\n if (segments.length === 1) {\n const { viewKey } = getCustomViewByRoute({\n config,\n currentRoute: '/collections',\n })\n\n // Only redirect if there's NO custom view configured for /collections\n if (!viewKey) {\n redirect(adminRouteURL)\n }\n }\n\n if (segments[1]) {\n collectionConfig = config.collections.find(({ slug }) => slug === segments[1])\n }\n }\n\n // Redirect `${adminRoute}/globals` to `${adminRoute}`\n if (isGlobalRoute) {\n if (segments.length === 1) {\n const { viewKey } = getCustomViewByRoute({\n config,\n currentRoute: '/globals',\n })\n\n // Only redirect if there's NO custom view configured for /globals\n if (!viewKey) {\n redirect(adminRouteURL)\n }\n }\n\n if (segments[1]) {\n globalConfig = config.globals.find(({ slug }) => slug === segments[1])\n }\n }\n\n if ((isCollectionRoute && !collectionConfig) || (isGlobalRoute && !globalConfig)) {\n return notFound()\n }\n\n const queryString = `${qs.stringify(searchParams ?? {}, { addQueryPrefix: true })}`\n\n const {\n cookies,\n locale,\n permissions,\n req,\n req: { payload },\n user: userWithReadAccess,\n } = await initReq({\n configPromise: config,\n importMap,\n key: 'initPage',\n overrides: {\n fallbackLocale: false,\n req: {\n query: qs.parse(queryString, {\n depth: 10,\n ignoreQueryPrefix: true,\n }),\n },\n // intentionally omit `serverURL` to keep URL relative\n urlSuffix: `${currentRouteURL}${searchParams ? queryString : ''}`,\n },\n })\n\n if (\n !permissions.canAccessAdmin &&\n !isPublicAdminRoute({ adminRoute, config: payload.config, route: currentRouteToCompare }) &&\n !isCustomAdminView({ adminRoute, config: payload.config, route: currentRouteToCompare })\n ) {\n redirect(\n handleAuthRedirect({\n config: payload.config,\n route: currentRouteToCompare,\n searchParams,\n user: userWithReadAccess,\n }),\n )\n }\n\n let collectionPreferences: CollectionPreferences = undefined\n\n if (collectionConfig && segments.length === 2) {\n if (config.folders && collectionConfig.folders && segments[1] !== config.folders.slug) {\n await getPreferences<CollectionPreferences>(\n `collection-${collectionConfig.slug}`,\n req.payload,\n req.user.id,\n config.admin.user,\n ).then((res) => {\n if (res && res.value) {\n collectionPreferences = res.value\n }\n })\n }\n }\n\n const {\n browseByFolderSlugs,\n DefaultView,\n documentSubViewType,\n routeParams,\n templateClassName,\n templateType,\n viewActions,\n viewType,\n } = getRouteData({\n adminRoute,\n collectionConfig,\n collectionPreferences,\n currentRoute: currentRouteToCompare,\n globalConfig,\n payload,\n searchParams,\n segments,\n })\n\n req.routeParams = routeParams\n\n const dbHasUser =\n req.user ||\n (await req.payload.db\n .findOne({\n collection: userSlug,\n req,\n })\n ?.then((doc) => !!doc))\n\n /**\n * This function is responsible for handling the case where the view is not found.\n * The current route did not match any default views or custom route views.\n */\n if (!DefaultView?.Component && !DefaultView?.payloadComponent) {\n if (req?.user) {\n notFound()\n }\n\n if (dbHasUser) {\n redirect(adminRouteURL)\n }\n }\n\n const usersCollection = config.collections.find(({ slug }) => slug === userSlug)\n const disableLocalStrategy = usersCollection?.auth?.disableLocalStrategy\n\n const rawCreateFirstUserRoute = formatAdminURL({\n adminRoute,\n path: _createFirstUserRoute,\n })\n const createFirstUserRoute = stripTrailingSlash(rawCreateFirstUserRoute)\n\n if (disableLocalStrategy && currentRouteToCompare === createFirstUserRoute) {\n redirect(adminRouteURL)\n }\n\n if (!dbHasUser && currentRouteToCompare !== createFirstUserRoute && !disableLocalStrategy) {\n redirect(rawCreateFirstUserRoute)\n }\n\n if (dbHasUser && currentRouteToCompare === createFirstUserRoute) {\n redirect(adminRouteURL)\n }\n\n if (!DefaultView?.Component && !DefaultView?.payloadComponent && !dbHasUser) {\n redirect(adminRouteURL)\n }\n\n const clientConfig = getClientConfig({\n config,\n i18n: req.i18n,\n importMap,\n user: viewType === 'createFirstUser' ? true : userWithReadAccess,\n })\n\n await applyLocaleFiltering({ clientConfig, config, req })\n\n // Ensure locale on req is still valid after filtering locales\n if (\n clientConfig.localization &&\n req.locale &&\n !clientConfig.localization.localeCodes.includes(req.locale)\n ) {\n redirect(\n `${currentRouteURL}${qs.stringify(\n {\n ...searchParams,\n locale: clientConfig.localization.localeCodes.includes(\n clientConfig.localization.defaultLocale,\n )\n ? clientConfig.localization.defaultLocale\n : clientConfig.localization.localeCodes[0],\n },\n { addQueryPrefix: true },\n )}`,\n )\n }\n\n const visibleEntities = getVisibleEntities({ req })\n\n const folderID = routeParams.folderID\n\n const RenderedView = RenderServerComponent({\n clientProps: {\n browseByFolderSlugs,\n clientConfig,\n collectionSlug: collectionConfig?.slug,\n docID: routeParams.id,\n documentSubViewType,\n folderID,\n globalSlug: globalConfig?.slug,\n viewType,\n } satisfies AdminViewClientProps,\n Component: DefaultView.payloadComponent,\n Fallback: DefaultView.Component,\n importMap,\n serverProps: {\n clientConfig,\n collectionConfig,\n docID: routeParams.id,\n folderID,\n globalConfig,\n i18n: req.i18n,\n importMap,\n initPageResult: {\n collectionConfig,\n cookies,\n docID: routeParams.id,\n globalConfig,\n languageOptions: Object.entries(req.payload.config.i18n.supportedLanguages || {}).reduce(\n (acc, [language, languageConfig]) => {\n if (Object.keys(req.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 locale,\n permissions,\n req,\n translations: req.i18n.translations,\n visibleEntities,\n },\n params,\n payload: req.payload,\n searchParams,\n user: userWithReadAccess,\n viewActions,\n } satisfies AdminViewServerPropsOnly,\n })\n\n return (\n <PageConfigProvider config={clientConfig}>\n {!templateType && <React.Fragment>{RenderedView}</React.Fragment>}\n {templateType === 'minimal' && (\n <MinimalTemplate className={templateClassName}>{RenderedView}</MinimalTemplate>\n )}\n {templateType === 'default' && (\n <DefaultTemplate\n collectionSlug={collectionConfig?.slug}\n docID={routeParams.id}\n documentSubViewType={documentSubViewType}\n globalSlug={globalConfig?.slug}\n i18n={req.i18n}\n locale={locale}\n params={params}\n payload={req.payload}\n permissions={permissions}\n req={req}\n searchParams={searchParams}\n user={userWithReadAccess}\n viewActions={viewActions}\n viewType={viewType}\n visibleEntities={{\n // The reason we are not passing in initPageResult.visibleEntities directly is due to a \"Cannot assign to read only property of object '#<Object>\" error introduced in React 19\n // which this caused as soon as initPageResult.visibleEntities is passed in\n collections: visibleEntities?.collections,\n globals: visibleEntities?.globals,\n }}\n >\n {RenderedView}\n </DefaultTemplate>\n )}\n </PageConfigProvider>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isPathMatchingRoute.d.ts","sourceRoot":"","sources":["../../../src/views/Root/isPathMatchingRoute.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"isPathMatchingRoute.d.ts","sourceRoot":"","sources":["../../../src/views/Root/isPathMatchingRoute.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,gEAM7B;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB,YAgCA,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { pathToRegexp } from 'path-to-regexp';
|
|
2
|
+
import { stripTrailingSlash } from 'payload/shared';
|
|
2
3
|
export const isPathMatchingRoute = ({
|
|
3
4
|
currentRoute,
|
|
4
5
|
exact,
|
|
@@ -10,6 +11,7 @@ export const isPathMatchingRoute = ({
|
|
|
10
11
|
if (!viewPath) {
|
|
11
12
|
return false;
|
|
12
13
|
}
|
|
14
|
+
const normalizedCurrentRoute = strict ? currentRoute : stripTrailingSlash(currentRoute);
|
|
13
15
|
const keys = [];
|
|
14
16
|
// run the view path through `pathToRegexp` to resolve any dynamic segments
|
|
15
17
|
// i.e. `/admin/custom-view/:id` -> `/admin/custom-view/123`
|
|
@@ -17,16 +19,16 @@ export const isPathMatchingRoute = ({
|
|
|
17
19
|
sensitive,
|
|
18
20
|
strict
|
|
19
21
|
});
|
|
20
|
-
const match = regex.exec(
|
|
21
|
-
const viewRoute = match?.[0] || viewPath;
|
|
22
|
+
const match = regex.exec(normalizedCurrentRoute);
|
|
23
|
+
const viewRoute = strict ? match?.[0] || viewPath : stripTrailingSlash(match?.[0] || viewPath);
|
|
22
24
|
if (exact) {
|
|
23
|
-
return
|
|
25
|
+
return normalizedCurrentRoute === viewRoute;
|
|
24
26
|
}
|
|
25
27
|
if (!exact) {
|
|
26
|
-
if (!
|
|
28
|
+
if (!normalizedCurrentRoute.startsWith(viewRoute)) {
|
|
27
29
|
return false;
|
|
28
30
|
}
|
|
29
|
-
const remainingPath =
|
|
31
|
+
const remainingPath = normalizedCurrentRoute.slice(viewRoute.length);
|
|
30
32
|
return remainingPath === '' || remainingPath.startsWith('/');
|
|
31
33
|
}
|
|
32
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isPathMatchingRoute.js","names":["pathToRegexp","isPathMatchingRoute","currentRoute","exact","path","viewPath","sensitive","strict","keys","regex","match","exec","viewRoute","startsWith","remainingPath","slice","length"],"sources":["../../../src/views/Root/isPathMatchingRoute.ts"],"sourcesContent":["import { pathToRegexp } from 'path-to-regexp'\n\nexport const isPathMatchingRoute = ({\n currentRoute,\n exact,\n path: viewPath,\n sensitive,\n strict,\n}: {\n currentRoute: string\n exact?: boolean\n path?: string\n sensitive?: boolean\n strict?: boolean\n}) => {\n // if no path is defined, we cannot match it so return false early\n if (!viewPath) {\n return false\n }\n\n const keys = []\n\n // run the view path through `pathToRegexp` to resolve any dynamic segments\n // i.e. `/admin/custom-view/:id` -> `/admin/custom-view/123`\n const regex = pathToRegexp(viewPath, keys, {\n sensitive,\n strict,\n })\n\n const match = regex.exec(
|
|
1
|
+
{"version":3,"file":"isPathMatchingRoute.js","names":["pathToRegexp","stripTrailingSlash","isPathMatchingRoute","currentRoute","exact","path","viewPath","sensitive","strict","normalizedCurrentRoute","keys","regex","match","exec","viewRoute","startsWith","remainingPath","slice","length"],"sources":["../../../src/views/Root/isPathMatchingRoute.ts"],"sourcesContent":["import { pathToRegexp } from 'path-to-regexp'\nimport { stripTrailingSlash } from 'payload/shared'\n\nexport const isPathMatchingRoute = ({\n currentRoute,\n exact,\n path: viewPath,\n sensitive,\n strict,\n}: {\n currentRoute: string\n exact?: boolean\n path?: string\n sensitive?: boolean\n strict?: boolean\n}) => {\n // if no path is defined, we cannot match it so return false early\n if (!viewPath) {\n return false\n }\n\n const normalizedCurrentRoute = strict ? currentRoute : stripTrailingSlash(currentRoute)\n const keys = []\n\n // run the view path through `pathToRegexp` to resolve any dynamic segments\n // i.e. `/admin/custom-view/:id` -> `/admin/custom-view/123`\n const regex = pathToRegexp(viewPath, keys, {\n sensitive,\n strict,\n })\n\n const match = regex.exec(normalizedCurrentRoute)\n const viewRoute = strict ? match?.[0] || viewPath : stripTrailingSlash(match?.[0] || viewPath)\n\n if (exact) {\n return normalizedCurrentRoute === viewRoute\n }\n\n if (!exact) {\n if (!normalizedCurrentRoute.startsWith(viewRoute)) {\n return false\n }\n\n const remainingPath = normalizedCurrentRoute.slice(viewRoute.length)\n\n return remainingPath === '' || remainingPath.startsWith('/')\n }\n}\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ;AAC7B,SAASC,kBAAkB,QAAQ;AAEnC,OAAO,MAAMC,mBAAA,GAAsBA,CAAC;EAClCC,YAAY;EACZC,KAAK;EACLC,IAAA,EAAMC,QAAQ;EACdC,SAAS;EACTC;AAAM,CAOP;EACC;EACA,IAAI,CAACF,QAAA,EAAU;IACb,OAAO;EACT;EAEA,MAAMG,sBAAA,GAAyBD,MAAA,GAASL,YAAA,GAAeF,kBAAA,CAAmBE,YAAA;EAC1E,MAAMO,IAAA,GAAO,EAAE;EAEf;EACA;EACA,MAAMC,KAAA,GAAQX,YAAA,CAAaM,QAAA,EAAUI,IAAA,EAAM;IACzCH,SAAA;IACAC;EACF;EAEA,MAAMI,KAAA,GAAQD,KAAA,CAAME,IAAI,CAACJ,sBAAA;EACzB,MAAMK,SAAA,GAAYN,MAAA,GAASI,KAAA,GAAQ,EAAE,IAAIN,QAAA,GAAWL,kBAAA,CAAmBW,KAAA,GAAQ,EAAE,IAAIN,QAAA;EAErF,IAAIF,KAAA,EAAO;IACT,OAAOK,sBAAA,KAA2BK,SAAA;EACpC;EAEA,IAAI,CAACV,KAAA,EAAO;IACV,IAAI,CAACK,sBAAA,CAAuBM,UAAU,CAACD,SAAA,GAAY;MACjD,OAAO;IACT;IAEA,MAAME,aAAA,GAAgBP,sBAAA,CAAuBQ,KAAK,CAACH,SAAA,CAAUI,MAAM;IAEnE,OAAOF,aAAA,KAAkB,MAAMA,aAAA,CAAcD,UAAU,CAAC;EAC1D;AACF","ignoreList":[]}
|
|
@@ -23,6 +23,13 @@ describe('isPathMatchingRoute', () => {
|
|
|
23
23
|
path: '/dashboard'
|
|
24
24
|
})).toBe(true);
|
|
25
25
|
});
|
|
26
|
+
it('should match a trailing-slash path with a normalized current route', () => {
|
|
27
|
+
expect(isPathMatchingRoute({
|
|
28
|
+
currentRoute: '/dashboard',
|
|
29
|
+
exact: true,
|
|
30
|
+
path: '/dashboard/'
|
|
31
|
+
})).toBe(true);
|
|
32
|
+
});
|
|
26
33
|
it('should not match when currentRoute differs from the path', () => {
|
|
27
34
|
expect(isPathMatchingRoute({
|
|
28
35
|
currentRoute: '/settings',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"isPathMatchingRoute.spec.js","names":["describe","expect","it","isPathMatchingRoute","currentRoute","path","undefined","toBe","exact","sensitive","strict"],"sources":["../../../src/views/Root/isPathMatchingRoute.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { isPathMatchingRoute } from './isPathMatchingRoute.js'\n\ndescribe('isPathMatchingRoute', () => {\n describe('no path defined', () => {\n it('should return false when path is undefined', () => {\n expect(isPathMatchingRoute({ currentRoute: '/anything', path: undefined })).toBe(false)\n })\n\n it('should return false when path is empty string', () => {\n expect(isPathMatchingRoute({ currentRoute: '/anything', path: '' })).toBe(false)\n })\n })\n\n describe('exact matching', () => {\n it('should match when currentRoute exactly equals the static path', () => {\n expect(\n isPathMatchingRoute({ currentRoute: '/dashboard', exact: true, path: '/dashboard' }),\n ).toBe(true)\n })\n\n it('should not match when currentRoute differs from the path', () => {\n expect(\n isPathMatchingRoute({ currentRoute: '/settings', exact: true, path: '/dashboard' }),\n ).toBe(false)\n })\n\n it('should not match a sub-path when exact is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/settings',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(false)\n })\n\n it('should match a parameterized path exactly', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123',\n exact: true,\n path: '/custom/:id',\n }),\n ).toBe(true)\n })\n\n it('should not match a parameterized path with extra segments', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123/edit',\n exact: true,\n path: '/custom/:id',\n }),\n ).toBe(false)\n })\n\n it('should match root path exactly', () => {\n expect(isPathMatchingRoute({ currentRoute: '/', exact: true, path: '/' })).toBe(true)\n })\n\n it('should not match root path against other routes when exact', () => {\n expect(isPathMatchingRoute({ currentRoute: '/login', exact: true, path: '/' })).toBe(false)\n })\n })\n\n describe('non-exact (prefix) matching', () => {\n it('should match when currentRoute equals the path', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard', path: '/dashboard' })).toBe(true)\n })\n\n it('should match a sub-path at a segment boundary', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard/settings', path: '/dashboard' })).toBe(\n true,\n )\n })\n\n it('should match deeply nested sub-paths', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/settings/advanced/debug',\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match when route shares a prefix but not at a segment boundary', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard-extra', path: '/dashboard' })).toBe(\n false,\n )\n })\n\n it('should not match a completely different route', () => {\n expect(isPathMatchingRoute({ currentRoute: '/settings', path: '/dashboard' })).toBe(false)\n })\n\n it('should match a parameterized path with a sub-path', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123/edit',\n path: '/custom/:id',\n }),\n ).toBe(false)\n // pathToRegexp is end-anchored by default, so /custom/:id does not match /custom/123/edit.\n // The literal fallback '/custom/:id' also won't startsWith-match.\n // Parameterized views should use exact: true or include all segments in the pattern.\n })\n\n it('should match when :id captures the full segment including non-slash characters', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123extra',\n path: '/custom/:id',\n }),\n ).toBe(true)\n // :id captures everything up to the next / — '123extra' is a valid :id value\n })\n })\n\n describe('root path / without exact — regression for route shadowing bug', () => {\n it('should match root path against itself', () => {\n expect(isPathMatchingRoute({ currentRoute: '/', path: '/' })).toBe(true)\n })\n\n it('should not match root path against /login', () => {\n expect(isPathMatchingRoute({ currentRoute: '/login', path: '/' })).toBe(false)\n })\n\n it('should not match root path against /collections/posts', () => {\n expect(isPathMatchingRoute({ currentRoute: '/collections/posts', path: '/' })).toBe(false)\n })\n\n it('should not match root path against /collections/posts/123', () => {\n expect(isPathMatchingRoute({ currentRoute: '/collections/posts/123', path: '/' })).toBe(false)\n })\n })\n\n describe('sensitive option', () => {\n it('should match case-insensitively by default', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/Dashboard',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match different cases when sensitive is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/Dashboard',\n exact: true,\n path: '/dashboard',\n sensitive: true,\n }),\n ).toBe(false)\n })\n })\n\n describe('strict option', () => {\n it('should match with or without trailing slash by default', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match trailing slash mismatch when strict is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/',\n exact: true,\n path: '/dashboard',\n strict: true,\n }),\n ).toBe(false)\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"isPathMatchingRoute.spec.js","names":["describe","expect","it","isPathMatchingRoute","currentRoute","path","undefined","toBe","exact","sensitive","strict"],"sources":["../../../src/views/Root/isPathMatchingRoute.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport { isPathMatchingRoute } from './isPathMatchingRoute.js'\n\ndescribe('isPathMatchingRoute', () => {\n describe('no path defined', () => {\n it('should return false when path is undefined', () => {\n expect(isPathMatchingRoute({ currentRoute: '/anything', path: undefined })).toBe(false)\n })\n\n it('should return false when path is empty string', () => {\n expect(isPathMatchingRoute({ currentRoute: '/anything', path: '' })).toBe(false)\n })\n })\n\n describe('exact matching', () => {\n it('should match when currentRoute exactly equals the static path', () => {\n expect(\n isPathMatchingRoute({ currentRoute: '/dashboard', exact: true, path: '/dashboard' }),\n ).toBe(true)\n })\n\n it('should match a trailing-slash path with a normalized current route', () => {\n expect(\n isPathMatchingRoute({ currentRoute: '/dashboard', exact: true, path: '/dashboard/' }),\n ).toBe(true)\n })\n\n it('should not match when currentRoute differs from the path', () => {\n expect(\n isPathMatchingRoute({ currentRoute: '/settings', exact: true, path: '/dashboard' }),\n ).toBe(false)\n })\n\n it('should not match a sub-path when exact is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/settings',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(false)\n })\n\n it('should match a parameterized path exactly', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123',\n exact: true,\n path: '/custom/:id',\n }),\n ).toBe(true)\n })\n\n it('should not match a parameterized path with extra segments', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123/edit',\n exact: true,\n path: '/custom/:id',\n }),\n ).toBe(false)\n })\n\n it('should match root path exactly', () => {\n expect(isPathMatchingRoute({ currentRoute: '/', exact: true, path: '/' })).toBe(true)\n })\n\n it('should not match root path against other routes when exact', () => {\n expect(isPathMatchingRoute({ currentRoute: '/login', exact: true, path: '/' })).toBe(false)\n })\n })\n\n describe('non-exact (prefix) matching', () => {\n it('should match when currentRoute equals the path', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard', path: '/dashboard' })).toBe(true)\n })\n\n it('should match a sub-path at a segment boundary', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard/settings', path: '/dashboard' })).toBe(\n true,\n )\n })\n\n it('should match deeply nested sub-paths', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/settings/advanced/debug',\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match when route shares a prefix but not at a segment boundary', () => {\n expect(isPathMatchingRoute({ currentRoute: '/dashboard-extra', path: '/dashboard' })).toBe(\n false,\n )\n })\n\n it('should not match a completely different route', () => {\n expect(isPathMatchingRoute({ currentRoute: '/settings', path: '/dashboard' })).toBe(false)\n })\n\n it('should match a parameterized path with a sub-path', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123/edit',\n path: '/custom/:id',\n }),\n ).toBe(false)\n // pathToRegexp is end-anchored by default, so /custom/:id does not match /custom/123/edit.\n // The literal fallback '/custom/:id' also won't startsWith-match.\n // Parameterized views should use exact: true or include all segments in the pattern.\n })\n\n it('should match when :id captures the full segment including non-slash characters', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/custom/123extra',\n path: '/custom/:id',\n }),\n ).toBe(true)\n // :id captures everything up to the next / — '123extra' is a valid :id value\n })\n })\n\n describe('root path / without exact — regression for route shadowing bug', () => {\n it('should match root path against itself', () => {\n expect(isPathMatchingRoute({ currentRoute: '/', path: '/' })).toBe(true)\n })\n\n it('should not match root path against /login', () => {\n expect(isPathMatchingRoute({ currentRoute: '/login', path: '/' })).toBe(false)\n })\n\n it('should not match root path against /collections/posts', () => {\n expect(isPathMatchingRoute({ currentRoute: '/collections/posts', path: '/' })).toBe(false)\n })\n\n it('should not match root path against /collections/posts/123', () => {\n expect(isPathMatchingRoute({ currentRoute: '/collections/posts/123', path: '/' })).toBe(false)\n })\n })\n\n describe('sensitive option', () => {\n it('should match case-insensitively by default', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/Dashboard',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match different cases when sensitive is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/Dashboard',\n exact: true,\n path: '/dashboard',\n sensitive: true,\n }),\n ).toBe(false)\n })\n })\n\n describe('strict option', () => {\n it('should match with or without trailing slash by default', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/',\n exact: true,\n path: '/dashboard',\n }),\n ).toBe(true)\n })\n\n it('should not match trailing slash mismatch when strict is true', () => {\n expect(\n isPathMatchingRoute({\n currentRoute: '/dashboard/',\n exact: true,\n path: '/dashboard',\n strict: true,\n }),\n ).toBe(false)\n })\n })\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Version/Restore/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAiBpG,OAAO,cAAc,CAAA;AAErB,OAAO,KAA0C,MAAM,OAAO,CAAA;AAK9D,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IACzC,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,KAAK,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;IACtD,aAAa,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Version/Restore/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,SAAS,CAAA;AAiBpG,OAAO,cAAc,CAAA;AAErB,OAAO,KAA0C,MAAM,OAAO,CAAA;AAK9D,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;IACzC,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC,KAAK,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAA;IACtD,aAAa,EAAE,MAAM,GAAG,MAAM,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB,EAAE,MAAM,CAAA;IAC5B,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAuHnC,CAAA"}
|
|
@@ -45,20 +45,23 @@ export const Restore = ({
|
|
|
45
45
|
});
|
|
46
46
|
const canRestoreAsDraft = status !== 'draft' && collectionConfig?.versions?.drafts;
|
|
47
47
|
const handleRestore = useCallback(async () => {
|
|
48
|
-
let fetchURL
|
|
49
|
-
apiRoute,
|
|
50
|
-
path: ''
|
|
51
|
-
});
|
|
48
|
+
let fetchURL;
|
|
52
49
|
let redirectURL;
|
|
53
50
|
if (collectionConfig) {
|
|
54
|
-
fetchURL =
|
|
51
|
+
fetchURL = formatAdminURL({
|
|
52
|
+
apiRoute,
|
|
53
|
+
path: `/${collectionConfig.slug}/versions/${versionID}?draft=${draft}`
|
|
54
|
+
});
|
|
55
55
|
redirectURL = formatAdminURL({
|
|
56
56
|
adminRoute,
|
|
57
57
|
path: `/collections/${collectionConfig.slug}/${originalDocID}`
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
if (globalConfig) {
|
|
61
|
-
fetchURL =
|
|
61
|
+
fetchURL = formatAdminURL({
|
|
62
|
+
apiRoute,
|
|
63
|
+
path: `/globals/${globalConfig.slug}/versions/${versionID}?draft=${draft}`
|
|
64
|
+
});
|
|
62
65
|
redirectURL = formatAdminURL({
|
|
63
66
|
adminRoute,
|
|
64
67
|
path: `/globals/${globalConfig.slug}`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","Button","ConfirmationModal","PopupList","toast","useConfig","useModal","useRouteTransition","useTranslation","requests","useRouter","formatAdminURL","React","Fragment","useCallback","useState","baseClass","modalSlug","Restore","className","collectionConfig","globalConfig","label","originalDocID","status","versionDateFormatted","versionID","config","routes","admin","adminRoute","api","apiRoute","toggleModal","router","i18n","t","draft","setDraft","startRouteTransition","restoreMessage","versionDate","canRestoreAsDraft","versions","drafts","handleRestore","fetchURL","
|
|
1
|
+
{"version":3,"file":"index.js","names":["getTranslation","Button","ConfirmationModal","PopupList","toast","useConfig","useModal","useRouteTransition","useTranslation","requests","useRouter","formatAdminURL","React","Fragment","useCallback","useState","baseClass","modalSlug","Restore","className","collectionConfig","globalConfig","label","originalDocID","status","versionDateFormatted","versionID","config","routes","admin","adminRoute","api","apiRoute","toggleModal","router","i18n","t","draft","setDraft","startRouteTransition","restoreMessage","versionDate","canRestoreAsDraft","versions","drafts","handleRestore","fetchURL","redirectURL","path","slug","res","post","headers","language","json","success","message","push","error","_jsxs","_jsx","filter","Boolean","join","buttonStyle","onClick","size","SubMenuPopupContent","ButtonGroup","body","confirmingLabel","heading","onConfirm"],"sources":["../../../../src/views/Version/Restore/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientCollectionConfig, ClientGlobalConfig, SanitizedCollectionConfig } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Button,\n ConfirmationModal,\n PopupList,\n toast,\n useConfig,\n useModal,\n useRouteTransition,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport { useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\n\nimport './index.scss'\n\nimport React, { Fragment, useCallback, useState } from 'react'\n\nconst baseClass = 'restore-version'\nconst modalSlug = 'restore-version'\n\ntype Props = {\n className?: string\n collectionConfig?: ClientCollectionConfig\n globalConfig?: ClientGlobalConfig\n label: SanitizedCollectionConfig['labels']['singular']\n originalDocID: number | string\n status?: string\n versionDateFormatted: string\n versionID: string\n}\n\nexport const Restore: React.FC<Props> = ({\n className,\n collectionConfig,\n globalConfig,\n label,\n originalDocID,\n status,\n versionDateFormatted,\n versionID,\n}) => {\n const {\n config: {\n routes: { admin: adminRoute, api: apiRoute },\n },\n } = useConfig()\n\n const { toggleModal } = useModal()\n const router = useRouter()\n const { i18n, t } = useTranslation()\n const [draft, setDraft] = useState(false)\n const { startRouteTransition } = useRouteTransition()\n\n const restoreMessage = t(\n globalConfig ? 'version:aboutToRestoreGlobal' : 'version:aboutToRestore',\n {\n label: getTranslation(label, i18n),\n versionDate: versionDateFormatted,\n },\n )\n\n const canRestoreAsDraft = status !== 'draft' && collectionConfig?.versions?.drafts\n\n const handleRestore = useCallback(async () => {\n let fetchURL: string\n let redirectURL: string\n\n if (collectionConfig) {\n fetchURL = formatAdminURL({\n apiRoute,\n path: `/${collectionConfig.slug}/versions/${versionID}?draft=${draft}`,\n })\n redirectURL = formatAdminURL({\n adminRoute,\n path: `/collections/${collectionConfig.slug}/${originalDocID}`,\n })\n }\n\n if (globalConfig) {\n fetchURL = formatAdminURL({\n apiRoute,\n path: `/globals/${globalConfig.slug}/versions/${versionID}?draft=${draft}`,\n })\n redirectURL = formatAdminURL({\n adminRoute,\n path: `/globals/${globalConfig.slug}`,\n })\n }\n\n const res = await requests.post(fetchURL, {\n headers: {\n 'Accept-Language': i18n.language,\n },\n })\n\n if (res.status === 200) {\n const json = await res.json()\n toast.success(json.message)\n return startRouteTransition(() => router.push(redirectURL))\n } else {\n toast.error(t('version:problemRestoringVersion'))\n }\n }, [\n apiRoute,\n collectionConfig,\n globalConfig,\n i18n.language,\n versionID,\n draft,\n adminRoute,\n originalDocID,\n startRouteTransition,\n router,\n t,\n ])\n\n return (\n <Fragment>\n <div className={[baseClass, className].filter(Boolean).join(' ')}>\n <Button\n buttonStyle=\"primary\"\n className={[canRestoreAsDraft && `${baseClass}__restore-as-draft-button`]\n .filter(Boolean)\n .join(' ')}\n onClick={() => toggleModal(modalSlug)}\n size=\"xsmall\"\n SubMenuPopupContent={\n canRestoreAsDraft\n ? () => (\n <PopupList.ButtonGroup>\n <PopupList.Button onClick={() => [setDraft(true), toggleModal(modalSlug)]}>\n {t('version:restoreAsDraft')}\n </PopupList.Button>\n </PopupList.ButtonGroup>\n )\n : null\n }\n >\n {t('version:restoreThisVersion')}\n </Button>\n </div>\n <ConfirmationModal\n body={restoreMessage}\n confirmingLabel={t('version:restoring')}\n heading={t('version:confirmVersionRestoration')}\n modalSlug={modalSlug}\n onConfirm={handleRestore}\n />\n </Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -77,10 +77,6 @@ export const withPayload = (nextConfig = {}, options = {}) => {
|
|
|
77
77
|
...(nextConfig.outputFileTracingExcludes || {}),
|
|
78
78
|
'**/*': [...(nextConfig.outputFileTracingExcludes?.['**/*'] || []), 'drizzle-kit', 'drizzle-kit/api']
|
|
79
79
|
},
|
|
80
|
-
outputFileTracingIncludes: {
|
|
81
|
-
...(nextConfig.outputFileTracingIncludes || {}),
|
|
82
|
-
'**/*': [...(nextConfig.outputFileTracingIncludes?.['**/*'] || []), '@libsql/client']
|
|
83
|
-
},
|
|
84
80
|
turbopack: {
|
|
85
81
|
...(nextConfig.turbopack || {})
|
|
86
82
|
},
|
|
@@ -194,6 +190,9 @@ export const withPayload = (nextConfig = {}, options = {}) => {
|
|
|
194
190
|
process.env.NEXT_BASE_PATH = nextConfig.basePath;
|
|
195
191
|
baseConfig.env.NEXT_BASE_PATH = nextConfig.basePath;
|
|
196
192
|
}
|
|
193
|
+
const trailingSlash = nextConfig.trailingSlash === true ? 'true' : 'false';
|
|
194
|
+
process.env.NEXT_TRAILING_SLASH = trailingSlash;
|
|
195
|
+
baseConfig.env.NEXT_TRAILING_SLASH = trailingSlash;
|
|
197
196
|
if (!supportsTurbopackBuild) {
|
|
198
197
|
return withPayloadLegacy(baseConfig);
|
|
199
198
|
} else {
|