From afd0b54d1b32c968b532af665ca1d817e9c0b16e Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Fri, 6 Dec 2024 20:30:04 +0200 Subject: [PATCH] feat: export `sanitizeSelectParam`, `sanitizePopulateParam`, `senitizeJoinParams` utils (#9777) ### What? * Exposes to `payload` these functions: `sanitizeSelectParam`, `sanitizePopulateParam`, `senitizeJoinParams`. * Refactors `sanitizeSelect` and `sanitizePopulate` to `sanitizeSelectParam` and `sanitizePopulateParam` for clarity. * Moves them from `@payloadcms/next` to `payload` as they aren't related to next. ### Why? To use these functions externally, for example in custom endpoints. --- .../next/src/routes/rest/collections/create.ts | 8 +++----- .../next/src/routes/rest/collections/delete.ts | 8 +++----- .../src/routes/rest/collections/deleteByID.ts | 8 +++----- .../src/routes/rest/collections/duplicate.ts | 8 +++----- .../next/src/routes/rest/collections/find.ts | 15 ++++++++------- .../src/routes/rest/collections/findByID.ts | 14 ++++++++------ .../routes/rest/collections/findVersionByID.ts | 8 +++----- .../routes/rest/collections/findVersions.ts | 8 +++----- .../routes/rest/collections/restoreVersion.ts | 5 ++--- .../next/src/routes/rest/collections/update.ts | 8 +++----- .../src/routes/rest/collections/updateByID.ts | 8 +++----- .../next/src/routes/rest/globals/findOne.ts | 8 +++----- .../src/routes/rest/globals/findVersionByID.ts | 8 +++----- .../src/routes/rest/globals/findVersions.ts | 8 +++----- .../src/routes/rest/globals/restoreVersion.ts | 5 ++--- .../next/src/routes/rest/globals/update.ts | 8 +++----- .../routes/rest/utilities/sanitizePopulate.ts | 15 --------------- packages/payload/src/index.ts | 3 +++ .../src}/utilities/sanitizeJoinParams.ts | 4 ++-- .../src/utilities/sanitizePopulateParam.ts | 18 ++++++++++++++++++ .../src/utilities/sanitizeSelectParam.ts} | 6 +++--- test/_community/payload-types.ts | 2 +- 22 files changed, 83 insertions(+), 100 deletions(-) delete mode 100644 packages/next/src/routes/rest/utilities/sanitizePopulate.ts rename packages/{next/src/routes/rest => payload/src}/utilities/sanitizeJoinParams.ts (90%) create mode 100644 packages/payload/src/utilities/sanitizePopulateParam.ts rename packages/{next/src/routes/rest/utilities/sanitizeSelect.ts => payload/src/utilities/sanitizeSelectParam.ts} (70%) diff --git a/packages/next/src/routes/rest/collections/create.ts b/packages/next/src/routes/rest/collections/create.ts index f705bda012..9e742e1c86 100644 --- a/packages/next/src/routes/rest/collections/create.ts +++ b/packages/next/src/routes/rest/collections/create.ts @@ -1,13 +1,11 @@ import { getTranslation } from '@payloadcms/translations' import httpStatus from 'http-status' -import { createOperation } from 'payload' +import { createOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const create: CollectionRouteHandler = async ({ collection, req }) => { const { searchParams } = req @@ -21,9 +19,9 @@ export const create: CollectionRouteHandler = async ({ collection, req }) => { data: req.data, depth: isNumber(depth) ? depth : undefined, draft, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) return Response.json( diff --git a/packages/next/src/routes/rest/collections/delete.ts b/packages/next/src/routes/rest/collections/delete.ts index 1e2e329df0..5a93fd88ab 100644 --- a/packages/next/src/routes/rest/collections/delete.ts +++ b/packages/next/src/routes/rest/collections/delete.ts @@ -2,14 +2,12 @@ import type { Where } from 'payload' import { getTranslation } from '@payloadcms/translations' import httpStatus from 'http-status' -import { deleteOperation } from 'payload' +import { deleteOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const deleteDoc: CollectionRouteHandler = async ({ collection, req }) => { const { depth, overrideLock, populate, select, where } = req.query as { @@ -24,9 +22,9 @@ export const deleteDoc: CollectionRouteHandler = async ({ collection, req }) => collection, depth: isNumber(depth) ? Number(depth) : undefined, overrideLock: Boolean(overrideLock === 'true'), - populate: sanitizePopulate(populate), + populate: sanitizePopulateParam(populate), req, - select: sanitizeSelect(select), + select: sanitizeSelectParam(select), where, }) diff --git a/packages/next/src/routes/rest/collections/deleteByID.ts b/packages/next/src/routes/rest/collections/deleteByID.ts index 676a16fbf6..18771d44d2 100644 --- a/packages/next/src/routes/rest/collections/deleteByID.ts +++ b/packages/next/src/routes/rest/collections/deleteByID.ts @@ -1,13 +1,11 @@ import httpStatus from 'http-status' -import { deleteByIDOperation } from 'payload' +import { deleteByIDOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const deleteByID: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -29,9 +27,9 @@ export const deleteByID: CollectionRouteHandlerWithID = async ({ collection, depth: isNumber(depth) ? depth : undefined, overrideLock: Boolean(overrideLock === 'true'), - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) const headers = headersWithCors({ diff --git a/packages/next/src/routes/rest/collections/duplicate.ts b/packages/next/src/routes/rest/collections/duplicate.ts index 5a46ca7a50..57350f5355 100644 --- a/packages/next/src/routes/rest/collections/duplicate.ts +++ b/packages/next/src/routes/rest/collections/duplicate.ts @@ -1,14 +1,12 @@ import { getTranslation } from '@payloadcms/translations' import httpStatus from 'http-status' -import { duplicateOperation } from 'payload' +import { duplicateOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const duplicate: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -31,9 +29,9 @@ export const duplicate: CollectionRouteHandlerWithID = async ({ collection, depth: isNumber(depth) ? Number(depth) : undefined, draft, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) const message = req.t('general:successfullyDuplicated', { diff --git a/packages/next/src/routes/rest/collections/find.ts b/packages/next/src/routes/rest/collections/find.ts index 5e46eff9bc..e0ba92a0f9 100644 --- a/packages/next/src/routes/rest/collections/find.ts +++ b/packages/next/src/routes/rest/collections/find.ts @@ -1,16 +1,17 @@ import type { JoinQuery, Where } from 'payload' import httpStatus from 'http-status' -import { findOperation } from 'payload' +import { + findOperation, + sanitizeJoinParams, + sanitizePopulateParam, + sanitizeSelectParam, +} from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizeJoinParams } from '../utilities/sanitizeJoinParams.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' - export const find: CollectionRouteHandler = async ({ collection, req }) => { const { depth, draft, joins, limit, page, populate, select, sort, where } = req.query as { depth?: string @@ -31,9 +32,9 @@ export const find: CollectionRouteHandler = async ({ collection, req }) => { joins: sanitizeJoinParams(joins), limit: isNumber(limit) ? Number(limit) : undefined, page: isNumber(page) ? Number(page) : undefined, - populate: sanitizePopulate(populate), + populate: sanitizePopulateParam(populate), req, - select: sanitizeSelect(select), + select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, where, }) diff --git a/packages/next/src/routes/rest/collections/findByID.ts b/packages/next/src/routes/rest/collections/findByID.ts index 33e86ac3f8..50543bfb7d 100644 --- a/packages/next/src/routes/rest/collections/findByID.ts +++ b/packages/next/src/routes/rest/collections/findByID.ts @@ -1,16 +1,18 @@ import type { JoinQuery } from 'payload' import httpStatus from 'http-status' -import { findByIDOperation } from 'payload' +import { + findByIDOperation, + sanitizeJoinParams, + sanitizePopulateParam, + sanitizeSelectParam, +} from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizeJoinParams } from '../utilities/sanitizeJoinParams.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findByID: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -32,9 +34,9 @@ export const findByID: CollectionRouteHandlerWithID = async ({ depth: isNumber(depth) ? Number(depth) : undefined, draft: searchParams.get('draft') === 'true', joins: sanitizeJoinParams(req.query.joins as JoinQuery), - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) return Response.json(result, { diff --git a/packages/next/src/routes/rest/collections/findVersionByID.ts b/packages/next/src/routes/rest/collections/findVersionByID.ts index ab99120796..1161bef62d 100644 --- a/packages/next/src/routes/rest/collections/findVersionByID.ts +++ b/packages/next/src/routes/rest/collections/findVersionByID.ts @@ -1,13 +1,11 @@ import httpStatus from 'http-status' -import { findVersionByIDOperation } from 'payload' +import { findVersionByIDOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findVersionByID: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -27,9 +25,9 @@ export const findVersionByID: CollectionRouteHandlerWithID = async ({ id, collection, depth: isNumber(depth) ? Number(depth) : undefined, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) return Response.json(result, { diff --git a/packages/next/src/routes/rest/collections/findVersions.ts b/packages/next/src/routes/rest/collections/findVersions.ts index 0f7b38f18e..d029ce7278 100644 --- a/packages/next/src/routes/rest/collections/findVersions.ts +++ b/packages/next/src/routes/rest/collections/findVersions.ts @@ -1,14 +1,12 @@ import type { Where } from 'payload' import httpStatus from 'http-status' -import { findVersionsOperation } from 'payload' +import { findVersionsOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findVersions: CollectionRouteHandler = async ({ collection, req }) => { const { depth, limit, page, populate, select, sort, where } = req.query as { @@ -26,9 +24,9 @@ export const findVersions: CollectionRouteHandler = async ({ collection, req }) depth: isNumber(depth) ? Number(depth) : undefined, limit: isNumber(limit) ? Number(limit) : undefined, page: isNumber(page) ? Number(page) : undefined, - populate: sanitizePopulate(populate), + populate: sanitizePopulateParam(populate), req, - select: sanitizeSelect(select), + select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, where, }) diff --git a/packages/next/src/routes/rest/collections/restoreVersion.ts b/packages/next/src/routes/rest/collections/restoreVersion.ts index f48d5c0ed2..93d645263e 100644 --- a/packages/next/src/routes/rest/collections/restoreVersion.ts +++ b/packages/next/src/routes/rest/collections/restoreVersion.ts @@ -1,12 +1,11 @@ import httpStatus from 'http-status' -import { restoreVersionOperation } from 'payload' +import { restoreVersionOperation, sanitizePopulateParam } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' export const restoreVersion: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -28,7 +27,7 @@ export const restoreVersion: CollectionRouteHandlerWithID = async ({ collection, depth: isNumber(depth) ? Number(depth) : undefined, draft: draft === 'true' ? true : undefined, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, }) diff --git a/packages/next/src/routes/rest/collections/update.ts b/packages/next/src/routes/rest/collections/update.ts index f90ae9ec44..3f9b4ba5f9 100644 --- a/packages/next/src/routes/rest/collections/update.ts +++ b/packages/next/src/routes/rest/collections/update.ts @@ -2,14 +2,12 @@ import type { Where } from 'payload' import { getTranslation } from '@payloadcms/translations' import httpStatus from 'http-status' -import { updateOperation } from 'payload' +import { sanitizePopulateParam, sanitizeSelectParam, updateOperation } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const update: CollectionRouteHandler = async ({ collection, req }) => { const { depth, draft, limit, overrideLock, populate, select, where } = req.query as { @@ -29,9 +27,9 @@ export const update: CollectionRouteHandler = async ({ collection, req }) => { draft: draft === 'true', limit: isNumber(limit) ? Number(limit) : undefined, overrideLock: Boolean(overrideLock === 'true'), - populate: sanitizePopulate(populate), + populate: sanitizePopulateParam(populate), req, - select: sanitizeSelect(select), + select: sanitizeSelectParam(select), where, }) diff --git a/packages/next/src/routes/rest/collections/updateByID.ts b/packages/next/src/routes/rest/collections/updateByID.ts index f2868f4bad..f429e9d36c 100644 --- a/packages/next/src/routes/rest/collections/updateByID.ts +++ b/packages/next/src/routes/rest/collections/updateByID.ts @@ -1,13 +1,11 @@ import httpStatus from 'http-status' -import { updateByIDOperation } from 'payload' +import { sanitizePopulateParam, sanitizeSelectParam, updateByIDOperation } from 'payload' import { isNumber } from 'payload/shared' import type { CollectionRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' import { sanitizeCollectionID } from '../utilities/sanitizeCollectionID.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const updateByID: CollectionRouteHandlerWithID = async ({ id: incomingID, @@ -35,10 +33,10 @@ export const updateByID: CollectionRouteHandlerWithID = async ({ depth: isNumber(depth) ? Number(depth) : undefined, draft, overrideLock: Boolean(overrideLock === 'true'), - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), publishSpecificLocale, req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) let message = req.t('general:updatedSuccessfully') diff --git a/packages/next/src/routes/rest/globals/findOne.ts b/packages/next/src/routes/rest/globals/findOne.ts index 7ee4670161..9abd8488e7 100644 --- a/packages/next/src/routes/rest/globals/findOne.ts +++ b/packages/next/src/routes/rest/globals/findOne.ts @@ -1,12 +1,10 @@ import httpStatus from 'http-status' -import { findOneOperation } from 'payload' +import { findOneOperation, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { GlobalRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findOne: GlobalRouteHandler = async ({ globalConfig, req }) => { const { searchParams } = req @@ -17,9 +15,9 @@ export const findOne: GlobalRouteHandler = async ({ globalConfig, req }) => { depth: isNumber(depth) ? Number(depth) : undefined, draft: searchParams.get('draft') === 'true', globalConfig, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) return Response.json(result, { diff --git a/packages/next/src/routes/rest/globals/findVersionByID.ts b/packages/next/src/routes/rest/globals/findVersionByID.ts index e1c7f58d62..49adb2fbfa 100644 --- a/packages/next/src/routes/rest/globals/findVersionByID.ts +++ b/packages/next/src/routes/rest/globals/findVersionByID.ts @@ -1,12 +1,10 @@ import httpStatus from 'http-status' -import { findVersionByIDOperationGlobal } from 'payload' +import { findVersionByIDOperationGlobal, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { GlobalRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findVersionByID: GlobalRouteHandlerWithID = async ({ id, globalConfig, req }) => { const { searchParams } = req @@ -16,9 +14,9 @@ export const findVersionByID: GlobalRouteHandlerWithID = async ({ id, globalConf id, depth: isNumber(depth) ? Number(depth) : undefined, globalConfig, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) return Response.json(result, { diff --git a/packages/next/src/routes/rest/globals/findVersions.ts b/packages/next/src/routes/rest/globals/findVersions.ts index 7a2ede4bce..5cf888b7dd 100644 --- a/packages/next/src/routes/rest/globals/findVersions.ts +++ b/packages/next/src/routes/rest/globals/findVersions.ts @@ -1,14 +1,12 @@ import type { Where } from 'payload' import httpStatus from 'http-status' -import { findVersionsOperationGlobal } from 'payload' +import { findVersionsOperationGlobal, sanitizePopulateParam, sanitizeSelectParam } from 'payload' import { isNumber } from 'payload/shared' import type { GlobalRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const findVersions: GlobalRouteHandler = async ({ globalConfig, req }) => { const { depth, limit, page, populate, select, sort, where } = req.query as { @@ -26,9 +24,9 @@ export const findVersions: GlobalRouteHandler = async ({ globalConfig, req }) => globalConfig, limit: isNumber(limit) ? Number(limit) : undefined, page: isNumber(page) ? Number(page) : undefined, - populate: sanitizePopulate(populate), + populate: sanitizePopulateParam(populate), req, - select: sanitizeSelect(select), + select: sanitizeSelectParam(select), sort: typeof sort === 'string' ? sort.split(',') : undefined, where, }) diff --git a/packages/next/src/routes/rest/globals/restoreVersion.ts b/packages/next/src/routes/rest/globals/restoreVersion.ts index c2e2672b74..376a02c6dc 100644 --- a/packages/next/src/routes/rest/globals/restoreVersion.ts +++ b/packages/next/src/routes/rest/globals/restoreVersion.ts @@ -1,11 +1,10 @@ import httpStatus from 'http-status' -import { restoreVersionOperationGlobal } from 'payload' +import { restoreVersionOperationGlobal, sanitizePopulateParam } from 'payload' import { isNumber } from 'payload/shared' import type { GlobalRouteHandlerWithID } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' export const restoreVersion: GlobalRouteHandlerWithID = async ({ id, globalConfig, req }) => { const { searchParams } = req @@ -17,7 +16,7 @@ export const restoreVersion: GlobalRouteHandlerWithID = async ({ id, globalConfi depth: isNumber(depth) ? Number(depth) : undefined, draft: draft === 'true' ? true : undefined, globalConfig, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), req, }) diff --git a/packages/next/src/routes/rest/globals/update.ts b/packages/next/src/routes/rest/globals/update.ts index 0b9c306a8c..eb50911107 100644 --- a/packages/next/src/routes/rest/globals/update.ts +++ b/packages/next/src/routes/rest/globals/update.ts @@ -1,12 +1,10 @@ import httpStatus from 'http-status' -import { updateOperationGlobal } from 'payload' +import { sanitizePopulateParam, sanitizeSelectParam, updateOperationGlobal } from 'payload' import { isNumber } from 'payload/shared' import type { GlobalRouteHandler } from '../types.js' import { headersWithCors } from '../../../utilities/headersWithCors.js' -import { sanitizePopulate } from '../utilities/sanitizePopulate.js' -import { sanitizeSelect } from '../utilities/sanitizeSelect.js' export const update: GlobalRouteHandler = async ({ globalConfig, req }) => { const { searchParams } = req @@ -22,10 +20,10 @@ export const update: GlobalRouteHandler = async ({ globalConfig, req }) => { depth: isNumber(depth) ? Number(depth) : undefined, draft, globalConfig, - populate: sanitizePopulate(req.query.populate), + populate: sanitizePopulateParam(req.query.populate), publishSpecificLocale, req, - select: sanitizeSelect(req.query.select), + select: sanitizeSelectParam(req.query.select), }) let message = req.t('general:updatedSuccessfully') diff --git a/packages/next/src/routes/rest/utilities/sanitizePopulate.ts b/packages/next/src/routes/rest/utilities/sanitizePopulate.ts deleted file mode 100644 index 0bdcf18030..0000000000 --- a/packages/next/src/routes/rest/utilities/sanitizePopulate.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { PopulateType } from 'payload' - -import { sanitizeSelect } from './sanitizeSelect.js' - -export const sanitizePopulate = (unsanitizedPopulate: unknown): PopulateType | undefined => { - if (!unsanitizedPopulate || typeof unsanitizedPopulate !== 'object') { - return - } - - for (const k in unsanitizedPopulate) { - unsanitizedPopulate[k] = sanitizeSelect(unsanitizedPopulate[k]) - } - - return unsanitizedPopulate as PopulateType -} diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index a6f477edd1..45d2a7ec6d 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1355,6 +1355,9 @@ export { isValidID } from './utilities/isValidID.js' export { killTransaction } from './utilities/killTransaction.js' export { mapAsync } from './utilities/mapAsync.js' export { sanitizeFallbackLocale } from './utilities/sanitizeFallbackLocale.js' +export { sanitizeJoinParams } from './utilities/sanitizeJoinParams.js' +export { sanitizePopulateParam } from './utilities/sanitizePopulateParam.js' +export { sanitizeSelectParam } from './utilities/sanitizeSelectParam.js' export { traverseFields } from './utilities/traverseFields.js' export type { TraverseFieldsCallback } from './utilities/traverseFields.js' export { buildVersionCollectionFields } from './versions/buildCollectionFields.js' diff --git a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts b/packages/payload/src/utilities/sanitizeJoinParams.ts similarity index 90% rename from packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts rename to packages/payload/src/utilities/sanitizeJoinParams.ts index cdbd843c3d..a094d18d30 100644 --- a/packages/next/src/routes/rest/utilities/sanitizeJoinParams.ts +++ b/packages/payload/src/utilities/sanitizeJoinParams.ts @@ -1,6 +1,6 @@ -import type { JoinQuery } from 'payload' +import type { JoinQuery } from '../types/index.js' -import { isNumber } from 'payload/shared' +import { isNumber } from './isNumber.js' /** * Convert request JoinQuery object from strings to numbers diff --git a/packages/payload/src/utilities/sanitizePopulateParam.ts b/packages/payload/src/utilities/sanitizePopulateParam.ts new file mode 100644 index 0000000000..9240e54d48 --- /dev/null +++ b/packages/payload/src/utilities/sanitizePopulateParam.ts @@ -0,0 +1,18 @@ +import type { PopulateType } from '../types/index.js' + +import { sanitizeSelectParam } from './sanitizeSelectParam.js' + +/** + * Sanitizes REST populate query to PopulateType + */ +export const sanitizePopulateParam = (unsanitizedPopulate: unknown): PopulateType | undefined => { + if (!unsanitizedPopulate || typeof unsanitizedPopulate !== 'object') { + return + } + + for (const k in unsanitizedPopulate) { + unsanitizedPopulate[k] = sanitizeSelectParam(unsanitizedPopulate[k]) + } + + return unsanitizedPopulate as PopulateType +} diff --git a/packages/next/src/routes/rest/utilities/sanitizeSelect.ts b/packages/payload/src/utilities/sanitizeSelectParam.ts similarity index 70% rename from packages/next/src/routes/rest/utilities/sanitizeSelect.ts rename to packages/payload/src/utilities/sanitizeSelectParam.ts index a837ffc6d1..acc40134c2 100644 --- a/packages/next/src/routes/rest/utilities/sanitizeSelect.ts +++ b/packages/payload/src/utilities/sanitizeSelectParam.ts @@ -1,9 +1,9 @@ -import type { SelectType } from 'payload' +import type { SelectType } from '../types/index.js' /** * Sanitizes REST select query to SelectType */ -export const sanitizeSelect = (unsanitizedSelect: unknown): SelectType | undefined => { +export const sanitizeSelectParam = (unsanitizedSelect: unknown): SelectType | undefined => { if (unsanitizedSelect && typeof unsanitizedSelect === 'object') { for (const k in unsanitizedSelect) { if (unsanitizedSelect[k] === 'true') { @@ -11,7 +11,7 @@ export const sanitizeSelect = (unsanitizedSelect: unknown): SelectType | undefin } else if (unsanitizedSelect[k] === 'false') { unsanitizedSelect[k] = false } else if (typeof unsanitizedSelect[k] === 'object') { - sanitizeSelect(unsanitizedSelect[k]) + sanitizeSelectParam(unsanitizedSelect[k]) } } } diff --git a/test/_community/payload-types.ts b/test/_community/payload-types.ts index a259f6c7c5..fd6483846a 100644 --- a/test/_community/payload-types.ts +++ b/test/_community/payload-types.ts @@ -336,4 +336,4 @@ export interface Auth { declare module 'payload' { // @ts-ignore export interface GeneratedTypes extends Config {} -} +} \ No newline at end of file