@payloadcms/next 3.40.0-internal.9e8d70e → 3.40.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/exports/utilities.d.ts +2 -1
- package/dist/exports/utilities.d.ts.map +1 -1
- package/dist/layouts/Root/index.js +0 -1
- package/dist/layouts/Root/index.js.map +1 -1
- package/dist/prod/styles.css +1 -1
- package/dist/routes/graphql/handler.d.ts.map +1 -1
- package/dist/routes/graphql/handler.js +1 -0
- package/dist/routes/graphql/handler.js.map +1 -1
- package/dist/utilities/initPage/index.d.ts.map +1 -1
- package/dist/utilities/initPage/index.js +0 -1
- package/dist/utilities/initPage/index.js.map +1 -1
- package/dist/utilities/initReq.d.ts +2 -2
- package/dist/utilities/initReq.d.ts.map +1 -1
- package/dist/utilities/initReq.js +2 -2
- package/dist/utilities/initReq.js.map +1 -1
- package/dist/views/Login/LoginForm/index.d.ts.map +1 -1
- package/dist/views/Login/LoginForm/index.js +5 -3
- package/dist/views/Login/LoginForm/index.js.map +1 -1
- package/dist/views/Login/index.d.ts.map +1 -1
- package/dist/views/Login/index.js +5 -2
- package/dist/views/Login/index.js.map +1 -1
- package/dist/views/Versions/cells/AutosaveCell/index.d.ts +1 -0
- package/dist/views/Versions/cells/AutosaveCell/index.d.ts.map +1 -1
- package/dist/views/Versions/cells/AutosaveCell/index.js +7 -5
- package/dist/views/Versions/cells/AutosaveCell/index.js.map +1 -1
- package/dist/views/Versions/cells/AutosaveCell/index.scss +9 -0
- package/package.json +6 -6
- package/dist/utilities/getSafeRedirect.d.ts +0 -2
- package/dist/utilities/getSafeRedirect.d.ts.map +0 -1
- package/dist/utilities/getSafeRedirect.js +0 -28
- package/dist/utilities/getSafeRedirect.js.map +0 -1
- package/dist/utilities/getSafeRedirect.spec.js +0 -32
- package/dist/utilities/getSafeRedirect.spec.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/routes/graphql/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,eAAe,EAAE,MAAM,SAAS,CAAA;AAqEjF,eAAO,MAAM,UAAU,WAAkB,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,iBAyBlF,CAAA;AAED,eAAO,MAAM,IAAI,WACN,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,eAAqB,OAAO,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/routes/graphql/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqC,eAAe,EAAE,MAAM,SAAS,CAAA;AAqEjF,eAAO,MAAM,UAAU,WAAkB,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,iBAyBlF,CAAA;AAED,eAAO,MAAM,IAAI,WACN,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,eAAqB,OAAO,sBAuD9E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","names":["configToSchema","createHandler","status","httpStatus","addDataAndFileToRequest","addLocalesToRequestFromData","createPayloadRequest","headersWithCors","logError","mergeHeaders","handleError","err","payload","req","originalError","INTERNAL_SERVER_ERROR","errorMessage","message","config","debug","response","extensions","name","undefined","data","stack","statusCode","locations","path","hooks","afterError","reduce","promise","hook","result","context","error","graphqlResult","Promise","resolve","cached","global","_payload_graphql","graphql","getGraphql","process","env","NODE_ENV","resolvedConfig","schema","e","POST","request","originalRequest","clone","validationRules","headers","apiResponse","onOperation","args","errors","all","map","_","defaultRules","concat","resHeaders","Headers","key","append","Response","body","responseHeaders"],"sources":["../../../src/routes/graphql/handler.ts"],"sourcesContent":["import type { GraphQLError, GraphQLFormattedError } from 'graphql'\nimport type { APIError, Payload, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport { configToSchema } from '@payloadcms/graphql'\nimport { createHandler } from 'graphql-http/lib/use/fetch'\nimport { status as httpStatus } from 'http-status'\nimport {\n addDataAndFileToRequest,\n addLocalesToRequestFromData,\n createPayloadRequest,\n headersWithCors,\n logError,\n mergeHeaders,\n} from 'payload'\n\nconst handleError = async ({\n err,\n payload,\n req,\n}: {\n err: GraphQLError\n payload: Payload\n req: PayloadRequest\n}): Promise<GraphQLFormattedError> => {\n const status = (err.originalError as APIError).status || httpStatus.INTERNAL_SERVER_ERROR\n let errorMessage = err.message\n logError({ err, payload })\n\n // Internal server errors can contain anything, including potentially sensitive data.\n // Therefore, error details will be hidden from the response unless `config.debug` is `true`\n if (!payload.config.debug && status === httpStatus.INTERNAL_SERVER_ERROR) {\n errorMessage = 'Something went wrong.'\n }\n\n let response: GraphQLFormattedError = {\n extensions: {\n name: err?.originalError?.name || undefined,\n data: (err && err.originalError && (err.originalError as APIError).data) || undefined,\n stack: payload.config.debug ? err.stack : undefined,\n statusCode: status,\n },\n locations: err.locations,\n message: errorMessage,\n path: err.path,\n }\n\n await payload.config.hooks.afterError?.reduce(async (promise, hook) => {\n await promise\n\n const result = await hook({\n context: req.context,\n error: err,\n graphqlResult: response,\n req,\n })\n\n if (result) {\n response = result.graphqlResult || response\n }\n }, Promise.resolve())\n\n return response\n}\n\nlet cached = global._payload_graphql\n\nif (!cached) {\n cached = global._payload_graphql = { graphql: null, promise: null }\n}\n\nexport const getGraphql = async (config: Promise<SanitizedConfig> | SanitizedConfig) => {\n if (process.env.NODE_ENV === 'development') {\n cached = global._payload_graphql = { graphql: null, promise: null }\n }\n\n if (cached.graphql) {\n return cached.graphql\n }\n\n if (!cached.promise) {\n const resolvedConfig = await config\n cached.promise = new Promise((resolve) => {\n const schema = configToSchema(resolvedConfig)\n resolve(cached.graphql || schema)\n })\n }\n\n try {\n cached.graphql = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.graphql\n}\n\nexport const POST =\n (config: Promise<SanitizedConfig> | SanitizedConfig) => async (request: Request) => {\n const originalRequest = request.clone()\n const req = await createPayloadRequest({\n config,\n request,\n })\n\n await addDataAndFileToRequest(req)\n addLocalesToRequestFromData(req)\n\n const { schema, validationRules } = await getGraphql(config)\n\n const { payload } = req\n\n const headers = {}\n const apiResponse = await createHandler({\n context: { headers, req },\n onOperation: async (request, args, result) => {\n const response =\n typeof payload.extensions === 'function'\n ? await payload.extensions({\n args,\n req: request,\n result,\n })\n : result\n if (response.errors) {\n const errors = (await Promise.all(\n result.errors.map((error) => {\n return handleError({ err: error, payload, req })\n }),\n )) as GraphQLError[]\n // errors type should be FormattedGraphQLError[] but onOperation has a return type of ExecutionResult instead of FormattedExecutionResult\n return { ...response, errors }\n }\n return response\n },\n schema,\n validationRules: (_, args, defaultRules) => defaultRules.concat(validationRules(args)),\n })(originalRequest)\n\n const resHeaders = headersWithCors({\n headers: new Headers(apiResponse.headers),\n req,\n })\n\n for (const key in headers) {\n resHeaders.append(key, headers[key])\n }\n\n return new Response(apiResponse.body, {\n headers: req.responseHeaders ? mergeHeaders(req.responseHeaders, resHeaders) : resHeaders,\n status: apiResponse.status,\n })\n }\n"],"mappings":"AAGA,SAASA,cAAc,QAAQ;AAC/B,SAASC,aAAa,QAAQ;AAC9B,SAASC,MAAA,IAAUC,UAAU,QAAQ;AACrC,SACEC,uBAAuB,EACvBC,2BAA2B,EAC3BC,oBAAoB,EACpBC,eAAe,EACfC,QAAQ,EACRC,YAAY,QACP;AAEP,MAAMC,WAAA,GAAc,MAAAA,CAAO;EACzBC,GAAG;EACHC,OAAO;EACPC;AAAG,CAKJ;EACC,MAAMX,MAAA,GAASS,GAAC,CAAIG,aAAa,CAAcZ,MAAM,IAAIC,UAAA,CAAWY,qBAAqB;EACzF,IAAIC,YAAA,GAAeL,GAAA,CAAIM,OAAO;EAC9BT,QAAA,CAAS;IAAEG,GAAA;IAAKC;EAAQ;EAExB;EACA;EACA,IAAI,CAACA,OAAA,CAAQM,MAAM,CAACC,KAAK,IAAIjB,MAAA,KAAWC,UAAA,CAAWY,qBAAqB,EAAE;IACxEC,YAAA,GAAe;EACjB;EAEA,IAAII,QAAA,GAAkC;IACpCC,UAAA,EAAY;MACVC,IAAA,EAAMX,GAAA,EAAKG,aAAA,EAAeQ,IAAA,IAAQC,SAAA;MAClCC,IAAA,EAAMb,GAAC,IAAOA,GAAA,CAAIG,aAAa,IAAIH,GAAC,CAAIG,aAAa,CAAcU,IAAI,IAAKD,SAAA;MAC5EE,KAAA,EAAOb,OAAA,CAAQM,MAAM,CAACC,KAAK,GAAGR,GAAA,CAAIc,KAAK,GAAGF,SAAA;MAC1CG,UAAA,EAAYxB;IACd;IACAyB,SAAA,EAAWhB,GAAA,CAAIgB,SAAS;IACxBV,OAAA,EAASD,YAAA;IACTY,IAAA,EAAMjB,GAAA,CAAIiB;EACZ;EAEA,MAAMhB,OAAA,CAAQM,MAAM,CAACW,KAAK,CAACC,UAAU,EAAEC,MAAA,CAAO,OAAOC,OAAA,EAASC,IAAA;IAC5D,MAAMD,OAAA;IAEN,MAAME,MAAA,GAAS,MAAMD,IAAA,CAAK;MACxBE,OAAA,EAAStB,GAAA,CAAIsB,OAAO;MACpBC,KAAA,EAAOzB,GAAA;MACP0B,aAAA,EAAejB,QAAA;MACfP;IACF;IAEA,IAAIqB,MAAA,EAAQ;MACVd,QAAA,GAAWc,MAAA,CAAOG,aAAa,IAAIjB,QAAA;IACrC;EACF,GAAGkB,OAAA,CAAQC,OAAO;EAElB,OAAOnB,QAAA;AACT;AAEA,IAAIoB,MAAA,GAASC,MAAA,CAAOC,gBAAgB;AAEpC,IAAI,CAACF,MAAA,EAAQ;EACXA,MAAA,GAASC,MAAA,CAAOC,gBAAgB,GAAG;IAAEC,OAAA,EAAS;IAAMX,OAAA,EAAS;EAAK;AACpE;AAEA,OAAO,MAAMY,UAAA,GAAa,MAAO1B,MAAA;EAC/B,IAAI2B,OAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;IAC1CP,MAAA,GAASC,MAAA,CAAOC,gBAAgB,GAAG;MAAEC,OAAA,EAAS;MAAMX,OAAA,EAAS;IAAK;EACpE;EAEA,IAAIQ,MAAA,CAAOG,OAAO,EAAE;IAClB,OAAOH,MAAA,CAAOG,OAAO;EACvB;EAEA,IAAI,CAACH,MAAA,CAAOR,OAAO,EAAE;IACnB,MAAMgB,cAAA,GAAiB,MAAM9B,MAAA;IAC7BsB,MAAA,CAAOR,OAAO,GAAG,IAAIM,OAAA,CAASC,OAAA;MAC5B,MAAMU,MAAA,GAASjD,cAAA,CAAegD,cAAA;MAC9BT,OAAA,CAAQC,MAAA,CAAOG,OAAO,IAAIM,MAAA;IAC5B;EACF;EAEA,IAAI;IACFT,MAAA,CAAOG,OAAO,GAAG,MAAMH,MAAA,CAAOR,OAAO;EACvC,EAAE,OAAOkB,CAAA,EAAG;IACVV,MAAA,CAAOR,OAAO,GAAG;IACjB,MAAMkB,CAAA;EACR;EAEA,OAAOV,MAAA,CAAOG,OAAO;AACvB;AAEA,OAAO,MAAMQ,IAAA,GACVjC,MAAA,IAAuD,MAAOkC,OAAA;EAC7D,MAAMC,eAAA,GAAkBD,OAAA,CAAQE,KAAK;EACrC,MAAMzC,GAAA,GAAM,MAAMP,oBAAA,CAAqB;
|
|
1
|
+
{"version":3,"file":"handler.js","names":["configToSchema","createHandler","status","httpStatus","addDataAndFileToRequest","addLocalesToRequestFromData","createPayloadRequest","headersWithCors","logError","mergeHeaders","handleError","err","payload","req","originalError","INTERNAL_SERVER_ERROR","errorMessage","message","config","debug","response","extensions","name","undefined","data","stack","statusCode","locations","path","hooks","afterError","reduce","promise","hook","result","context","error","graphqlResult","Promise","resolve","cached","global","_payload_graphql","graphql","getGraphql","process","env","NODE_ENV","resolvedConfig","schema","e","POST","request","originalRequest","clone","canSetHeaders","validationRules","headers","apiResponse","onOperation","args","errors","all","map","_","defaultRules","concat","resHeaders","Headers","key","append","Response","body","responseHeaders"],"sources":["../../../src/routes/graphql/handler.ts"],"sourcesContent":["import type { GraphQLError, GraphQLFormattedError } from 'graphql'\nimport type { APIError, Payload, PayloadRequest, SanitizedConfig } from 'payload'\n\nimport { configToSchema } from '@payloadcms/graphql'\nimport { createHandler } from 'graphql-http/lib/use/fetch'\nimport { status as httpStatus } from 'http-status'\nimport {\n addDataAndFileToRequest,\n addLocalesToRequestFromData,\n createPayloadRequest,\n headersWithCors,\n logError,\n mergeHeaders,\n} from 'payload'\n\nconst handleError = async ({\n err,\n payload,\n req,\n}: {\n err: GraphQLError\n payload: Payload\n req: PayloadRequest\n}): Promise<GraphQLFormattedError> => {\n const status = (err.originalError as APIError).status || httpStatus.INTERNAL_SERVER_ERROR\n let errorMessage = err.message\n logError({ err, payload })\n\n // Internal server errors can contain anything, including potentially sensitive data.\n // Therefore, error details will be hidden from the response unless `config.debug` is `true`\n if (!payload.config.debug && status === httpStatus.INTERNAL_SERVER_ERROR) {\n errorMessage = 'Something went wrong.'\n }\n\n let response: GraphQLFormattedError = {\n extensions: {\n name: err?.originalError?.name || undefined,\n data: (err && err.originalError && (err.originalError as APIError).data) || undefined,\n stack: payload.config.debug ? err.stack : undefined,\n statusCode: status,\n },\n locations: err.locations,\n message: errorMessage,\n path: err.path,\n }\n\n await payload.config.hooks.afterError?.reduce(async (promise, hook) => {\n await promise\n\n const result = await hook({\n context: req.context,\n error: err,\n graphqlResult: response,\n req,\n })\n\n if (result) {\n response = result.graphqlResult || response\n }\n }, Promise.resolve())\n\n return response\n}\n\nlet cached = global._payload_graphql\n\nif (!cached) {\n cached = global._payload_graphql = { graphql: null, promise: null }\n}\n\nexport const getGraphql = async (config: Promise<SanitizedConfig> | SanitizedConfig) => {\n if (process.env.NODE_ENV === 'development') {\n cached = global._payload_graphql = { graphql: null, promise: null }\n }\n\n if (cached.graphql) {\n return cached.graphql\n }\n\n if (!cached.promise) {\n const resolvedConfig = await config\n cached.promise = new Promise((resolve) => {\n const schema = configToSchema(resolvedConfig)\n resolve(cached.graphql || schema)\n })\n }\n\n try {\n cached.graphql = await cached.promise\n } catch (e) {\n cached.promise = null\n throw e\n }\n\n return cached.graphql\n}\n\nexport const POST =\n (config: Promise<SanitizedConfig> | SanitizedConfig) => async (request: Request) => {\n const originalRequest = request.clone()\n const req = await createPayloadRequest({\n canSetHeaders: true,\n config,\n request,\n })\n\n await addDataAndFileToRequest(req)\n addLocalesToRequestFromData(req)\n\n const { schema, validationRules } = await getGraphql(config)\n\n const { payload } = req\n\n const headers = {}\n const apiResponse = await createHandler({\n context: { headers, req },\n onOperation: async (request, args, result) => {\n const response =\n typeof payload.extensions === 'function'\n ? await payload.extensions({\n args,\n req: request,\n result,\n })\n : result\n if (response.errors) {\n const errors = (await Promise.all(\n result.errors.map((error) => {\n return handleError({ err: error, payload, req })\n }),\n )) as GraphQLError[]\n // errors type should be FormattedGraphQLError[] but onOperation has a return type of ExecutionResult instead of FormattedExecutionResult\n return { ...response, errors }\n }\n return response\n },\n schema,\n validationRules: (_, args, defaultRules) => defaultRules.concat(validationRules(args)),\n })(originalRequest)\n\n const resHeaders = headersWithCors({\n headers: new Headers(apiResponse.headers),\n req,\n })\n\n for (const key in headers) {\n resHeaders.append(key, headers[key])\n }\n\n return new Response(apiResponse.body, {\n headers: req.responseHeaders ? mergeHeaders(req.responseHeaders, resHeaders) : resHeaders,\n status: apiResponse.status,\n })\n }\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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;AAM9D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAQtC,eAAO,MAAM,QAAQ,6EAMlB,IAAI,KAAG,OAAO,CAAC,cAAc,
|
|
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 +1 @@
|
|
|
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","
|
|
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":"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","ignoreList":[]}
|
|
@@ -14,10 +14,10 @@ type Result = {
|
|
|
14
14
|
* Initializes a full request object, including the `req` object and access control.
|
|
15
15
|
* As access control and getting the request locale is dependent on the current URL and
|
|
16
16
|
*/
|
|
17
|
-
export declare const initReq: ({ configPromise, importMap,
|
|
17
|
+
export declare const initReq: ({ canSetHeaders, configPromise, importMap, key, overrides, }: {
|
|
18
|
+
canSetHeaders?: boolean;
|
|
18
19
|
configPromise: Promise<SanitizedConfig> | SanitizedConfig;
|
|
19
20
|
importMap: ImportMap;
|
|
20
|
-
isAdmin?: boolean;
|
|
21
21
|
key: string;
|
|
22
22
|
overrides?: Parameters<typeof createLocalReq>[0];
|
|
23
23
|
}) => Promise<Result>;
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,iEAMjB;IACD,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,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,CAwEjB,CAAA"}
|
|
@@ -11,9 +11,9 @@ const reqCache = selectiveCache('req');
|
|
|
11
11
|
* As access control and getting the request locale is dependent on the current URL and
|
|
12
12
|
*/
|
|
13
13
|
export const initReq = async function ({
|
|
14
|
+
canSetHeaders,
|
|
14
15
|
configPromise,
|
|
15
16
|
importMap,
|
|
16
|
-
isAdmin,
|
|
17
17
|
key,
|
|
18
18
|
overrides
|
|
19
19
|
}) {
|
|
@@ -39,8 +39,8 @@ export const initReq = async function ({
|
|
|
39
39
|
responseHeaders,
|
|
40
40
|
user
|
|
41
41
|
} = await executeAuthStrategies({
|
|
42
|
+
canSetHeaders,
|
|
42
43
|
headers,
|
|
43
|
-
isAdmin,
|
|
44
44
|
payload
|
|
45
45
|
});
|
|
46
46
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","getRequestLocale","selectiveCache","partialReqCache","reqCache","initReq","
|
|
1
|
+
{"version":3,"file":"initReq.js","names":["initI18n","headers","getHeaders","createLocalReq","executeAuthStrategies","getAccessResults","getPayload","getRequestLanguage","parseCookies","getRequestLocale","selectiveCache","partialReqCache","reqCache","initReq","canSetHeaders","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 canSetHeaders,\n configPromise,\n importMap,\n key,\n overrides,\n}: {\n canSetHeaders?: boolean\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 canSetHeaders,\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,aAAa;EACbC,SAAS;EACTC,GAAG;EACHC;AAAS,CAOV;EACC,MAAMjB,OAAA,GAAU,MAAMC,UAAA;EACtB,MAAMiB,OAAA,GAAUX,YAAA,CAAaP,OAAA;EAE7B,MAAMmB,aAAA,GAAgB,MAAMT,eAAA,CAAgBU,GAAG,CAAC;IAC9C,MAAMC,MAAA,GAAS,MAAMP,aAAA;IACrB,MAAMQ,OAAA,GAAU,MAAMjB,UAAA,CAAW;MAAEgB,MAAA;MAAQN;IAAU;IACrD,MAAMQ,YAAA,GAAejB,kBAAA,CAAmB;MACtCe,MAAA;MACAH,OAAA;MACAlB;IACF;IACA,MAAMwB,IAAA,GAAmB,MAAMzB,QAAA,CAAS;MACtCsB,MAAA,EAAQA,MAAA,CAAOG,IAAI;MACnBC,OAAA,EAAS;MACTC,QAAA,EAAUH;IACZ;IAEA,MAAM;MAAEI,eAAe;MAAEC;IAAI,CAAE,GAAG,MAAMzB,qBAAA,CAAsB;MAC5DU,aAAA;MACAb,OAAA;MACAsB;IACF;IAEA,OAAO;MACLE,IAAA;MACAD,YAAA;MACAD,OAAA;MACAK,eAAA;MACAC;IACF;EACF,GAAG;EAEH,OAAOjB,QAAA,CAASS,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,MAAM3B,cAAA,CAChB;MACE2B,GAAA,EAAK;QACH7B,OAAA;QACAgC,IAAA,EAAMhC,OAAA,CAAQoB,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,MAAMzB,gBAAA,CAAiB;MACpCqB;IACF;IAEAA,GAAA,CAAII,MAAM,GAAGA,MAAA,EAAQC,IAAA;IAErB,MAAMC,WAAA,GAAc,MAAM/B,gBAAA,CAAiB;MACzCyB;IACF;IAEA,OAAO;MACLX,OAAA;MACAlB,OAAA;MACAuB,YAAA;MACAU,MAAA;MACAE,WAAA;MACAN;IACF;EACF,GAAGb,GAAA;AACL","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Login/LoginForm/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/views/Login/LoginForm/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAqBzB,OAAO,cAAc,CAAA;AAErB,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;KAAE,CAAA;CAC/D,CAyFA,CAAA"}
|
|
@@ -5,8 +5,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
import React from 'react';
|
|
6
6
|
const baseClass = 'login__form';
|
|
7
7
|
import { Form, FormSubmit, Link, PasswordField, useAuth, useConfig, useTranslation } from '@payloadcms/ui';
|
|
8
|
-
import { formatAdminURL, getLoginOptions } from 'payload/shared';
|
|
9
|
-
import { getSafeRedirect } from '../../../utilities/getSafeRedirect.js';
|
|
8
|
+
import { formatAdminURL, getLoginOptions, getSafeRedirect } from 'payload/shared';
|
|
10
9
|
import { LoginField } from '../LoginField/index.js';
|
|
11
10
|
export const LoginForm = t0 => {
|
|
12
11
|
const $ = _c(23);
|
|
@@ -124,7 +123,10 @@ export const LoginForm = t0 => {
|
|
|
124
123
|
initialState,
|
|
125
124
|
method: "POST",
|
|
126
125
|
onSuccess: handleLogin,
|
|
127
|
-
redirect: getSafeRedirect(
|
|
126
|
+
redirect: getSafeRedirect({
|
|
127
|
+
fallbackTo: adminRoute,
|
|
128
|
+
redirectTo: searchParams?.redirect
|
|
129
|
+
}),
|
|
128
130
|
waitForAutocomplete: true,
|
|
129
131
|
children: [_jsxs("div", {
|
|
130
132
|
className: `${baseClass}__inputWrap`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","React","baseClass","Form","FormSubmit","Link","PasswordField","useAuth","useConfig","useTranslation","formatAdminURL","getLoginOptions","getSafeRedirect","LoginField","LoginForm","t0","$","prefillEmail","prefillPassword","prefillUsername","searchParams","config","getEntityConfig","admin","t1","routes","t2","t3","user","userSlug","forgot","forgotRoute","adminRoute","api","apiRoute","loginWithUsername","t4","collectionConfig","collectionSlug","auth","authOptions","canLoginWithEmail","canLoginWithUsername","t5","loginType","useState","t","setUser","t6","undefined","t7","t8","redirect","initialState","password","initialValue","valid","value","username","email","t9","data","handleLogin","_jsxs","action","className","disableSuccessStatus","method","onSuccess","waitForAutocomplete","children","_jsx","type","field","name","label","required","path","href","prefetch","size"],"sources":["../../../../src/views/Login/LoginForm/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nconst baseClass = 'login__form'\n\nimport type { UserWithToken } from '@payloadcms/ui'\nimport type { FormState } from 'payload'\n\nimport {\n Form,\n FormSubmit,\n Link,\n PasswordField,\n useAuth,\n useConfig,\n useTranslation,\n} from '@payloadcms/ui'\nimport { formatAdminURL, getLoginOptions } from 'payload/shared'\n\nimport type { LoginFieldProps } from '../LoginField/index.js'\n\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","React","baseClass","Form","FormSubmit","Link","PasswordField","useAuth","useConfig","useTranslation","formatAdminURL","getLoginOptions","getSafeRedirect","LoginField","LoginForm","t0","$","prefillEmail","prefillPassword","prefillUsername","searchParams","config","getEntityConfig","admin","t1","routes","t2","t3","user","userSlug","forgot","forgotRoute","adminRoute","api","apiRoute","loginWithUsername","t4","collectionConfig","collectionSlug","auth","authOptions","canLoginWithEmail","canLoginWithUsername","t5","loginType","useState","t","setUser","t6","undefined","t7","t8","redirect","initialState","password","initialValue","valid","value","username","email","t9","data","handleLogin","_jsxs","action","className","disableSuccessStatus","method","onSuccess","fallbackTo","redirectTo","waitForAutocomplete","children","_jsx","type","field","name","label","required","path","href","prefetch","size"],"sources":["../../../../src/views/Login/LoginForm/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nconst baseClass = 'login__form'\n\nimport type { UserWithToken } from '@payloadcms/ui'\nimport type { FormState } from 'payload'\n\nimport {\n Form,\n FormSubmit,\n Link,\n PasswordField,\n useAuth,\n useConfig,\n useTranslation,\n} from '@payloadcms/ui'\nimport { formatAdminURL, getLoginOptions, getSafeRedirect } from 'payload/shared'\n\nimport type { LoginFieldProps } from '../LoginField/index.js'\n\nimport { LoginField } from '../LoginField/index.js'\nimport './index.scss'\n\nexport const LoginForm: React.FC<{\n prefillEmail?: string\n prefillPassword?: string\n prefillUsername?: string\n searchParams: { [key: string]: string | string[] | undefined }\n}> = ({ prefillEmail, prefillPassword, prefillUsername, searchParams }) => {\n const { config, getEntityConfig } = useConfig()\n\n const {\n admin: {\n routes: { forgot: forgotRoute },\n user: userSlug,\n },\n routes: { admin: adminRoute, api: apiRoute },\n } = config\n\n const collectionConfig = getEntityConfig({ collectionSlug: userSlug })\n const { auth: authOptions } = collectionConfig\n const loginWithUsername = authOptions.loginWithUsername\n const { canLoginWithEmail, canLoginWithUsername } = getLoginOptions(loginWithUsername)\n\n const [loginType] = React.useState<LoginFieldProps['type']>(() => {\n if (canLoginWithEmail && canLoginWithUsername) {\n return 'emailOrUsername'\n }\n if (canLoginWithUsername) {\n return 'username'\n }\n return 'email'\n })\n\n const { t } = useTranslation()\n const { setUser } = useAuth()\n\n const initialState: FormState = {\n password: {\n initialValue: prefillPassword ?? undefined,\n valid: true,\n value: prefillPassword ?? undefined,\n },\n }\n\n if (loginWithUsername) {\n initialState.username = {\n initialValue: prefillUsername ?? undefined,\n valid: true,\n value: prefillUsername ?? undefined,\n }\n } else {\n initialState.email = {\n initialValue: prefillEmail ?? undefined,\n valid: true,\n value: prefillEmail ?? undefined,\n }\n }\n\n const handleLogin = (data: UserWithToken) => {\n setUser(data)\n }\n\n return (\n <Form\n action={`${apiRoute}/${userSlug}/login`}\n className={baseClass}\n disableSuccessStatus\n initialState={initialState}\n method=\"POST\"\n onSuccess={handleLogin}\n redirect={getSafeRedirect({ fallbackTo: adminRoute, redirectTo: searchParams?.redirect })}\n waitForAutocomplete\n >\n <div className={`${baseClass}__inputWrap`}>\n <LoginField type={loginType} />\n <PasswordField\n field={{\n name: 'password',\n label: t('general:password'),\n required: true,\n }}\n path=\"password\"\n />\n </div>\n <Link\n href={formatAdminURL({\n adminRoute,\n path: forgotRoute,\n })}\n prefetch={false}\n >\n {t('authentication:forgotPasswordQuestion')}\n </Link>\n <FormSubmit size=\"large\">{t('authentication:login')}</FormSubmit>\n </Form>\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAEA,OAAOC,KAAA,MAAW;AAElB,MAAMC,SAAA,GAAY;AAKlB,SACEC,IAAI,EACJC,UAAU,EACVC,IAAI,EACJC,aAAa,EACbC,OAAO,EACPC,SAAS,EACTC,cAAc,QACT;AACP,SAASC,cAAc,EAAEC,eAAe,EAAEC,eAAe,QAAQ;AAIjE,SAASC,UAAU,QAAQ;AAG3B,OAAO,MAAMC,SAAA,GAKRC,EAAA;EAAA,MAAAC,CAAA,GAAAhB,EAAA;EAAC;IAAAiB,YAAA;IAAAC,eAAA;IAAAC,eAAA;IAAAC;EAAA,IAAAL,EAAgE;EACpE;IAAAM,MAAA;IAAAC;EAAA,IAAoCd,SAAA;EAEpC;IAAAe,KAAA,EAAAC,EAAA;IAAAC,MAAA,EAAAC;EAAA,IAMIL,MAAA;EALK;IAAAI,MAAA,EAAAE,EAAA;IAAAC,IAAA,EAAAC;EAAA,IAAAL,EAGN;EAFS;IAAAM,MAAA,EAAAC;EAAA,IAAAJ,EAAuB;EAGzB;IAAAJ,KAAA,EAAAS,UAAA;IAAAC,GAAA,EAAAC;EAAA,IAAAR,EAAoC;EAAA,IAAAS,iBAAA;EAAA,IAAAC,EAAA;EAAA,IAAApB,CAAA,QAAAM,eAAA,IAAAN,CAAA,QAAAa,QAAA;IAG9C,MAAAQ,gBAAA,GAAyBf,eAAA;MAAAgB,cAAA,EAAkCT;IAAA,CAAS;IACpE;MAAAU,IAAA,EAAAC;IAAA,IAA8BH,gBAAA;IAC9BF,iBAAA,GAA0BK,WAAA,CAAAL,iBAAA;IAC0BC,EAAA,GAAAzB,eAAA,CAAgBwB,iBAAA;IAAAnB,CAAA,MAAAM,eAAA;IAAAN,CAAA,MAAAa,QAAA;IAAAb,CAAA,MAAAmB,iBAAA;IAAAnB,CAAA,MAAAoB,EAAA;EAAA;IAAAD,iBAAA,GAAAnB,CAAA;IAAAoB,EAAA,GAAApB,CAAA;EAAA;EAApE;IAAAyB,iBAAA;IAAAC;EAAA,IAAoDN,EAAgB;EAAA,IAAAO,EAAA;EAAA,IAAA3B,CAAA,QAAAyB,iBAAA,IAAAzB,CAAA,QAAA0B,oBAAA;IAERC,EAAA,GAAAA,CAAA;MAAA,IACtDF,iBAAA,IAAqBC,oBAAA;QAAA,OAChB;MAAA;MAAA,IAELA,oBAAA;QAAA,OACK;MAAA;MAAA,OAEF;IAAA;IACT1B,CAAA,MAAAyB,iBAAA;IAAAzB,CAAA,MAAA0B,oBAAA;IAAA1B,CAAA,MAAA2B,EAAA;EAAA;IAAAA,EAAA,GAAA3B,CAAA;EAAA;EARA,OAAA4B,SAAA,IAAoB3C,KAAA,CAAA4C,QAAA,CAAwCF,EAQ5D;EAEA;IAAAG;EAAA,IAAcrC,cAAA;EACd;IAAAsC;EAAA,IAAoBxC,OAAA;EAIF,MAAAyC,EAAA,GAAA9B,eAAA,IAAA+B,SAAmB;EAE1B,MAAAC,EAAA,GAAAhC,eAAA,IAAA+B,SAAmB;EAAA,IAAAE,EAAA;EAAA,IAAAnC,CAAA,QAAAgB,UAAA,IAAAhB,CAAA,QAAAkB,QAAA,IAAAlB,CAAA,QAAAe,WAAA,IAAAf,CAAA,SAAA4B,SAAA,IAAA5B,CAAA,SAAAmB,iBAAA,IAAAnB,CAAA,SAAAC,YAAA,IAAAD,CAAA,SAAAG,eAAA,IAAAH,CAAA,SAAAI,YAAA,EAAAgC,QAAA,IAAApC,CAAA,SAAA+B,OAAA,IAAA/B,CAAA,SAAA8B,CAAA,IAAA9B,CAAA,SAAAgC,EAAA,IAAAhC,CAAA,SAAAkC,EAAA,IAAAlC,CAAA,SAAAa,QAAA;IAJ9B,MAAAwB,YAAA;MAAAC,QAAA;QAAAC,YAAA,EAEkBP,EAAmB;QAAAQ,KAAA;QAAAC,KAAA,EAE1BP;MAAmB;IAAA;IAE9B,IAEIf,iBAAA;MACFkB,YAAA,CAAAK,QAAA;QAAAH,YAAA,EACgBpC,eAAA,IAAA8B,SAAmB;QAAAO,KAAA;QAAAC,KAAA,EAE1BtC,eAAA,IAAA8B;MAAmB;IAAA;MAG5BI,YAAA,CAAAM,KAAA;QAAAJ,YAAA,EACgBtC,YAAA,IAAAgC,SAAgB;QAAAO,KAAA;QAAAC,KAAA,EAEvBxC,YAAA,IAAAgC;MAAgB;IAAA;IAAA,IAAAW,EAAA;IAAA,IAAA5C,CAAA,SAAA+B,OAAA;MAIPa,EAAA,GAAAC,IAAA;QAClBd,OAAA,CAAQc,IAAA;MAAA;MACV7C,CAAA,OAAA+B,OAAA;MAAA/B,CAAA,OAAA4C,EAAA;IAAA;MAAAA,EAAA,GAAA5C,CAAA;IAAA;IAFA,MAAA8C,WAAA,GAAoBF,EAEpB;IAGET,EAAA,GAAAY,KAAA,CAAA5D,IAAA;MAAA6D,MAAA,EACU,GAAG9B,QAAA,IAAYL,QAAA,QAAgB;MAAAoC,SAAA,EAAA/D,SAAA;MAAAgE,oBAAA;MAAAb,YAAA;MAAAc,MAAA,EAIhC;MAAAC,SAAA,EACIN,WAAA;MAAAV,QAAA,EACDxC,eAAA;QAAAyD,UAAA,EAA8BrC,UAAA;QAAAsC,UAAA,EAAwBlD,YAAA,EAAAgC;MAAA,CAAuB;MAAAmB,mBAAA;MAAAC,QAAA,GAGvFT,KAAA,CAAC;QAAAE,SAAA,EAAe,GAAA/D,SAAA,aAAyB;QAAAsE,QAAA,GACvCC,IAAA,CAAA5D,UAAA;UAAA6D,IAAA,EAAkB9B;QAAA,C,GAClB6B,IAAA,CAAAnE,aAAA;UAAAqE,KAAA;YAAAC,IAAA,EAEU;YAAAC,KAAA,EACC/B,CAAA,CAAE;YAAAgC,QAAA;UAAA;UAAAC,IAAA,EAGN;QAAA,C;UAGTN,IAAA,CAAApE,IAAA;QAAA2E,IAAA,EACQtE,cAAA;UAAAsB,UAAA;UAAA+C,IAAA,EAEEhD;QAAA,CACR;QAAAkD,QAAA;QAAAT,QAAA,EAGC1B,CAAA,CAAE;MAAA,C,GAEL2B,IAAA,CAAArE,UAAA;QAAA8E,IAAA,EAAiB;QAAAV,QAAA,EAAS1B,CAAA,CAAE;MAAA,C;;;;;;;;;;;;;;;;;;;SA9B9BK,E;CAiCJ","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Login/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAe,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/views/Login/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAe,MAAM,SAAS,CAAA;AAKhE,OAAO,KAAmB,MAAM,OAAO,CAAA;AAIvC,OAAO,cAAc,CAAA;AACrB,eAAO,MAAM,cAAc,UAAU,CAAA;AAErC,wBAAgB,SAAS,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,oBAAoB,qBA0FvF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
|
|
3
3
|
import { redirect } from 'next/navigation.js';
|
|
4
|
+
import { getSafeRedirect } from 'payload/shared';
|
|
4
5
|
import React, { Fragment } from 'react';
|
|
5
6
|
import { Logo } from '../../elements/Logo/index.js';
|
|
6
|
-
import { getSafeRedirect } from '../../utilities/getSafeRedirect.js';
|
|
7
7
|
import { LoginForm } from './LoginForm/index.js';
|
|
8
8
|
export const loginBaseClass = 'login';
|
|
9
9
|
export function LoginView({
|
|
@@ -36,7 +36,10 @@ export function LoginView({
|
|
|
36
36
|
admin
|
|
37
37
|
}
|
|
38
38
|
} = config;
|
|
39
|
-
const redirectUrl = getSafeRedirect(
|
|
39
|
+
const redirectUrl = getSafeRedirect({
|
|
40
|
+
fallbackTo: admin,
|
|
41
|
+
redirectTo: searchParams.redirect
|
|
42
|
+
});
|
|
40
43
|
if (user) {
|
|
41
44
|
redirect(redirectUrl);
|
|
42
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["RenderServerComponent","redirect","React","Fragment","Logo","
|
|
1
|
+
{"version":3,"file":"index.js","names":["RenderServerComponent","redirect","getSafeRedirect","React","Fragment","Logo","LoginForm","loginBaseClass","LoginView","initPageResult","params","searchParams","locale","permissions","req","i18n","payload","config","user","admin","components","afterLogin","beforeLogin","userSlug","routes","redirectUrl","fallbackTo","redirectTo","collectionConfig","collections","prefillAutoLogin","autoLogin","prefillOnly","prefillUsername","username","undefined","prefillEmail","email","prefillPassword","password","_jsxs","_jsx","className","Component","importMap","serverProps","auth","disableLocalStrategy"],"sources":["../../../src/views/Login/index.tsx"],"sourcesContent":["import type { AdminViewServerProps, ServerProps } from 'payload'\n\nimport { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent'\nimport { redirect } from 'next/navigation.js'\nimport { getSafeRedirect } from 'payload/shared'\nimport React, { Fragment } from 'react'\n\nimport { Logo } from '../../elements/Logo/index.js'\nimport { LoginForm } from './LoginForm/index.js'\nimport './index.scss'\nexport const loginBaseClass = 'login'\n\nexport function LoginView({ initPageResult, params, searchParams }: AdminViewServerProps) {\n const { locale, permissions, req } = initPageResult\n\n const {\n i18n,\n payload: { config },\n payload,\n user,\n } = req\n\n const {\n admin: { components: { afterLogin, beforeLogin } = {}, user: userSlug },\n routes: { admin },\n } = config\n\n const redirectUrl = getSafeRedirect({ fallbackTo: admin, redirectTo: searchParams.redirect })\n\n if (user) {\n redirect(redirectUrl)\n }\n\n const collectionConfig = payload?.collections?.[userSlug]?.config\n\n const prefillAutoLogin =\n typeof config.admin?.autoLogin === 'object' && config.admin?.autoLogin.prefillOnly\n\n const prefillUsername =\n prefillAutoLogin && typeof config.admin?.autoLogin === 'object'\n ? config.admin?.autoLogin.username\n : undefined\n\n const prefillEmail =\n prefillAutoLogin && typeof config.admin?.autoLogin === 'object'\n ? config.admin?.autoLogin.email\n : undefined\n\n const prefillPassword =\n prefillAutoLogin && typeof config.admin?.autoLogin === 'object'\n ? config.admin?.autoLogin.password\n : undefined\n\n return (\n <Fragment>\n <div className={`${loginBaseClass}__brand`}>\n <Logo\n i18n={i18n}\n locale={locale}\n params={params}\n payload={payload}\n permissions={permissions}\n searchParams={searchParams}\n user={user}\n />\n </div>\n {RenderServerComponent({\n Component: beforeLogin,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n } satisfies ServerProps,\n })}\n {!collectionConfig?.auth?.disableLocalStrategy && (\n <LoginForm\n prefillEmail={prefillEmail}\n prefillPassword={prefillPassword}\n prefillUsername={prefillUsername}\n searchParams={searchParams}\n />\n )}\n {RenderServerComponent({\n Component: afterLogin,\n importMap: payload.importMap,\n serverProps: {\n i18n,\n locale,\n params,\n payload,\n permissions,\n searchParams,\n user,\n } satisfies ServerProps,\n })}\n </Fragment>\n )\n}\n"],"mappings":";AAEA,SAASA,qBAAqB,QAAQ;AACtC,SAASC,QAAQ,QAAQ;AACzB,SAASC,eAAe,QAAQ;AAChC,OAAOC,KAAA,IAASC,QAAQ,QAAQ;AAEhC,SAASC,IAAI,QAAQ;AACrB,SAASC,SAAS,QAAQ;AAE1B,OAAO,MAAMC,cAAA,GAAiB;AAE9B,OAAO,SAASC,UAAU;EAAEC,cAAc;EAAEC,MAAM;EAAEC;AAAY,CAAwB;EACtF,MAAM;IAAEC,MAAM;IAAEC,WAAW;IAAEC;EAAG,CAAE,GAAGL,cAAA;EAErC,MAAM;IACJM,IAAI;IACJC,OAAA,EAAS;MAAEC;IAAM,CAAE;IACnBD,OAAO;IACPE;EAAI,CACL,GAAGJ,GAAA;EAEJ,MAAM;IACJK,KAAA,EAAO;MAAEC,UAAA,EAAY;QAAEC,UAAU;QAAEC;MAAW,CAAE,GAAG,CAAC,CAAC;MAAEJ,IAAA,EAAMK;IAAQ,CAAE;IACvEC,MAAA,EAAQ;MAAEL;IAAK;EAAE,CAClB,GAAGF,MAAA;EAEJ,MAAMQ,WAAA,GAAcvB,eAAA,CAAgB;IAAEwB,UAAA,EAAYP,KAAA;IAAOQ,UAAA,EAAYhB,YAAA,CAAaV;EAAS;EAE3F,IAAIiB,IAAA,EAAM;IACRjB,QAAA,CAASwB,WAAA;EACX;EAEA,MAAMG,gBAAA,GAAmBZ,OAAA,EAASa,WAAA,GAAcN,QAAA,CAAS,EAAEN,MAAA;EAE3D,MAAMa,gBAAA,GACJ,OAAOb,MAAA,CAAOE,KAAK,EAAEY,SAAA,KAAc,YAAYd,MAAA,CAAOE,KAAK,EAAEY,SAAA,CAAUC,WAAA;EAEzE,MAAMC,eAAA,GACJH,gBAAA,IAAoB,OAAOb,MAAA,CAAOE,KAAK,EAAEY,SAAA,KAAc,WACnDd,MAAA,CAAOE,KAAK,EAAEY,SAAA,CAAUG,QAAA,GACxBC,SAAA;EAEN,MAAMC,YAAA,GACJN,gBAAA,IAAoB,OAAOb,MAAA,CAAOE,KAAK,EAAEY,SAAA,KAAc,WACnDd,MAAA,CAAOE,KAAK,EAAEY,SAAA,CAAUM,KAAA,GACxBF,SAAA;EAEN,MAAMG,eAAA,GACJR,gBAAA,IAAoB,OAAOb,MAAA,CAAOE,KAAK,EAAEY,SAAA,KAAc,WACnDd,MAAA,CAAOE,KAAK,EAAEY,SAAA,CAAUQ,QAAA,GACxBJ,SAAA;EAEN,oBACEK,KAAA,CAACpC,QAAA;4BACCqC,IAAA,CAAC;MAAIC,SAAA,EAAW,GAAGnC,cAAA,SAAuB;gBACxC,aAAAkC,IAAA,CAACpC,IAAA;QACCU,IAAA,EAAMA,IAAA;QACNH,MAAA,EAAQA,MAAA;QACRF,MAAA,EAAQA,MAAA;QACRM,OAAA,EAASA,OAAA;QACTH,WAAA,EAAaA,WAAA;QACbF,YAAA,EAAcA,YAAA;QACdO,IAAA,EAAMA;;QAGTlB,qBAAA,CAAsB;MACrB2C,SAAA,EAAWrB,WAAA;MACXsB,SAAA,EAAW5B,OAAA,CAAQ4B,SAAS;MAC5BC,WAAA,EAAa;QACX9B,IAAA;QACAH,MAAA;QACAF,MAAA;QACAM,OAAA;QACAH,WAAA;QACAF,YAAA;QACAO;MACF;IACF,IACC,CAACU,gBAAA,EAAkBkB,IAAA,EAAMC,oBAAA,iBACxBN,IAAA,CAACnC,SAAA;MACC8B,YAAA,EAAcA,YAAA;MACdE,eAAA,EAAiBA,eAAA;MACjBL,eAAA,EAAiBA,eAAA;MACjBtB,YAAA,EAAcA;QAGjBX,qBAAA,CAAsB;MACrB2C,SAAA,EAAWtB,UAAA;MACXuB,SAAA,EAAW5B,OAAA,CAAQ4B,SAAS;MAC5BC,WAAA,EAAa;QACX9B,IAAA;QACAH,MAAA;QACAF,MAAA;QACAM,OAAA;QACAH,WAAA;QACAF,YAAA;QACAO;MACF;IACF;;AAGN","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/views/Versions/cells/AutosaveCell/index.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/views/Versions/cells/AutosaveCell/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAIrB,KAAK,iBAAiB,GAAG;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,OAAO,EAAE;YACP,OAAO,CAAC,EAAE,MAAM,CAAA;SACjB,CAAA;KACF,CAAA;CACF,CAAA;AAED,eAAO,MAAM,UAAU,6GAYtB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAkDpD,CAAA"}
|
|
@@ -3,17 +3,18 @@
|
|
|
3
3
|
import { c as _c } from "react/compiler-runtime";
|
|
4
4
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
5
|
import { Pill, useConfig, useTranslation } from '@payloadcms/ui';
|
|
6
|
-
import React
|
|
6
|
+
import React from 'react';
|
|
7
|
+
const baseClass = 'autosave-cell';
|
|
7
8
|
export const renderPill = (data, latestVersion, currentLabel, previousLabel, pillStyle) => {
|
|
8
|
-
return /*#__PURE__*/
|
|
9
|
-
children:
|
|
9
|
+
return /*#__PURE__*/_jsx(React.Fragment, {
|
|
10
|
+
children: data?.id === latestVersion ? /*#__PURE__*/_jsx(Pill, {
|
|
10
11
|
pillStyle: pillStyle,
|
|
11
12
|
size: "small",
|
|
12
13
|
children: currentLabel
|
|
13
14
|
}) : /*#__PURE__*/_jsx(Pill, {
|
|
14
15
|
size: "small",
|
|
15
16
|
children: previousLabel
|
|
16
|
-
})
|
|
17
|
+
})
|
|
17
18
|
});
|
|
18
19
|
};
|
|
19
20
|
export const AutosaveCell = t0 => {
|
|
@@ -100,7 +101,8 @@ export const AutosaveCell = t0 => {
|
|
|
100
101
|
} else {
|
|
101
102
|
t5 = $[15];
|
|
102
103
|
}
|
|
103
|
-
t4 = _jsxs(
|
|
104
|
+
t4 = _jsxs("div", {
|
|
105
|
+
className: `${baseClass}__items`,
|
|
104
106
|
children: [t5, status && renderPill(rowData, latestVersion, currentLabel, previousLabel, pillStyle), publishedLocalePill]
|
|
105
107
|
});
|
|
106
108
|
$[2] = i18n?.language;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","Pill","useConfig","useTranslation","React","
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","Pill","useConfig","useTranslation","React","baseClass","renderPill","data","latestVersion","currentLabel","previousLabel","pillStyle","_jsx","Fragment","id","size","AutosaveCell","t0","$","latestDraftVersion","latestPublishedVersion","rowData","t1","t2","undefined","autosave","publishedLocale","version","i18n","t","config","t3","localization","status","_status","t4","language","publishedLocalePill","versionInfo","draft","published","locales","localeCode","Array","isArray","t5","loc","code","locale","find","formattedLabel","label","children","_jsxs","className"],"sources":["../../../../../src/views/Versions/cells/AutosaveCell/index.tsx"],"sourcesContent":["'use client'\nimport { Pill, useConfig, useTranslation } from '@payloadcms/ui'\nimport React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'autosave-cell'\n\ntype AutosaveCellProps = {\n latestDraftVersion?: string\n latestPublishedVersion?: string\n rowData?: {\n autosave?: boolean\n publishedLocale?: string\n version: {\n _status?: string\n }\n }\n}\n\nexport const renderPill = (data, latestVersion, currentLabel, previousLabel, pillStyle) => {\n return (\n <React.Fragment>\n {data?.id === latestVersion ? (\n <Pill pillStyle={pillStyle} size=\"small\">\n {currentLabel}\n </Pill>\n ) : (\n <Pill size=\"small\">{previousLabel}</Pill>\n )}\n </React.Fragment>\n )\n}\n\nexport const AutosaveCell: React.FC<AutosaveCellProps> = ({\n latestDraftVersion,\n latestPublishedVersion,\n rowData = { autosave: undefined, publishedLocale: undefined, version: undefined },\n}) => {\n const { i18n, t } = useTranslation()\n\n const {\n config: { localization },\n } = useConfig()\n\n const publishedLocale = rowData?.publishedLocale || undefined\n const status = rowData?.version._status\n let publishedLocalePill = null\n\n const versionInfo = {\n draft: {\n currentLabel: t('version:currentDraft'),\n latestVersion: latestDraftVersion,\n pillStyle: undefined,\n previousLabel: t('version:draft'),\n },\n published: {\n currentLabel: t('version:currentPublishedVersion'),\n latestVersion: latestPublishedVersion,\n pillStyle: 'success',\n previousLabel: t('version:previouslyPublished'),\n },\n }\n\n const { currentLabel, latestVersion, pillStyle, previousLabel } = versionInfo[status] || {}\n\n if (localization && localization?.locales && publishedLocale) {\n const localeCode = Array.isArray(publishedLocale) ? publishedLocale[0] : publishedLocale\n\n const locale = localization.locales.find((loc) => loc.code === localeCode)\n const formattedLabel = locale?.label?.[i18n?.language] || locale?.label\n\n if (formattedLabel) {\n publishedLocalePill = <Pill>{formattedLabel}</Pill>\n }\n }\n\n return (\n <div className={`${baseClass}__items`}>\n {rowData?.autosave && <Pill>{t('version:autosave')}</Pill>}\n {status && renderPill(rowData, latestVersion, currentLabel, previousLabel, pillStyle)}\n {publishedLocalePill}\n </div>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/next",
|
|
3
|
-
"version": "3.40.0
|
|
3
|
+
"version": "3.40.0",
|
|
4
4
|
"homepage": "https://payloadcms.com",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -84,9 +84,9 @@
|
|
|
84
84
|
"react-diff-viewer-continued": "4.0.5",
|
|
85
85
|
"sass": "1.77.4",
|
|
86
86
|
"uuid": "10.0.0",
|
|
87
|
-
"@payloadcms/
|
|
88
|
-
"@payloadcms/
|
|
89
|
-
"@payloadcms/
|
|
87
|
+
"@payloadcms/graphql": "3.40.0",
|
|
88
|
+
"@payloadcms/translations": "3.40.0",
|
|
89
|
+
"@payloadcms/ui": "3.40.0"
|
|
90
90
|
},
|
|
91
91
|
"devDependencies": {
|
|
92
92
|
"@babel/cli": "7.26.4",
|
|
@@ -104,12 +104,12 @@
|
|
|
104
104
|
"esbuild-sass-plugin": "3.3.1",
|
|
105
105
|
"swc-plugin-transform-remove-imports": "3.1.0",
|
|
106
106
|
"@payloadcms/eslint-config": "3.28.0",
|
|
107
|
-
"payload": "3.40.0
|
|
107
|
+
"payload": "3.40.0"
|
|
108
108
|
},
|
|
109
109
|
"peerDependencies": {
|
|
110
110
|
"graphql": "^16.8.1",
|
|
111
111
|
"next": "^15.2.3",
|
|
112
|
-
"payload": "3.40.0
|
|
112
|
+
"payload": "3.40.0"
|
|
113
113
|
},
|
|
114
114
|
"engines": {
|
|
115
115
|
"node": "^18.20.2 || >=20.9.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getSafeRedirect.d.ts","sourceRoot":"","sources":["../../src/utilities/getSafeRedirect.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,kBACX,MAAM,GAAG,MAAM,EAAE,aACtB,MAAM,KACf,MA8BF,CAAA"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
export const getSafeRedirect = (redirectParam, fallback = '/') => {
|
|
2
|
-
if (typeof redirectParam !== 'string') {
|
|
3
|
-
return fallback;
|
|
4
|
-
}
|
|
5
|
-
// Normalize and decode the path
|
|
6
|
-
let redirectPath;
|
|
7
|
-
try {
|
|
8
|
-
redirectPath = decodeURIComponent(redirectParam.trim());
|
|
9
|
-
} catch {
|
|
10
|
-
return fallback // invalid encoding
|
|
11
|
-
;
|
|
12
|
-
}
|
|
13
|
-
const isSafeRedirect =
|
|
14
|
-
// Must start with a single forward slash (e.g., "/admin")
|
|
15
|
-
redirectPath.startsWith('/') &&
|
|
16
|
-
// Prevent protocol-relative URLs (e.g., "//example.com")
|
|
17
|
-
!redirectPath.startsWith('//') &&
|
|
18
|
-
// Prevent encoded slashes that could resolve to protocol-relative
|
|
19
|
-
!redirectPath.startsWith('/%2F') &&
|
|
20
|
-
// Prevent backslash-based escape attempts (e.g., "/\\/example.com", "/\\\\example.com", "/\\example.com")
|
|
21
|
-
!redirectPath.startsWith('/\\/') && !redirectPath.startsWith('/\\\\') && !redirectPath.startsWith('/\\') &&
|
|
22
|
-
// Prevent javascript-based schemes (e.g., "/javascript:alert(1)")
|
|
23
|
-
!redirectPath.toLowerCase().startsWith('/javascript:') &&
|
|
24
|
-
// Prevent attempts to redirect to full URLs using "/http:" or "/https:"
|
|
25
|
-
!redirectPath.toLowerCase().startsWith('/http');
|
|
26
|
-
return isSafeRedirect ? redirectPath : fallback;
|
|
27
|
-
};
|
|
28
|
-
//# sourceMappingURL=getSafeRedirect.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getSafeRedirect.js","names":["getSafeRedirect","redirectParam","fallback","redirectPath","decodeURIComponent","trim","isSafeRedirect","startsWith","toLowerCase"],"sources":["../../src/utilities/getSafeRedirect.ts"],"sourcesContent":["export const getSafeRedirect = (\n redirectParam: string | string[],\n fallback: string = '/',\n): string => {\n if (typeof redirectParam !== 'string') {\n return fallback\n }\n\n // Normalize and decode the path\n let redirectPath: string\n try {\n redirectPath = decodeURIComponent(redirectParam.trim())\n } catch {\n return fallback // invalid encoding\n }\n\n const isSafeRedirect =\n // Must start with a single forward slash (e.g., \"/admin\")\n redirectPath.startsWith('/') &&\n // Prevent protocol-relative URLs (e.g., \"//example.com\")\n !redirectPath.startsWith('//') &&\n // Prevent encoded slashes that could resolve to protocol-relative\n !redirectPath.startsWith('/%2F') &&\n // Prevent backslash-based escape attempts (e.g., \"/\\\\/example.com\", \"/\\\\\\\\example.com\", \"/\\\\example.com\")\n !redirectPath.startsWith('/\\\\/') &&\n !redirectPath.startsWith('/\\\\\\\\') &&\n !redirectPath.startsWith('/\\\\') &&\n // Prevent javascript-based schemes (e.g., \"/javascript:alert(1)\")\n !redirectPath.toLowerCase().startsWith('/javascript:') &&\n // Prevent attempts to redirect to full URLs using \"/http:\" or \"/https:\"\n !redirectPath.toLowerCase().startsWith('/http')\n\n return isSafeRedirect ? redirectPath : fallback\n}\n"],"mappings":"AAAA,OAAO,MAAMA,eAAA,GAAkBA,CAC7BC,aAAA,EACAC,QAAA,GAAmB,GAAG;EAEtB,IAAI,OAAOD,aAAA,KAAkB,UAAU;IACrC,OAAOC,QAAA;EACT;EAEA;EACA,IAAIC,YAAA;EACJ,IAAI;IACFA,YAAA,GAAeC,kBAAA,CAAmBH,aAAA,CAAcI,IAAI;EACtD,EAAE,MAAM;IACN,OAAOH,QAAA,CAAS;IAAA;EAClB;EAEA,MAAMI,cAAA;EACJ;EACAH,YAAA,CAAaI,UAAU,CAAC;EACxB;EACA,CAACJ,YAAA,CAAaI,UAAU,CAAC;EACzB;EACA,CAACJ,YAAA,CAAaI,UAAU,CAAC;EACzB;EACA,CAACJ,YAAA,CAAaI,UAAU,CAAC,WACzB,CAACJ,YAAA,CAAaI,UAAU,CAAC,YACzB,CAACJ,YAAA,CAAaI,UAAU,CAAC;EACzB;EACA,CAACJ,YAAA,CAAaK,WAAW,GAAGD,UAAU,CAAC;EACvC;EACA,CAACJ,YAAA,CAAaK,WAAW,GAAGD,UAAU,CAAC;EAEzC,OAAOD,cAAA,GAAiBH,YAAA,GAAeD,QAAA;AACzC","ignoreList":[]}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { getSafeRedirect } from './getSafeRedirect';
|
|
2
|
-
const fallback = '/admin' // default fallback if the input is unsafe or invalid
|
|
3
|
-
;
|
|
4
|
-
describe('getSafeRedirect', () => {
|
|
5
|
-
// Valid - safe redirect paths
|
|
6
|
-
it.each([['/dashboard'], ['/admin/settings'], ['/projects?id=123'], ['/hello-world']])('should allow safe relative path: %s', input => {
|
|
7
|
-
// If the input is a clean relative path, it should be returned as-is
|
|
8
|
-
expect(getSafeRedirect(input, fallback)).toBe(input);
|
|
9
|
-
});
|
|
10
|
-
// Invalid types or empty inputs
|
|
11
|
-
it.each(['', null, undefined, 123, {}, []])('should fallback on invalid or non-string input: %s', input => {
|
|
12
|
-
// If the input is not a valid string, it should return the fallback
|
|
13
|
-
expect(getSafeRedirect(input, fallback)).toBe(fallback);
|
|
14
|
-
});
|
|
15
|
-
// Unsafe redirect patterns
|
|
16
|
-
it.each(['//example.com', '/javascript:alert(1)', '/JavaScript:alert(1)', '/http://unknown.com', '/https://unknown.com', '/%2Funknown.com', '/\\/unknown.com', '/\\\\unknown.com', '/\\unknown.com', '%2F%2Funknown.com', '%2Fjavascript:alert(1)'])('should block unsafe redirect: %s', input => {
|
|
17
|
-
// All of these should return the fallback because they’re unsafe
|
|
18
|
-
expect(getSafeRedirect(input, fallback)).toBe(fallback);
|
|
19
|
-
});
|
|
20
|
-
// Input with extra spaces should still be properly handled
|
|
21
|
-
it('should trim whitespace before evaluating', () => {
|
|
22
|
-
// A valid path with surrounding spaces should still be accepted
|
|
23
|
-
expect(getSafeRedirect(' /dashboard ', fallback)).toBe('/dashboard');
|
|
24
|
-
// An unsafe path with spaces should still be rejected
|
|
25
|
-
expect(getSafeRedirect(' //example.com ', fallback)).toBe(fallback);
|
|
26
|
-
});
|
|
27
|
-
// If decoding the input fails (e.g., invalid percent encoding), it should not crash
|
|
28
|
-
it('should return fallback on invalid encoding', () => {
|
|
29
|
-
expect(getSafeRedirect('%E0%A4%A', fallback)).toBe(fallback);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
//# sourceMappingURL=getSafeRedirect.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getSafeRedirect.spec.js","names":["getSafeRedirect","fallback","describe","it","each","input","expect","toBe","undefined"],"sources":["../../src/utilities/getSafeRedirect.spec.ts"],"sourcesContent":["import { getSafeRedirect } from './getSafeRedirect'\n\nconst fallback = '/admin' // default fallback if the input is unsafe or invalid\n\ndescribe('getSafeRedirect', () => {\n // Valid - safe redirect paths\n it.each([['/dashboard'], ['/admin/settings'], ['/projects?id=123'], ['/hello-world']])(\n 'should allow safe relative path: %s',\n (input) => {\n // If the input is a clean relative path, it should be returned as-is\n expect(getSafeRedirect(input, fallback)).toBe(input)\n },\n )\n\n // Invalid types or empty inputs\n it.each(['', null, undefined, 123, {}, []])(\n 'should fallback on invalid or non-string input: %s',\n (input) => {\n // If the input is not a valid string, it should return the fallback\n expect(getSafeRedirect(input as any, fallback)).toBe(fallback)\n },\n )\n\n // Unsafe redirect patterns\n it.each([\n '//example.com', // protocol-relative URL\n '/javascript:alert(1)', // JavaScript scheme\n '/JavaScript:alert(1)', // case-insensitive JavaScript\n '/http://unknown.com', // disguised external redirect\n '/https://unknown.com', // disguised external redirect\n '/%2Funknown.com', // encoded slash — could resolve to //\n '/\\\\/unknown.com', // escaped slash\n '/\\\\\\\\unknown.com', // double escaped slashes\n '/\\\\unknown.com', // single escaped slash\n '%2F%2Funknown.com', // fully encoded protocol-relative path\n '%2Fjavascript:alert(1)', // encoded JavaScript scheme\n ])('should block unsafe redirect: %s', (input) => {\n // All of these should return the fallback because they’re unsafe\n expect(getSafeRedirect(input, fallback)).toBe(fallback)\n })\n\n // Input with extra spaces should still be properly handled\n it('should trim whitespace before evaluating', () => {\n // A valid path with surrounding spaces should still be accepted\n expect(getSafeRedirect(' /dashboard ', fallback)).toBe('/dashboard')\n\n // An unsafe path with spaces should still be rejected\n expect(getSafeRedirect(' //example.com ', fallback)).toBe(fallback)\n })\n\n // If decoding the input fails (e.g., invalid percent encoding), it should not crash\n it('should return fallback on invalid encoding', () => {\n expect(getSafeRedirect('%E0%A4%A', fallback)).toBe(fallback)\n })\n})\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ;AAEhC,MAAMC,QAAA,GAAW,SAAS;AAAA;AAE1BC,QAAA,CAAS,mBAAmB;EAC1B;EACAC,EAAA,CAAGC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,mBAAmB,EAAE,CAAC,eAAe,CAAC,EACnF,uCACCC,KAAA;IACC;IACAC,MAAA,CAAON,eAAA,CAAgBK,KAAA,EAAOJ,QAAA,GAAWM,IAAI,CAACF,KAAA;EAChD;EAGF;EACAF,EAAA,CAAGC,IAAI,CAAC,CAAC,IAAI,MAAMI,SAAA,EAAW,KAAK,CAAC,GAAG,EAAE,CAAC,EACxC,sDACCH,KAAA;IACC;IACAC,MAAA,CAAON,eAAA,CAAgBK,KAAA,EAAcJ,QAAA,GAAWM,IAAI,CAACN,QAAA;EACvD;EAGF;EACAE,EAAA,CAAGC,IAAI,CAAC,CACN,iBACA,wBACA,wBACA,uBACA,wBACA,mBACA,mBACA,oBACA,kBACA,qBACA,yBACD,EAAE,oCAAqCC,KAAA;IACtC;IACAC,MAAA,CAAON,eAAA,CAAgBK,KAAA,EAAOJ,QAAA,GAAWM,IAAI,CAACN,QAAA;EAChD;EAEA;EACAE,EAAA,CAAG,4CAA4C;IAC7C;IACAG,MAAA,CAAON,eAAA,CAAgB,oBAAoBC,QAAA,GAAWM,IAAI,CAAC;IAE3D;IACAD,MAAA,CAAON,eAAA,CAAgB,uBAAuBC,QAAA,GAAWM,IAAI,CAACN,QAAA;EAChE;EAEA;EACAE,EAAA,CAAG,8CAA8C;IAC/CG,MAAA,CAAON,eAAA,CAAgB,YAAYC,QAAA,GAAWM,IAAI,CAACN,QAAA;EACrD;AACF","ignoreList":[]}
|