payload 3.42.0 → 3.43.0-internal.c5bbc84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/functions/index.d.ts +8 -0
- package/dist/admin/functions/index.d.ts.map +1 -1
- package/dist/admin/functions/index.js.map +1 -1
- package/dist/admin/types.d.ts +1 -1
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/admin/types.js.map +1 -1
- package/dist/admin/views/folderList.d.ts +14 -5
- package/dist/admin/views/folderList.d.ts.map +1 -1
- package/dist/admin/views/folderList.js.map +1 -1
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +6 -3
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/operations/unlock.d.ts.map +1 -1
- package/dist/auth/operations/unlock.js +1 -2
- package/dist/auth/operations/unlock.js.map +1 -1
- package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
- package/dist/auth/strategies/local/authenticate.js +1 -0
- package/dist/auth/strategies/local/authenticate.js.map +1 -1
- package/dist/bin/index.js.map +1 -1
- package/dist/bin/migrate.d.ts.map +1 -1
- package/dist/bin/migrate.js +2 -2
- package/dist/bin/migrate.js.map +1 -1
- package/dist/collections/config/client.d.ts.map +1 -1
- package/dist/collections/config/client.js +3 -1
- package/dist/collections/config/client.js.map +1 -1
- package/dist/collections/dataloader.d.ts.map +1 -1
- package/dist/collections/dataloader.js +0 -1
- package/dist/collections/dataloader.js.map +1 -1
- package/dist/collections/operations/delete.d.ts.map +1 -1
- package/dist/collections/operations/delete.js +1 -2
- package/dist/collections/operations/delete.js.map +1 -1
- package/dist/collections/operations/findVersions.js +0 -1
- package/dist/collections/operations/findVersions.js.map +1 -1
- package/dist/collections/operations/update.d.ts.map +1 -1
- package/dist/collections/operations/update.js +3 -2
- package/dist/collections/operations/update.js.map +1 -1
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +1 -1
- package/dist/config/client.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +1 -2
- package/dist/config/sanitize.js.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
- package/dist/database/queryValidation/validateQueryPaths.js +0 -1
- package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.js +0 -1
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
- package/dist/database/sanitizeJoinQuery.d.ts.map +1 -1
- package/dist/database/sanitizeJoinQuery.js +3 -1
- package/dist/database/sanitizeJoinQuery.js.map +1 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +6 -1
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +0 -1
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.js +0 -1
- package/dist/fields/hooks/afterRead/index.js.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js +1 -2
- package/dist/fields/hooks/afterRead/relationshipPopulationPromise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +0 -1
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/setDefaultBeforeDuplicate.js.map +1 -1
- package/dist/fields/validations.d.ts.map +1 -1
- package/dist/fields/validations.js +1 -2
- package/dist/fields/validations.js.map +1 -1
- package/dist/folders/types.d.ts +2 -0
- package/dist/folders/types.d.ts.map +1 -1
- package/dist/folders/types.js.map +1 -1
- package/dist/globals/config/client.d.ts.map +1 -1
- package/dist/globals/config/client.js +2 -1
- package/dist/globals/config/client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/dist/queues/operations/runJobs/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/index.js +0 -1
- 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 +2 -2
- package/dist/queues/operations/runJobs/runJSONJob/index.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js +0 -1
- package/dist/queues/operations/runJobs/runJob/getRunTaskFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js +1 -1
- package/dist/queues/operations/runJobs/runJob/getUpdateJobFunction.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.js +1 -2
- package/dist/queues/operations/runJobs/runJob/importHandlerPath.js.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.d.ts.map +1 -1
- package/dist/queues/operations/runJobs/runJob/index.js +2 -2
- package/dist/queues/operations/runJobs/runJob/index.js.map +1 -1
- package/dist/uploads/cropImage.d.ts +0 -1
- package/dist/uploads/cropImage.d.ts.map +1 -1
- package/dist/uploads/cropImage.js +2 -3
- package/dist/uploads/cropImage.js.map +1 -1
- package/dist/uploads/endpoints/getFile.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFile.js +0 -1
- package/dist/uploads/endpoints/getFile.js.map +1 -1
- package/dist/uploads/endpoints/getFileFromURL.d.ts.map +1 -1
- package/dist/uploads/endpoints/getFileFromURL.js +2 -3
- package/dist/uploads/endpoints/getFileFromURL.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/fileFactory.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/fileFactory.js +1 -0
- package/dist/uploads/fetchAPI-multipart/fileFactory.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts +6 -0
- package/dist/uploads/fetchAPI-multipart/processMultipart.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js +0 -1
- package/dist/uploads/fetchAPI-multipart/processMultipart.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.d.ts +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/processNested.js +0 -1
- package/dist/uploads/fetchAPI-multipart/processNested.js.map +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.d.ts +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-multipart/utilities.js +0 -1
- package/dist/uploads/fetchAPI-multipart/utilities.js.map +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.d.ts +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.d.ts.map +1 -1
- package/dist/uploads/fetchAPI-stream-file/index.js +0 -1
- package/dist/uploads/fetchAPI-stream-file/index.js.map +1 -1
- package/dist/uploads/tempFile.d.ts +1 -1
- package/dist/uploads/tempFile.d.ts.map +1 -1
- package/dist/uploads/tempFile.js +0 -1
- package/dist/uploads/tempFile.js.map +1 -1
- package/dist/utilities/addLocalesToRequest.d.ts.map +1 -1
- package/dist/utilities/addLocalesToRequest.js +0 -1
- package/dist/utilities/addLocalesToRequest.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +2 -1
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/deepCopyObject.js +1 -2
- package/dist/utilities/deepCopyObject.js.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.js +0 -1
- package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
- package/dist/utilities/flattenTopLevelFields.d.ts.map +1 -1
- package/dist/utilities/flattenTopLevelFields.js +0 -1
- package/dist/utilities/flattenTopLevelFields.js.map +1 -1
- package/dist/utilities/formatErrors.d.ts.map +1 -1
- package/dist/utilities/formatErrors.js +0 -1
- package/dist/utilities/formatErrors.js.map +1 -1
- package/dist/utilities/getCollectionIDFieldTypes.d.ts.map +1 -1
- package/dist/utilities/getCollectionIDFieldTypes.js +0 -1
- package/dist/utilities/getCollectionIDFieldTypes.js.map +1 -1
- package/dist/utilities/getDataByPath.d.ts.map +1 -1
- package/dist/utilities/getDataByPath.js +0 -1
- package/dist/utilities/getDataByPath.js.map +1 -1
- package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
- package/dist/utilities/getEntityPolicies.js +3 -2
- package/dist/utilities/getEntityPolicies.js.map +1 -1
- package/dist/utilities/getFieldPermissions.d.ts.map +1 -1
- package/dist/utilities/getFieldPermissions.js +2 -3
- package/dist/utilities/getFieldPermissions.js.map +1 -1
- package/dist/utilities/getObjectDotNotation.d.ts.map +1 -1
- package/dist/utilities/getObjectDotNotation.js +0 -1
- package/dist/utilities/getObjectDotNotation.js.map +1 -1
- package/dist/utilities/getSiblingData.d.ts.map +1 -1
- package/dist/utilities/getSiblingData.js +0 -1
- package/dist/utilities/getSiblingData.js.map +1 -1
- package/dist/utilities/getUniqueListBy.d.ts.map +1 -1
- package/dist/utilities/getUniqueListBy.js +0 -1
- package/dist/utilities/getUniqueListBy.js.map +1 -1
- package/dist/utilities/handleEndpoints.d.ts.map +1 -1
- package/dist/utilities/handleEndpoints.js +2 -2
- package/dist/utilities/handleEndpoints.js.map +1 -1
- package/dist/utilities/logError.d.ts.map +1 -1
- package/dist/utilities/logError.js +0 -1
- package/dist/utilities/logError.js.map +1 -1
- package/dist/utilities/reduceFieldsToValues.d.ts.map +1 -1
- package/dist/utilities/reduceFieldsToValues.js +0 -1
- package/dist/utilities/reduceFieldsToValues.js.map +1 -1
- package/dist/utilities/sanitizeJoinParams.d.ts +1 -1
- package/dist/utilities/sanitizeJoinParams.d.ts.map +1 -1
- package/dist/utilities/sanitizeJoinParams.js +2 -2
- package/dist/utilities/sanitizeJoinParams.js.map +1 -1
- package/dist/utilities/sanitizePermissions.d.ts.map +1 -1
- package/dist/utilities/sanitizePermissions.js +2 -2
- package/dist/utilities/sanitizePermissions.js.map +1 -1
- package/dist/utilities/sanitizePopulateParam.d.ts.map +1 -1
- package/dist/utilities/sanitizePopulateParam.js +1 -1
- package/dist/utilities/sanitizePopulateParam.js.map +1 -1
- package/dist/utilities/sanitizeSelectParam.d.ts.map +1 -1
- package/dist/utilities/sanitizeSelectParam.js +4 -2
- package/dist/utilities/sanitizeSelectParam.js.map +1 -1
- package/dist/utilities/telemetry/conf/envPaths.d.ts +1 -1
- package/dist/utilities/telemetry/conf/envPaths.d.ts.map +1 -1
- package/dist/utilities/telemetry/conf/envPaths.js.map +1 -1
- package/dist/utilities/timestamp.d.ts +1 -1
- package/dist/utilities/timestamp.d.ts.map +1 -1
- package/dist/utilities/timestamp.js +0 -1
- package/dist/utilities/timestamp.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +6 -1
- package/dist/utilities/traverseFields.js.map +1 -1
- package/dist/utilities/unflatten.d.ts.map +1 -1
- package/dist/utilities/unflatten.js +1 -2
- package/dist/utilities/unflatten.js.map +1 -1
- package/dist/utilities/wait.d.ts +1 -1
- package/dist/utilities/wait.d.ts.map +1 -1
- package/dist/utilities/wait.js +0 -1
- package/dist/utilities/wait.js.map +1 -1
- package/dist/versions/baseFields.d.ts +2 -7
- package/dist/versions/baseFields.d.ts.map +1 -1
- package/dist/versions/baseFields.js.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.d.ts.map +1 -1
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js +1 -0
- package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
- package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
- package/dist/versions/getLatestGlobalVersion.js +3 -1
- package/dist/versions/getLatestGlobalVersion.js.map +1 -1
- package/dist/versions/saveVersion.js +1 -1
- package/dist/versions/saveVersion.js.map +1 -1
- package/package.json +3 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/utilities.ts"],"sourcesContent":["// @ts-strict-ignore\nimport fs from 'fs'\nimport path from 'path'\nimport { Readable } from 'stream'\n\nimport type { FetchAPIFileUploadOptions } from '../../config/types.js'\n\n// Parameters for safe file name parsing.\nconst SAFE_FILE_NAME_REGEX = /[^\\w-]/g\nconst MAX_EXTENSION_LENGTH = 3\n\n// Parameters to generate unique temporary file names:\nconst TEMP_COUNTER_MAX = 65536\nconst TEMP_PREFIX = 'tmp'\nlet tempCounter = 0\n\n/**\n * Logs message to console if options.debug option set to true.\n */\nexport const debugLog = (options: FetchAPIFileUploadOptions, msg: string) => {\n const opts = options || {}\n if (!opts.debug) {\n return false\n }\n console.log(`Next-file-upload: ${msg}`) // eslint-disable-line\n return true\n}\n\n/**\n * Generates unique temporary file name. e.g. tmp-5000-156788789789.\n */\nexport const getTempFilename = (prefix: string = TEMP_PREFIX) => {\n tempCounter = tempCounter >= TEMP_COUNTER_MAX ? 1 : tempCounter + 1\n return `${prefix}-${tempCounter}-${Date.now()}`\n}\n\ntype FuncType = (...args: any[]) => any\nexport const isFunc = (value: any): value is FuncType => {\n return typeof value === 'function'\n}\n\n/**\n * Set errorFunc to the same value as successFunc for callback mode.\n */\ntype ErrorFunc = (resolve: () => void, reject: (err: Error) => void) => (err: Error) => void\nconst errorFunc: ErrorFunc = (resolve, reject) => (isFunc(reject) ? reject : resolve)\n\n/**\n * Return a callback function for promise resole/reject args.\n * Ensures that callback is called only once.\n */\ntype PromiseCallback = (resolve: () => void, reject: (err: Error) => void) => (err: Error) => void\nexport const promiseCallback: PromiseCallback = (resolve, reject) => {\n let hasFired = false\n return (err: Error) => {\n if (hasFired) {\n return\n }\n\n hasFired = true\n return err ? errorFunc(resolve, reject)(err) : resolve()\n }\n}\n\n// The default prototypes for both objects and arrays.\n// Used by isSafeFromPollution\nconst OBJECT_PROTOTYPE_KEYS = Object.getOwnPropertyNames(Object.prototype)\nconst ARRAY_PROTOTYPE_KEYS = Object.getOwnPropertyNames(Array.prototype)\n\n/**\n * Determines whether a key insertion into an object could result in a prototype pollution\n */\ntype IsSafeFromPollution = (base: any, key: string) => boolean\nexport const isSafeFromPollution: IsSafeFromPollution = (base, key) => {\n // We perform an instanceof check instead of Array.isArray as the former is more\n // permissive for cases in which the object as an Array prototype but was not constructed\n // via an Array constructor or literal.\n const TOUCHES_ARRAY_PROTOTYPE = base instanceof Array && ARRAY_PROTOTYPE_KEYS.includes(key)\n const TOUCHES_OBJECT_PROTOTYPE = OBJECT_PROTOTYPE_KEYS.includes(key)\n\n return !TOUCHES_ARRAY_PROTOTYPE && !TOUCHES_OBJECT_PROTOTYPE\n}\n\n/**\n * Build request field/file objects to return\n */\ntype BuildFields = (instance: any, field: string, value: any) => any\nexport const buildFields: BuildFields = (instance, field, value) => {\n // Do nothing if value is not set.\n if (value === null || value === undefined) {\n return instance\n }\n instance = instance || Object.create(null)\n\n if (!isSafeFromPollution(instance, field)) {\n return instance\n }\n // Non-array fields\n if (!instance[field]) {\n instance[field] = value\n return instance\n }\n // Array fields\n if (instance[field] instanceof Array) {\n instance[field].push(value)\n } else {\n instance[field] = [instance[field], value]\n }\n return instance\n}\n\n/**\n * Creates a folder if it does not exist\n * for file specified in the path variable\n */\ntype CheckAndMakeDir = (fileUploadOptions: FetchAPIFileUploadOptions, filePath: string) => boolean\nexport const checkAndMakeDir: CheckAndMakeDir = (fileUploadOptions, filePath) => {\n if (!fileUploadOptions.createParentPath) {\n return false\n }\n // Check whether folder for the file exists.\n const parentPath = path.dirname(filePath)\n // Create folder if it doesn't exist.\n if (!fs.existsSync(parentPath)) {\n fs.mkdirSync(parentPath, { recursive: true })\n }\n // Checks folder again and return a results.\n return fs.existsSync(parentPath)\n}\n\n/**\n * Delete a file.\n */\ntype DeleteFile = (filePath: string, callback: (args: any) => void) => void\nexport const deleteFile: DeleteFile = (filePath, callback: (args) => void) =>\n fs.unlink(filePath, callback)\n\n/**\n * Copy file via streams\n */\ntype CopyFile = (src: string, dst: string, callback: (err: Error) => void) => void\nconst copyFile: CopyFile = (src, dst, callback) => {\n // cbCalled flag and runCb helps to run cb only once.\n let cbCalled = false\n const runCb = (err?: Error) => {\n if (cbCalled) {\n return\n }\n cbCalled = true\n callback(err!)\n }\n // Create read stream\n const readable = fs.createReadStream(src)\n readable.on('error', runCb)\n // Create write stream\n const writable = fs.createWriteStream(dst)\n writable.on('error', (err: Error) => {\n readable.destroy()\n runCb(err)\n })\n writable.on('close', () => runCb())\n // Copy file via piping streams.\n readable.pipe(writable)\n}\n\n/**\n * moveFile: moves the file from src to dst.\n * Firstly trying to rename the file if no luck copying it to dst and then deleting src.\n */\ntype MoveFile = (\n src: string,\n dst: string,\n callback: (err: Error, renamed?: boolean) => void,\n) => void\nexport const moveFile: MoveFile = (src, dst, callback) =>\n fs.rename(src, dst, (err) => {\n if (err) {\n // Try to copy file if rename didn't work.\n copyFile(src, dst, (cpErr) => (cpErr ? callback(cpErr) : deleteFile(src, callback)))\n return\n }\n // File was renamed successfully: Add true to the callback to indicate that.\n callback(null!, true)\n })\n\n/**\n * Save buffer data to a file.\n * @param {Buffer} buffer - buffer to save to a file.\n * @param {string} filePath - path to a file.\n */\nexport const saveBufferToFile = (buffer, filePath, callback) => {\n if (!Buffer.isBuffer(buffer)) {\n return callback(new Error('buffer variable should be type of Buffer!'))\n }\n // Setup readable stream from buffer.\n let streamData = buffer\n const readStream = new Readable()\n readStream._read = () => {\n readStream.push(streamData)\n streamData = null!\n }\n // Setup file system writable stream.\n const fstream = fs.createWriteStream(filePath)\n // console.log(\"Calling saveBuffer\");\n fstream.on('error', (err) => {\n // console.log(\"err cb\")\n callback(err)\n })\n fstream.on('close', () => {\n // console.log(\"close cb\");\n callback()\n })\n // Copy file via piping streams.\n readStream.pipe(fstream)\n}\n\n/**\n * Decodes uriEncoded file names.\n * @param {Object} opts - middleware options.\n * @param fileName {String} - file name to decode.\n * @returns {String}\n */\nconst uriDecodeFileName = (opts, fileName) => {\n if (!opts || !opts.uriDecodeFileNames) {\n return fileName\n }\n // Decode file name from URI with checking URI malformed errors.\n // See Issue https://github.com/richardgirges/express-fileupload/issues/342.\n try {\n return decodeURIComponent(fileName)\n } catch (ignore) {\n const matcher = /(%[a-f\\d]{2})/gi\n return fileName\n .split(matcher)\n .map((str) => {\n try {\n return decodeURIComponent(str)\n } catch (ignore) {\n return ''\n }\n })\n .join('')\n }\n}\n\n/**\n * Parses filename and extension and returns object {name, extension}.\n */\ntype ParseFileNameExtension = (\n preserveExtension: boolean | number,\n fileName: string,\n) => {\n extension: string\n name: string\n}\nexport const parseFileNameExtension: ParseFileNameExtension = (preserveExtension, fileName) => {\n const defaultResult = {\n name: fileName,\n extension: '',\n }\n if (!preserveExtension) {\n return defaultResult\n }\n\n // Define maximum extension length\n const maxExtLength =\n typeof preserveExtension === 'boolean' ? MAX_EXTENSION_LENGTH : preserveExtension\n\n const nameParts = fileName.split('.')\n if (nameParts.length < 2) {\n return defaultResult\n }\n\n let extension = nameParts.pop()\n if (extension!.length > maxExtLength && maxExtLength > 0) {\n nameParts[nameParts.length - 1] += '.' + extension!.substr(0, extension!.length - maxExtLength)\n extension = extension!.substr(-maxExtLength)\n }\n\n return {\n name: nameParts.join('.'),\n extension: maxExtLength ? extension! : '',\n }\n}\n\n/**\n * Parse file name and extension.\n */\ntype ParseFileName = (opts: FetchAPIFileUploadOptions, fileName: string) => string\nexport const parseFileName: ParseFileName = (opts, fileName) => {\n // Check fileName argument\n if (!fileName || typeof fileName !== 'string') {\n return getTempFilename()\n }\n // Cut off file name if it's length more then 255.\n let parsedName = fileName.length <= 255 ? fileName : fileName.substr(0, 255)\n // Decode file name if uriDecodeFileNames option set true.\n parsedName = uriDecodeFileName(opts, parsedName)\n // Stop parsing file name if safeFileNames options hasn't been set.\n if (!opts.safeFileNames) {\n return parsedName\n }\n // Set regular expression for the file name.\n const nameRegex =\n typeof opts.safeFileNames === 'object' && opts.safeFileNames instanceof RegExp\n ? opts.safeFileNames\n : SAFE_FILE_NAME_REGEX\n // Parse file name extension.\n const parsedFileName = parseFileNameExtension(opts.preserveExtension!, parsedName)\n if (parsedFileName.extension.length) {\n parsedFileName.extension = '.' + parsedFileName.extension.replace(nameRegex, '')\n }\n\n return parsedFileName.name.replace(nameRegex, '').concat(parsedFileName.extension)\n}\n"],"names":["fs","path","Readable","SAFE_FILE_NAME_REGEX","MAX_EXTENSION_LENGTH","TEMP_COUNTER_MAX","TEMP_PREFIX","tempCounter","debugLog","options","msg","opts","debug","console","log","getTempFilename","prefix","Date","now","isFunc","value","errorFunc","resolve","reject","promiseCallback","hasFired","err","OBJECT_PROTOTYPE_KEYS","Object","getOwnPropertyNames","prototype","ARRAY_PROTOTYPE_KEYS","Array","isSafeFromPollution","base","key","TOUCHES_ARRAY_PROTOTYPE","includes","TOUCHES_OBJECT_PROTOTYPE","buildFields","instance","field","undefined","create","push","checkAndMakeDir","fileUploadOptions","filePath","createParentPath","parentPath","dirname","existsSync","mkdirSync","recursive","deleteFile","callback","unlink","copyFile","src","dst","cbCalled","runCb","readable","createReadStream","on","writable","createWriteStream","destroy","pipe","moveFile","rename","cpErr","saveBufferToFile","buffer","Buffer","isBuffer","Error","streamData","readStream","_read","fstream","uriDecodeFileName","fileName","uriDecodeFileNames","decodeURIComponent","ignore","matcher","split","map","str","join","parseFileNameExtension","preserveExtension","defaultResult","name","extension","maxExtLength","nameParts","length","pop","substr","parseFileName","parsedName","safeFileNames","nameRegex","RegExp","parsedFileName","replace","concat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fetchAPI-multipart/utilities.ts"],"sourcesContent":["import fs from 'fs'\nimport path from 'path'\nimport { Readable } from 'stream'\n\nimport type { FetchAPIFileUploadOptions } from '../../config/types.js'\n\n// Parameters for safe file name parsing.\nconst SAFE_FILE_NAME_REGEX = /[^\\w-]/g\nconst MAX_EXTENSION_LENGTH = 3\n\n// Parameters to generate unique temporary file names:\nconst TEMP_COUNTER_MAX = 65536\nconst TEMP_PREFIX = 'tmp'\nlet tempCounter = 0\n\n/**\n * Logs message to console if options.debug option set to true.\n */\nexport const debugLog = (options: FetchAPIFileUploadOptions, msg: string) => {\n const opts = options || {}\n if (!opts.debug) {\n return false\n }\n console.log(`Next-file-upload: ${msg}`) // eslint-disable-line\n return true\n}\n\n/**\n * Generates unique temporary file name. e.g. tmp-5000-156788789789.\n */\nexport const getTempFilename = (prefix: string = TEMP_PREFIX) => {\n tempCounter = tempCounter >= TEMP_COUNTER_MAX ? 1 : tempCounter + 1\n return `${prefix}-${tempCounter}-${Date.now()}`\n}\n\ntype FuncType = (...args: any[]) => any\nexport const isFunc = (value: any): value is FuncType => {\n return typeof value === 'function'\n}\n\n/**\n * Set errorFunc to the same value as successFunc for callback mode.\n */\ntype ErrorFunc = (resolve: () => void, reject: (err: Error) => void) => (err: Error) => void\nconst errorFunc: ErrorFunc = (resolve, reject) => (isFunc(reject) ? reject : resolve)\n\n/**\n * Return a callback function for promise resole/reject args.\n * Ensures that callback is called only once.\n */\ntype PromiseCallback = (resolve: () => void, reject: (err: Error) => void) => (err: Error) => void\nexport const promiseCallback: PromiseCallback = (resolve, reject) => {\n let hasFired = false\n return (err: Error) => {\n if (hasFired) {\n return\n }\n\n hasFired = true\n return err ? errorFunc(resolve, reject)(err) : resolve()\n }\n}\n\n// The default prototypes for both objects and arrays.\n// Used by isSafeFromPollution\nconst OBJECT_PROTOTYPE_KEYS = Object.getOwnPropertyNames(Object.prototype)\nconst ARRAY_PROTOTYPE_KEYS = Object.getOwnPropertyNames(Array.prototype)\n\n/**\n * Determines whether a key insertion into an object could result in a prototype pollution\n */\ntype IsSafeFromPollution = (base: any, key: string) => boolean\nexport const isSafeFromPollution: IsSafeFromPollution = (base, key) => {\n // We perform an instanceof check instead of Array.isArray as the former is more\n // permissive for cases in which the object as an Array prototype but was not constructed\n // via an Array constructor or literal.\n const TOUCHES_ARRAY_PROTOTYPE = base instanceof Array && ARRAY_PROTOTYPE_KEYS.includes(key)\n const TOUCHES_OBJECT_PROTOTYPE = OBJECT_PROTOTYPE_KEYS.includes(key)\n\n return !TOUCHES_ARRAY_PROTOTYPE && !TOUCHES_OBJECT_PROTOTYPE\n}\n\n/**\n * Build request field/file objects to return\n */\ntype BuildFields = (instance: any, field: string, value: any) => any\nexport const buildFields: BuildFields = (instance, field, value) => {\n // Do nothing if value is not set.\n if (value === null || value === undefined) {\n return instance\n }\n instance = instance || Object.create(null)\n\n if (!isSafeFromPollution(instance, field)) {\n return instance\n }\n // Non-array fields\n if (!instance[field]) {\n instance[field] = value\n return instance\n }\n // Array fields\n if (instance[field] instanceof Array) {\n instance[field].push(value)\n } else {\n instance[field] = [instance[field], value]\n }\n return instance\n}\n\n/**\n * Creates a folder if it does not exist\n * for file specified in the path variable\n */\ntype CheckAndMakeDir = (fileUploadOptions: FetchAPIFileUploadOptions, filePath: string) => boolean\nexport const checkAndMakeDir: CheckAndMakeDir = (fileUploadOptions, filePath) => {\n if (!fileUploadOptions.createParentPath) {\n return false\n }\n // Check whether folder for the file exists.\n const parentPath = path.dirname(filePath)\n // Create folder if it doesn't exist.\n if (!fs.existsSync(parentPath)) {\n fs.mkdirSync(parentPath, { recursive: true })\n }\n // Checks folder again and return a results.\n return fs.existsSync(parentPath)\n}\n\n/**\n * Delete a file.\n */\ntype DeleteFile = (filePath: string, callback: (args: any) => void) => void\nexport const deleteFile: DeleteFile = (filePath, callback) => fs.unlink(filePath, callback)\n\n/**\n * Copy file via streams\n */\ntype CopyFile = (src: string, dst: string, callback: (err: Error) => void) => void\nconst copyFile: CopyFile = (src, dst, callback) => {\n // cbCalled flag and runCb helps to run cb only once.\n let cbCalled = false\n const runCb = (err?: Error) => {\n if (cbCalled) {\n return\n }\n cbCalled = true\n callback(err!)\n }\n // Create read stream\n const readable = fs.createReadStream(src)\n readable.on('error', runCb)\n // Create write stream\n const writable = fs.createWriteStream(dst)\n writable.on('error', (err: Error) => {\n readable.destroy()\n runCb(err)\n })\n writable.on('close', () => runCb())\n // Copy file via piping streams.\n readable.pipe(writable)\n}\n\n/**\n * moveFile: moves the file from src to dst.\n * Firstly trying to rename the file if no luck copying it to dst and then deleting src.\n */\ntype MoveFile = (\n src: string,\n dst: string,\n callback: (err: Error, renamed?: boolean) => void,\n) => void\nexport const moveFile: MoveFile = (src, dst, callback) =>\n fs.rename(src, dst, (err) => {\n if (err) {\n // Try to copy file if rename didn't work.\n copyFile(src, dst, (cpErr) => (cpErr ? callback(cpErr) : deleteFile(src, callback)))\n return\n }\n // File was renamed successfully: Add true to the callback to indicate that.\n callback(null!, true)\n })\n\n/**\n * Save buffer data to a file.\n * @param {Buffer} buffer - buffer to save to a file.\n * @param {string} filePath - path to a file.\n */\nexport const saveBufferToFile = (\n buffer: Buffer,\n filePath: string,\n callback: (err?: Error) => void,\n) => {\n if (!Buffer.isBuffer(buffer)) {\n return callback(new Error('buffer variable should be type of Buffer!'))\n }\n // Setup readable stream from buffer.\n let streamData = buffer\n const readStream = new Readable()\n readStream._read = () => {\n readStream.push(streamData)\n streamData = null!\n }\n // Setup file system writable stream.\n const fstream = fs.createWriteStream(filePath)\n // console.log(\"Calling saveBuffer\");\n fstream.on('error', (err) => {\n // console.log(\"err cb\")\n callback(err)\n })\n fstream.on('close', () => {\n // console.log(\"close cb\");\n callback()\n })\n // Copy file via piping streams.\n readStream.pipe(fstream)\n}\n\n/**\n * Decodes uriEncoded file names.\n * @param {Object} opts - middleware options.\n * @param fileName {String} - file name to decode.\n * @returns {String}\n */\nconst uriDecodeFileName = (opts: FetchAPIFileUploadOptions, fileName: string) => {\n if (!opts || !opts.uriDecodeFileNames) {\n return fileName\n }\n // Decode file name from URI with checking URI malformed errors.\n // See Issue https://github.com/richardgirges/express-fileupload/issues/342.\n try {\n return decodeURIComponent(fileName)\n } catch (ignore) {\n const matcher = /(%[a-f\\d]{2})/gi\n return fileName\n .split(matcher)\n .map((str) => {\n try {\n return decodeURIComponent(str)\n } catch (ignore) {\n return ''\n }\n })\n .join('')\n }\n}\n\n/**\n * Parses filename and extension and returns object {name, extension}.\n */\ntype ParseFileNameExtension = (\n preserveExtension: boolean | number,\n fileName: string,\n) => {\n extension: string\n name: string\n}\nexport const parseFileNameExtension: ParseFileNameExtension = (preserveExtension, fileName) => {\n const defaultResult = {\n name: fileName,\n extension: '',\n }\n if (!preserveExtension) {\n return defaultResult\n }\n\n // Define maximum extension length\n const maxExtLength =\n typeof preserveExtension === 'boolean' ? MAX_EXTENSION_LENGTH : preserveExtension\n\n const nameParts = fileName.split('.')\n if (nameParts.length < 2) {\n return defaultResult\n }\n\n let extension = nameParts.pop()\n if (extension!.length > maxExtLength && maxExtLength > 0) {\n nameParts[nameParts.length - 1] += '.' + extension!.substr(0, extension!.length - maxExtLength)\n extension = extension!.substr(-maxExtLength)\n }\n\n return {\n name: nameParts.join('.'),\n extension: maxExtLength ? extension! : '',\n }\n}\n\n/**\n * Parse file name and extension.\n */\ntype ParseFileName = (opts: FetchAPIFileUploadOptions, fileName: string) => string\nexport const parseFileName: ParseFileName = (opts, fileName) => {\n // Check fileName argument\n if (!fileName || typeof fileName !== 'string') {\n return getTempFilename()\n }\n // Cut off file name if it's length more then 255.\n let parsedName = fileName.length <= 255 ? fileName : fileName.substr(0, 255)\n // Decode file name if uriDecodeFileNames option set true.\n parsedName = uriDecodeFileName(opts, parsedName)\n // Stop parsing file name if safeFileNames options hasn't been set.\n if (!opts.safeFileNames) {\n return parsedName\n }\n // Set regular expression for the file name.\n const nameRegex =\n typeof opts.safeFileNames === 'object' && opts.safeFileNames instanceof RegExp\n ? opts.safeFileNames\n : SAFE_FILE_NAME_REGEX\n // Parse file name extension.\n const parsedFileName = parseFileNameExtension(opts.preserveExtension!, parsedName)\n if (parsedFileName.extension.length) {\n parsedFileName.extension = '.' + parsedFileName.extension.replace(nameRegex, '')\n }\n\n return parsedFileName.name.replace(nameRegex, '').concat(parsedFileName.extension)\n}\n"],"names":["fs","path","Readable","SAFE_FILE_NAME_REGEX","MAX_EXTENSION_LENGTH","TEMP_COUNTER_MAX","TEMP_PREFIX","tempCounter","debugLog","options","msg","opts","debug","console","log","getTempFilename","prefix","Date","now","isFunc","value","errorFunc","resolve","reject","promiseCallback","hasFired","err","OBJECT_PROTOTYPE_KEYS","Object","getOwnPropertyNames","prototype","ARRAY_PROTOTYPE_KEYS","Array","isSafeFromPollution","base","key","TOUCHES_ARRAY_PROTOTYPE","includes","TOUCHES_OBJECT_PROTOTYPE","buildFields","instance","field","undefined","create","push","checkAndMakeDir","fileUploadOptions","filePath","createParentPath","parentPath","dirname","existsSync","mkdirSync","recursive","deleteFile","callback","unlink","copyFile","src","dst","cbCalled","runCb","readable","createReadStream","on","writable","createWriteStream","destroy","pipe","moveFile","rename","cpErr","saveBufferToFile","buffer","Buffer","isBuffer","Error","streamData","readStream","_read","fstream","uriDecodeFileName","fileName","uriDecodeFileNames","decodeURIComponent","ignore","matcher","split","map","str","join","parseFileNameExtension","preserveExtension","defaultResult","name","extension","maxExtLength","nameParts","length","pop","substr","parseFileName","parsedName","safeFileNames","nameRegex","RegExp","parsedFileName","replace","concat"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
|
-
export declare function iteratorToStream(iterator:
|
|
2
|
+
export declare function iteratorToStream(iterator: AsyncIterator<Uint8Array>): ReadableStream<any>;
|
|
3
3
|
export declare function nodeStreamToIterator(stream: fs.ReadStream): AsyncGenerator<Uint8Array<any>, void, unknown>;
|
|
4
4
|
export declare function streamFile(path: string): ReadableStream;
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/uploads/fetchAPI-stream-file/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/uploads/fetchAPI-stream-file/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,uBAWnE;AAED,wBAAuB,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,kDAIhE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAIvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/uploads/fetchAPI-stream-file/index.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../../src/uploads/fetchAPI-stream-file/index.ts"],"sourcesContent":["import fs from 'fs'\n\nexport function iteratorToStream(iterator: AsyncIterator<Uint8Array>) {\n return new ReadableStream({\n async pull(controller) {\n const { done, value } = await iterator.next()\n if (done) {\n controller.close()\n } else {\n controller.enqueue(value)\n }\n },\n })\n}\n\nexport async function* nodeStreamToIterator(stream: fs.ReadStream) {\n for await (const chunk of stream) {\n yield new Uint8Array(chunk)\n }\n}\n\nexport function streamFile(path: string): ReadableStream {\n const nodeStream = fs.createReadStream(path)\n const data: ReadableStream = iteratorToStream(nodeStreamToIterator(nodeStream))\n return data\n}\n"],"names":["fs","iteratorToStream","iterator","ReadableStream","pull","controller","done","value","next","close","enqueue","nodeStreamToIterator","stream","chunk","Uint8Array","streamFile","path","nodeStream","createReadStream","data"],"mappings":"AAAA,OAAOA,QAAQ,KAAI;AAEnB,OAAO,SAASC,iBAAiBC,QAAmC;IAClE,OAAO,IAAIC,eAAe;QACxB,MAAMC,MAAKC,UAAU;YACnB,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAG,MAAML,SAASM,IAAI;YAC3C,IAAIF,MAAM;gBACRD,WAAWI,KAAK;YAClB,OAAO;gBACLJ,WAAWK,OAAO,CAACH;YACrB;QACF;IACF;AACF;AAEA,OAAO,gBAAgBI,qBAAqBC,MAAqB;IAC/D,WAAW,MAAMC,SAASD,OAAQ;QAChC,MAAM,IAAIE,WAAWD;IACvB;AACF;AAEA,OAAO,SAASE,WAAWC,IAAY;IACrC,MAAMC,aAAajB,GAAGkB,gBAAgB,CAACF;IACvC,MAAMG,OAAuBlB,iBAAiBU,qBAAqBM;IACnE,OAAOE;AACT"}
|
|
@@ -2,6 +2,6 @@ type Options = {
|
|
|
2
2
|
extension?: string;
|
|
3
3
|
name?: string;
|
|
4
4
|
};
|
|
5
|
-
export declare const temporaryFileTask: (callback: any
|
|
5
|
+
export declare const temporaryFileTask: (callback: (temporaryPath: string) => Promise<any>, options?: Options) => Promise<any>;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=tempFile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempFile.d.ts","sourceRoot":"","sources":["../../src/uploads/tempFile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tempFile.d.ts","sourceRoot":"","sources":["../../src/uploads/tempFile.ts"],"names":[],"mappings":"AAaA,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,iBAAiB,aAClB,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,YACxC,OAAO,iBAIjB,CAAA"}
|
package/dist/uploads/tempFile.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { v4 as uuid } from 'uuid'\n\nasync function runTask(temporaryPath: string, callback: (temporaryPath: string) => Promise<any>) {\n try {\n return await callback(temporaryPath)\n } finally {\n await fs.rm(temporaryPath, { force: true, maxRetries: 2, recursive: true })\n }\n}\n\ntype Options = {\n extension?: string\n name?: string\n}\n\nexport const temporaryFileTask = async (\n callback: (temporaryPath: string) => Promise<any>,\n options: Options = {},\n) => {\n const filePath = await temporaryFile(options)\n return runTask(filePath, callback)\n}\n\nasync function temporaryFile(options: Options) {\n if (options.name) {\n if (options.extension !== undefined && options.extension !== null) {\n throw new Error('The `name` and `extension` options are mutually exclusive')\n }\n\n return path.join(await temporaryDirectory(), options.name)\n }\n\n return (\n (await getPath()) +\n (options.extension === undefined || options.extension === null\n ? ''\n : '.' + options.extension.replace(/^\\./, ''))\n )\n}\n\nasync function temporaryDirectory({ prefix = '' } = {}) {\n const directory = await getPath(prefix)\n await fs.mkdir(directory)\n return directory\n}\n\nasync function getPath(prefix = ''): Promise<string> {\n const temporaryDirectory = await fs.realpath(os.tmpdir())\n return path.join(temporaryDirectory, prefix + uuid())\n}\n"],"names":["fs","os","path","v4","uuid","runTask","temporaryPath","callback","rm","force","maxRetries","recursive","temporaryFileTask","options","filePath","temporaryFile","name","extension","undefined","Error","join","temporaryDirectory","getPath","replace","prefix","directory","mkdir","realpath","tmpdir"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAC5B,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAEjC,eAAeC,QAAQC,aAAqB,EAAEC,QAAiD;IAC7F,IAAI;QACF,OAAO,MAAMA,SAASD;IACxB,SAAU;QACR,MAAMN,GAAGQ,EAAE,CAACF,eAAe;YAAEG,OAAO;YAAMC,YAAY;YAAGC,WAAW;QAAK;IAC3E;AACF;AAOA,OAAO,MAAMC,oBAAoB,OAC/BL,UACAM,UAAmB,CAAC,CAAC;IAErB,MAAMC,WAAW,MAAMC,cAAcF;IACrC,OAAOR,QAAQS,UAAUP;AAC3B,EAAC;AAED,eAAeQ,cAAcF,OAAgB;IAC3C,IAAIA,QAAQG,IAAI,EAAE;QAChB,IAAIH,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,MAAM;YACjE,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOjB,KAAKkB,IAAI,CAAC,MAAMC,sBAAsBR,QAAQG,IAAI;IAC3D;IAEA,OACE,AAAC,MAAMM,YACNT,CAAAA,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,OACtD,KACA,MAAMJ,QAAQI,SAAS,CAACM,OAAO,CAAC,OAAO,GAAE;AAEjD;AAEA,eAAeF,mBAAmB,EAAEG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAMC,YAAY,MAAMH,QAAQE;IAChC,MAAMxB,GAAG0B,KAAK,CAACD;IACf,OAAOA;AACT;AAEA,eAAeH,QAAQE,SAAS,EAAE;IAChC,MAAMH,qBAAqB,MAAMrB,GAAG2B,QAAQ,CAAC1B,GAAG2B,MAAM;IACtD,OAAO1B,KAAKkB,IAAI,CAACC,oBAAoBG,SAASpB;AAChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addLocalesToRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/addLocalesToRequest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addLocalesToRequest.d.ts","sourceRoot":"","sources":["../../src/utilities/addLocalesToRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAIvD;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CA0CrE;AAED,KAAK,mBAAmB,GAAG;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,eAAe,CAAC,cAAc,CAAC,CAAA;CAC9C,CAAA;AACD,KAAK,qBAAqB,GAAG;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB,CAAA;AACD,eAAO,MAAM,eAAe,8CAIzB,mBAAmB,KAAG,qBAqBxB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/addLocalesToRequest.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/addLocalesToRequest.ts"],"sourcesContent":["import type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequest } from '../types/index.js'\n\nimport { sanitizeFallbackLocale } from './sanitizeFallbackLocale.js'\n\n/**\n * Mutates the Request to contain 'locale' and 'fallbackLocale' based on data or searchParams\n */\nexport function addLocalesToRequestFromData(req: PayloadRequest): void {\n const {\n data,\n payload: { config },\n } = req\n\n if (data) {\n const localeOnReq = req.locale\n const fallbackLocaleOnReq = req.fallbackLocale\n let localeFromData!: string\n let fallbackLocaleFromData!: string\n\n if (!localeOnReq && data?.locale && typeof data.locale === 'string') {\n localeFromData = data.locale\n }\n\n if (!fallbackLocaleOnReq) {\n if (data?.['fallback-locale'] && typeof data?.['fallback-locale'] === 'string') {\n fallbackLocaleFromData = data['fallback-locale']\n }\n\n if (data?.['fallbackLocale'] && typeof data?.['fallbackLocale'] === 'string') {\n fallbackLocaleFromData = data['fallbackLocale']\n }\n }\n\n if (!localeOnReq || !fallbackLocaleOnReq) {\n const { fallbackLocale, locale } = sanitizeLocales({\n fallbackLocale: fallbackLocaleFromData,\n locale: localeFromData,\n localization: config.localization,\n })\n\n if (localeFromData) {\n req.locale = locale\n }\n\n if (fallbackLocaleFromData) {\n req.fallbackLocale = fallbackLocale\n }\n }\n }\n}\n\ntype SanitizeLocalesArgs = {\n fallbackLocale: string\n locale: string\n localization: SanitizedConfig['localization']\n}\ntype SanitizeLocalesReturn = {\n fallbackLocale?: string\n locale?: string\n}\nexport const sanitizeLocales = ({\n fallbackLocale,\n locale,\n localization,\n}: SanitizeLocalesArgs): SanitizeLocalesReturn => {\n // Check if localization has fallback enabled or if a fallback locale is provided\n\n if (localization) {\n fallbackLocale = sanitizeFallbackLocale({\n fallbackLocale,\n locale,\n localization,\n })!\n }\n\n if (['*', 'all'].includes(locale)) {\n locale = 'all'\n } else if (localization && !localization.localeCodes.includes(locale) && localization.fallback) {\n locale = localization.defaultLocale\n }\n\n return {\n fallbackLocale,\n locale,\n }\n}\n"],"names":["sanitizeFallbackLocale","addLocalesToRequestFromData","req","data","payload","config","localeOnReq","locale","fallbackLocaleOnReq","fallbackLocale","localeFromData","fallbackLocaleFromData","sanitizeLocales","localization","includes","localeCodes","fallback","defaultLocale"],"mappings":"AAGA,SAASA,sBAAsB,QAAQ,8BAA6B;AAEpE;;CAEC,GACD,OAAO,SAASC,4BAA4BC,GAAmB;IAC7D,MAAM,EACJC,IAAI,EACJC,SAAS,EAAEC,MAAM,EAAE,EACpB,GAAGH;IAEJ,IAAIC,MAAM;QACR,MAAMG,cAAcJ,IAAIK,MAAM;QAC9B,MAAMC,sBAAsBN,IAAIO,cAAc;QAC9C,IAAIC;QACJ,IAAIC;QAEJ,IAAI,CAACL,eAAeH,MAAMI,UAAU,OAAOJ,KAAKI,MAAM,KAAK,UAAU;YACnEG,iBAAiBP,KAAKI,MAAM;QAC9B;QAEA,IAAI,CAACC,qBAAqB;YACxB,IAAIL,MAAM,CAAC,kBAAkB,IAAI,OAAOA,MAAM,CAAC,kBAAkB,KAAK,UAAU;gBAC9EQ,yBAAyBR,IAAI,CAAC,kBAAkB;YAClD;YAEA,IAAIA,MAAM,CAAC,iBAAiB,IAAI,OAAOA,MAAM,CAAC,iBAAiB,KAAK,UAAU;gBAC5EQ,yBAAyBR,IAAI,CAAC,iBAAiB;YACjD;QACF;QAEA,IAAI,CAACG,eAAe,CAACE,qBAAqB;YACxC,MAAM,EAAEC,cAAc,EAAEF,MAAM,EAAE,GAAGK,gBAAgB;gBACjDH,gBAAgBE;gBAChBJ,QAAQG;gBACRG,cAAcR,OAAOQ,YAAY;YACnC;YAEA,IAAIH,gBAAgB;gBAClBR,IAAIK,MAAM,GAAGA;YACf;YAEA,IAAII,wBAAwB;gBAC1BT,IAAIO,cAAc,GAAGA;YACvB;QACF;IACF;AACF;AAWA,OAAO,MAAMG,kBAAkB,CAAC,EAC9BH,cAAc,EACdF,MAAM,EACNM,YAAY,EACQ;IACpB,iFAAiF;IAEjF,IAAIA,cAAc;QAChBJ,iBAAiBT,uBAAuB;YACtCS;YACAF;YACAM;QACF;IACF;IAEA,IAAI;QAAC;QAAK;KAAM,CAACC,QAAQ,CAACP,SAAS;QACjCA,SAAS;IACX,OAAO,IAAIM,gBAAgB,CAACA,aAAaE,WAAW,CAACD,QAAQ,CAACP,WAAWM,aAAaG,QAAQ,EAAE;QAC9FT,SAASM,aAAaI,aAAa;IACrC;IAEA,OAAO;QACLR;QACAF;IACF;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"configToJSONSchema.d.ts","sourceRoot":"","sources":["../../src/utilities/configToJSONSchema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAKnE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAGpD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAsB,cAAc,EAAU,MAAM,2BAA2B,CAAA;AAC3F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AA4LvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAO7C;AA2BD,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,cAAc,EAAE;AACxB;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,EACxB,IAAI,CAAC,EAAE,IAAI,GACV;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAqeA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,yBAAyB,GAAG,qBAAqB,EACzD,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,EAChC,sBAAsB,CAAC,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC/D,IAAI,CAAC,EAAE,IAAI,GACV,WAAW,CAwEb;AAED,wBAAgB,wBAAwB,CAAC,EACvC,MAAM,EACN,MAAM,EACN,wBAAwB,GACzB,EAAE;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;CACnD,GAAG,WAAW,CAgGd;AAgHD,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,yBAAyB,GAChC,WAAW,CA0Bb;AAGD,wBAAgB,qBAAqB,CACnC,kBAAkB,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,GAC9E,WAAW,CAOb;AAuBD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,EACjC,IAAI,CAAC,EAAE,IAAI,GACV,WAAW,CAgLb"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @ts-strict-ignore
|
|
2
1
|
import pluralize from 'pluralize';
|
|
3
2
|
const { singular } = pluralize;
|
|
4
3
|
import { MissingEditorProp } from '../errors/MissingEditorProp.js';
|
|
@@ -73,6 +72,7 @@ function generateCollectionJoinsSchemas(collections) {
|
|
|
73
72
|
};
|
|
74
73
|
for(const collectionSlug in joins){
|
|
75
74
|
for (const join of joins[collectionSlug]){
|
|
75
|
+
;
|
|
76
76
|
schema.properties[join.joinPath] = {
|
|
77
77
|
type: 'string',
|
|
78
78
|
enum: [
|
|
@@ -83,6 +83,7 @@ function generateCollectionJoinsSchemas(collections) {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
for (const join of polymorphicJoins){
|
|
86
|
+
;
|
|
86
87
|
schema.properties[join.joinPath] = {
|
|
87
88
|
type: 'string',
|
|
88
89
|
enum: join.field.collection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/configToJSONSchema.ts"],"sourcesContent":["// @ts-strict-ignore\nimport type { JSONSchema4, JSONSchema4TypeName } from 'json-schema'\n\nimport pluralize from 'pluralize'\nconst { singular } = pluralize\n\nimport type { I18n } from '@payloadcms/translations'\n\nimport type { Auth } from '../auth/types.js'\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { FieldAffectingData, FlattenedField, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { MissingEditorProp } from '../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../fields/config/types.js'\nimport { generateJobsJSONSchemas } from '../queues/config/generateJobsJSONSchemas.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: FlattenedField) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) {\n return false\n }\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) {\n return true\n }\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.flattenedFields.some((subField) => fieldIsRequired(subField))\n }\n\n return false\n}\n\nfunction buildOptionEnums(options: Option[]): string[] {\n return options.map((option) => {\n if (typeof option === 'object' && 'value' in option) {\n return option.value\n }\n\n return option\n })\n}\n\nfunction generateEntitySchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}`,\n }\n\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateEntitySelectSchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce((acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}_select`,\n }\n\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateCollectionJoinsSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = [...collections].reduce<Record<string, JSONSchema4>>(\n (acc, { slug, joins, polymorphicJoins }) => {\n const schema = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n required: [] as string[],\n } satisfies JSONSchema4\n\n for (const collectionSlug in joins) {\n for (const join of joins[collectionSlug]!) {\n schema.properties[join.joinPath] = {\n type: 'string',\n enum: [collectionSlug],\n }\n schema.required.push(join.joinPath)\n }\n }\n\n for (const join of polymorphicJoins) {\n schema.properties[join.joinPath] = {\n type: 'string',\n enum: join.field.collection,\n }\n schema.required.push(join.joinPath)\n }\n\n if (Object.keys(schema.properties).length > 0) {\n acc[slug] = schema\n }\n\n return acc\n },\n {},\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateLocaleEntitySchemas(localization: SanitizedConfig['localization']): JSONSchema4 {\n if (localization && 'locales' in localization && localization?.locales) {\n const localesFromConfig = localization?.locales\n\n const locales = [...localesFromConfig].map((locale) => {\n return locale.code\n }, [])\n\n return {\n type: 'string',\n enum: locales,\n }\n }\n\n return {\n type: 'null',\n }\n}\n\nfunction generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties: JSONSchema4[] = [...entities]\n .filter(({ auth }) => Boolean(auth))\n .map(({ slug }) => {\n return {\n allOf: [\n { $ref: `#/definitions/${slug}` },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n collection: { type: 'string', enum: [slug] },\n },\n required: ['collection'],\n },\n ],\n }\n }, {})\n\n return {\n oneOf: properties,\n }\n}\n\n/**\n * Generates the JSON Schema for database configuration\n *\n * @example { db: idType: string }\n */\nfunction generateDbEntitySchema(config: SanitizedConfig): JSONSchema4 {\n const defaultIDType: JSONSchema4 =\n config.db?.defaultIDType === 'number' ? { type: 'number' } : { type: 'string' }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n defaultIDType,\n },\n required: ['defaultIDType'],\n }\n}\n\n/**\n * Returns a JSON Schema Type with 'null' added if the field is not required.\n */\nexport function withNullableJSONSchemaType(\n fieldType: JSONSchema4TypeName,\n isRequired: boolean,\n): JSONSchema4TypeName | JSONSchema4TypeName[] {\n const fieldTypes = [fieldType]\n if (isRequired) {\n return fieldType\n }\n fieldTypes.push('null')\n return fieldTypes\n}\n\nfunction entityOrFieldToJsDocs({\n entity,\n i18n,\n}: {\n entity: FlattenedField | SanitizedCollectionConfig | SanitizedGlobalConfig\n i18n?: I18n\n}): string | undefined {\n let description: string | undefined = undefined\n if (entity?.admin?.description) {\n if (typeof entity?.admin?.description === 'string') {\n description = entity?.admin?.description\n } else if (typeof entity?.admin?.description === 'object') {\n if (entity?.admin?.description?.en) {\n description = entity?.admin?.description?.en\n } else if (entity?.admin?.description?.[i18n!.language]) {\n description = entity?.admin?.description?.[i18n!.language]\n }\n } else if (typeof entity?.admin?.description === 'function' && i18n) {\n // do not evaluate description functions for generating JSDocs. The output of\n // those can differ depending on where and when they are called, creating\n // inconsistencies in the generated JSDocs.\n }\n }\n return description\n}\nexport function fieldsToJSONSchema(\n /**\n * Used for relationship fields, to determine whether to use a string or number type for the ID.\n * While there is a default ID field type set by the db adapter, they can differ on a collection-level\n * if they have custom ID fields.\n */\n collectionIDFieldTypes: { [key: string]: 'number' | 'string' },\n fields: FlattenedField[],\n /**\n * Allows you to define new top-level interfaces that can be re-used in the output schema.\n */\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n config?: SanitizedConfig,\n i18n?: I18n,\n): {\n properties: {\n [k: string]: JSONSchema4\n }\n required: string[]\n} {\n const requiredFieldNames = new Set<string>()\n\n return {\n properties: Object.fromEntries(\n fields.reduce((fieldSchemas, field, index) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n\n const fieldDescription = entityOrFieldToJsDocs({ entity: field, i18n })\n const baseFieldSchema: JSONSchema4 = {}\n if (fieldDescription) {\n baseFieldSchema.description = fieldDescription\n }\n\n let fieldSchema: JSONSchema4\n\n switch (field.type) {\n case 'array': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n },\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n case 'blocks': {\n // Check for a case where no blocks are provided.\n // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays\n // so the best we can get is `unknown[]`\n const hasBlocks = Boolean(\n field.blockReferences ? field.blockReferences.length : field.blocks.length,\n )\n\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: hasBlocks\n ? {\n oneOf: (field.blockReferences ?? field.blocks).map((block) => {\n if (typeof block === 'string') {\n const resolvedBlock = config?.blocks?.find((b) => b.slug === block)\n return {\n $ref: `#/definitions/${resolvedBlock!.interfaceName ?? resolvedBlock!.slug}`,\n }\n }\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n if (block.interfaceName) {\n interfaceNameDefinitions.set(block.interfaceName, blockSchema)\n\n return {\n $ref: `#/definitions/${block.interfaceName}`,\n }\n }\n\n return blockSchema\n }),\n }\n : {},\n }\n break\n }\n case 'checkbox': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('boolean', isRequired),\n }\n break\n }\n case 'code':\n case 'date':\n case 'email':\n case 'textarea': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = { $ref: `#/definitions/${field.interfaceName}` }\n }\n }\n break\n }\n\n case 'join': {\n let items: JSONSchema4\n\n if (Array.isArray(field.collection)) {\n items = {\n oneOf: field.collection.map((collection) => ({\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: collection,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[collection],\n },\n {\n $ref: `#/definitions/${collection}`,\n },\n ],\n },\n },\n required: ['collectionSlug', 'value'],\n })),\n }\n } else {\n items = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.collection],\n },\n {\n $ref: `#/definitions/${field.collection}`,\n },\n ],\n }\n }\n\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n properties: {\n docs: {\n type: 'array',\n items,\n },\n hasNextPage: { type: 'boolean' },\n totalDocs: { type: 'number' },\n },\n }\n break\n }\n\n case 'json': {\n fieldSchema = field.jsonSchema?.schema || {\n ...baseFieldSchema,\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('number', isRequired),\n }\n }\n break\n }\n\n case 'point': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: [\n {\n type: 'number',\n },\n {\n type: 'number',\n },\n ],\n maxItems: 2,\n minItems: 2,\n }\n break\n }\n\n case 'radio': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n\n break\n }\n case 'relationship':\n case 'upload': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n oneOf: field.relationTo.map((relation) => {\n return {\n type: withNullableJSONSchemaType('object', isRequired),\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n }\n }\n } else if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo]!,\n isRequired,\n ),\n },\n { $ref: `#/definitions/${field.relationTo}` },\n ],\n }\n }\n\n break\n }\n case 'richText': {\n if (!field?.editor) {\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 if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n if (field.editor.outputSchema) {\n fieldSchema = {\n ...baseFieldSchema,\n ...field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n i18n,\n interfaceNameDefinitions,\n isRequired,\n }),\n }\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n // We get the previous field to check for a date in the case of a timezone select\n // This works because timezone selects are always inserted right after a date with 'timezone: true'\n const previousField = fields?.[index - 1]\n const isTimezoneField =\n previousField?.type === 'date' && previousField.timezone && field.name.includes('_tz')\n\n // Timezone selects should reference the supportedTimezones definition\n if (isTimezoneField) {\n fieldSchema = {\n $ref: `#/definitions/supportedTimezones`,\n }\n } else {\n if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n },\n }\n if (optionEnums?.length) {\n ;(fieldSchema.items as JSONSchema4).enum = optionEnums\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n if (optionEnums?.length) {\n fieldSchema.enum = optionEnums\n }\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n break\n }\n case 'tab': {\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = { $ref: `#/definitions/${field.interfaceName}` }\n }\n break\n }\n\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n }\n break\n\n default: {\n break\n }\n }\n\n if ('typescriptSchema' in field && field?.typescriptSchema?.length) {\n for (const schema of field.typescriptSchema) {\n fieldSchema = schema({ jsonSchema: fieldSchema! })\n }\n }\n\n if (fieldSchema! && fieldAffectsData(field)) {\n if (isRequired && fieldSchema.required !== false) {\n requiredFieldNames.add(field.name)\n }\n fieldSchemas.set(field.name, fieldSchema)\n }\n\n return fieldSchemas\n }, new Map<string, JSONSchema4>()),\n ),\n required: Array.from(requiredFieldNames),\n }\n}\n\n// This function is part of the public API and is exported through payload/utilities\nexport function entityToJSONSchema(\n config: SanitizedConfig,\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n collectionIDFieldTypes?: { [key: string]: 'number' | 'string' },\n i18n?: I18n,\n): JSONSchema4 {\n if (!collectionIDFieldTypes) {\n collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n }\n\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n let mutableFields = [...entity.flattenedFields]\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = mutableFields.find((field) => field.name === 'id') as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n mutableFields = mutableFields.map((field) => {\n if (field === customIdField) {\n return { ...field, required: true }\n }\n\n return field\n })\n } else {\n mutableFields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n mutableFields = mutableFields.map((field) => {\n if (field.name === 'createdAt' || field.name === 'updatedAt') {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if (\n 'auth' in entity &&\n entity.auth &&\n (!entity.auth?.disableLocalStrategy ||\n (typeof entity.auth?.disableLocalStrategy === 'object' &&\n entity.auth.disableLocalStrategy.enableFields))\n ) {\n mutableFields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n const jsonSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n mutableFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n const entityDescription = entityOrFieldToJsDocs({ entity, i18n })\n\n if (entityDescription) {\n jsonSchema.description = entityDescription\n }\n\n return jsonSchema\n}\n\nexport function fieldsToSelectJSONSchema({\n config,\n fields,\n interfaceNameDefinitions,\n}: {\n config: SanitizedConfig\n fields: FlattenedField[]\n interfaceNameDefinitions: Map<string, JSONSchema4>\n}): JSONSchema4 {\n const schema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group':\n case 'tab': {\n let fieldSchema: JSONSchema4 = fieldsToSelectJSONSchema({\n config,\n fields: field.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (field.interfaceName) {\n const definition = `${field.interfaceName}_select`\n interfaceNameDefinitions.set(definition, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${definition}`,\n }\n }\n\n schema.properties![field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldSchema,\n ],\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const block of field.blockReferences ?? field.blocks) {\n if (typeof block === 'string') {\n continue // TODO\n }\n\n let blockSchema = fieldsToSelectJSONSchema({\n config,\n fields: block.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (block.interfaceName) {\n const definition = `${block.interfaceName}_select`\n interfaceNameDefinitions.set(definition, blockSchema)\n blockSchema = {\n $ref: `#/definitions/${definition}`,\n }\n }\n\n blocksSchema.properties![block.slug] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blockSchema,\n ],\n }\n }\n\n schema.properties![field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blocksSchema,\n ],\n }\n\n break\n }\n\n default:\n schema.properties![field.name] = {\n type: 'boolean',\n }\n break\n }\n }\n\n return schema\n}\n\nconst fieldType: JSONSchema4 = {\n type: 'string',\n required: false,\n}\nconst generateAuthFieldTypes = ({\n type,\n loginWithUsername,\n}: {\n loginWithUsername: Auth['loginWithUsername']\n type: 'forgotOrUnlock' | 'login' | 'register'\n}): JSONSchema4 => {\n if (loginWithUsername) {\n switch (type) {\n case 'forgotOrUnlock': {\n if (loginWithUsername.allowEmailLogin) {\n // allow email or username for unlock/forgot-password\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType },\n required: ['email'],\n },\n {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n },\n ],\n }\n } else {\n // allow only username for unlock/forgot-password\n return {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n }\n }\n }\n\n case 'login': {\n if (loginWithUsername.allowEmailLogin) {\n // allow username or email and require password for login\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n },\n {\n additionalProperties: false,\n properties: { password: fieldType, username: fieldType },\n required: ['username', 'password'],\n },\n ],\n }\n } else {\n // allow only username and password for login\n return {\n additionalProperties: false,\n properties: {\n password: fieldType,\n username: fieldType,\n },\n required: ['username', 'password'],\n }\n }\n }\n\n case 'register': {\n const requiredFields: ('email' | 'password' | 'username')[] = ['password']\n const properties: {\n email?: JSONSchema4['properties']\n password?: JSONSchema4['properties']\n username?: JSONSchema4['properties']\n } = {\n password: fieldType,\n username: fieldType,\n }\n\n if (loginWithUsername.requireEmail) {\n requiredFields.push('email')\n }\n if (loginWithUsername.requireUsername) {\n requiredFields.push('username')\n }\n if (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin) {\n properties.email = fieldType\n }\n\n return {\n additionalProperties: false,\n properties,\n required: requiredFields,\n }\n }\n }\n }\n\n // default email (and password for login/register)\n return {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n }\n}\n\nexport function authCollectionToOperationsJSONSchema(\n config: SanitizedCollectionConfig,\n): JSONSchema4 {\n const loginWithUsername = config.auth?.loginWithUsername\n const loginUserFields: JSONSchema4 = generateAuthFieldTypes({ type: 'login', loginWithUsername })\n const forgotOrUnlockUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'forgotOrUnlock',\n loginWithUsername,\n })\n const registerUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'register',\n loginWithUsername,\n })\n\n const properties: JSONSchema4['properties'] = {\n forgotPassword: forgotOrUnlockUserFields,\n login: loginUserFields,\n registerFirstUser: registerUserFields,\n unlock: forgotOrUnlockUserFields,\n }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n title: `${singular(toWords(`${config.slug}`, true))}AuthOperations`,\n }\n}\n\n// Generates the JSON Schema for supported timezones\nexport function timezonesToJSONSchema(\n supportedTimezones: SanitizedConfig['admin']['timezones']['supportedTimezones'],\n): JSONSchema4 {\n return {\n description: 'Supported timezones in IANA format.',\n enum: supportedTimezones.map((timezone) =>\n typeof timezone === 'string' ? timezone : timezone.value,\n ),\n }\n}\n\nfunction generateAuthOperationSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = collections.reduce((acc, collection) => {\n if (collection.auth) {\n acc[collection.slug] = {\n $ref: `#/definitions/auth/${collection.slug}`,\n }\n }\n return acc\n }, {})\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\n/**\n * This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.\n */\nexport function configToJSONSchema(\n config: SanitizedConfig,\n defaultIDType?: 'number' | 'text',\n i18n?: I18n,\n): JSONSchema4 {\n // a mutable Map to store custom top-level `interfaceName` types. Fields with an `interfaceName` property will be moved to the top-level definitions here\n const interfaceNameDefinitions: Map<string, JSONSchema4> = new Map()\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({\n config,\n defaultIDType: defaultIDType!,\n })\n\n // Collections and Globals have to be moved to the top-level definitions as well. Reason: The top-level type will be the `Config` type - we don't want all collection and global\n // types to be inlined inside the `Config` type\n\n const entities: {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n type: 'collection' | 'global'\n }[] = [\n ...config.globals.map((global) => ({ type: 'global' as const, entity: global })),\n ...config.collections.map((collection) => ({\n type: 'collection' as const,\n entity: collection,\n })),\n ]\n\n const entityDefinitions: { [k: string]: JSONSchema4 } = entities.reduce(\n (acc, { type, entity }) => {\n acc[entity.slug] = entityToJSONSchema(\n config,\n entity,\n interfaceNameDefinitions,\n defaultIDType!,\n collectionIDFieldTypes,\n i18n,\n )\n const select = fieldsToSelectJSONSchema({\n config,\n fields: entity.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (type === 'global') {\n select.properties!.globalType = {\n type: 'boolean',\n }\n }\n\n acc[`${entity.slug}_select`] = {\n type: 'object',\n additionalProperties: false,\n ...select,\n }\n\n return acc\n },\n {},\n )\n\n const timezoneDefinitions = timezonesToJSONSchema(config.admin.timezones.supportedTimezones)\n\n const authOperationDefinitions = [...config.collections]\n .filter(({ auth }) => Boolean(auth))\n .reduce(\n (acc, authCollection) => {\n acc.auth[authCollection.slug] = authCollectionToOperationsJSONSchema(authCollection)\n return acc\n },\n { auth: {} },\n )\n\n const jobsSchemas = config.jobs\n ? generateJobsJSONSchemas(\n config,\n config.jobs,\n interfaceNameDefinitions,\n collectionIDFieldTypes,\n i18n,\n )\n : {}\n\n const blocksDefinition: JSONSchema4 | undefined = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n required: [],\n }\n if (config?.blocks?.length) {\n for (const block of config.blocks) {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n const interfaceName = block.interfaceName ?? block.slug\n interfaceNameDefinitions.set(interfaceName, blockSchema)\n\n blocksDefinition.properties![block.slug] = {\n $ref: `#/definitions/${interfaceName}`,\n }\n ;(blocksDefinition.required as string[]).push(block.slug)\n }\n }\n\n let jsonSchema: JSONSchema4 = {\n additionalProperties: false,\n definitions: {\n supportedTimezones: timezoneDefinitions,\n ...entityDefinitions,\n ...Object.fromEntries(interfaceNameDefinitions),\n ...authOperationDefinitions,\n },\n // These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type\n type: 'object',\n properties: {\n auth: generateAuthOperationSchemas(config.collections),\n blocks: blocksDefinition,\n collections: generateEntitySchemas(config.collections || []),\n collectionsJoins: generateCollectionJoinsSchemas(config.collections || []),\n collectionsSelect: generateEntitySelectSchemas(config.collections || []),\n db: generateDbEntitySchema(config),\n globals: generateEntitySchemas(config.globals || []),\n globalsSelect: generateEntitySelectSchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: [\n 'user',\n 'locale',\n 'collections',\n 'collectionsSelect',\n 'collectionsJoins',\n 'globalsSelect',\n 'globals',\n 'auth',\n 'db',\n 'jobs',\n 'blocks',\n ],\n title: 'Config',\n }\n\n if (jobsSchemas.definitions?.size) {\n for (const [key, value] of jobsSchemas.definitions) {\n jsonSchema.definitions![key] = value\n }\n }\n if (jobsSchemas.properties) {\n jsonSchema.properties!.jobs = {\n type: 'object',\n additionalProperties: false,\n properties: jobsSchemas.properties,\n required: ['tasks', 'workflows'],\n }\n }\n\n if (config?.typescript?.schema?.length) {\n for (const schema of config.typescript.schema) {\n jsonSchema = schema({ collectionIDFieldTypes, config, i18n: i18n!, jsonSchema })\n }\n }\n\n return jsonSchema\n}\n"],"names":["pluralize","singular","MissingEditorProp","fieldAffectsData","generateJobsJSONSchemas","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","flattenedFields","some","subField","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateEntitySelectSchemas","generateCollectionJoinsSchemas","collections","joins","polymorphicJoins","schema","collectionSlug","join","joinPath","enum","push","collection","length","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","generateAuthEntitySchemas","filter","auth","allOf","oneOf","generateDbEntitySchema","config","defaultIDType","db","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","entityOrFieldToJsDocs","entity","i18n","description","undefined","en","language","fieldsToJSONSchema","collectionIDFieldTypes","fields","interfaceNameDefinitions","requiredFieldNames","Set","fromEntries","fieldSchemas","index","fieldDescription","baseFieldSchema","fieldSchema","items","interfaceName","set","hasBlocks","blockReferences","blocks","block","resolvedBlock","find","b","blockFieldSchemas","blockSchema","blockType","const","Array","isArray","relationTo","docs","hasNextPage","totalDocs","jsonSchema","hasMany","maxItems","minItems","relation","editor","Error","outputSchema","optionEnums","previousField","isTimezoneField","timezone","name","includes","typescriptSchema","add","Map","from","entityToJSONSchema","title","typescript","interface","mutableFields","idField","customIdField","unshift","timestamps","disableLocalStrategy","enableFields","entityDescription","fieldsToSelectJSONSchema","definition","blocksSchema","generateAuthFieldTypes","loginWithUsername","allowEmailLogin","email","username","password","requiredFields","requireEmail","requireUsername","authCollectionToOperationsJSONSchema","loginUserFields","forgotOrUnlockUserFields","registerUserFields","forgotPassword","login","registerFirstUser","unlock","timezonesToJSONSchema","supportedTimezones","generateAuthOperationSchemas","configToJSONSchema","globals","global","entityDefinitions","select","globalType","timezoneDefinitions","timezones","authOperationDefinitions","authCollection","jobsSchemas","jobs","blocksDefinition","definitions","collectionsJoins","collectionsSelect","globalsSelect","user","size","key"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/configToJSONSchema.ts"],"sourcesContent":["import type { JSONSchema4, JSONSchema4TypeName } from 'json-schema'\n\nimport pluralize from 'pluralize'\nconst { singular } = pluralize\n\nimport type { I18n } from '@payloadcms/translations'\n\nimport type { Auth } from '../auth/types.js'\nimport type { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { FieldAffectingData, FlattenedField, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { MissingEditorProp } from '../errors/MissingEditorProp.js'\nimport { fieldAffectsData } from '../fields/config/types.js'\nimport { generateJobsJSONSchemas } from '../queues/config/generateJobsJSONSchemas.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: FlattenedField): boolean => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) {\n return false\n }\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) {\n return true\n }\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.flattenedFields.some((subField) => fieldIsRequired(subField))\n }\n\n return false\n}\n\nfunction buildOptionEnums(options: Option[]): string[] {\n return options.map((option) => {\n if (typeof option === 'object' && 'value' in option) {\n return option.value\n }\n\n return option\n })\n}\n\nfunction generateEntitySchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce(\n (acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}`,\n }\n\n return acc\n },\n {} as Record<string, JSONSchema4>,\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateEntitySelectSchemas(\n entities: (SanitizedCollectionConfig | SanitizedGlobalConfig)[],\n): JSONSchema4 {\n const properties = [...entities].reduce(\n (acc, { slug }) => {\n acc[slug] = {\n $ref: `#/definitions/${slug}_select`,\n }\n\n return acc\n },\n {} as Record<string, JSONSchema4>,\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateCollectionJoinsSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = [...collections].reduce<Record<string, JSONSchema4>>(\n (acc, { slug, joins, polymorphicJoins }) => {\n const schema = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n required: [] as string[],\n } satisfies JSONSchema4\n\n for (const collectionSlug in joins) {\n for (const join of joins[collectionSlug]!) {\n ;(schema.properties as any)[join.joinPath] = {\n type: 'string',\n enum: [collectionSlug],\n }\n schema.required.push(join.joinPath)\n }\n }\n\n for (const join of polymorphicJoins) {\n ;(schema.properties as any)[join.joinPath] = {\n type: 'string',\n enum: join.field.collection,\n }\n schema.required.push(join.joinPath)\n }\n\n if (Object.keys(schema.properties).length > 0) {\n acc[slug] = schema\n }\n\n return acc\n },\n {},\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\nfunction generateLocaleEntitySchemas(localization: SanitizedConfig['localization']): JSONSchema4 {\n if (localization && 'locales' in localization && localization?.locales) {\n const localesFromConfig = localization?.locales\n\n const locales = [...localesFromConfig].map((locale) => {\n return locale.code\n }, [])\n\n return {\n type: 'string',\n enum: locales,\n }\n }\n\n return {\n type: 'null',\n }\n}\n\nfunction generateAuthEntitySchemas(entities: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties: JSONSchema4[] = [...entities]\n .filter(({ auth }) => Boolean(auth))\n .map(({ slug }) => {\n return {\n allOf: [\n { $ref: `#/definitions/${slug}` },\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n collection: { type: 'string', enum: [slug] },\n },\n required: ['collection'],\n },\n ],\n }\n }, {})\n\n return {\n oneOf: properties,\n }\n}\n\n/**\n * Generates the JSON Schema for database configuration\n *\n * @example { db: idType: string }\n */\nfunction generateDbEntitySchema(config: SanitizedConfig): JSONSchema4 {\n const defaultIDType: JSONSchema4 =\n config.db?.defaultIDType === 'number' ? { type: 'number' } : { type: 'string' }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n defaultIDType,\n },\n required: ['defaultIDType'],\n }\n}\n\n/**\n * Returns a JSON Schema Type with 'null' added if the field is not required.\n */\nexport function withNullableJSONSchemaType(\n fieldType: JSONSchema4TypeName,\n isRequired: boolean,\n): JSONSchema4TypeName | JSONSchema4TypeName[] {\n const fieldTypes = [fieldType]\n if (isRequired) {\n return fieldType\n }\n fieldTypes.push('null')\n return fieldTypes\n}\n\nfunction entityOrFieldToJsDocs({\n entity,\n i18n,\n}: {\n entity: FlattenedField | SanitizedCollectionConfig | SanitizedGlobalConfig\n i18n?: I18n\n}): string | undefined {\n let description: string | undefined = undefined\n if (entity?.admin?.description) {\n if (typeof entity?.admin?.description === 'string') {\n description = entity?.admin?.description\n } else if (typeof entity?.admin?.description === 'object') {\n if (entity?.admin?.description?.en) {\n description = entity?.admin?.description?.en\n } else if (entity?.admin?.description?.[i18n!.language]) {\n description = entity?.admin?.description?.[i18n!.language]\n }\n } else if (typeof entity?.admin?.description === 'function' && i18n) {\n // do not evaluate description functions for generating JSDocs. The output of\n // those can differ depending on where and when they are called, creating\n // inconsistencies in the generated JSDocs.\n }\n }\n return description\n}\nexport function fieldsToJSONSchema(\n /**\n * Used for relationship fields, to determine whether to use a string or number type for the ID.\n * While there is a default ID field type set by the db adapter, they can differ on a collection-level\n * if they have custom ID fields.\n */\n collectionIDFieldTypes: { [key: string]: 'number' | 'string' },\n fields: FlattenedField[],\n /**\n * Allows you to define new top-level interfaces that can be re-used in the output schema.\n */\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n config?: SanitizedConfig,\n i18n?: I18n,\n): {\n properties: {\n [k: string]: JSONSchema4\n }\n required: string[]\n} {\n const requiredFieldNames = new Set<string>()\n\n return {\n properties: Object.fromEntries(\n fields.reduce((fieldSchemas, field, index) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n\n const fieldDescription = entityOrFieldToJsDocs({ entity: field, i18n })\n const baseFieldSchema: JSONSchema4 = {}\n if (fieldDescription) {\n baseFieldSchema.description = fieldDescription\n }\n\n let fieldSchema: JSONSchema4\n\n switch (field.type) {\n case 'array': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n },\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n case 'blocks': {\n // Check for a case where no blocks are provided.\n // We need to generate an empty array for this case, note that JSON schema 4 doesn't support empty arrays\n // so the best we can get is `unknown[]`\n const hasBlocks = Boolean(\n field.blockReferences ? field.blockReferences.length : field.blocks.length,\n )\n\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: hasBlocks\n ? {\n oneOf: (field.blockReferences ?? field.blocks).map((block) => {\n if (typeof block === 'string') {\n const resolvedBlock = config?.blocks?.find((b) => b.slug === block)\n return {\n $ref: `#/definitions/${resolvedBlock!.interfaceName ?? resolvedBlock!.slug}`,\n }\n }\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n if (block.interfaceName) {\n interfaceNameDefinitions.set(block.interfaceName, blockSchema)\n\n return {\n $ref: `#/definitions/${block.interfaceName}`,\n }\n }\n\n return blockSchema\n }),\n }\n : {},\n }\n break\n }\n case 'checkbox': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('boolean', isRequired),\n }\n break\n }\n case 'code':\n case 'date':\n case 'email':\n case 'textarea': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n break\n }\n\n case 'group': {\n if (fieldAffectsData(field)) {\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = { $ref: `#/definitions/${field.interfaceName}` }\n }\n }\n break\n }\n\n case 'join': {\n let items: JSONSchema4\n\n if (Array.isArray(field.collection)) {\n items = {\n oneOf: field.collection.map((collection) => ({\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: collection,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[collection],\n },\n {\n $ref: `#/definitions/${collection}`,\n },\n ],\n },\n },\n required: ['collectionSlug', 'value'],\n })),\n }\n } else {\n items = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.collection],\n },\n {\n $ref: `#/definitions/${field.collection}`,\n },\n ],\n }\n }\n\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n properties: {\n docs: {\n type: 'array',\n items,\n },\n hasNextPage: { type: 'boolean' },\n totalDocs: { type: 'number' },\n },\n }\n break\n }\n\n case 'json': {\n fieldSchema = field.jsonSchema?.schema || {\n ...baseFieldSchema,\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('number', isRequired),\n }\n }\n break\n }\n\n case 'point': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: [\n {\n type: 'number',\n },\n {\n type: 'number',\n },\n ],\n maxItems: 2,\n minItems: 2,\n }\n break\n }\n\n case 'radio': {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n\n break\n }\n case 'relationship':\n case 'upload': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.relationTo.map((relation) => {\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n oneOf: field.relationTo.map((relation) => {\n return {\n type: withNullableJSONSchemaType('object', isRequired),\n additionalProperties: false,\n properties: {\n relationTo: {\n const: relation,\n },\n value: {\n oneOf: [\n {\n type: collectionIDFieldTypes[relation],\n },\n {\n $ref: `#/definitions/${relation}`,\n },\n ],\n },\n },\n required: ['value', 'relationTo'],\n }\n }),\n }\n }\n } else if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo]!,\n isRequired,\n ),\n },\n { $ref: `#/definitions/${field.relationTo}` },\n ],\n }\n }\n\n break\n }\n case 'richText': {\n if (!field?.editor) {\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 if (typeof field.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n if (field.editor.outputSchema) {\n fieldSchema = {\n ...baseFieldSchema,\n ...field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n i18n,\n interfaceNameDefinitions,\n isRequired,\n }),\n }\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n // We get the previous field to check for a date in the case of a timezone select\n // This works because timezone selects are always inserted right after a date with 'timezone: true'\n const previousField = fields?.[index - 1]\n const isTimezoneField =\n previousField?.type === 'date' && previousField.timezone && field.name.includes('_tz')\n\n // Timezone selects should reference the supportedTimezones definition\n if (isTimezoneField) {\n fieldSchema = {\n $ref: `#/definitions/supportedTimezones`,\n }\n } else {\n if (field.hasMany) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n },\n }\n if (optionEnums?.length) {\n ;(fieldSchema.items as JSONSchema4).enum = optionEnums\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n if (optionEnums?.length) {\n fieldSchema.enum = optionEnums\n }\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${field.interfaceName}`,\n }\n }\n break\n }\n\n break\n }\n case 'tab': {\n fieldSchema = {\n ...baseFieldSchema,\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n if (field.interfaceName) {\n interfaceNameDefinitions.set(field.interfaceName, fieldSchema)\n\n fieldSchema = { $ref: `#/definitions/${field.interfaceName}` }\n }\n break\n }\n\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = {\n ...baseFieldSchema,\n type: withNullableJSONSchemaType('string', isRequired),\n }\n }\n break\n\n default: {\n break\n }\n }\n\n if ('typescriptSchema' in field && field?.typescriptSchema?.length) {\n for (const schema of field.typescriptSchema) {\n fieldSchema = schema({ jsonSchema: fieldSchema! })\n }\n }\n\n if (fieldSchema! && fieldAffectsData(field)) {\n if (isRequired && fieldSchema.required !== false) {\n requiredFieldNames.add(field.name)\n }\n fieldSchemas.set(field.name, fieldSchema)\n }\n\n return fieldSchemas\n }, new Map<string, JSONSchema4>()),\n ),\n required: Array.from(requiredFieldNames),\n }\n}\n\n// This function is part of the public API and is exported through payload/utilities\nexport function entityToJSONSchema(\n config: SanitizedConfig,\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n collectionIDFieldTypes?: { [key: string]: 'number' | 'string' },\n i18n?: I18n,\n): JSONSchema4 {\n if (!collectionIDFieldTypes) {\n collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n }\n\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n let mutableFields = [...entity.flattenedFields]\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = mutableFields.find((field) => field.name === 'id') as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n mutableFields = mutableFields.map((field) => {\n if (field === customIdField) {\n return { ...field, required: true }\n }\n\n return field\n })\n } else {\n mutableFields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n mutableFields = mutableFields.map((field) => {\n if (field.name === 'createdAt' || field.name === 'updatedAt') {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if (\n 'auth' in entity &&\n entity.auth &&\n (!entity.auth?.disableLocalStrategy ||\n (typeof entity.auth?.disableLocalStrategy === 'object' &&\n entity.auth.disableLocalStrategy.enableFields))\n ) {\n mutableFields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n const jsonSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n mutableFields,\n interfaceNameDefinitions,\n config,\n i18n,\n ),\n }\n\n const entityDescription = entityOrFieldToJsDocs({ entity, i18n })\n\n if (entityDescription) {\n jsonSchema.description = entityDescription\n }\n\n return jsonSchema\n}\n\nexport function fieldsToSelectJSONSchema({\n config,\n fields,\n interfaceNameDefinitions,\n}: {\n config: SanitizedConfig\n fields: FlattenedField[]\n interfaceNameDefinitions: Map<string, JSONSchema4>\n}): JSONSchema4 {\n const schema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const field of fields) {\n switch (field.type) {\n case 'array':\n case 'group':\n case 'tab': {\n let fieldSchema: JSONSchema4 = fieldsToSelectJSONSchema({\n config,\n fields: field.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (field.interfaceName) {\n const definition = `${field.interfaceName}_select`\n interfaceNameDefinitions.set(definition, fieldSchema)\n\n fieldSchema = {\n $ref: `#/definitions/${definition}`,\n }\n }\n\n schema.properties![field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n fieldSchema,\n ],\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n }\n\n for (const block of field.blockReferences ?? field.blocks) {\n if (typeof block === 'string') {\n continue // TODO\n }\n\n let blockSchema = fieldsToSelectJSONSchema({\n config,\n fields: block.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (block.interfaceName) {\n const definition = `${block.interfaceName}_select`\n interfaceNameDefinitions.set(definition, blockSchema)\n blockSchema = {\n $ref: `#/definitions/${definition}`,\n }\n }\n\n blocksSchema.properties![block.slug] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blockSchema,\n ],\n }\n }\n\n schema.properties![field.name] = {\n oneOf: [\n {\n type: 'boolean',\n },\n blocksSchema,\n ],\n }\n\n break\n }\n\n default:\n schema.properties![field.name] = {\n type: 'boolean',\n }\n break\n }\n }\n\n return schema\n}\n\nconst fieldType: JSONSchema4 = {\n type: 'string',\n required: false,\n}\nconst generateAuthFieldTypes = ({\n type,\n loginWithUsername,\n}: {\n loginWithUsername: Auth['loginWithUsername']\n type: 'forgotOrUnlock' | 'login' | 'register'\n}): JSONSchema4 => {\n if (loginWithUsername) {\n switch (type) {\n case 'forgotOrUnlock': {\n if (loginWithUsername.allowEmailLogin) {\n // allow email or username for unlock/forgot-password\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType },\n required: ['email'],\n },\n {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n },\n ],\n }\n } else {\n // allow only username for unlock/forgot-password\n return {\n additionalProperties: false,\n properties: { username: fieldType },\n required: ['username'],\n }\n }\n }\n\n case 'login': {\n if (loginWithUsername.allowEmailLogin) {\n // allow username or email and require password for login\n return {\n additionalProperties: false,\n oneOf: [\n {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n },\n {\n additionalProperties: false,\n properties: { password: fieldType, username: fieldType },\n required: ['username', 'password'],\n },\n ],\n }\n } else {\n // allow only username and password for login\n return {\n additionalProperties: false,\n properties: {\n password: fieldType,\n username: fieldType,\n },\n required: ['username', 'password'],\n }\n }\n }\n\n case 'register': {\n const requiredFields: ('email' | 'password' | 'username')[] = ['password']\n const properties: {\n email?: JSONSchema4['properties']\n password?: JSONSchema4['properties']\n username?: JSONSchema4['properties']\n } = {\n password: fieldType,\n username: fieldType,\n }\n\n if (loginWithUsername.requireEmail) {\n requiredFields.push('email')\n }\n if (loginWithUsername.requireUsername) {\n requiredFields.push('username')\n }\n if (loginWithUsername.requireEmail || loginWithUsername.allowEmailLogin) {\n properties.email = fieldType\n }\n\n return {\n additionalProperties: false,\n properties,\n required: requiredFields,\n }\n }\n }\n }\n\n // default email (and password for login/register)\n return {\n additionalProperties: false,\n properties: { email: fieldType, password: fieldType },\n required: ['email', 'password'],\n }\n}\n\nexport function authCollectionToOperationsJSONSchema(\n config: SanitizedCollectionConfig,\n): JSONSchema4 {\n const loginWithUsername = config.auth?.loginWithUsername\n const loginUserFields: JSONSchema4 = generateAuthFieldTypes({ type: 'login', loginWithUsername })\n const forgotOrUnlockUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'forgotOrUnlock',\n loginWithUsername,\n })\n const registerUserFields: JSONSchema4 = generateAuthFieldTypes({\n type: 'register',\n loginWithUsername,\n })\n\n const properties: JSONSchema4['properties'] = {\n forgotPassword: forgotOrUnlockUserFields,\n login: loginUserFields,\n registerFirstUser: registerUserFields,\n unlock: forgotOrUnlockUserFields,\n }\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n title: `${singular(toWords(`${config.slug}`, true))}AuthOperations`,\n }\n}\n\n// Generates the JSON Schema for supported timezones\nexport function timezonesToJSONSchema(\n supportedTimezones: SanitizedConfig['admin']['timezones']['supportedTimezones'],\n): JSONSchema4 {\n return {\n description: 'Supported timezones in IANA format.',\n enum: supportedTimezones.map((timezone) =>\n typeof timezone === 'string' ? timezone : timezone.value,\n ),\n }\n}\n\nfunction generateAuthOperationSchemas(collections: SanitizedCollectionConfig[]): JSONSchema4 {\n const properties = collections.reduce(\n (acc, collection) => {\n if (collection.auth) {\n acc[collection.slug] = {\n $ref: `#/definitions/auth/${collection.slug}`,\n }\n }\n return acc\n },\n {} as Record<string, JSONSchema4>,\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties,\n required: Object.keys(properties),\n }\n}\n\n/**\n * This is used for generating the TypeScript types (payload-types.ts) with the payload generate:types command.\n */\nexport function configToJSONSchema(\n config: SanitizedConfig,\n defaultIDType?: 'number' | 'text',\n i18n?: I18n,\n): JSONSchema4 {\n // a mutable Map to store custom top-level `interfaceName` types. Fields with an `interfaceName` property will be moved to the top-level definitions here\n const interfaceNameDefinitions: Map<string, JSONSchema4> = new Map()\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({\n config,\n defaultIDType: defaultIDType!,\n })\n\n // Collections and Globals have to be moved to the top-level definitions as well. Reason: The top-level type will be the `Config` type - we don't want all collection and global\n // types to be inlined inside the `Config` type\n\n const entities: {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n type: 'collection' | 'global'\n }[] = [\n ...config.globals.map((global) => ({ type: 'global' as const, entity: global })),\n ...config.collections.map((collection) => ({\n type: 'collection' as const,\n entity: collection,\n })),\n ]\n\n const entityDefinitions: { [k: string]: JSONSchema4 } = entities.reduce(\n (acc, { type, entity }) => {\n acc[entity.slug] = entityToJSONSchema(\n config,\n entity,\n interfaceNameDefinitions,\n defaultIDType!,\n collectionIDFieldTypes,\n i18n,\n )\n const select = fieldsToSelectJSONSchema({\n config,\n fields: entity.flattenedFields,\n interfaceNameDefinitions,\n })\n\n if (type === 'global') {\n select.properties!.globalType = {\n type: 'boolean',\n }\n }\n\n acc[`${entity.slug}_select`] = {\n type: 'object',\n additionalProperties: false,\n ...select,\n }\n\n return acc\n },\n {} as Record<string, JSONSchema4>,\n )\n\n const timezoneDefinitions = timezonesToJSONSchema(config.admin.timezones.supportedTimezones)\n\n const authOperationDefinitions = [...config.collections]\n .filter(({ auth }) => Boolean(auth))\n .reduce(\n (acc, authCollection) => {\n acc.auth[authCollection.slug] = authCollectionToOperationsJSONSchema(authCollection)\n return acc\n },\n { auth: {} as Record<string, JSONSchema4> },\n )\n\n const jobsSchemas = config.jobs\n ? generateJobsJSONSchemas(\n config,\n config.jobs,\n interfaceNameDefinitions,\n collectionIDFieldTypes,\n i18n,\n )\n : {}\n\n const blocksDefinition: JSONSchema4 | undefined = {\n type: 'object',\n additionalProperties: false,\n properties: {},\n required: [],\n }\n if (config?.blocks?.length) {\n for (const block of config.blocks) {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.flattenedFields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n\n const blockSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: {\n ...blockFieldSchemas.properties,\n blockType: {\n const: block.slug,\n },\n },\n required: ['blockType', ...blockFieldSchemas.required],\n }\n\n const interfaceName = block.interfaceName ?? block.slug\n interfaceNameDefinitions.set(interfaceName, blockSchema)\n\n blocksDefinition.properties![block.slug] = {\n $ref: `#/definitions/${interfaceName}`,\n }\n ;(blocksDefinition.required as string[]).push(block.slug)\n }\n }\n\n let jsonSchema: JSONSchema4 = {\n additionalProperties: false,\n definitions: {\n supportedTimezones: timezoneDefinitions,\n ...entityDefinitions,\n ...Object.fromEntries(interfaceNameDefinitions),\n ...authOperationDefinitions,\n },\n // These properties here will be very simple, as all the complexity is in the definitions. These are just the properties for the top-level `Config` type\n type: 'object',\n properties: {\n auth: generateAuthOperationSchemas(config.collections),\n blocks: blocksDefinition,\n collections: generateEntitySchemas(config.collections || []),\n collectionsJoins: generateCollectionJoinsSchemas(config.collections || []),\n collectionsSelect: generateEntitySelectSchemas(config.collections || []),\n db: generateDbEntitySchema(config),\n globals: generateEntitySchemas(config.globals || []),\n globalsSelect: generateEntitySelectSchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: [\n 'user',\n 'locale',\n 'collections',\n 'collectionsSelect',\n 'collectionsJoins',\n 'globalsSelect',\n 'globals',\n 'auth',\n 'db',\n 'jobs',\n 'blocks',\n ],\n title: 'Config',\n }\n\n if (jobsSchemas.definitions?.size) {\n for (const [key, value] of jobsSchemas.definitions) {\n jsonSchema.definitions![key] = value\n }\n }\n if (jobsSchemas.properties) {\n jsonSchema.properties!.jobs = {\n type: 'object',\n additionalProperties: false,\n properties: jobsSchemas.properties,\n required: ['tasks', 'workflows'],\n }\n }\n\n if (config?.typescript?.schema?.length) {\n for (const schema of config.typescript.schema) {\n jsonSchema = schema({ collectionIDFieldTypes, config, i18n: i18n!, jsonSchema })\n }\n }\n\n return jsonSchema\n}\n"],"names":["pluralize","singular","MissingEditorProp","fieldAffectsData","generateJobsJSONSchemas","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","flattenedFields","some","subField","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateEntitySelectSchemas","generateCollectionJoinsSchemas","collections","joins","polymorphicJoins","schema","collectionSlug","join","joinPath","enum","push","collection","length","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","generateAuthEntitySchemas","filter","auth","allOf","oneOf","generateDbEntitySchema","config","defaultIDType","db","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","entityOrFieldToJsDocs","entity","i18n","description","undefined","en","language","fieldsToJSONSchema","collectionIDFieldTypes","fields","interfaceNameDefinitions","requiredFieldNames","Set","fromEntries","fieldSchemas","index","fieldDescription","baseFieldSchema","fieldSchema","items","interfaceName","set","hasBlocks","blockReferences","blocks","block","resolvedBlock","find","b","blockFieldSchemas","blockSchema","blockType","const","Array","isArray","relationTo","docs","hasNextPage","totalDocs","jsonSchema","hasMany","maxItems","minItems","relation","editor","Error","outputSchema","optionEnums","previousField","isTimezoneField","timezone","name","includes","typescriptSchema","add","Map","from","entityToJSONSchema","title","typescript","interface","mutableFields","idField","customIdField","unshift","timestamps","disableLocalStrategy","enableFields","entityDescription","fieldsToSelectJSONSchema","definition","blocksSchema","generateAuthFieldTypes","loginWithUsername","allowEmailLogin","email","username","password","requiredFields","requireEmail","requireUsername","authCollectionToOperationsJSONSchema","loginUserFields","forgotOrUnlockUserFields","registerUserFields","forgotPassword","login","registerFirstUser","unlock","timezonesToJSONSchema","supportedTimezones","generateAuthOperationSchemas","configToJSONSchema","globals","global","entityDefinitions","select","globalType","timezoneDefinitions","timezones","authOperationDefinitions","authCollection","jobsSchemas","jobs","blocksDefinition","definitions","collectionsJoins","collectionsSelect","globalsSelect","user","size","key"],"mappings":"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"}
|