@depup/payload 3.82.0-depup.0 → 3.86.0-depup.5
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/README.md +16 -14
- package/bin.js +11 -0
- package/changes.json +26 -18
- package/dist/admin/fields/Row.d.ts +2 -2
- package/dist/admin/fields/Row.d.ts.map +1 -1
- package/dist/admin/fields/Row.js.map +1 -1
- package/dist/admin/forms/Field.d.ts +1 -3
- package/dist/admin/forms/Field.d.ts.map +1 -1
- package/dist/admin/forms/Field.js.map +1 -1
- package/dist/admin/views/index.d.ts +5 -1
- package/dist/admin/views/index.d.ts.map +1 -1
- package/dist/admin/views/index.js.map +1 -1
- package/dist/bin/generateImportMap/index.d.ts.map +1 -1
- package/dist/bin/generateImportMap/index.js +1 -0
- package/dist/bin/generateImportMap/index.js.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateCollections.js +11 -0
- package/dist/bin/generateImportMap/iterateCollections.js.map +1 -1
- package/dist/bin/index.d.ts.map +1 -1
- package/dist/bin/index.js +3 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts +5 -0
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +21 -0
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/collections/config/sanitize.spec.js +120 -0
- package/dist/collections/config/sanitize.spec.js.map +1 -0
- package/dist/collections/config/types.d.ts +24 -1
- package/dist/collections/config/types.d.ts.map +1 -1
- package/dist/collections/config/types.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +1 -0
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +3 -0
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
- package/dist/collections/operations/restoreVersion.js +1 -0
- package/dist/collections/operations/restoreVersion.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +7 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts +9 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.d.ts.map +1 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js +170 -0
- package/dist/collections/operations/utilities/copyDataWithFreshRowIDs.js.map +1 -0
- package/dist/collections/operations/utilities/update.d.ts.map +1 -1
- package/dist/collections/operations/utilities/update.js +16 -8
- package/dist/collections/operations/utilities/update.js.map +1 -1
- package/dist/config/build.js +5 -4
- package/dist/config/build.js.map +1 -1
- package/dist/config/definePlugin.d.ts +41 -0
- package/dist/config/definePlugin.d.ts.map +1 -0
- package/dist/config/definePlugin.js +34 -0
- package/dist/config/definePlugin.js.map +1 -0
- package/dist/config/orderable/index.d.ts.map +1 -1
- package/dist/config/orderable/index.js +23 -0
- package/dist/config/orderable/index.js.map +1 -1
- package/dist/config/types.d.ts +30 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/email/normalizeSendEmailOptions.d.ts +13 -0
- package/dist/email/normalizeSendEmailOptions.d.ts.map +1 -0
- package/dist/email/normalizeSendEmailOptions.js +20 -0
- package/dist/email/normalizeSendEmailOptions.js.map +1 -0
- package/dist/email/types.d.ts +7 -2
- package/dist/email/types.d.ts.map +1 -1
- package/dist/email/types.js.map +1 -1
- package/dist/errors/APIError.d.ts +2 -1
- package/dist/errors/APIError.d.ts.map +1 -1
- package/dist/errors/APIError.js +1 -3
- package/dist/errors/APIError.js.map +1 -1
- package/dist/errors/ValidationError.d.ts +3 -1
- package/dist/errors/ValidationError.d.ts.map +1 -1
- package/dist/errors/ValidationError.js +1 -3
- package/dist/errors/ValidationError.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +3 -0
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitize.spec.js +66 -0
- package/dist/fields/config/sanitize.spec.js.map +1 -1
- package/dist/fields/config/types.d.ts +3 -2
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +2 -2
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/globals/operations/restoreVersion.d.ts.map +1 -1
- package/dist/globals/operations/restoreVersion.js +1 -0
- package/dist/globals/operations/restoreVersion.js.map +1 -1
- package/dist/index.bundled.d.ts +484 -115
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -2
- package/dist/index.js.map +1 -1
- package/dist/queues/config/collection.d.ts.map +1 -1
- package/dist/queues/config/collection.js +0 -1
- package/dist/queues/config/collection.js.map +1 -1
- package/dist/queues/endpoints/run.d.ts.map +1 -1
- package/dist/queues/endpoints/run.js +0 -3
- package/dist/queues/endpoints/run.js.map +1 -1
- package/dist/queues/errors/calculateBackoffWaitUntil.d.ts.map +1 -1
- package/dist/queues/errors/calculateBackoffWaitUntil.js +5 -13
- package/dist/queues/errors/calculateBackoffWaitUntil.js.map +1 -1
- package/dist/queues/errors/handleWorkflowError.d.ts.map +1 -1
- package/dist/queues/errors/handleWorkflowError.js +9 -1
- package/dist/queues/errors/handleWorkflowError.js.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js +2 -1
- package/dist/queues/operations/handleSchedules/countRunnableOrActiveJobsForQueue.js.map +1 -1
- package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js +1 -1
- package/dist/queues/operations/handleSchedules/defaultAfterSchedule.js.map +1 -1
- package/dist/queues/operations/handleSchedules/index.d.ts.map +1 -1
- package/dist/queues/operations/handleSchedules/index.js +4 -1
- package/dist/queues/operations/handleSchedules/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +44 -26
- package/dist/queues/operations/runJobs/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJSONJob/index.js +1 -0
- package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
- package/dist/queues/utilities/updateJob.d.ts.map +1 -1
- package/dist/queues/utilities/updateJob.js +2 -1
- package/dist/queues/utilities/updateJob.js.map +1 -1
- package/dist/types/index.d.ts +4 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/checkFileAccess.d.ts.map +1 -1
- package/dist/uploads/checkFileAccess.js +30 -9
- package/dist/uploads/checkFileAccess.js.map +1 -1
- package/dist/uploads/checkFileRestrictions.d.ts.map +1 -1
- package/dist/uploads/checkFileRestrictions.js +48 -8
- package/dist/uploads/checkFileRestrictions.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js +2 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js +29 -0
- package/dist/uploads/fetchAPI-multipart/isEligibleRequest.spec.js.map +1 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +11 -2
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/generateFileData.d.ts +2 -1
- package/dist/uploads/generateFileData.d.ts.map +1 -1
- package/dist/uploads/generateFileData.js +5 -2
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getSafeFilename.d.ts +9 -4
- package/dist/uploads/getSafeFilename.d.ts.map +1 -1
- package/dist/uploads/getSafeFilename.js +5 -5
- package/dist/uploads/getSafeFilename.js.map +1 -1
- package/dist/uploads/types.d.ts +4 -0
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.d.ts.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.js +16 -3
- package/dist/utilities/addDataAndFileToRequest.js.map +1 -1
- package/dist/utilities/addDataAndFileToRequest.spec.js +41 -0
- package/dist/utilities/addDataAndFileToRequest.spec.js.map +1 -0
- package/dist/utilities/createPayloadRequest.d.ts.map +1 -1
- package/dist/utilities/createPayloadRequest.js +1 -0
- package/dist/utilities/createPayloadRequest.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.d.ts.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.js +74 -31
- package/dist/utilities/filterDataToSelectedLocales.js.map +1 -1
- package/dist/utilities/filterDataToSelectedLocales.spec.js +337 -0
- package/dist/utilities/filterDataToSelectedLocales.spec.js.map +1 -1
- package/dist/utilities/formatErrors.d.ts +1 -1
- package/dist/utilities/formatErrors.d.ts.map +1 -1
- package/dist/utilities/formatErrors.js +4 -7
- package/dist/utilities/formatErrors.js.map +1 -1
- package/dist/utilities/formatErrors.spec.js +101 -0
- package/dist/utilities/formatErrors.spec.js.map +1 -0
- package/dist/utilities/isURLAllowed.d.ts.map +1 -1
- package/dist/utilities/isURLAllowed.js +9 -3
- package/dist/utilities/isURLAllowed.js.map +1 -1
- package/dist/utilities/isURLAllowed.spec.js +78 -0
- package/dist/utilities/isURLAllowed.spec.js.map +1 -0
- package/dist/utilities/parseParams/index.d.ts +1 -1
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js +3 -0
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/parseParams/index.spec.js +24 -0
- package/dist/utilities/parseParams/index.spec.js.map +1 -1
- package/dist/utilities/profiling.d.ts +12 -0
- package/dist/utilities/profiling.d.ts.map +1 -0
- package/dist/utilities/profiling.js +56 -0
- package/dist/utilities/profiling.js.map +1 -0
- package/dist/utilities/profiling.spec.js +53 -0
- package/dist/utilities/profiling.spec.js.map +1 -0
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -1
- package/dist/versions/schedule/job.d.ts.map +1 -1
- package/dist/versions/schedule/job.js +4 -1
- package/dist/versions/schedule/job.js.map +1 -1
- package/dist/versions/updateLatestVersion.d.ts.map +1 -1
- package/dist/versions/updateLatestVersion.js +55 -8
- package/dist/versions/updateLatestVersion.js.map +1 -1
- package/package.json +44 -37
package/dist/email/types.d.ts
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import type { SendMailOptions as NodemailerSendMailOptions } from 'nodemailer';
|
|
2
|
+
import type { Address } from 'nodemailer/lib/mailer';
|
|
2
3
|
import type { Payload } from '../types/index.js';
|
|
3
4
|
type Prettify<T> = {
|
|
4
5
|
[K in keyof T]: T[K];
|
|
5
6
|
} & NonNullable<unknown>;
|
|
6
7
|
/**
|
|
7
|
-
* Options for sending an email. Allows access to the PayloadRequest object
|
|
8
|
+
* Options for sending an email. Allows access to the PayloadRequest object.
|
|
9
|
+
*
|
|
10
|
+
* @todo: Remove in v4. See `normalizeSendEmailOptions` for details.
|
|
8
11
|
*/
|
|
9
|
-
export type SendEmailOptions = Prettify<
|
|
12
|
+
export type SendEmailOptions = Prettify<{
|
|
13
|
+
from?: Address | string;
|
|
14
|
+
} & Omit<NodemailerSendMailOptions, 'from'>>;
|
|
10
15
|
/**
|
|
11
16
|
* Email adapter after it has been initialized. This is used internally by Payload.
|
|
12
17
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/email/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,yBAAyB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/email/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,IAAI,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAEhD,KAAK,QAAQ,CAAC,CAAC,IAAI;KAChB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACrB,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAExB;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CACrC;IACE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAA;CACxB,GAAG,IAAI,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAC5C,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,uBAAuB,CAAC,kBAAkB,GAAG,OAAO,IAAI,UAAU,CAC5E,YAAY,CAAC,kBAAkB,CAAC,CACjC,CAAA;AAED;;;;GAIG;AAEH,MAAM,MAAM,YAAY,CAAC,kBAAkB,GAAG,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,KAAK;IAC9F,kBAAkB,EAAE,MAAM,CAAA;IAC1B,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAA;CACtE,CAAA"}
|
package/dist/email/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/email/types.ts"],"sourcesContent":["import type { SendMailOptions as NodemailerSendMailOptions } from 'nodemailer'\n\nimport type { Payload } from '../types/index.js'\n\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & NonNullable<unknown>\n\n/**\n * Options for sending an email. Allows access to the PayloadRequest object
|
|
1
|
+
{"version":3,"sources":["../../src/email/types.ts"],"sourcesContent":["import type { SendMailOptions as NodemailerSendMailOptions } from 'nodemailer'\nimport type { Address } from 'nodemailer/lib/mailer'\n\nimport type { Payload } from '../types/index.js'\n\ntype Prettify<T> = {\n [K in keyof T]: T[K]\n} & NonNullable<unknown>\n\n/**\n * Options for sending an email. Allows access to the PayloadRequest object.\n *\n * @todo: Remove in v4. See `normalizeSendEmailOptions` for details.\n */\nexport type SendEmailOptions = Prettify<\n {\n from?: Address | string\n } & Omit<NodemailerSendMailOptions, 'from'>\n>\n\n/**\n * Email adapter after it has been initialized. This is used internally by Payload.\n */\nexport type InitializedEmailAdapter<TSendEmailResponse = unknown> = ReturnType<\n EmailAdapter<TSendEmailResponse>\n>\n\n/**\n * Email adapter interface. Allows a generic type for the response of the sendEmail method.\n *\n * This is the interface to use if you are creating a new email adapter.\n */\n\nexport type EmailAdapter<TSendEmailResponse = unknown> = ({ payload }: { payload: Payload }) => {\n defaultFromAddress: string\n defaultFromName: string\n name: string\n sendEmail: (message: SendEmailOptions) => Promise<TSendEmailResponse>\n}\n"],"names":[],"mappings":"AA2BA;;;;CAIC,GAED,WAKC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"APIError.d.ts","sourceRoot":"","sources":["../../src/errors/APIError.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"APIError.d.ts","sourceRoot":"","sources":["../../src/errors/APIError.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,eAAO,MAAM,YAAY,aAAa,CAAA;AAEtC,cAAM,eAAe,CAAC,KAAK,SAAS,MAAM,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAE,SAAQ,KAAK;IACpF,IAAI,EAAE,KAAK,CAAA;IAEX,aAAa,EAAE,OAAO,CAAA;IAEtB,QAAQ,EAAE,OAAO,CAAA;IAEjB,MAAM,EAAE,MAAM,CAAA;gBAEF,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO;CAa5E;AAED;;;GAGG;AACH,qBAAa,QAAQ,CACnB,KAAK,SAAS,IAAI,GAAG,MAAM,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAE/D,SAAQ,eAAe,CAAC,KAAK,CAAC;IAC9B;;;;;;OAMG;gBAED,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,MAAyC,EACjD,IAAI,GAAE,KAAa,EACnB,QAAQ,CAAC,EAAE,OAAO;CASrB"}
|
package/dist/errors/APIError.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { status as httpStatus } from 'http-status';
|
|
2
|
-
|
|
3
|
-
export let APIErrorName = 'APIError';
|
|
2
|
+
/** @deprecated Use `instanceof APIError` instead of name comparison. */ export const APIErrorName = 'APIError';
|
|
4
3
|
class ExtendableError extends Error {
|
|
5
4
|
data;
|
|
6
5
|
isOperational;
|
|
@@ -11,7 +10,6 @@ class ExtendableError extends Error {
|
|
|
11
10
|
// show data in cause
|
|
12
11
|
cause: data
|
|
13
12
|
});
|
|
14
|
-
APIErrorName = this.constructor.name;
|
|
15
13
|
this.name = this.constructor.name;
|
|
16
14
|
this.message = message;
|
|
17
15
|
this.status = status;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/APIError.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/errors/APIError.ts"],"sourcesContent":["import { status as httpStatus } from 'http-status'\n\n/** @deprecated Use `instanceof APIError` instead of name comparison. */\nexport const APIErrorName = 'APIError'\n\nclass ExtendableError<TData extends object = { [key: string]: unknown }> extends Error {\n data: TData\n\n isOperational: boolean\n\n isPublic: boolean\n\n status: number\n\n constructor(message: string, status: number, data: TData, isPublic: boolean) {\n super(message, {\n // show data in cause\n cause: data,\n })\n this.name = this.constructor.name\n this.message = message\n this.status = status\n this.data = data\n this.isPublic = isPublic\n this.isOperational = true // This is required since bluebird 4 doesn't append it anymore.\n Error.captureStackTrace(this, this.constructor)\n }\n}\n\n/**\n * Class representing an API error.\n * @extends ExtendableError\n */\nexport class APIError<\n TData extends null | object = { [key: string]: unknown } | null,\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n> extends ExtendableError<TData> {\n /**\n * Creates an API error.\n * @param {string} message - Error message.\n * @param {number} status - HTTP status code of error.\n * @param {object} data - response data to be returned.\n * @param {boolean} isPublic - Whether the message should be visible to user or not.\n */\n constructor(\n message: string,\n status: number = httpStatus.INTERNAL_SERVER_ERROR,\n data: TData = null!,\n isPublic?: boolean,\n ) {\n super(\n message,\n status,\n data,\n typeof isPublic === 'boolean' ? isPublic : status !== httpStatus.INTERNAL_SERVER_ERROR,\n )\n }\n}\n"],"names":["status","httpStatus","APIErrorName","ExtendableError","Error","data","isOperational","isPublic","message","cause","name","captureStackTrace","APIError","INTERNAL_SERVER_ERROR"],"mappings":"AAAA,SAASA,UAAUC,UAAU,QAAQ,cAAa;AAElD,sEAAsE,GACtE,OAAO,MAAMC,eAAe,WAAU;AAEtC,MAAMC,wBAA2EC;IAC/EC,KAAW;IAEXC,cAAsB;IAEtBC,SAAiB;IAEjBP,OAAc;IAEd,YAAYQ,OAAe,EAAER,MAAc,EAAEK,IAAW,EAAEE,QAAiB,CAAE;QAC3E,KAAK,CAACC,SAAS;YACb,qBAAqB;YACrBC,OAAOJ;QACT;QACA,IAAI,CAACK,IAAI,GAAG,IAAI,CAAC,WAAW,CAACA,IAAI;QACjC,IAAI,CAACF,OAAO,GAAGA;QACf,IAAI,CAACR,MAAM,GAAGA;QACd,IAAI,CAACK,IAAI,GAAGA;QACZ,IAAI,CAACE,QAAQ,GAAGA;QAChB,IAAI,CAACD,aAAa,GAAG,MAAK,+DAA+D;QACzFF,MAAMO,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW;IAChD;AACF;AAEA;;;CAGC,GACD,OAAO,MAAMC,iBAGHT;IACR;;;;;;GAMC,GACD,YACEK,OAAe,EACfR,SAAiBC,WAAWY,qBAAqB,EACjDR,OAAc,IAAK,EACnBE,QAAkB,CAClB;QACA,KAAK,CACHC,SACAR,QACAK,MACA,OAAOE,aAAa,YAAYA,WAAWP,WAAWC,WAAWY,qBAAqB;IAE1F;AACF"}
|
|
@@ -2,11 +2,13 @@ import type { TFunction } from '@payloadcms/translations';
|
|
|
2
2
|
import type { LabelFunction, StaticLabel } from '../config/types.js';
|
|
3
3
|
import type { PayloadRequest } from '../types/index.js';
|
|
4
4
|
import { APIError } from './APIError.js';
|
|
5
|
-
|
|
5
|
+
/** @deprecated Use `instanceof ValidationError` instead of name comparison. */
|
|
6
|
+
export declare const ValidationErrorName = "ValidationError";
|
|
6
7
|
export type ValidationFieldError = {
|
|
7
8
|
label?: LabelFunction | StaticLabel;
|
|
8
9
|
message: string;
|
|
9
10
|
path: string;
|
|
11
|
+
tableName?: string;
|
|
10
12
|
};
|
|
11
13
|
export declare class ValidationError extends APIError<{
|
|
12
14
|
collection?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValidationError.d.ts","sourceRoot":"","sources":["../../src/errors/ValidationError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"ValidationError.d.ts","sourceRoot":"","sources":["../../src/errors/ValidationError.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAKzD,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,oBAAoB,CAAA;AAEpD,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,CAAA;IAEnC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,qBAAa,eAAgB,SAAQ,QAAQ,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,oBAAoB,EAAE,CAAA;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAC;gBAEE,OAAO,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,oBAAoB,EAAE,CAAA;QAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;QACpB;;WAEG;QACH,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;KAC9B,EACD,CAAC,CAAC,EAAE,SAAS;CA0ChB"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { en } from '@payloadcms/translations/languages/en';
|
|
2
2
|
import { status as httpStatus } from 'http-status';
|
|
3
3
|
import { APIError } from './APIError.js';
|
|
4
|
-
|
|
5
|
-
export let ValidationErrorName = 'ValidationError';
|
|
4
|
+
/** @deprecated Use `instanceof ValidationError` instead of name comparison. */ export const ValidationErrorName = 'ValidationError';
|
|
6
5
|
export class ValidationError extends APIError {
|
|
7
6
|
constructor(results, t){
|
|
8
7
|
const message = t ? t('error:followingFieldsInvalid', {
|
|
@@ -32,7 +31,6 @@ export class ValidationError extends APIError {
|
|
|
32
31
|
}
|
|
33
32
|
return f.path;
|
|
34
33
|
}).join(', ')}`, httpStatus.BAD_REQUEST, results);
|
|
35
|
-
ValidationErrorName = this.constructor.name;
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
36
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/errors/ValidationError.ts"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\nimport { status as httpStatus } from 'http-status'\n\nimport type { LabelFunction, StaticLabel } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { APIError } from './APIError.js'\n\n
|
|
1
|
+
{"version":3,"sources":["../../src/errors/ValidationError.ts"],"sourcesContent":["import type { TFunction } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\nimport { status as httpStatus } from 'http-status'\n\nimport type { LabelFunction, StaticLabel } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { APIError } from './APIError.js'\n\n/** @deprecated Use `instanceof ValidationError` instead of name comparison. */\nexport const ValidationErrorName = 'ValidationError'\n\nexport type ValidationFieldError = {\n label?: LabelFunction | StaticLabel\n // The error message to display for this field\n message: string\n path: string\n tableName?: string\n}\n\nexport class ValidationError extends APIError<{\n collection?: string\n errors: ValidationFieldError[]\n global?: string\n}> {\n constructor(\n results: {\n collection?: string\n errors: ValidationFieldError[]\n global?: string\n id?: number | string\n /**\n * req needs to be passed through (if you have one) in order to resolve label functions that may be part of the errors array\n */\n req?: Partial<PayloadRequest>\n },\n t?: TFunction,\n ) {\n const message = t\n ? t('error:followingFieldsInvalid', { count: results.errors.length })\n : results.errors.length === 1\n ? en.translations.error.followingFieldsInvalid_one\n : en.translations.error.followingFieldsInvalid_other\n\n const req = results.req\n // delete to avoid logging the whole req\n delete results['req']\n\n super(\n `${message} ${results.errors\n .map((f) => {\n if (f.label) {\n if (typeof f.label === 'function') {\n if (!req || !req.i18n || !req.t) {\n return f.path\n }\n\n return f.label({ i18n: req.i18n, t: req.t })\n }\n\n if (typeof f.label === 'object') {\n if (req?.i18n?.language) {\n return f.label[req.i18n.language]\n }\n\n return f.label[Object.keys(f.label)[0]!]\n }\n\n return f.label\n }\n\n return f.path\n })\n .join(', ')}`,\n httpStatus.BAD_REQUEST,\n results,\n )\n }\n}\n"],"names":["en","status","httpStatus","APIError","ValidationErrorName","ValidationError","results","t","message","count","errors","length","translations","error","followingFieldsInvalid_one","followingFieldsInvalid_other","req","map","f","label","i18n","path","language","Object","keys","join","BAD_REQUEST"],"mappings":"AAEA,SAASA,EAAE,QAAQ,wCAAuC;AAC1D,SAASC,UAAUC,UAAU,QAAQ,cAAa;AAKlD,SAASC,QAAQ,QAAQ,gBAAe;AAExC,6EAA6E,GAC7E,OAAO,MAAMC,sBAAsB,kBAAiB;AAUpD,OAAO,MAAMC,wBAAwBF;IAKnC,YACEG,OASC,EACDC,CAAa,CACb;QACA,MAAMC,UAAUD,IACZA,EAAE,gCAAgC;YAAEE,OAAOH,QAAQI,MAAM,CAACC,MAAM;QAAC,KACjEL,QAAQI,MAAM,CAACC,MAAM,KAAK,IACxBX,GAAGY,YAAY,CAACC,KAAK,CAACC,0BAA0B,GAChDd,GAAGY,YAAY,CAACC,KAAK,CAACE,4BAA4B;QAExD,MAAMC,MAAMV,QAAQU,GAAG;QACvB,wCAAwC;QACxC,OAAOV,OAAO,CAAC,MAAM;QAErB,KAAK,CACH,GAAGE,QAAQ,CAAC,EAAEF,QAAQI,MAAM,CACzBO,GAAG,CAAC,CAACC;YACJ,IAAIA,EAAEC,KAAK,EAAE;gBACX,IAAI,OAAOD,EAAEC,KAAK,KAAK,YAAY;oBACjC,IAAI,CAACH,OAAO,CAACA,IAAII,IAAI,IAAI,CAACJ,IAAIT,CAAC,EAAE;wBAC/B,OAAOW,EAAEG,IAAI;oBACf;oBAEA,OAAOH,EAAEC,KAAK,CAAC;wBAAEC,MAAMJ,IAAII,IAAI;wBAAEb,GAAGS,IAAIT,CAAC;oBAAC;gBAC5C;gBAEA,IAAI,OAAOW,EAAEC,KAAK,KAAK,UAAU;oBAC/B,IAAIH,KAAKI,MAAME,UAAU;wBACvB,OAAOJ,EAAEC,KAAK,CAACH,IAAII,IAAI,CAACE,QAAQ,CAAC;oBACnC;oBAEA,OAAOJ,EAAEC,KAAK,CAACI,OAAOC,IAAI,CAACN,EAAEC,KAAK,CAAC,CAAC,EAAE,CAAE;gBAC1C;gBAEA,OAAOD,EAAEC,KAAK;YAChB;YAEA,OAAOD,EAAEG,IAAI;QACf,GACCI,IAAI,CAAC,OAAO,EACfvB,WAAWwB,WAAW,EACtBpB;IAEJ;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA8BvC,KAAK,kBAAkB,GAAG;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,+RAkBvB,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/fields/config/sanitize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACf,MAAM,mCAAmC,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AA8BvC,KAAK,kBAAkB,GAAG;IACxB,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,EAAE,OAAO,CAAA;IAC1B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC;;;;OAIG;IACH,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC;;;OAGG;IACH,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF;;;OAGG;IACH,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,cAAc,CAAA;IACtB;;OAEG;IACH,cAAc,CAAC,EAAE,iBAAiB,EAAE,CAAA;IACpC,eAAe,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,gBAAgB,EAAE,MAAM,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;IAClC,+BAA+B,EAAE,OAAO,CAAA;IACxC,4BAA4B,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAChF,kBAAkB,EAAE,IAAI,GAAG,MAAM,EAAE,CAAA;CACpC,CAAA;AAED,KAAK,mBAAmB,GAAG;IACzB;;OAEG;IACH,cAAc,CAAC,EAAE,KAAK,EAAE,CAAA;CACzB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,+RAkBvB,iBAAiB,KAAG,OAAO,CAAC,mBAAmB,CA4cjD,CAAA;AAED,eAAO,MAAM,cAAc,yRAiBxB,kBAAkB,KAAG,OAAO,CAAC,KAAK,EAAE,CAqCtC,CAAA"}
|
|
@@ -176,6 +176,9 @@ import { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } f
|
|
|
176
176
|
if (!field.admin) {
|
|
177
177
|
field.admin = {};
|
|
178
178
|
}
|
|
179
|
+
if ('virtual' in field && field.virtual && field.admin.readOnly !== false && fieldAffectsData) {
|
|
180
|
+
field.admin.readOnly = true;
|
|
181
|
+
}
|
|
179
182
|
// Make sure that the richText field has an editor
|
|
180
183
|
if (field.type === 'richText') {
|
|
181
184
|
const sanitizeRichText = async (_config)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { OrderableJoinInfo } from './sanitizeJoinField.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } from './types.js'\n\ntype SanitizeFieldsArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport type SanitizeFieldArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames: Set<string>\n field: Field\n globalConfig?: GlobalConfig\n /**\n * The index of this field in the parent fields array\n */\n index: number\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField: boolean\n joinPath: string\n /**\n * When not passed in, assume that joins are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n parentIndexPath: string\n parentIsLocalized: boolean\n parentSchemaPath: string\n polymorphicJoins?: SanitizedJoin[]\n requireFieldLevelRichTextEditor: boolean\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships: null | string[]\n}\n\ntype SanitizeFieldResult = {\n /**\n * Fields to insert after this field (e.g., timezone field)\n */\n fieldsToInsert?: Field[]\n}\n\n/**\n * Sanitize a single field. Handles all per-field logic including:\n * - Validation setup\n * - Hooks/access/admin defaults\n * - Type-specific handling\n * - Recursive sanitization of nested fields\n *\n * @returns Result containing any fields to insert after this one\n */\nexport const sanitizeField = async ({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldArgs): Promise<SanitizeFieldResult> => {\n const result: SanitizeFieldResult = {}\n\n if ('_sanitized' in field && field._sanitized === true) {\n return result\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index,\n parentIndexPath,\n parentSchemaPath,\n })\n\n // Reserved field name checks\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // Invalid field name check\n if (fieldAffectsData && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n // Checkbox default\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n // Join field sanitization\n if (field.type === 'join') {\n sanitizeJoinField({\n config,\n field,\n joinPath,\n joins,\n orderableJoins,\n parentIsLocalized,\n polymorphicJoins,\n })\n }\n\n // Relationship/upload validation\n if (field.type === 'relationship' || field.type === 'upload') {\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n field.minRows = field.min\n }\n\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n field.maxRows = field.max\n }\n }\n\n // Upload isSortable default\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n // Array ID field\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n // Blocks/array labels\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (\n process.env.NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized !== 'true' &&\n parentIsLocalized &&\n // @todo PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY=true will be the default in 4.0\n process.env.PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY !== 'true'\n ) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n if ('virtual' in field && field.virtual) {\n field.validate = (): true => true\n } else {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n!.translations = deepMergeSimple(config.i18n!.translations!, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n if (field.blockReferences && field.blocks?.length) {\n throw new Error('You cannot have both blockReferences and blocks in the same blocks field')\n }\n\n const blockSlugs: string[] = []\n\n for (const block of field.blockReferences ?? field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\n\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]!\n\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n // Timezone field insertion\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n result.fieldsToInsert = [timezoneField]\n }\n\n // Virtual field handling\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const configFields = (collectionConfig || globalConfig)?.fields\n if (configFields) {\n let flattenFields = flattenAllFields({ fields: configFields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [idx, segment] of paths.entries()) {\n const foundField = flattenFields.find((e) => e.name === segment)\n if (!foundField) {\n break\n }\n\n if (\n foundField.type === 'group' ||\n foundField.type === 'tab' ||\n foundField.type === 'array'\n ) {\n flattenFields = foundField.flattenedFields\n } else if (\n (foundField.type === 'relationship' || foundField.type === 'upload') &&\n idx !== paths.length - 1 &&\n typeof foundField.relationTo === 'string'\n ) {\n if (\n foundField.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find(\n (e) => e.slug === foundField.relationTo,\n )\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n\n return result\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n orderableJoins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldsArgs): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const result = await sanitizeField({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index: i,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n fields[i] = field\n\n if (result.fieldsToInsert?.length) {\n fields.splice(i + 1, 0, ...result.fieldsToInsert)\n i += result.fieldsToInsert.length\n }\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeField","collectionConfig","config","existingFieldNames","field","globalConfig","index","isTopLevelField","joinPath","joins","orderableJoins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","result","_sanitized","type","indexPath","schemaPath","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","length","Error","relationships","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","fields","hasCustomID","some","f","push","labels","has","add","localized","shouldDisableLocalized","localization","process","env","NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized","PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY","validate","virtual","defaultValidate","val","options","hooks","access","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","blockReferences","blockSlugs","block","blockSlug","slug","concat","sanitizeFields","Set","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","disableBulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","fieldsToInsert","virtualField","configFields","flattenFields","paths","split","isHasMany","idx","segment","entries","foundField","find","e","flattenedFields","hasMany","relatedCollection","collections","i","splice"],"mappings":"AAAA,SAASA,eAAe,QAAQ,qCAAoC;AAYpE,SACEC,kBAAkB,EAClBC,oBAAoB,EACpBC,gBAAgB,EAChBC,wBAAwB,EACxBC,iBAAiB,EACjBC,gBAAgB,QACX,wBAAuB;AAC9B,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,gBAAgB,QAAQ,sCAAqC;AACtE,SAASC,YAAY,EAAEC,OAAO,QAAQ,kCAAiC;AACvE,SAASC,iBAAiB,QAAQ,uCAAsC;AACxE,SAASC,eAAe,QAAQ,mCAAkC;AAClE,SAASC,WAAW,QAAQ,+BAA8B;AAC1D,SAASC,iBAAiB,QAAQ,sCAAqC;AACvE,SAASC,gBAAgB,QAAQ,6CAA4C;AAC7E,SAASC,aAAa,QAAQ,sBAAqB;AACnD,SAASC,yBAAyB,QAAQ,kCAAiC;AAC3E,SAASC,WAAW,QAAQ,oBAAmB;AAC/C,SACEC,wBAAwB,EACxBC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,wBAAwB,QACnB,0BAAyB;AAChC,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,oBAAoBC,iBAAiB,EAAEC,gBAAgB,EAAEC,UAAU,QAAQ,aAAY;AAyFhG;;;;;;;;CAQC,GACD,OAAO,MAAMC,gBAAgB,OAAO,EAClCC,gBAAgB,EAChBC,MAAM,EACNC,kBAAkB,EAClBC,KAAK,EACLC,YAAY,EACZC,KAAK,EACLC,eAAe,EACfC,QAAQ,EACRC,KAAK,EACLC,cAAc,EACdC,eAAe,EACfC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAgB,EAChBC,+BAA+B,EAC/BC,4BAA4B,EAC5BC,kBAAkB,EACA;IAClB,MAAMC,SAA8B,CAAC;IAErC,IAAI,gBAAgBd,SAASA,MAAMe,UAAU,KAAK,MAAM;QACtD,OAAOD;IACT;IAEA,IAAI,gBAAgBd,OAAO;QACzBA,MAAMe,UAAU,GAAG;IACrB;IAEA,IAAI,CAACf,MAAMgB,IAAI,EAAE;QACf,MAAM,IAAI1C,iBAAiB0B;IAC7B;IAEA,MAAMR,mBAAmBC,kBAAkBO;IAE3C,MAAM,EAAEiB,SAAS,EAAEC,UAAU,EAAE,GAAGlC,cAAc;QAC9CgB;QACAE;QACAK;QACAE;IACF;IAEA,6BAA6B;IAC7B,IAAIN,mBAAmBX,oBAAoBQ,MAAMmB,IAAI,EAAE;QACrD,IAAItB,oBAAoBA,iBAAiBuB,MAAM,EAAE;YAC/C,IAAI/B,6BAA6BgC,QAAQ,CAACrB,MAAMmB,IAAI,GAAG;gBACrD,MAAM,IAAI5C,kBAAkByB,OAAOA,MAAMmB,IAAI;YAC/C;QACF;QAEA,IACEtB,oBACAA,iBAAiByB,IAAI,IACrB,OAAOzB,iBAAiByB,IAAI,KAAK,YACjC,CAACzB,iBAAiByB,IAAI,CAACC,oBAAoB,EAC3C;YACA,IAAInC,2BAA2BiC,QAAQ,CAACrB,MAAMmB,IAAI,GAAG;gBACnD,MAAM,IAAI5C,kBAAkByB,OAAOA,MAAMmB,IAAI;YAC/C;YAEA,IAAItB,iBAAiByB,IAAI,CAACE,MAAM,EAAE;gBAChC,oFAAoF;gBACpF,IAAIrC,yBAAyBkC,QAAQ,CAACrB,MAAMmB,IAAI,GAAG;oBACjD,MAAM,IAAI5C,kBAAkByB,OAAOA,MAAMmB,IAAI;gBAC/C;gBAEA,oFAAoF;gBACpF,IAAI7B,yBAAyB+B,QAAQ,CAACrB,MAAMmB,IAAI,GAAG;oBACjD,MAAM,IAAI5C,kBAAkByB,OAAOA,MAAMmB,IAAI;gBAC/C;YACF;QACF;IACF;IAEA,2BAA2B;IAC3B,IAAI3B,oBAAoBQ,MAAMmB,IAAI,CAACE,QAAQ,CAAC,MAAM;QAChD,MAAM,IAAIlD,iBAAiB6B,OAAOA,MAAMmB,IAAI;IAC9C;IAEA,aAAa;IACb,IACE,UAAUnB,SACVA,MAAMmB,IAAI,IACV,OAAOnB,MAAMyB,KAAK,KAAK,YACvB,OAAOzB,MAAMyB,KAAK,KAAK,YACvB,OAAOzB,MAAMyB,KAAK,KAAK,cACvBzB,MAAMyB,KAAK,KAAK,OAChB;QACAzB,MAAMyB,KAAK,GAAG/C,QAAQsB,MAAMmB,IAAI;IAClC;IAEA,mBAAmB;IACnB,IACEnB,MAAMgB,IAAI,KAAK,cACf,OAAOhB,MAAM0B,YAAY,KAAK,eAC9B1B,MAAM2B,QAAQ,KAAK,MACnB;QACA3B,MAAM0B,YAAY,GAAG;IACvB;IAEA,0BAA0B;IAC1B,IAAI1B,MAAMgB,IAAI,KAAK,QAAQ;QACzBzB,kBAAkB;YAChBO;YACAE;YACAI;YACAC;YACAC;YACAE;YACAE;QACF;IACF;IAEA,iCAAiC;IACjC,IAAIV,MAAMgB,IAAI,KAAK,kBAAkBhB,MAAMgB,IAAI,KAAK,UAAU;QAC5D,IAAIY,MAAMC,OAAO,CAAC7B,MAAM8B,UAAU,KAAK9B,MAAM8B,UAAU,CAACC,MAAM,KAAK,GAAG;YACpE,MAAM,IAAIC,MACR,CAAC,OAAO,EAAEhC,MAAMmB,IAAI,CAAC,WAAW,EAAEnB,MAAMgB,IAAI,CAAC,2EAA2E,CAAC;QAE7H;QAEA,IAAIH,oBAAoB;YACtB,MAAMoB,gBAAgBL,MAAMC,OAAO,CAAC7B,MAAM8B,UAAU,IAAI9B,MAAM8B,UAAU,GAAG;gBAAC9B,MAAM8B,UAAU;aAAC;YAE7FG,cAAcC,OAAO,CAAC,CAACC;gBACrB,IAAI,CAACtB,mBAAmBQ,QAAQ,CAACc,eAAe;oBAC9C,MAAM,IAAI/D,yBAAyB4B,OAAOmC;gBAC5C;YACF;QACF;QAEA,IAAInC,MAAMoC,GAAG,IAAI,CAACpC,MAAMqC,OAAO,EAAE;YAC/BC,QAAQC,IAAI,CACV,CAAC,wEAAwE,EAAEvC,MAAMmB,IAAI,CAAC,wEAAwE,CAAC;YAEjKnB,MAAMqC,OAAO,GAAGrC,MAAMoC,GAAG;QAC3B;QAEA,IAAIpC,MAAMwC,GAAG,IAAI,CAACxC,MAAMyC,OAAO,EAAE;YAC/BH,QAAQC,IAAI,CACV,CAAC,wEAAwE,EAAEvC,MAAMmB,IAAI,CAAC,wEAAwE,CAAC;YAEjKnB,MAAMyC,OAAO,GAAGzC,MAAMwC,GAAG;QAC3B;IACF;IAEA,4BAA4B;IAC5B,IAAIxC,MAAMgB,IAAI,KAAK,UAAU;QAC3B,IAAI,CAAChB,MAAM0C,KAAK,IAAI,CAAE,CAAA,gBAAgB1C,MAAM0C,KAAK,AAAD,GAAI;YAClD1C,MAAM0C,KAAK,GAAG;gBACZC,YAAY;gBACZ,GAAG3C,MAAM0C,KAAK;YAChB;QACF;IACF;IAEA,iBAAiB;IACjB,IAAI1C,MAAMgB,IAAI,KAAK,WAAWhB,MAAM4C,MAAM,EAAE;QAC1C,MAAMC,cAAc7C,MAAM4C,MAAM,CAACE,IAAI,CAAC,CAACC,IAAM,UAAUA,KAAKA,EAAE5B,IAAI,KAAK;QACvE,IAAI,CAAC0B,aAAa;YAChB7C,MAAM4C,MAAM,CAACI,IAAI,CAACnE;QACpB;IACF;IAEA,sBAAsB;IACtB,IAAI,AAACmB,CAAAA,MAAMgB,IAAI,KAAK,YAAYhB,MAAMgB,IAAI,KAAK,OAAM,KAAMhB,MAAMyB,KAAK,EAAE;QACtEzB,MAAMiD,MAAM,GAAGjD,MAAMiD,MAAM,IAAIxE,aAAauB,MAAMmB,IAAI;IACxD;IAEA,IAAI3B,kBAAkB;QACpB,IAAIO,mBAAmBmD,GAAG,CAAClD,MAAMmB,IAAI,GAAG;YACtC,MAAM,IAAIlD,mBAAmB+B,MAAMmB,IAAI;QACzC,OAAO,IAAI,CAAC;YAAC;YAAa;SAAK,CAACE,QAAQ,CAACrB,MAAMmB,IAAI,GAAG;YACpDpB,mBAAmBoD,GAAG,CAACnD,MAAMmB,IAAI;QACnC;QAEA,IAAI,OAAOnB,MAAMoD,SAAS,KAAK,aAAa;YAC1C,IAAIC,yBAAyB,CAACvD,OAAOwD,YAAY;YAEjD,IACEC,QAAQC,GAAG,CAACC,+DAA+D,KAAK,UAChFjD,qBACA,mFAAmF;YACnF+C,QAAQC,GAAG,CAACE,0CAA0C,KAAK,QAC3D;gBACAL,yBAAyB;YAC3B;YAEA,IAAIA,wBAAwB;gBAC1B,OAAOrD,MAAMoD,SAAS;YACxB;QACF;QAEA,IAAI,OAAOpD,MAAM2D,QAAQ,KAAK,aAAa;YACzC,IAAI,aAAa3D,SAASA,MAAM4D,OAAO,EAAE;gBACvC5D,MAAM2D,QAAQ,GAAG,IAAY;YAC/B,OAAO;gBACL,MAAME,kBAAkB3E,WAAW,CAACc,MAAMgB,IAAI,CAA6B;gBAC3E,IAAI6C,iBAAiB;oBACnB7D,MAAM2D,QAAQ,GAAG,CAACG,KAAUC,UAC1BF,gBAAgBC,KAAK;4BAAE,GAAG9D,KAAK;4BAAE,GAAG+D,OAAO;wBAAC;gBAChD,OAAO;oBACL/D,MAAM2D,QAAQ,GAAG,IAAY;gBAC/B;YACF;QACF;QAEA,IAAI,CAAC3D,MAAMgE,KAAK,EAAE;YAChBhE,MAAMgE,KAAK,GAAG,CAAC;QACjB;QAEA,IAAI,CAAChE,MAAMiE,MAAM,EAAE;YACjBjE,MAAMiE,MAAM,GAAG,CAAC;QAClB;QAEAhF,0BAA0Be,OAAOQ;IACnC;IAEA,IAAI,CAACR,MAAM0C,KAAK,EAAE;QAChB1C,MAAM0C,KAAK,GAAG,CAAC;IACjB;IAEA,kDAAkD;IAClD,IAAI1C,MAAMgB,IAAI,KAAK,YAAY;QAC7B,MAAMkD,mBAAmB,OAAOC;YAC9B,IAAI,CAACnE,MAAMoE,MAAM,EAAE;gBACjB,IAAID,QAAQC,MAAM,IAAI,CAACzD,iCAAiC;oBACtD,kDAAkD;oBAClDX,MAAMoE,MAAM,GAAGD,QAAQC,MAAM;gBAC/B,OAAO;oBACL,MAAM,IAAI/F,kBAAkB2B,OAAO,8HAA8H;;gBACnK;YACF;YAEA,IAAI,OAAOA,MAAMoE,MAAM,KAAK,YAAY;gBACtCpE,MAAMoE,MAAM,GAAG,MAAMpE,MAAMoE,MAAM,CAAC;oBAChCtE,QAAQqE;oBACRE,QAAQ1D;oBACRH,mBAAoBA,qBAAqBR,MAAMoD,SAAS;gBAC1D;YACF;YAEA,IAAIpD,MAAMoE,MAAM,CAACE,IAAI,IAAIC,OAAOC,IAAI,CAACxE,MAAMoE,MAAM,CAACE,IAAI,EAAEvC,MAAM,IAAI,GAAG;gBACnEjC,OAAOwE,IAAI,CAAEG,YAAY,GAAGzG,gBAAgB8B,OAAOwE,IAAI,CAAEG,YAAY,EAAGzE,MAAMoE,MAAM,CAACE,IAAI;YAC3F;QACF;QACA,IAAI1D,8BAA8B;YAChCA,6BAA6BoC,IAAI,CAACkB;QACpC,OAAO;YACL,MAAMA,iBAAiBpE;QACzB;IACF;IAEA,IAAIE,MAAMgB,IAAI,KAAK,YAAYhB,MAAM0E,MAAM,EAAE;QAC3C,IAAI1E,MAAM2E,eAAe,IAAI3E,MAAM0E,MAAM,EAAE3C,QAAQ;YACjD,MAAM,IAAIC,MAAM;QAClB;QAEA,MAAM4C,aAAuB,EAAE;QAE/B,KAAK,MAAMC,SAAS7E,MAAM2E,eAAe,IAAI3E,MAAM0E,MAAM,CAAE;YACzD,MAAMI,YAAY,OAAOD,UAAU,WAAWA,QAAQA,MAAME,IAAI;YAEhE,IAAIH,WAAWvD,QAAQ,CAACyD,YAAY;gBAClC,MAAM,IAAI7G,mBAAmB6G;YAC/B;YAEAF,WAAW5B,IAAI,CAAC8B;YAEhB,IAAI,OAAOD,UAAU,UAAU;gBAC7B;YACF;YAEA,IAAIA,MAAM9D,UAAU,KAAK,MAAM;gBAC7B;YACF;YAEA8D,MAAM9D,UAAU,GAAG;YACnB8D,MAAMjC,MAAM,GAAGiC,MAAMjC,MAAM,CAACoC,MAAM,CAACpG;YACnCiG,MAAM5B,MAAM,GAAG,CAAC4B,MAAM5B,MAAM,GAAGxE,aAAaoG,MAAME,IAAI,IAAIF,MAAM5B,MAAM;YAEtE4B,MAAMjC,MAAM,GAAG,MAAMqC,eAAe;gBAClCpF;gBACAC;gBACAC,oBAAoB,IAAImF;gBACxBtC,QAAQiC,MAAMjC,MAAM;gBACpBzC,iBAAiB;gBACjBI,iBAAiB;gBACjBC,mBAAoBA,qBAAqBR,MAAMoD,SAAS;gBACxD3C,kBAAkBS,aAAa,MAAM2D,MAAME,IAAI;gBAC/CpE;gBACAC;gBACAC;YACF;QACF;IACF;IAEA,IAAI,YAAYb,SAASA,MAAM4C,MAAM,EAAE;QACrC5C,MAAM4C,MAAM,GAAG,MAAMqC,eAAe;YAClCpF;YACAC;YACAC,oBAAoBP,mBAAmB,IAAI0F,QAAQnF;YACnD6C,QAAQ5C,MAAM4C,MAAM;YACpBzC,iBAAiBA,mBAAmB,CAACX;YACrCY,UAAUZ,mBAAmB,GAAGY,WAAWA,WAAW,MAAM,KAAKJ,MAAMmB,IAAI,EAAE,GAAGf;YAChFC;YACAC;YACAC,iBAAiBf,mBAAmB,KAAKyB;YACzCT,mBAAmBA,qBAAqBd,iBAAiBM;YACzDS,kBAAkBS;YAClBR;YACAC;YACAC;YACAC;QACF;IACF;IAEA,IAAIb,MAAMgB,IAAI,KAAK,QAAQ;QACzB,IAAK,IAAImE,IAAI,GAAGA,IAAInF,MAAMoF,IAAI,CAACrD,MAAM,EAAEoD,IAAK;YAC1C,MAAME,MAAMrF,MAAMoF,IAAI,CAACD,EAAE;YAEzB,MAAMG,aAAa3F,WAAW0F;YAE9B,IAAIC,cAAc,OAAOD,IAAI5D,KAAK,KAAK,aAAa;gBAClD4D,IAAI5D,KAAK,GAAG/C,QAAQ2G,IAAIlE,IAAI;YAC9B;YAEA,MAAM,EAAEF,WAAWsE,YAAY,EAAErE,YAAYsE,aAAa,EAAE,GAAGxG,cAAc;gBAC3EgB,OAAOqF;gBACPnF,OAAOiF;gBACP5E,iBAAiBU;gBACjBR,kBAAkBS;YACpB;YAEA,IACE,WAAWmE,OACXA,IAAI3C,KAAK,EAAE+C,aACX,OAAOJ,IAAI3C,KAAK,CAAC+C,SAAS,KAAK,cAC/B,CAACJ,IAAIK,EAAE,EACP;gBACAL,IAAIK,EAAE,GAAGF;YACX;YAEAH,IAAIzC,MAAM,GAAG,MAAMqC,eAAe;gBAChCpF;gBACAC;gBACAC,oBAAoBuF,aAAa,IAAIJ,QAAQnF;gBAC7C6C,QAAQyC,IAAIzC,MAAM;gBAClBzC,iBAAiBA,mBAAmB,CAACmF;gBACrClF,UAAUkF,aAAa,GAAGlF,WAAWA,WAAW,MAAM,KAAKiF,IAAIlE,IAAI,EAAE,GAAGf;gBACxEC;gBACAC;gBACAC,iBAAiB+E,aAAa,KAAKC;gBACnC/E,mBAAmBA,qBAAsB8E,cAAcD,IAAIjC,SAAS;gBACpE3C,kBAAkB+E;gBAClB9E;gBACAC;gBACAC;gBACAC;YACF;YAEAb,MAAMoF,IAAI,CAACD,EAAE,GAAGE;QAClB;IACF;IAEA,IAAIrF,MAAMgB,IAAI,KAAK,QAAQ,OAAOhB,MAAM0C,KAAK,CAACiD,eAAe,KAAK,aAAa;QAC7E3F,MAAM0C,KAAK,CAACiD,eAAe,GAAG;IAChC;IAEA,2BAA2B;IAC3B,IAAI3F,MAAMgB,IAAI,KAAK,UAAUhB,MAAM4F,QAAQ,EAAE;QAC3C,MAAMzE,OAAOnB,MAAMmB,IAAI,GAAG;QAE1B,IAAI0E,kBACF7F,MAAM4F,QAAQ,IAAI,OAAO5F,MAAM4F,QAAQ,KAAK,WACxC5F,MAAM4F,QAAQ,CAACC,eAAe,GAC9B/F,OAAO4C,KAAK,EAAEoD,WAAWD;QAE/B,MAAMlE,WACJ3B,MAAM2B,QAAQ,IACb3B,MAAM4F,QAAQ,IAAI,OAAO5F,MAAM4F,QAAQ,KAAK,YAAY5F,MAAM4F,QAAQ,CAACjE,QAAQ;QAElF,MAAMoE,qBACJ/F,MAAM4F,QAAQ,IAAI,OAAO5F,MAAM4F,QAAQ,KAAK,YAAY5F,MAAM4F,QAAQ,CAACG,kBAAkB,GACrF/F,MAAM4F,QAAQ,CAACG,kBAAkB,GACjCjG,OAAO4C,KAAK,EAAEoD,WAAWC;QAE/B,MAAMhC,UACJ,OAAOgC,uBAAuB,aAC1BA,mBAAmB;YAAEhH;QAAiB,KACtCgH;QAENpH,kBAAkB;YAChBqH,QAAQ,CAAC,OAAO,EAAEhG,MAAMmB,IAAI,CAAC,6BAA6B,CAAC;YAC3D2E,WAAW/B;QACb;QAEA,IAAIA,WAAWA,QAAQhC,MAAM,KAAK,KAAKgC,OAAO,CAAC,EAAE,EAAEkC,OAAO;YACxDJ,kBAAkB9B,OAAO,CAAC,EAAE,CAACkC,KAAK;QACpC;QAEA,oCAAoC;QACpC,MAAMC,gBAAgB,OAAOlG,MAAMyB,KAAK,KAAK,WAAW,GAAGzB,MAAMyB,KAAK,CAAC,GAAG,CAAC,GAAG/C,QAAQyC;QAEtF,MAAMgF,YAAYrH,kBAAkB;YAClCqC;YACAO,cAAcmE;YACdpE,OAAOyE;YACPnC;YACApC;QACF;QAEA,6BAA6B;QAC7B,MAAMyE,gBACJ,OAAOpG,MAAM4F,QAAQ,KAAK,YAAY,OAAO5F,MAAM4F,QAAQ,CAACS,QAAQ,KAAK,aACrErG,MAAM4F,QAAQ,CAACS,QAAQ,CAAC;YAAEF;QAAU,KACpCA;QAENrF,OAAOwF,cAAc,GAAG;YAACF;SAAc;IACzC;IAEA,yBAAyB;IACzB,IAAI,aAAapG,SAAS,OAAOA,MAAM4D,OAAO,KAAK,UAAU;QAC3D,MAAM2C,eAAevG;QACrB,MAAMwG,eAAgB3G,CAAAA,oBAAoBI,YAAW,GAAI2C;QACzD,IAAI4D,cAAc;YAChB,IAAIC,gBAAgBjI,iBAAiB;gBAAEoE,QAAQ4D;YAAa;YAC5D,MAAME,QAAQ1G,MAAM4D,OAAO,CAAC+C,KAAK,CAAC;YAClC,IAAIC,YAAY;YAEhB,KAAK,MAAM,CAACC,KAAKC,QAAQ,IAAIJ,MAAMK,OAAO,GAAI;gBAC5C,MAAMC,aAAaP,cAAcQ,IAAI,CAAC,CAACC,IAAMA,EAAE/F,IAAI,KAAK2F;gBACxD,IAAI,CAACE,YAAY;oBACf;gBACF;gBAEA,IACEA,WAAWhG,IAAI,KAAK,WACpBgG,WAAWhG,IAAI,KAAK,SACpBgG,WAAWhG,IAAI,KAAK,SACpB;oBACAyF,gBAAgBO,WAAWG,eAAe;gBAC5C,OAAO,IACL,AAACH,CAAAA,WAAWhG,IAAI,KAAK,kBAAkBgG,WAAWhG,IAAI,KAAK,QAAO,KAClE6F,QAAQH,MAAM3E,MAAM,GAAG,KACvB,OAAOiF,WAAWlF,UAAU,KAAK,UACjC;oBACA,IACEkF,WAAWI,OAAO,IACjBb,CAAAA,aAAavF,IAAI,KAAK,UACrBuF,aAAavF,IAAI,KAAK,YACtBuF,aAAavF,IAAI,KAAK,QAAO,GAC/B;wBACA,IAAI4F,WAAW;4BACb,MAAM,IAAI1I,qBACR,CAAC,cAAc,EAAEqI,aAAapF,IAAI,CAAC,IAAI,EAAElB,eAAe,CAAC,OAAO,EAAEA,aAAa8E,IAAI,EAAE,GAAG,CAAC,WAAW,EAAElF,kBAAkBkF,MAAM,CAAC,wDAAwD,EAAEwB,aAAa3C,OAAO,CAAC,sBAAsB,CAAC;wBAEzO;wBAEAgD,YAAY;wBACZL,aAAaa,OAAO,GAAG;oBACzB;oBACA,MAAMC,oBAAoBvH,OAAOwH,WAAW,EAAEL,KAC5C,CAACC,IAAMA,EAAEnC,IAAI,KAAKiC,WAAWlF,UAAU;oBAEzC,IAAIuF,mBAAmB;wBACrBZ,gBAAgBjI,iBAAiB;4BAAEoE,QAAQyE,kBAAkBzE,MAAM;wBAAC;oBACtE;gBACF;YACF;QACF;IACF;IAEA,OAAO9B;AACT,EAAC;AAED,OAAO,MAAMmE,iBAAiB,OAAO,EACnCpF,gBAAgB,EAChBC,MAAM,EACNC,qBAAqB,IAAImF,KAAK,EAC9BtC,MAAM,EACN3C,YAAY,EACZE,kBAAkB,IAAI,EACtBC,WAAW,EAAE,EACbC,KAAK,EACLC,cAAc,EACdC,kBAAkB,EAAE,EACpBC,iBAAiB,EACjBC,mBAAmB,EAAE,EACrBC,gBAAgB,EAChBC,kCAAkC,KAAK,EACvCC,4BAA4B,EAC5BC,kBAAkB,EACC;IACnB,IAAI,CAAC+B,QAAQ;QACX,OAAO,EAAE;IACX;IAEA,IAAK,IAAI2E,IAAI,GAAGA,IAAI3E,OAAOb,MAAM,EAAEwF,IAAK;QACtC,MAAMvH,QAAQ4C,MAAM,CAAC2E,EAAE;QAEvB,MAAMzG,SAAS,MAAMlB,cAAc;YACjCC;YACAC;YACAC;YACAC;YACAC;YACAC,OAAOqH;YACPpH;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;QACF;QAEA+B,MAAM,CAAC2E,EAAE,GAAGvH;QAEZ,IAAIc,OAAOwF,cAAc,EAAEvE,QAAQ;YACjCa,OAAO4E,MAAM,CAACD,IAAI,GAAG,MAAMzG,OAAOwF,cAAc;YAChDiB,KAAKzG,OAAOwF,cAAc,CAACvE,MAAM;QACnC;IACF;IAEA,OAAOa;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type {\n CollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from '../../collections/config/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { GlobalConfig } from '../../globals/config/types.js'\nimport type { OrderableJoinInfo } from './sanitizeJoinField.js'\nimport type { Field } from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidConfiguration,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingEditorProp,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { ReservedFieldName } from '../../errors/ReservedFieldName.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { validateTimezones } from '../../utilities/validateTimezones.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { baseTimezoneField } from '../baseFields/timezone/baseField.js'\nimport { defaultTimezones } from '../baseFields/timezone/defaultTimezones.js'\nimport { getFieldPaths } from '../getFieldPaths.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport { validations } from '../validations.js'\nimport {\n reservedAPIKeyFieldNames,\n reservedBaseAuthFieldNames,\n reservedBaseUploadFieldNames,\n reservedVerifyFieldNames,\n} from './reservedFieldNames.js'\nimport { sanitizeJoinField } from './sanitizeJoinField.js'\nimport { fieldAffectsData as _fieldAffectsData, fieldIsLocalized, tabHasName } from './types.js'\n\ntype SanitizeFieldsArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n globalConfig?: GlobalConfig\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField?: boolean\n joinPath?: string\n /**\n * When not passed in, assume that join are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n /**\n * A string of '-' separated indexes representing where\n * to find this field in a given field schema array.\n */\n parentIndexPath?: string\n parentIsLocalized: boolean\n /**\n * Path for parent fields relative to their position in the schema.\n */\n parentSchemaPath?: string\n polymorphicJoins?: SanitizedJoin[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport type SanitizeFieldArgs = {\n collectionConfig?: CollectionConfig\n config: Config\n existingFieldNames: Set<string>\n field: Field\n globalConfig?: GlobalConfig\n /**\n * The index of this field in the parent fields array\n */\n index: number\n /**\n * Used to prevent unnecessary sanitization of fields that are not top-level.\n */\n isTopLevelField: boolean\n joinPath: string\n /**\n * When not passed in, assume that joins are not supported (globals, arrays, blocks)\n */\n joins?: SanitizedJoins\n /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[]\n parentIndexPath: string\n parentIsLocalized: boolean\n parentSchemaPath: string\n polymorphicJoins?: SanitizedJoin[]\n requireFieldLevelRichTextEditor: boolean\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>\n validRelationships: null | string[]\n}\n\ntype SanitizeFieldResult = {\n /**\n * Fields to insert after this field (e.g., timezone field)\n */\n fieldsToInsert?: Field[]\n}\n\n/**\n * Sanitize a single field. Handles all per-field logic including:\n * - Validation setup\n * - Hooks/access/admin defaults\n * - Type-specific handling\n * - Recursive sanitization of nested fields\n *\n * @returns Result containing any fields to insert after this one\n */\nexport const sanitizeField = async ({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldArgs): Promise<SanitizeFieldResult> => {\n const result: SanitizeFieldResult = {}\n\n if ('_sanitized' in field && field._sanitized === true) {\n return result\n }\n\n if ('_sanitized' in field) {\n field._sanitized = true\n }\n\n if (!field.type) {\n throw new MissingFieldType(field)\n }\n\n const fieldAffectsData = _fieldAffectsData(field)\n\n const { indexPath, schemaPath } = getFieldPaths({\n field,\n index,\n parentIndexPath,\n parentSchemaPath,\n })\n\n // Reserved field name checks\n if (isTopLevelField && fieldAffectsData && field.name) {\n if (collectionConfig && collectionConfig.upload) {\n if (reservedBaseUploadFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n\n if (\n collectionConfig &&\n collectionConfig.auth &&\n typeof collectionConfig.auth === 'object' &&\n !collectionConfig.auth.disableLocalStrategy\n ) {\n if (reservedBaseAuthFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n if (collectionConfig.auth.verify) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedAPIKeyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n if (reservedVerifyFieldNames.includes(field.name)) {\n throw new ReservedFieldName(field, field.name)\n }\n }\n }\n }\n\n // Invalid field name check\n if (fieldAffectsData && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n typeof field.label !== 'function' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n // Checkbox default\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n // Join field sanitization\n if (field.type === 'join') {\n sanitizeJoinField({\n config,\n field,\n joinPath,\n joins,\n orderableJoins,\n parentIsLocalized,\n polymorphicJoins,\n })\n }\n\n // Relationship/upload validation\n if (field.type === 'relationship' || field.type === 'upload') {\n if (Array.isArray(field.relationTo) && field.relationTo.length === 0) {\n throw new Error(\n `Field \"${field.name}\" of type \"${field.type}\" has an empty relationTo array. At least one collection must be specified.`,\n )\n }\n\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo) ? field.relationTo : [field.relationTo]\n\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n field.minRows = field.min\n }\n\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n field.maxRows = field.max\n }\n }\n\n // Upload isSortable default\n if (field.type === 'upload') {\n if (!field.admin || !('isSortable' in field.admin)) {\n field.admin = {\n isSortable: true,\n ...field.admin,\n }\n }\n }\n\n // Array ID field\n if (field.type === 'array' && field.fields) {\n const hasCustomID = field.fields.some((f) => 'name' in f && f.name === 'id')\n if (!hasCustomID) {\n field.fields.push(baseIDField)\n }\n }\n\n // Blocks/array labels\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (typeof field.localized !== 'undefined') {\n let shouldDisableLocalized = !config.localization\n\n if (\n process.env.NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized !== 'true' &&\n parentIsLocalized &&\n // @todo PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY=true will be the default in 4.0\n process.env.PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY !== 'true'\n ) {\n shouldDisableLocalized = true\n }\n\n if (shouldDisableLocalized) {\n delete field.localized\n }\n }\n\n if (typeof field.validate === 'undefined') {\n if ('virtual' in field && field.virtual) {\n field.validate = (): true => true\n } else {\n const defaultValidate = validations[field.type as keyof typeof validations]\n if (defaultValidate) {\n field.validate = (val: any, options: any) =>\n defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = (): true => true\n }\n }\n }\n\n if (!field.hooks) {\n field.hooks = {}\n }\n\n if (!field.access) {\n field.access = {}\n }\n\n setDefaultBeforeDuplicate(field, parentIsLocalized)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n if ('virtual' in field && field.virtual && field.admin.readOnly !== false && fieldAffectsData) {\n field.admin.readOnly = true\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n const sanitizeRichText = async (_config: SanitizedConfig) => {\n if (!field.editor) {\n if (_config.editor && !requireFieldLevelRichTextEditor) {\n // config.editor should be sanitized at this point\n field.editor = _config.editor\n } else {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n }\n\n if (typeof field.editor === 'function') {\n field.editor = await field.editor({\n config: _config,\n isRoot: requireFieldLevelRichTextEditor,\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n })\n }\n\n if (field.editor.i18n && Object.keys(field.editor.i18n).length >= 0) {\n config.i18n!.translations = deepMergeSimple(config.i18n!.translations!, field.editor.i18n)\n }\n }\n if (richTextSanitizationPromises) {\n richTextSanitizationPromises.push(sanitizeRichText)\n } else {\n await sanitizeRichText(config as unknown as SanitizedConfig)\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n if (field.blockReferences && field.blocks?.length) {\n throw new Error('You cannot have both blockReferences and blocks in the same blocks field')\n }\n\n const blockSlugs: string[] = []\n\n for (const block of field.blockReferences ?? field.blocks) {\n const blockSlug = typeof block === 'string' ? block : block.slug\n\n if (blockSlugs.includes(blockSlug)) {\n throw new DuplicateFieldName(blockSlug)\n }\n\n blockSlugs.push(blockSlug)\n\n if (typeof block === 'string') {\n continue\n }\n\n if (block._sanitized === true) {\n continue\n }\n\n block._sanitized = true\n block.fields = block.fields.concat(baseBlockFields)\n block.labels = !block.labels ? formatLabels(block.slug) : block.labels\n\n block.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n isTopLevelField: false,\n parentIndexPath: '',\n parentIsLocalized: (parentIsLocalized || field.localized)!,\n parentSchemaPath: schemaPath + '.' + block.slug,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n }\n\n if ('fields' in field && field.fields) {\n field.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: fieldAffectsData ? new Set() : existingFieldNames,\n fields: field.fields,\n isTopLevelField: isTopLevelField && !fieldAffectsData,\n joinPath: fieldAffectsData ? `${joinPath ? joinPath + '.' : ''}${field.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: fieldAffectsData ? '' : indexPath,\n parentIsLocalized: parentIsLocalized || fieldIsLocalized(field),\n parentSchemaPath: schemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n for (let j = 0; j < field.tabs.length; j++) {\n const tab = field.tabs[j]!\n\n const isNamedTab = tabHasName(tab)\n\n if (isNamedTab && typeof tab.label === 'undefined') {\n tab.label = toWords(tab.name)\n }\n\n const { indexPath: tabIndexPath, schemaPath: tabSchemaPath } = getFieldPaths({\n field: tab,\n index: j,\n parentIndexPath: indexPath,\n parentSchemaPath: schemaPath,\n })\n\n if (\n 'admin' in tab &&\n tab.admin?.condition &&\n typeof tab.admin.condition === 'function' &&\n !tab.id\n ) {\n tab.id = tabSchemaPath\n }\n\n tab.fields = await sanitizeFields({\n collectionConfig,\n config,\n existingFieldNames: isNamedTab ? new Set() : existingFieldNames,\n fields: tab.fields,\n isTopLevelField: isTopLevelField && !isNamedTab,\n joinPath: isNamedTab ? `${joinPath ? joinPath + '.' : ''}${tab.name}` : joinPath,\n joins,\n orderableJoins,\n parentIndexPath: isNamedTab ? '' : tabIndexPath,\n parentIsLocalized: parentIsLocalized || (isNamedTab && tab.localized)!,\n parentSchemaPath: tabSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n field.tabs[j] = tab\n }\n }\n\n if (field.type === 'ui' && typeof field.admin.disableBulkEdit === 'undefined') {\n field.admin.disableBulkEdit = true\n }\n\n // Timezone field insertion\n if (field.type === 'date' && field.timezone) {\n const name = field.name + '_tz'\n\n let defaultTimezone =\n field.timezone && typeof field.timezone === 'object'\n ? field.timezone.defaultTimezone\n : config.admin?.timezones?.defaultTimezone\n\n const required =\n field.required ||\n (field.timezone && typeof field.timezone === 'object' && field.timezone.required)\n\n const supportedTimezones =\n field.timezone && typeof field.timezone === 'object' && field.timezone.supportedTimezones\n ? field.timezone.supportedTimezones\n : config.admin?.timezones?.supportedTimezones\n\n const options =\n typeof supportedTimezones === 'function'\n ? supportedTimezones({ defaultTimezones })\n : supportedTimezones\n\n validateTimezones({\n source: `field \"${field.name}\" timezone.supportedTimezones`,\n timezones: options,\n })\n\n if (options && options.length === 1 && options[0]?.value) {\n defaultTimezone = options[0].value\n }\n\n // Generate label for timezone field\n const timezoneLabel = typeof field.label === 'string' ? `${field.label} Tz` : toWords(name)\n\n const baseField = baseTimezoneField({\n name,\n defaultValue: defaultTimezone,\n label: timezoneLabel,\n options,\n required,\n })\n\n // Apply override if provided\n const timezoneField =\n typeof field.timezone === 'object' && typeof field.timezone.override === 'function'\n ? field.timezone.override({ baseField })\n : baseField\n\n result.fieldsToInsert = [timezoneField]\n }\n\n // Virtual field handling\n if ('virtual' in field && typeof field.virtual === 'string') {\n const virtualField = field\n const configFields = (collectionConfig || globalConfig)?.fields\n if (configFields) {\n let flattenFields = flattenAllFields({ fields: configFields })\n const paths = field.virtual.split('.')\n let isHasMany = false\n\n for (const [idx, segment] of paths.entries()) {\n const foundField = flattenFields.find((e) => e.name === segment)\n if (!foundField) {\n break\n }\n\n if (\n foundField.type === 'group' ||\n foundField.type === 'tab' ||\n foundField.type === 'array'\n ) {\n flattenFields = foundField.flattenedFields\n } else if (\n (foundField.type === 'relationship' || foundField.type === 'upload') &&\n idx !== paths.length - 1 &&\n typeof foundField.relationTo === 'string'\n ) {\n if (\n foundField.hasMany &&\n (virtualField.type === 'text' ||\n virtualField.type === 'number' ||\n virtualField.type === 'select')\n ) {\n if (isHasMany) {\n throw new InvalidConfiguration(\n `Virtual field ${virtualField.name} in ${globalConfig ? `global ${globalConfig.slug}` : `collection ${collectionConfig?.slug}`} references 2 or more hasMany relationships on the path ${virtualField.virtual} which is not allowed.`,\n )\n }\n\n isHasMany = true\n virtualField.hasMany = true\n }\n const relatedCollection = config.collections?.find(\n (e) => e.slug === foundField.relationTo,\n )\n if (relatedCollection) {\n flattenFields = flattenAllFields({ fields: relatedCollection.fields })\n }\n }\n }\n }\n }\n\n return result\n}\n\nexport const sanitizeFields = async ({\n collectionConfig,\n config,\n existingFieldNames = new Set(),\n fields,\n globalConfig,\n isTopLevelField = true,\n joinPath = '',\n joins,\n orderableJoins,\n parentIndexPath = '',\n parentIsLocalized,\n parentSchemaPath = '',\n polymorphicJoins,\n requireFieldLevelRichTextEditor = false,\n richTextSanitizationPromises,\n validRelationships,\n}: SanitizeFieldsArgs): Promise<Field[]> => {\n if (!fields) {\n return []\n }\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]!\n\n const result = await sanitizeField({\n collectionConfig,\n config,\n existingFieldNames,\n field,\n globalConfig,\n index: i,\n isTopLevelField,\n joinPath,\n joins,\n orderableJoins,\n parentIndexPath,\n parentIsLocalized,\n parentSchemaPath,\n polymorphicJoins,\n requireFieldLevelRichTextEditor,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n fields[i] = field\n\n if (result.fieldsToInsert?.length) {\n fields.splice(i + 1, 0, ...result.fieldsToInsert)\n i += result.fieldsToInsert.length\n }\n }\n\n return fields\n}\n"],"names":["deepMergeSimple","DuplicateFieldName","InvalidConfiguration","InvalidFieldName","InvalidFieldRelationship","MissingEditorProp","MissingFieldType","ReservedFieldName","flattenAllFields","formatLabels","toWords","validateTimezones","baseBlockFields","baseIDField","baseTimezoneField","defaultTimezones","getFieldPaths","setDefaultBeforeDuplicate","validations","reservedAPIKeyFieldNames","reservedBaseAuthFieldNames","reservedBaseUploadFieldNames","reservedVerifyFieldNames","sanitizeJoinField","fieldAffectsData","_fieldAffectsData","fieldIsLocalized","tabHasName","sanitizeField","collectionConfig","config","existingFieldNames","field","globalConfig","index","isTopLevelField","joinPath","joins","orderableJoins","parentIndexPath","parentIsLocalized","parentSchemaPath","polymorphicJoins","requireFieldLevelRichTextEditor","richTextSanitizationPromises","validRelationships","result","_sanitized","type","indexPath","schemaPath","name","upload","includes","auth","disableLocalStrategy","verify","label","defaultValue","required","Array","isArray","relationTo","length","Error","relationships","forEach","relationship","min","minRows","console","warn","max","maxRows","admin","isSortable","fields","hasCustomID","some","f","push","labels","has","add","localized","shouldDisableLocalized","localization","process","env","NEXT_PUBLIC_PAYLOAD_COMPATIBILITY_allowLocalizedWithinLocalized","PAYLOAD_DO_NOT_SANITIZE_LOCALIZED_PROPERTY","validate","virtual","defaultValidate","val","options","hooks","access","readOnly","sanitizeRichText","_config","editor","isRoot","i18n","Object","keys","translations","blocks","blockReferences","blockSlugs","block","blockSlug","slug","concat","sanitizeFields","Set","j","tabs","tab","isNamedTab","tabIndexPath","tabSchemaPath","condition","id","disableBulkEdit","timezone","defaultTimezone","timezones","supportedTimezones","source","value","timezoneLabel","baseField","timezoneField","override","fieldsToInsert","virtualField","configFields","flattenFields","paths","split","isHasMany","idx","segment","entries","foundField","find","e","flattenedFields","hasMany","relatedCollection","collections","i","splice"],"mappings":"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"}
|
|
@@ -673,6 +673,72 @@ describe('sanitizeFields', ()=>{
|
|
|
673
673
|
});
|
|
674
674
|
expect(result).not.toBe(true);
|
|
675
675
|
});
|
|
676
|
+
it('should default readOnly to true for virtual: true fields', async ()=>{
|
|
677
|
+
const fields = [
|
|
678
|
+
{
|
|
679
|
+
name: 'virtualText',
|
|
680
|
+
type: 'text',
|
|
681
|
+
virtual: true
|
|
682
|
+
}
|
|
683
|
+
];
|
|
684
|
+
const sanitizedField = (await sanitizeFields({
|
|
685
|
+
config,
|
|
686
|
+
collectionConfig,
|
|
687
|
+
fields,
|
|
688
|
+
validRelationships: []
|
|
689
|
+
}))[0];
|
|
690
|
+
expect(sanitizedField.admin?.readOnly).toBe(true);
|
|
691
|
+
});
|
|
692
|
+
it('should default readOnly to true for virtual: "string" fields', async ()=>{
|
|
693
|
+
const fields = [
|
|
694
|
+
{
|
|
695
|
+
name: 'virtualRef',
|
|
696
|
+
type: 'text',
|
|
697
|
+
virtual: 'post.title'
|
|
698
|
+
}
|
|
699
|
+
];
|
|
700
|
+
const sanitizedField = (await sanitizeFields({
|
|
701
|
+
config,
|
|
702
|
+
collectionConfig,
|
|
703
|
+
fields,
|
|
704
|
+
validRelationships: []
|
|
705
|
+
}))[0];
|
|
706
|
+
expect(sanitizedField.admin?.readOnly).toBe(true);
|
|
707
|
+
});
|
|
708
|
+
it('should not override readOnly: false on virtual fields', async ()=>{
|
|
709
|
+
const fields = [
|
|
710
|
+
{
|
|
711
|
+
name: 'virtualText',
|
|
712
|
+
type: 'text',
|
|
713
|
+
virtual: true,
|
|
714
|
+
admin: {
|
|
715
|
+
readOnly: false
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
];
|
|
719
|
+
const sanitizedField = (await sanitizeFields({
|
|
720
|
+
config,
|
|
721
|
+
collectionConfig,
|
|
722
|
+
fields,
|
|
723
|
+
validRelationships: []
|
|
724
|
+
}))[0];
|
|
725
|
+
expect(sanitizedField.admin?.readOnly).toBe(false);
|
|
726
|
+
});
|
|
727
|
+
it('should not set readOnly on non-virtual fields', async ()=>{
|
|
728
|
+
const fields = [
|
|
729
|
+
{
|
|
730
|
+
name: 'normalText',
|
|
731
|
+
type: 'text'
|
|
732
|
+
}
|
|
733
|
+
];
|
|
734
|
+
const sanitizedField = (await sanitizeFields({
|
|
735
|
+
config,
|
|
736
|
+
collectionConfig,
|
|
737
|
+
fields,
|
|
738
|
+
validRelationships: []
|
|
739
|
+
}))[0];
|
|
740
|
+
expect(sanitizedField.admin?.readOnly).toBeUndefined();
|
|
741
|
+
});
|
|
676
742
|
});
|
|
677
743
|
});
|
|
678
744
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fields/config/sanitize.spec.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type {\n ArrayField,\n Block,\n BlocksField,\n CheckboxField,\n Field,\n NumberField,\n TextField,\n} from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { sanitizeFields } from './sanitize.js'\nimport { CollectionConfig } from '../../index.js'\nimport { describe, it, expect } from 'vitest'\n\ndescribe('sanitizeFields', () => {\n const config = {} as Config\n const collectionConfig = {} as CollectionConfig\n\n it('should throw on missing type field', async () => {\n const fields: Field[] = [\n // @ts-expect-error\n {\n name: 'Some Collection',\n label: 'some-collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(MissingFieldType)\n })\n\n it('should throw on invalid field name', async () => {\n const fields: Field[] = [\n {\n name: 'some.collection',\n type: 'text',\n label: 'some.collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(InvalidFieldName)\n })\n\n it('should throw on duplicate field name', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: 'someField',\n },\n {\n name: 'someField',\n type: 'text',\n label: 'someField',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(DuplicateFieldName)\n })\n\n it('should throw on duplicate block slug', async () => {\n const fields: Field[] = [\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [\n {\n slug: 'block',\n fields: [\n {\n name: 'blockField',\n type: 'text',\n },\n ],\n },\n {\n slug: 'block',\n fields: [\n {\n name: 'blockField',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(DuplicateFieldName)\n })\n\n describe('auto-labeling', () => {\n it('should populate label if missing', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual('Some Field')\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n it('should allow auto-label override', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: 'Do not label',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual('Do not label')\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n describe('opt-out', () => {\n it('should allow label opt-out', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n it('should allow label opt-out for arrays', async () => {\n const arrayField: ArrayField = {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'itemName',\n type: 'text',\n },\n ],\n label: false,\n }\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields: [arrayField],\n validRelationships: [],\n })\n )[0] as ArrayField\n\n expect(sanitizedField.name).toStrictEqual('items')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('array')\n expect(sanitizedField.labels).toBeUndefined()\n })\n\n it('should allow label opt-out for blocks', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n expect(sanitizedField.name).toStrictEqual('noLabelBlock')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('blocks')\n expect(sanitizedField.labels).toBeUndefined()\n })\n })\n\n it('should label arrays with plural and singular', async () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'itemName',\n type: 'text',\n },\n ],\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as ArrayField\n\n expect(sanitizedField.name).toStrictEqual('items')\n expect(sanitizedField.label).toStrictEqual('Items')\n expect(sanitizedField.type).toStrictEqual('array')\n expect(sanitizedField.labels).toMatchObject({ plural: 'Items', singular: 'Item' })\n })\n\n it('should label blocks with plural and singular', async () => {\n const fields: Field[] = [\n {\n name: 'specialBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [{ name: 'testNumber', type: 'number' }],\n },\n ],\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n expect(sanitizedField.name).toStrictEqual('specialBlock')\n expect(sanitizedField.label).toStrictEqual('Special Block')\n expect(sanitizedField.type).toStrictEqual('blocks')\n expect(sanitizedField.labels).toMatchObject({\n plural: 'Special Blocks',\n singular: 'Special Block',\n })\n\n expect((sanitizedField.blocks[0].fields[0] as NumberField).label).toStrictEqual('Test Number')\n })\n })\n\n describe('relationships', () => {\n it('should not throw on valid relationship', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'some-collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should not throw on valid relationship - multiple', async () => {\n const validRelationships = ['some-collection', 'another-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: ['some-collection', 'another-collection'],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should not throw on valid relationship inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'some-collection',\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should throw on invalid relationship', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'not-valid',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on invalid relationship - multiple', async () => {\n const validRelationships = ['some-collection', 'another-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: ['some-collection', 'not-valid'],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on invalid relationship inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'not-valid',\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on empty relationTo array', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: [],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should throw on empty relationTo array for upload field', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Upload',\n type: 'upload',\n label: 'my-upload',\n relationTo: [],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should throw on empty relationTo array inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: [],\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should defaultValue of checkbox to false if required and undefined', async () => {\n const fields: Field[] = [\n {\n name: 'My Checkbox',\n type: 'checkbox',\n required: true,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as CheckboxField\n\n expect(sanitizedField.defaultValue).toStrictEqual(false)\n })\n\n it('should return empty field array if no fields', async () => {\n const sanitizedFields = await sanitizeFields({\n config,\n collectionConfig,\n fields: [],\n validRelationships: [],\n })\n\n expect(sanitizedFields).toStrictEqual([])\n })\n })\n describe('blocks', () => {\n it('should maintain admin.blockName true after sanitization', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n admin: {\n disableBlockName: true,\n },\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n const sanitizedBlock = sanitizedField.blocks[0]\n\n expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(true)\n })\n it('should default admin.disableBlockName to true after sanitization', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n const sanitizedBlock = sanitizedField.blocks[0]\n\n expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(undefined)\n })\n })\n\n describe('virtual fields', () => {\n it('should assign a noop validate for virtual: true fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n expect(sanitizedField.validate!('', {} as any)).toBe(true)\n expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n })\n\n it('should assign a noop validate for virtual: \"string\" fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualRef',\n type: 'text',\n virtual: 'post.title',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n })\n\n it('should not override an explicit validate on a virtual field', async () => {\n const customValidate = () => true as const\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n validate: customValidate,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBe(customValidate)\n })\n\n it('should assign default type-based validate for non-virtual fields', async () => {\n const fields: Field[] = [\n {\n name: 'normalText',\n type: 'text',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n // Non-virtual text field should use the text validator which checks required/minLength/etc.\n // Passing undefined with required should fail\n const result = sanitizedField.validate!(undefined as any, { required: true, req: { payload: { config: {} }, t: ((v: string) => v) as any } } as any)\n expect(result).not.toBe(true)\n })\n })\n})\n"],"names":["DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","sanitizeFields","describe","it","expect","config","collectionConfig","fields","name","label","validRelationships","rejects","toThrow","type","blocks","slug","sanitizedField","toStrictEqual","arrayField","labels","toBeUndefined","toMatchObject","plural","singular","relationTo","not","relationshipBlock","required","defaultValue","sanitizedFields","admin","disableBlockName","sanitizedBlock","undefined","virtual","validate","toBeDefined","toBe","customValidate","result","req","payload","t","v"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/fields/config/sanitize.spec.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type {\n ArrayField,\n Block,\n BlocksField,\n CheckboxField,\n Field,\n NumberField,\n TextField,\n} from './types.js'\n\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { sanitizeFields } from './sanitize.js'\nimport { CollectionConfig } from '../../index.js'\nimport { describe, it, expect } from 'vitest'\n\ndescribe('sanitizeFields', () => {\n const config = {} as Config\n const collectionConfig = {} as CollectionConfig\n\n it('should throw on missing type field', async () => {\n const fields: Field[] = [\n // @ts-expect-error\n {\n name: 'Some Collection',\n label: 'some-collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(MissingFieldType)\n })\n\n it('should throw on invalid field name', async () => {\n const fields: Field[] = [\n {\n name: 'some.collection',\n type: 'text',\n label: 'some.collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(InvalidFieldName)\n })\n\n it('should throw on duplicate field name', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: 'someField',\n },\n {\n name: 'someField',\n type: 'text',\n label: 'someField',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(DuplicateFieldName)\n })\n\n it('should throw on duplicate block slug', async () => {\n const fields: Field[] = [\n {\n name: 'blocks',\n type: 'blocks',\n blocks: [\n {\n slug: 'block',\n fields: [\n {\n name: 'blockField',\n type: 'text',\n },\n ],\n },\n {\n slug: 'block',\n fields: [\n {\n name: 'blockField',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n }).rejects.toThrow(DuplicateFieldName)\n })\n\n describe('auto-labeling', () => {\n it('should populate label if missing', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual('Some Field')\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n it('should allow auto-label override', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: 'Do not label',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual('Do not label')\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n describe('opt-out', () => {\n it('should allow label opt-out', async () => {\n const fields: Field[] = [\n {\n name: 'someField',\n type: 'text',\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.name).toStrictEqual('someField')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('text')\n })\n\n it('should allow label opt-out for arrays', async () => {\n const arrayField: ArrayField = {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'itemName',\n type: 'text',\n },\n ],\n label: false,\n }\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields: [arrayField],\n validRelationships: [],\n })\n )[0] as ArrayField\n\n expect(sanitizedField.name).toStrictEqual('items')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('array')\n expect(sanitizedField.labels).toBeUndefined()\n })\n\n it('should allow label opt-out for blocks', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n expect(sanitizedField.name).toStrictEqual('noLabelBlock')\n expect(sanitizedField.label).toStrictEqual(false)\n expect(sanitizedField.type).toStrictEqual('blocks')\n expect(sanitizedField.labels).toBeUndefined()\n })\n })\n\n it('should label arrays with plural and singular', async () => {\n const fields: Field[] = [\n {\n name: 'items',\n type: 'array',\n fields: [\n {\n name: 'itemName',\n type: 'text',\n },\n ],\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as ArrayField\n\n expect(sanitizedField.name).toStrictEqual('items')\n expect(sanitizedField.label).toStrictEqual('Items')\n expect(sanitizedField.type).toStrictEqual('array')\n expect(sanitizedField.labels).toMatchObject({ plural: 'Items', singular: 'Item' })\n })\n\n it('should label blocks with plural and singular', async () => {\n const fields: Field[] = [\n {\n name: 'specialBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [{ name: 'testNumber', type: 'number' }],\n },\n ],\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n expect(sanitizedField.name).toStrictEqual('specialBlock')\n expect(sanitizedField.label).toStrictEqual('Special Block')\n expect(sanitizedField.type).toStrictEqual('blocks')\n expect(sanitizedField.labels).toMatchObject({\n plural: 'Special Blocks',\n singular: 'Special Block',\n })\n\n expect((sanitizedField.blocks[0].fields[0] as NumberField).label).toStrictEqual('Test Number')\n })\n })\n\n describe('relationships', () => {\n it('should not throw on valid relationship', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'some-collection',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should not throw on valid relationship - multiple', async () => {\n const validRelationships = ['some-collection', 'another-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: ['some-collection', 'another-collection'],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should not throw on valid relationship inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'some-collection',\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).not.toThrow()\n })\n\n it('should throw on invalid relationship', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'not-valid',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on invalid relationship - multiple', async () => {\n const validRelationships = ['some-collection', 'another-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: ['some-collection', 'not-valid'],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on invalid relationship inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: 'not-valid',\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow(InvalidFieldRelationship)\n })\n\n it('should throw on empty relationTo array', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: [],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should throw on empty relationTo array for upload field', async () => {\n const validRelationships = ['some-collection']\n const fields: Field[] = [\n {\n name: 'My Upload',\n type: 'upload',\n label: 'my-upload',\n relationTo: [],\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should throw on empty relationTo array inside blocks', async () => {\n const validRelationships = ['some-collection']\n const relationshipBlock: Block = {\n slug: 'relationshipBlock',\n fields: [\n {\n name: 'My Relationship',\n type: 'relationship',\n label: 'my-relationship',\n relationTo: [],\n },\n ],\n }\n\n const fields: Field[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [relationshipBlock],\n label: 'Layout Blocks',\n },\n ]\n\n await expect(async () => {\n await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n }).rejects.toThrow('has an empty relationTo array')\n })\n\n it('should defaultValue of checkbox to false if required and undefined', async () => {\n const fields: Field[] = [\n {\n name: 'My Checkbox',\n type: 'checkbox',\n required: true,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as CheckboxField\n\n expect(sanitizedField.defaultValue).toStrictEqual(false)\n })\n\n it('should return empty field array if no fields', async () => {\n const sanitizedFields = await sanitizeFields({\n config,\n collectionConfig,\n fields: [],\n validRelationships: [],\n })\n\n expect(sanitizedFields).toStrictEqual([])\n })\n })\n describe('blocks', () => {\n it('should maintain admin.blockName true after sanitization', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n admin: {\n disableBlockName: true,\n },\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n const sanitizedBlock = sanitizedField.blocks[0]\n\n expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(true)\n })\n it('should default admin.disableBlockName to true after sanitization', async () => {\n const fields: Field[] = [\n {\n name: 'noLabelBlock',\n type: 'blocks',\n blocks: [\n {\n slug: 'number',\n fields: [\n {\n name: 'testNumber',\n type: 'number',\n },\n ],\n },\n ],\n label: false,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as BlocksField\n\n const sanitizedBlock = sanitizedField.blocks[0]\n\n expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(undefined)\n })\n })\n\n describe('virtual fields', () => {\n it('should assign a noop validate for virtual: true fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n expect(sanitizedField.validate!('', {} as any)).toBe(true)\n expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n })\n\n it('should assign a noop validate for virtual: \"string\" fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualRef',\n type: 'text',\n virtual: 'post.title',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n })\n\n it('should not override an explicit validate on a virtual field', async () => {\n const customValidate = () => true as const\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n validate: customValidate,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBe(customValidate)\n })\n\n it('should assign default type-based validate for non-virtual fields', async () => {\n const fields: Field[] = [\n {\n name: 'normalText',\n type: 'text',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.validate).toBeDefined()\n // Non-virtual text field should use the text validator which checks required/minLength/etc.\n // Passing undefined with required should fail\n const result = sanitizedField.validate!(\n undefined as any,\n { required: true, req: { payload: { config: {} }, t: ((v: string) => v) as any } } as any,\n )\n expect(result).not.toBe(true)\n })\n\n it('should default readOnly to true for virtual: true fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.admin?.readOnly).toBe(true)\n })\n\n it('should default readOnly to true for virtual: \"string\" fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualRef',\n type: 'text',\n virtual: 'post.title',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.admin?.readOnly).toBe(true)\n })\n\n it('should not override readOnly: false on virtual fields', async () => {\n const fields: Field[] = [\n {\n name: 'virtualText',\n type: 'text',\n virtual: true,\n admin: { readOnly: false },\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.admin?.readOnly).toBe(false)\n })\n\n it('should not set readOnly on non-virtual fields', async () => {\n const fields: Field[] = [\n {\n name: 'normalText',\n type: 'text',\n },\n ]\n\n const sanitizedField = (\n await sanitizeFields({\n config,\n collectionConfig,\n fields,\n validRelationships: [],\n })\n )[0] as TextField\n\n expect(sanitizedField.admin?.readOnly).toBeUndefined()\n })\n })\n})\n"],"names":["DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","sanitizeFields","describe","it","expect","config","collectionConfig","fields","name","label","validRelationships","rejects","toThrow","type","blocks","slug","sanitizedField","toStrictEqual","arrayField","labels","toBeUndefined","toMatchObject","plural","singular","relationTo","not","relationshipBlock","required","defaultValue","sanitizedFields","admin","disableBlockName","sanitizedBlock","undefined","virtual","validate","toBeDefined","toBe","customValidate","result","req","payload","t","v","readOnly"],"mappings":"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"}
|