payload 3.0.0-alpha.65 → 3.0.0-alpha.67

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.
Files changed (207) hide show
  1. package/dist/admin/RichText.d.ts +3 -0
  2. package/dist/admin/RichText.d.ts.map +1 -1
  3. package/dist/admin/RichText.js.map +1 -1
  4. package/dist/admin/elements/Tab.d.ts +3 -0
  5. package/dist/admin/elements/Tab.d.ts.map +1 -1
  6. package/dist/admin/elements/Tab.js.map +1 -1
  7. package/dist/admin/types.d.ts +1 -1
  8. package/dist/admin/types.d.ts.map +1 -1
  9. package/dist/admin/types.js.map +1 -1
  10. package/dist/auth/getAccessResults.js +1 -1
  11. package/dist/auth/getAccessResults.js.map +1 -1
  12. package/dist/auth/operations/forgotPassword.js +3 -2
  13. package/dist/auth/operations/forgotPassword.js.map +1 -1
  14. package/dist/auth/operations/login.d.ts.map +1 -1
  15. package/dist/auth/operations/login.js +3 -0
  16. package/dist/auth/operations/login.js.map +1 -1
  17. package/dist/auth/sendVerificationEmail.js +3 -2
  18. package/dist/auth/sendVerificationEmail.js.map +1 -1
  19. package/dist/bin/loader/index.d.ts.map +1 -1
  20. package/dist/bin/loader/index.js +2 -1
  21. package/dist/bin/loader/index.js.map +1 -1
  22. package/dist/bin/loader/resolveOriginalPath.d.ts +10 -0
  23. package/dist/bin/loader/resolveOriginalPath.d.ts.map +1 -0
  24. package/dist/bin/loader/resolveOriginalPath.js +32 -0
  25. package/dist/bin/loader/resolveOriginalPath.js.map +1 -0
  26. package/dist/collections/config/sanitize.d.ts +2 -3
  27. package/dist/collections/config/sanitize.d.ts.map +1 -1
  28. package/dist/collections/config/sanitize.js +7 -4
  29. package/dist/collections/config/sanitize.js.map +1 -1
  30. package/dist/collections/config/schema.d.ts.map +1 -1
  31. package/dist/collections/config/schema.js +1 -0
  32. package/dist/collections/config/schema.js.map +1 -1
  33. package/dist/config/build.d.ts.map +1 -1
  34. package/dist/config/build.js +3 -4
  35. package/dist/config/build.js.map +1 -1
  36. package/dist/config/sanitize.d.ts +1 -1
  37. package/dist/config/sanitize.d.ts.map +1 -1
  38. package/dist/config/sanitize.js +28 -7
  39. package/dist/config/sanitize.js.map +1 -1
  40. package/dist/config/schema.js +1 -1
  41. package/dist/config/schema.js.map +1 -1
  42. package/dist/config/types.d.ts +11 -2
  43. package/dist/config/types.d.ts.map +1 -1
  44. package/dist/config/types.js.map +1 -1
  45. package/dist/database/queryValidation/validateQueryPaths.js +1 -1
  46. package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
  47. package/dist/email/consoleEmailAdapter.d.ts.map +1 -1
  48. package/dist/email/consoleEmailAdapter.js +1 -0
  49. package/dist/email/consoleEmailAdapter.js.map +1 -1
  50. package/dist/email/types.d.ts +1 -0
  51. package/dist/email/types.d.ts.map +1 -1
  52. package/dist/email/types.js.map +1 -1
  53. package/dist/errors/APIError.d.ts +2 -2
  54. package/dist/errors/APIError.d.ts.map +1 -1
  55. package/dist/errors/APIError.js +1 -2
  56. package/dist/errors/APIError.js.map +1 -1
  57. package/dist/errors/AuthenticationError.d.ts +2 -3
  58. package/dist/errors/AuthenticationError.d.ts.map +1 -1
  59. package/dist/errors/AuthenticationError.js +2 -3
  60. package/dist/errors/AuthenticationError.js.map +1 -1
  61. package/dist/errors/DuplicateCollection.d.ts +2 -3
  62. package/dist/errors/DuplicateCollection.d.ts.map +1 -1
  63. package/dist/errors/DuplicateCollection.js +2 -3
  64. package/dist/errors/DuplicateCollection.js.map +1 -1
  65. package/dist/errors/DuplicateFieldName.d.ts +2 -3
  66. package/dist/errors/DuplicateFieldName.d.ts.map +1 -1
  67. package/dist/errors/DuplicateFieldName.js +2 -3
  68. package/dist/errors/DuplicateFieldName.js.map +1 -1
  69. package/dist/errors/DuplicateGlobal.d.ts +2 -3
  70. package/dist/errors/DuplicateGlobal.d.ts.map +1 -1
  71. package/dist/errors/DuplicateGlobal.js +2 -3
  72. package/dist/errors/DuplicateGlobal.js.map +1 -1
  73. package/dist/errors/ErrorDeletingFile.d.ts +2 -3
  74. package/dist/errors/ErrorDeletingFile.d.ts.map +1 -1
  75. package/dist/errors/ErrorDeletingFile.js +2 -3
  76. package/dist/errors/ErrorDeletingFile.js.map +1 -1
  77. package/dist/errors/FileRetrievalError.d.ts +6 -0
  78. package/dist/errors/FileRetrievalError.d.ts.map +1 -0
  79. package/dist/errors/FileRetrievalError.js +13 -0
  80. package/dist/errors/FileRetrievalError.js.map +1 -0
  81. package/dist/errors/FileUploadError.d.ts +2 -3
  82. package/dist/errors/FileUploadError.d.ts.map +1 -1
  83. package/dist/errors/FileUploadError.js +2 -3
  84. package/dist/errors/FileUploadError.js.map +1 -1
  85. package/dist/errors/Forbidden.d.ts +2 -3
  86. package/dist/errors/Forbidden.d.ts.map +1 -1
  87. package/dist/errors/Forbidden.js +2 -3
  88. package/dist/errors/Forbidden.js.map +1 -1
  89. package/dist/errors/InvalidConfiguration.d.ts +2 -3
  90. package/dist/errors/InvalidConfiguration.d.ts.map +1 -1
  91. package/dist/errors/InvalidConfiguration.js +2 -3
  92. package/dist/errors/InvalidConfiguration.js.map +1 -1
  93. package/dist/errors/InvalidFieldName.d.ts +2 -3
  94. package/dist/errors/InvalidFieldName.d.ts.map +1 -1
  95. package/dist/errors/InvalidFieldName.js +2 -3
  96. package/dist/errors/InvalidFieldName.js.map +1 -1
  97. package/dist/errors/InvalidFieldRelationship.d.ts +2 -3
  98. package/dist/errors/InvalidFieldRelationship.d.ts.map +1 -1
  99. package/dist/errors/InvalidFieldRelationship.js +2 -3
  100. package/dist/errors/InvalidFieldRelationship.js.map +1 -1
  101. package/dist/errors/InvalidSchema.d.ts +2 -3
  102. package/dist/errors/InvalidSchema.d.ts.map +1 -1
  103. package/dist/errors/InvalidSchema.js +2 -3
  104. package/dist/errors/InvalidSchema.js.map +1 -1
  105. package/dist/errors/LockedAuth.d.ts +2 -3
  106. package/dist/errors/LockedAuth.d.ts.map +1 -1
  107. package/dist/errors/LockedAuth.js +2 -3
  108. package/dist/errors/LockedAuth.js.map +1 -1
  109. package/dist/errors/MissingCollectionLabel.d.ts +2 -3
  110. package/dist/errors/MissingCollectionLabel.d.ts.map +1 -1
  111. package/dist/errors/MissingCollectionLabel.js +2 -3
  112. package/dist/errors/MissingCollectionLabel.js.map +1 -1
  113. package/dist/errors/MissingEditorProp.d.ts +2 -3
  114. package/dist/errors/MissingEditorProp.d.ts.map +1 -1
  115. package/dist/errors/MissingEditorProp.js +2 -3
  116. package/dist/errors/MissingEditorProp.js.map +1 -1
  117. package/dist/errors/MissingFieldInputOptions.d.ts +2 -3
  118. package/dist/errors/MissingFieldInputOptions.d.ts.map +1 -1
  119. package/dist/errors/MissingFieldInputOptions.js +2 -3
  120. package/dist/errors/MissingFieldInputOptions.js.map +1 -1
  121. package/dist/errors/MissingFieldType.d.ts +2 -3
  122. package/dist/errors/MissingFieldType.d.ts.map +1 -1
  123. package/dist/errors/MissingFieldType.js +2 -3
  124. package/dist/errors/MissingFieldType.js.map +1 -1
  125. package/dist/errors/MissingFile.d.ts +2 -3
  126. package/dist/errors/MissingFile.d.ts.map +1 -1
  127. package/dist/errors/MissingFile.js +2 -3
  128. package/dist/errors/MissingFile.js.map +1 -1
  129. package/dist/errors/NotFound.d.ts +2 -3
  130. package/dist/errors/NotFound.d.ts.map +1 -1
  131. package/dist/errors/NotFound.js +2 -3
  132. package/dist/errors/NotFound.js.map +1 -1
  133. package/dist/errors/QueryError.d.ts +2 -3
  134. package/dist/errors/QueryError.d.ts.map +1 -1
  135. package/dist/errors/QueryError.js +2 -3
  136. package/dist/errors/QueryError.js.map +1 -1
  137. package/dist/errors/TimestampsRequired.d.ts +2 -3
  138. package/dist/errors/TimestampsRequired.d.ts.map +1 -1
  139. package/dist/errors/TimestampsRequired.js +2 -3
  140. package/dist/errors/TimestampsRequired.js.map +1 -1
  141. package/dist/errors/UnathorizedError.d.ts +2 -3
  142. package/dist/errors/UnathorizedError.d.ts.map +1 -1
  143. package/dist/errors/UnathorizedError.js +2 -3
  144. package/dist/errors/UnathorizedError.js.map +1 -1
  145. package/dist/errors/ValidationError.d.ts +2 -3
  146. package/dist/errors/ValidationError.d.ts.map +1 -1
  147. package/dist/errors/ValidationError.js +2 -3
  148. package/dist/errors/ValidationError.js.map +1 -1
  149. package/dist/errors/index.d.ts +20 -19
  150. package/dist/errors/index.d.ts.map +1 -1
  151. package/dist/errors/index.js +20 -19
  152. package/dist/errors/index.js.map +1 -1
  153. package/dist/exports/i18n.d.ts +2 -0
  154. package/dist/exports/i18n.d.ts.map +1 -0
  155. package/dist/exports/i18n.js +3 -0
  156. package/dist/exports/i18n.js.map +1 -0
  157. package/dist/fields/config/client.d.ts +1 -1
  158. package/dist/fields/config/sanitize.d.ts +7 -2
  159. package/dist/fields/config/sanitize.d.ts.map +1 -1
  160. package/dist/fields/config/sanitize.js +56 -45
  161. package/dist/fields/config/sanitize.js.map +1 -1
  162. package/dist/fields/config/sanitize.spec.js +76 -85
  163. package/dist/fields/config/sanitize.spec.js.map +1 -1
  164. package/dist/fields/config/types.d.ts +4 -3
  165. package/dist/fields/config/types.d.ts.map +1 -1
  166. package/dist/fields/config/types.js.map +1 -1
  167. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  168. package/dist/fields/hooks/afterRead/promise.js +3 -0
  169. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  170. package/dist/fields/validations.d.ts.map +1 -1
  171. package/dist/fields/validations.js +3 -0
  172. package/dist/fields/validations.js.map +1 -1
  173. package/dist/globals/config/sanitize.d.ts +2 -3
  174. package/dist/globals/config/sanitize.d.ts.map +1 -1
  175. package/dist/globals/config/sanitize.js +36 -35
  176. package/dist/globals/config/sanitize.js.map +1 -1
  177. package/dist/preferences/operations/delete.js +2 -2
  178. package/dist/preferences/operations/delete.js.map +1 -1
  179. package/dist/preferences/operations/update.js +1 -1
  180. package/dist/preferences/operations/update.js.map +1 -1
  181. package/dist/uploads/generateFileData.js +2 -2
  182. package/dist/uploads/generateFileData.js.map +1 -1
  183. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  184. package/dist/uploads/getExternalFile.js +5 -2
  185. package/dist/uploads/getExternalFile.js.map +1 -1
  186. package/dist/uploads/types.d.ts +4 -0
  187. package/dist/uploads/types.d.ts.map +1 -1
  188. package/dist/uploads/types.js.map +1 -1
  189. package/dist/utilities/checkDuplicateCollections.js +1 -1
  190. package/dist/utilities/checkDuplicateCollections.js.map +1 -1
  191. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  192. package/dist/utilities/configToJSONSchema.js +3 -0
  193. package/dist/utilities/configToJSONSchema.js.map +1 -1
  194. package/dist/utilities/configToJSONSchema.spec.js +2 -2
  195. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  196. package/dist/utilities/createLocalReq.d.ts.map +1 -1
  197. package/dist/utilities/createLocalReq.js +4 -2
  198. package/dist/utilities/createLocalReq.js.map +1 -1
  199. package/dist/utilities/importWithoutClientFiles.js +1 -1
  200. package/dist/utilities/importWithoutClientFiles.js.map +1 -1
  201. package/dist/utilities/parseCookies.js +1 -1
  202. package/dist/utilities/parseCookies.js.map +1 -1
  203. package/dist/utilities/telemetry/index.d.ts +7 -1
  204. package/dist/utilities/telemetry/index.d.ts.map +1 -1
  205. package/dist/utilities/telemetry/index.js +41 -19
  206. package/dist/utilities/telemetry/index.js.map +1 -1
  207. package/package.json +67 -70
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/globals/config/sanitize.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type { SanitizedGlobalConfig } from './types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { toWords } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\n\nconst sanitizeGlobals = (config: Config): SanitizedGlobalConfig[] => {\n const { collections, globals } = config\n\n const sanitizedGlobals = globals.map((global) => {\n const sanitizedGlobal = { ...global }\n\n sanitizedGlobal.label = sanitizedGlobal.label || toWords(sanitizedGlobal.slug)\n\n // /////////////////////////////////\n // Ensure that collection has required object structure\n // /////////////////////////////////\n\n sanitizedGlobal.endpoints = sanitizedGlobal.endpoints ?? []\n if (!sanitizedGlobal.hooks) sanitizedGlobal.hooks = {}\n if (!sanitizedGlobal.access) sanitizedGlobal.access = {}\n if (!sanitizedGlobal.admin) sanitizedGlobal.admin = {}\n\n if (!sanitizedGlobal.access.read) sanitizedGlobal.access.read = defaultAccess\n if (!sanitizedGlobal.access.update) sanitizedGlobal.access.update = defaultAccess\n\n if (!sanitizedGlobal.hooks.beforeValidate) sanitizedGlobal.hooks.beforeValidate = []\n if (!sanitizedGlobal.hooks.beforeChange) sanitizedGlobal.hooks.beforeChange = []\n if (!sanitizedGlobal.hooks.afterChange) sanitizedGlobal.hooks.afterChange = []\n if (!sanitizedGlobal.hooks.beforeRead) sanitizedGlobal.hooks.beforeRead = []\n if (!sanitizedGlobal.hooks.afterRead) sanitizedGlobal.hooks.afterRead = []\n\n if (sanitizedGlobal.versions) {\n if (sanitizedGlobal.versions === true) sanitizedGlobal.versions = { drafts: false }\n\n if (sanitizedGlobal.versions.drafts) {\n if (sanitizedGlobal.versions.drafts === true) {\n sanitizedGlobal.versions.drafts = {\n autosave: false,\n }\n }\n\n if (sanitizedGlobal.versions.drafts.autosave === true) {\n sanitizedGlobal.versions.drafts.autosave = {\n interval: 2000,\n }\n }\n\n sanitizedGlobal.fields = mergeBaseFields(sanitizedGlobal.fields, baseVersionFields)\n }\n }\n\n if (!sanitizedGlobal.custom) sanitizedGlobal.custom = {}\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n let hasUpdatedAt = null\n let hasCreatedAt = null\n sanitizedGlobal.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') hasUpdatedAt = true\n if (field.name === 'createdAt') hasCreatedAt = true\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitizedGlobal.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitizedGlobal.fields.push({\n name: 'createdAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n label: ({ t }) => t('general:createdAt'),\n })\n }\n\n const validRelationships = collections.map((c) => c.slug) || []\n sanitizedGlobal.fields = sanitizeFields({\n config,\n fields: sanitizedGlobal.fields,\n validRelationships,\n })\n\n return sanitizedGlobal as SanitizedGlobalConfig\n })\n\n return sanitizedGlobals\n}\n\nexport default sanitizeGlobals\n"],"names":["defaultAccess","sanitizeFields","fieldAffectsData","mergeBaseFields","toWords","baseVersionFields","sanitizeGlobals","config","collections","globals","sanitizedGlobals","map","global","sanitizedGlobal","label","slug","endpoints","hooks","access","admin","read","update","beforeValidate","beforeChange","afterChange","beforeRead","afterRead","versions","drafts","autosave","interval","fields","custom","hasUpdatedAt","hasCreatedAt","some","field","name","push","type","disableBulkEdit","hidden","t","validRelationships","c"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/globals/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { SanitizedGlobalConfig } from './types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { toWords } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\n\nexport const sanitizeGlobals = async (\n config: Config,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedGlobalConfig[]> => {\n const { collections, globals } = config\n\n for (let i = 0; i < globals.length; i++) {\n const global = globals[i]\n global.label = global.label || toWords(global.slug)\n\n // /////////////////////////////////\n // Ensure that collection has required object structure\n // /////////////////////////////////\n\n global.endpoints = global.endpoints ?? []\n if (!global.hooks) global.hooks = {}\n if (!global.access) global.access = {}\n if (!global.admin) global.admin = {}\n\n if (!global.access.read) global.access.read = defaultAccess\n if (!global.access.update) global.access.update = defaultAccess\n\n if (!global.hooks.beforeValidate) global.hooks.beforeValidate = []\n if (!global.hooks.beforeChange) global.hooks.beforeChange = []\n if (!global.hooks.afterChange) global.hooks.afterChange = []\n if (!global.hooks.beforeRead) global.hooks.beforeRead = []\n if (!global.hooks.afterRead) global.hooks.afterRead = []\n\n if (global.versions) {\n if (global.versions === true) global.versions = { drafts: false }\n\n if (global.versions.drafts) {\n if (global.versions.drafts === true) {\n global.versions.drafts = {\n autosave: false,\n }\n }\n\n if (global.versions.drafts.autosave === true) {\n global.versions.drafts.autosave = {\n interval: 2000,\n }\n }\n\n global.fields = mergeBaseFields(global.fields, baseVersionFields)\n }\n }\n\n if (!global.custom) global.custom = {}\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n let hasUpdatedAt = null\n let hasCreatedAt = null\n global.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') hasUpdatedAt = true\n if (field.name === 'createdAt') hasCreatedAt = true\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n global.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n global.fields.push({\n name: 'createdAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n label: ({ t }) => t('general:createdAt'),\n })\n }\n\n const validRelationships = collections.map((c) => c.slug) || []\n global.fields = await sanitizeFields({\n config,\n fields: global.fields,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n globals[i] = global\n }\n\n return globals as SanitizedGlobalConfig[]\n}\n"],"names":["defaultAccess","sanitizeFields","fieldAffectsData","mergeBaseFields","toWords","baseVersionFields","sanitizeGlobals","config","richTextSanitizationPromises","collections","globals","i","length","global","label","slug","endpoints","hooks","access","admin","read","update","beforeValidate","beforeChange","afterChange","beforeRead","afterRead","versions","drafts","autosave","interval","fields","custom","hasUpdatedAt","hasCreatedAt","some","field","name","push","type","disableBulkEdit","hidden","t","validRelationships","map","c"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import defaultAccess from '../../auth/defaultAccess.js';
2
2
  import executeAccess from '../../auth/executeAccess.js';
3
- import NotFound from '../../errors/NotFound.js';
4
- import UnauthorizedError from '../../errors/UnathorizedError.js';
3
+ import { NotFound } from '../../errors/NotFound.js';
4
+ import { UnauthorizedError } from '../../errors/UnathorizedError.js';
5
5
  async function deleteOperation(args) {
6
6
  const { key, overrideAccess, req: { payload }, req, user } = args;
7
7
  if (!user) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/preferences/operations/delete.ts"],"sourcesContent":["import type { Document, Where } from '../../types/index.js'\nimport type { PreferenceRequest } from '../types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport NotFound from '../../errors/NotFound.js'\nimport UnauthorizedError from '../../errors/UnathorizedError.js'\n\nasync function deleteOperation(args: PreferenceRequest): Promise<Document> {\n const {\n key,\n overrideAccess,\n req: { payload },\n req,\n user,\n } = args\n\n if (!user) {\n throw new UnauthorizedError(req.t)\n }\n\n if (!overrideAccess) {\n await executeAccess({ req }, defaultAccess)\n }\n\n const where: Where = {\n and: [\n { key: { equals: key } },\n { 'user.value': { equals: user.id } },\n { 'user.relationTo': { equals: user.collection } },\n ],\n }\n\n const result = await payload.db.deleteOne({\n collection: 'payload-preferences',\n req,\n where,\n })\n\n if (result) {\n return result\n }\n throw new NotFound(req.t)\n}\n\nexport default deleteOperation\n"],"names":["defaultAccess","executeAccess","NotFound","UnauthorizedError","deleteOperation","args","key","overrideAccess","req","payload","user","t","where","and","equals","id","collection","result","db","deleteOne"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,OAAOA,mBAAmB,8BAA6B;AACvD,OAAOC,mBAAmB,8BAA6B;AACvD,OAAOC,cAAc,2BAA0B;AAC/C,OAAOC,uBAAuB,mCAAkC;AAEhE,eAAeC,gBAAgBC,IAAuB;IACpD,MAAM,EACJC,GAAG,EACHC,cAAc,EACdC,KAAK,EAAEC,OAAO,EAAE,EAChBD,GAAG,EACHE,IAAI,EACL,GAAGL;IAEJ,IAAI,CAACK,MAAM;QACT,MAAM,IAAIP,kBAAkBK,IAAIG,CAAC;IACnC;IAEA,IAAI,CAACJ,gBAAgB;QACnB,MAAMN,cAAc;YAAEO;QAAI,GAAGR;IAC/B;IAEA,MAAMY,QAAe;QACnBC,KAAK;YACH;gBAAEP,KAAK;oBAAEQ,QAAQR;gBAAI;YAAE;YACvB;gBAAE,cAAc;oBAAEQ,QAAQJ,KAAKK,EAAE;gBAAC;YAAE;YACpC;gBAAE,mBAAmB;oBAAED,QAAQJ,KAAKM,UAAU;gBAAC;YAAE;SAClD;IACH;IAEA,MAAMC,SAAS,MAAMR,QAAQS,EAAE,CAACC,SAAS,CAAC;QACxCH,YAAY;QACZR;QACAI;IACF;IAEA,IAAIK,QAAQ;QACV,OAAOA;IACT;IACA,MAAM,IAAIf,SAASM,IAAIG,CAAC;AAC1B;AAEA,eAAeP,gBAAe"}
1
+ {"version":3,"sources":["../../../src/preferences/operations/delete.ts"],"sourcesContent":["import type { Document, Where } from '../../types/index.js'\nimport type { PreferenceRequest } from '../types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport { NotFound } from '../../errors/NotFound.js'\nimport { UnauthorizedError } from '../../errors/UnathorizedError.js'\n\nasync function deleteOperation(args: PreferenceRequest): Promise<Document> {\n const {\n key,\n overrideAccess,\n req: { payload },\n req,\n user,\n } = args\n\n if (!user) {\n throw new UnauthorizedError(req.t)\n }\n\n if (!overrideAccess) {\n await executeAccess({ req }, defaultAccess)\n }\n\n const where: Where = {\n and: [\n { key: { equals: key } },\n { 'user.value': { equals: user.id } },\n { 'user.relationTo': { equals: user.collection } },\n ],\n }\n\n const result = await payload.db.deleteOne({\n collection: 'payload-preferences',\n req,\n where,\n })\n\n if (result) {\n return result\n }\n throw new NotFound(req.t)\n}\n\nexport default deleteOperation\n"],"names":["defaultAccess","executeAccess","NotFound","UnauthorizedError","deleteOperation","args","key","overrideAccess","req","payload","user","t","where","and","equals","id","collection","result","db","deleteOne"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,OAAOA,mBAAmB,8BAA6B;AACvD,OAAOC,mBAAmB,8BAA6B;AACvD,SAASC,QAAQ,QAAQ,2BAA0B;AACnD,SAASC,iBAAiB,QAAQ,mCAAkC;AAEpE,eAAeC,gBAAgBC,IAAuB;IACpD,MAAM,EACJC,GAAG,EACHC,cAAc,EACdC,KAAK,EAAEC,OAAO,EAAE,EAChBD,GAAG,EACHE,IAAI,EACL,GAAGL;IAEJ,IAAI,CAACK,MAAM;QACT,MAAM,IAAIP,kBAAkBK,IAAIG,CAAC;IACnC;IAEA,IAAI,CAACJ,gBAAgB;QACnB,MAAMN,cAAc;YAAEO;QAAI,GAAGR;IAC/B;IAEA,MAAMY,QAAe;QACnBC,KAAK;YACH;gBAAEP,KAAK;oBAAEQ,QAAQR;gBAAI;YAAE;YACvB;gBAAE,cAAc;oBAAEQ,QAAQJ,KAAKK,EAAE;gBAAC;YAAE;YACpC;gBAAE,mBAAmB;oBAAED,QAAQJ,KAAKM,UAAU;gBAAC;YAAE;SAClD;IACH;IAEA,MAAMC,SAAS,MAAMR,QAAQS,EAAE,CAACC,SAAS,CAAC;QACxCH,YAAY;QACZR;QACAI;IACF;IAEA,IAAIK,QAAQ;QACV,OAAOA;IACT;IACA,MAAM,IAAIf,SAASM,IAAIG,CAAC;AAC1B;AAEA,eAAeP,gBAAe"}
@@ -1,6 +1,6 @@
1
1
  import defaultAccess from '../../auth/defaultAccess.js';
2
2
  import executeAccess from '../../auth/executeAccess.js';
3
- import UnauthorizedError from '../../errors/UnathorizedError.js';
3
+ import { UnauthorizedError } from '../../errors/UnathorizedError.js';
4
4
  async function update(args) {
5
5
  const { key, overrideAccess, req: { payload }, req, user, value } = args;
6
6
  if (!user) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/preferences/operations/update.ts"],"sourcesContent":["import type { PreferenceUpdateRequest } from '../types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport UnauthorizedError from '../../errors/UnathorizedError.js'\n\nasync function update(args: PreferenceUpdateRequest) {\n const {\n key,\n overrideAccess,\n req: { payload },\n req,\n user,\n value,\n } = args\n\n if (!user) {\n throw new UnauthorizedError(req.t)\n }\n\n const collection = 'payload-preferences'\n\n const filter = {\n key: { equals: key },\n 'user.relationTo': { equals: user.collection },\n 'user.value': { equals: user.id },\n }\n\n const preference = {\n key,\n user: {\n relationTo: user.collection,\n value: user.id,\n },\n value,\n }\n\n if (!overrideAccess) {\n await executeAccess({ req }, defaultAccess)\n }\n\n try {\n // try/catch because we attempt to update without first reading to check if it exists first to save on db calls\n await payload.db.updateOne({\n collection,\n data: preference,\n req,\n where: filter,\n })\n } catch (err: unknown) {\n await payload.db.create({\n collection,\n data: preference,\n req,\n })\n }\n\n return preference\n}\n\nexport default update\n"],"names":["defaultAccess","executeAccess","UnauthorizedError","update","args","key","overrideAccess","req","payload","user","value","t","collection","filter","equals","id","preference","relationTo","db","updateOne","data","where","err","create"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAOA,mBAAmB,8BAA6B;AACvD,OAAOC,mBAAmB,8BAA6B;AACvD,OAAOC,uBAAuB,mCAAkC;AAEhE,eAAeC,OAAOC,IAA6B;IACjD,MAAM,EACJC,GAAG,EACHC,cAAc,EACdC,KAAK,EAAEC,OAAO,EAAE,EAChBD,GAAG,EACHE,IAAI,EACJC,KAAK,EACN,GAAGN;IAEJ,IAAI,CAACK,MAAM;QACT,MAAM,IAAIP,kBAAkBK,IAAII,CAAC;IACnC;IAEA,MAAMC,aAAa;IAEnB,MAAMC,SAAS;QACbR,KAAK;YAAES,QAAQT;QAAI;QACnB,mBAAmB;YAAES,QAAQL,KAAKG,UAAU;QAAC;QAC7C,cAAc;YAAEE,QAAQL,KAAKM,EAAE;QAAC;IAClC;IAEA,MAAMC,aAAa;QACjBX;QACAI,MAAM;YACJQ,YAAYR,KAAKG,UAAU;YAC3BF,OAAOD,KAAKM,EAAE;QAChB;QACAL;IACF;IAEA,IAAI,CAACJ,gBAAgB;QACnB,MAAML,cAAc;YAAEM;QAAI,GAAGP;IAC/B;IAEA,IAAI;QACF,+GAA+G;QAC/G,MAAMQ,QAAQU,EAAE,CAACC,SAAS,CAAC;YACzBP;YACAQ,MAAMJ;YACNT;YACAc,OAAOR;QACT;IACF,EAAE,OAAOS,KAAc;QACrB,MAAMd,QAAQU,EAAE,CAACK,MAAM,CAAC;YACtBX;YACAQ,MAAMJ;YACNT;QACF;IACF;IAEA,OAAOS;AACT;AAEA,eAAeb,OAAM"}
1
+ {"version":3,"sources":["../../../src/preferences/operations/update.ts"],"sourcesContent":["import type { PreferenceUpdateRequest } from '../types.js'\n\nimport defaultAccess from '../../auth/defaultAccess.js'\nimport executeAccess from '../../auth/executeAccess.js'\nimport { UnauthorizedError } from '../../errors/UnathorizedError.js'\n\nasync function update(args: PreferenceUpdateRequest) {\n const {\n key,\n overrideAccess,\n req: { payload },\n req,\n user,\n value,\n } = args\n\n if (!user) {\n throw new UnauthorizedError(req.t)\n }\n\n const collection = 'payload-preferences'\n\n const filter = {\n key: { equals: key },\n 'user.relationTo': { equals: user.collection },\n 'user.value': { equals: user.id },\n }\n\n const preference = {\n key,\n user: {\n relationTo: user.collection,\n value: user.id,\n },\n value,\n }\n\n if (!overrideAccess) {\n await executeAccess({ req }, defaultAccess)\n }\n\n try {\n // try/catch because we attempt to update without first reading to check if it exists first to save on db calls\n await payload.db.updateOne({\n collection,\n data: preference,\n req,\n where: filter,\n })\n } catch (err: unknown) {\n await payload.db.create({\n collection,\n data: preference,\n req,\n })\n }\n\n return preference\n}\n\nexport default update\n"],"names":["defaultAccess","executeAccess","UnauthorizedError","update","args","key","overrideAccess","req","payload","user","value","t","collection","filter","equals","id","preference","relationTo","db","updateOne","data","where","err","create"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,OAAOA,mBAAmB,8BAA6B;AACvD,OAAOC,mBAAmB,8BAA6B;AACvD,SAASC,iBAAiB,QAAQ,mCAAkC;AAEpE,eAAeC,OAAOC,IAA6B;IACjD,MAAM,EACJC,GAAG,EACHC,cAAc,EACdC,KAAK,EAAEC,OAAO,EAAE,EAChBD,GAAG,EACHE,IAAI,EACJC,KAAK,EACN,GAAGN;IAEJ,IAAI,CAACK,MAAM;QACT,MAAM,IAAIP,kBAAkBK,IAAII,CAAC;IACnC;IAEA,MAAMC,aAAa;IAEnB,MAAMC,SAAS;QACbR,KAAK;YAAES,QAAQT;QAAI;QACnB,mBAAmB;YAAES,QAAQL,KAAKG,UAAU;QAAC;QAC7C,cAAc;YAAEE,QAAQL,KAAKM,EAAE;QAAC;IAClC;IAEA,MAAMC,aAAa;QACjBX;QACAI,MAAM;YACJQ,YAAYR,KAAKG,UAAU;YAC3BF,OAAOD,KAAKM,EAAE;QAChB;QACAL;IACF;IAEA,IAAI,CAACJ,gBAAgB;QACnB,MAAML,cAAc;YAAEM;QAAI,GAAGP;IAC/B;IAEA,IAAI;QACF,+GAA+G;QAC/G,MAAMQ,QAAQU,EAAE,CAACC,SAAS,CAAC;YACzBP;YACAQ,MAAMJ;YACNT;YACAc,OAAOR;QACT;IACF,EAAE,OAAOS,KAAc;QACrB,MAAMd,QAAQU,EAAE,CAACK,MAAM,CAAC;YACtBX;YACAQ,MAAMJ;YACNT;QACF;IACF;IAEA,OAAOS;AACT;AAEA,eAAeb,OAAM"}
@@ -3,7 +3,7 @@ const { fromBuffer } = fileType;
3
3
  import fs from 'fs';
4
4
  import mkdirp from 'mkdirp';
5
5
  import sanitize from 'sanitize-filename';
6
- import { FileUploadError, MissingFile } from '../errors/index.js';
6
+ import { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js';
7
7
  import canResizeImage from './canResizeImage.js';
8
8
  import cropImage from './cropImage.js';
9
9
  import { getExternalFile } from './getExternalFile.js';
@@ -41,7 +41,7 @@ export const generateFileData = async ({ collection: { config: collectionConfig
41
41
  overwriteExistingFiles = true;
42
42
  }
43
43
  } catch (err) {
44
- throw new FileUploadError(req.t);
44
+ throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined);
45
45
  }
46
46
  }
47
47
  if (!file) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequestWithData } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequestWithData\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['uploadEdits'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: data as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err) {\n throw new FileUploadError(req.t)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","undefined","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../src/uploads/generateFileData.ts"],"sourcesContent":["import type { OutputInfo, Sharp, SharpOptions } from 'sharp'\n\nimport fileType from 'file-type'\nconst { fromBuffer } = fileType\nimport fs from 'fs'\nimport mkdirp from 'mkdirp'\nimport sanitize from 'sanitize-filename'\n\nimport type { Collection } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { PayloadRequestWithData } from '../types/index.js'\nimport type { FileData, FileToSave, ProbedImageSize } from './types.js'\n\nimport { FileRetrievalError, FileUploadError, MissingFile } from '../errors/index.js'\nimport canResizeImage from './canResizeImage.js'\nimport cropImage from './cropImage.js'\nimport { getExternalFile } from './getExternalFile.js'\nimport { getFileByPath } from './getFileByPath.js'\nimport { getImageSize } from './getImageSize.js'\nimport getSafeFileName from './getSafeFilename.js'\nimport resizeAndTransformImageSizes from './imageResizer.js'\nimport isImage from './isImage.js'\n\ntype Args<T> = {\n collection: Collection\n config: SanitizedConfig\n data: T\n overwriteExistingFiles?: boolean\n req: PayloadRequestWithData\n throwOnMissingFile?: boolean\n}\n\ntype Result<T> = Promise<{\n data: T\n files: FileToSave[]\n}>\n\nexport const generateFileData = async <T>({\n collection: { config: collectionConfig },\n data,\n overwriteExistingFiles,\n req,\n throwOnMissingFile,\n}: Args<T>): Result<T> => {\n if (!collectionConfig.upload) {\n return {\n data,\n files: [],\n }\n }\n\n const { sharp } = req.payload.config\n\n let file = req.file\n\n const uploadEdits = req.query['uploadEdits'] || {}\n\n const { disableLocalStorage, formatOptions, imageSizes, resizeOptions, staticDir, trimOptions } =\n collectionConfig.upload\n\n const staticPath = staticDir\n\n if (!file && uploadEdits && data) {\n const { filename, url } = data as FileData\n\n try {\n if (url && url.startsWith('/') && !disableLocalStorage) {\n const filePath = `${staticPath}/${filename}`\n const response = await getFileByPath(filePath)\n file = response\n overwriteExistingFiles = true\n } else if (filename && url) {\n file = await getExternalFile({\n data: data as FileData,\n req,\n uploadConfig: collectionConfig.upload,\n })\n overwriteExistingFiles = true\n }\n } catch (err: unknown) {\n throw new FileRetrievalError(req.t, err instanceof Error ? err.message : undefined)\n }\n }\n\n if (!file) {\n if (throwOnMissingFile) throw new MissingFile(req.t)\n\n return {\n data,\n files: [],\n }\n }\n\n if (!disableLocalStorage) {\n mkdirp.sync(staticPath)\n }\n\n let newData = data\n const filesToSave: FileToSave[] = []\n const fileData: Partial<FileData> = {}\n const fileIsAnimated = file.mimetype === 'image/gif' || file.mimetype === 'image/webp'\n const cropData =\n typeof uploadEdits === 'object' && 'crop' in uploadEdits ? uploadEdits.crop : undefined\n\n try {\n const fileSupportsResize = canResizeImage(file.mimetype)\n let fsSafeName: string\n let sharpFile: Sharp | undefined\n let dimensions: ProbedImageSize | undefined\n let fileBuffer: { data: Buffer; info: OutputInfo }\n let ext\n let mime: string\n const fileHasAdjustments =\n fileSupportsResize &&\n Boolean(resizeOptions || formatOptions || trimOptions || file.tempFilePath)\n\n const sharpOptions: SharpOptions = {}\n\n if (fileIsAnimated) sharpOptions.animated = true\n\n if (fileHasAdjustments && sharp) {\n if (file.tempFilePath) {\n sharpFile = sharp(file.tempFilePath, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n } else {\n sharpFile = sharp(file.data, sharpOptions).rotate() // pass rotate() to auto-rotate based on EXIF data. https://github.com/payloadcms/payload/pull/3081\n }\n\n if (resizeOptions) {\n sharpFile = sharpFile.resize(resizeOptions)\n }\n if (formatOptions) {\n sharpFile = sharpFile.toFormat(formatOptions.format, formatOptions.options)\n }\n if (trimOptions) {\n sharpFile = sharpFile.trim(trimOptions)\n }\n }\n\n if (fileSupportsResize || isImage(file.mimetype)) {\n dimensions = await getImageSize(file)\n fileData.width = dimensions.width\n fileData.height = dimensions.height\n }\n\n if (sharpFile) {\n const metadata = await sharpFile.metadata()\n fileBuffer = await sharpFile.toBuffer({ resolveWithObject: true })\n ;({ ext, mime } = await fromBuffer(fileBuffer.data)) // This is getting an incorrect gif height back.\n fileData.width = fileBuffer.info.width\n fileData.height = fileBuffer.info.height\n fileData.filesize = fileBuffer.info.size\n\n // Animated GIFs + WebP aggregate the height from every frame, so we need to use divide by number of pages\n if (metadata.pages) {\n fileData.height = fileBuffer.info.height / metadata.pages\n fileData.filesize = fileBuffer.data.length\n }\n } else {\n mime = file.mimetype\n fileData.filesize = file.size\n\n if (file.name.includes('.')) {\n ext = file.name.split('.').pop()\n } else {\n ext = ''\n }\n }\n\n // Adust SVG mime type. fromBuffer modifies it.\n if (mime === 'application/xml' && ext === 'svg') mime = 'image/svg+xml'\n fileData.mimeType = mime\n\n const baseFilename = sanitize(file.name.substring(0, file.name.lastIndexOf('.')) || file.name)\n fsSafeName = `${baseFilename}${ext ? `.${ext}` : ''}`\n\n if (!overwriteExistingFiles) {\n fsSafeName = await getSafeFileName({\n collectionSlug: collectionConfig.slug,\n desiredFilename: fsSafeName,\n req,\n staticPath,\n })\n }\n\n fileData.filename = fsSafeName\n let fileForResize = file\n\n if (cropData && sharp) {\n const { data: croppedImage, info } = await cropImage({ cropData, dimensions, file, sharp })\n\n filesToSave.push({\n buffer: croppedImage,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n fileForResize = {\n ...file,\n data: croppedImage,\n size: info.size,\n }\n fileData.width = info.width\n fileData.height = info.height\n fileData.filesize = info.size\n\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, croppedImage) // write fileBuffer to the temp path\n } else {\n req.file = fileForResize\n }\n } else {\n filesToSave.push({\n buffer: fileBuffer?.data || file.data,\n path: `${staticPath}/${fsSafeName}`,\n })\n\n // If using temp files and the image is being resized, write the file to the temp path\n if (fileBuffer?.data || file.data.length > 0) {\n if (file.tempFilePath) {\n await fs.promises.writeFile(file.tempFilePath, fileBuffer?.data || file.data) // write fileBuffer to the temp path\n } else {\n // Assign the _possibly modified_ file to the request object\n req.file = {\n ...file,\n data: fileBuffer?.data || file.data,\n size: fileBuffer?.info.size,\n }\n }\n }\n }\n\n if (Array.isArray(imageSizes) && fileSupportsResize && sharp) {\n req.payloadUploadSizes = {}\n const { sizeData, sizesToSave } = await resizeAndTransformImageSizes({\n config: collectionConfig,\n dimensions: !cropData\n ? dimensions\n : {\n ...dimensions,\n height: fileData.height,\n width: fileData.width,\n },\n file: fileForResize,\n mimeType: fileData.mimeType,\n req,\n savedFilename: fsSafeName || file.name,\n sharp,\n staticPath,\n })\n\n fileData.sizes = sizeData\n filesToSave.push(...sizesToSave)\n }\n } catch (err) {\n console.error(err)\n throw new FileUploadError(req.t)\n }\n\n newData = {\n ...newData,\n ...fileData,\n }\n\n return {\n data: newData,\n files: filesToSave,\n }\n}\n"],"names":["fileType","fromBuffer","fs","mkdirp","sanitize","FileRetrievalError","FileUploadError","MissingFile","canResizeImage","cropImage","getExternalFile","getFileByPath","getImageSize","getSafeFileName","resizeAndTransformImageSizes","isImage","generateFileData","collection","config","collectionConfig","data","overwriteExistingFiles","req","throwOnMissingFile","upload","files","sharp","payload","file","uploadEdits","query","disableLocalStorage","formatOptions","imageSizes","resizeOptions","staticDir","trimOptions","staticPath","filename","url","startsWith","filePath","response","uploadConfig","err","t","Error","message","undefined","sync","newData","filesToSave","fileData","fileIsAnimated","mimetype","cropData","crop","fileSupportsResize","fsSafeName","sharpFile","dimensions","fileBuffer","ext","mime","fileHasAdjustments","Boolean","tempFilePath","sharpOptions","animated","rotate","resize","toFormat","format","options","trim","width","height","metadata","toBuffer","resolveWithObject","info","filesize","size","pages","length","name","includes","split","pop","mimeType","baseFilename","substring","lastIndexOf","collectionSlug","slug","desiredFilename","fileForResize","croppedImage","push","buffer","path","promises","writeFile","Array","isArray","payloadUploadSizes","sizeData","sizesToSave","savedFilename","sizes","console","error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,sBAAsB,CAAA;IAC3B,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,QAAQ,IAAI,CA8BrF,CAAA"}
1
+ {"version":3,"file":"getExternalFile.d.ts","sourceRoot":"","sources":["../../src/uploads/getExternalFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,GAAG,EAAE,sBAAsB,CAAA;IAC3B,YAAY,EAAE,YAAY,CAAA;CAC3B,CAAA;AACD,eAAO,MAAM,eAAe,gCAAuC,IAAI,KAAG,QAAQ,IAAI,CAiCrF,CAAA"}
@@ -1,9 +1,12 @@
1
1
  import { APIError } from '../errors/index.js';
2
2
  export const getExternalFile = async ({ data, req, uploadConfig })=>{
3
- const baseUrl = req.origin || `${req.protocol}://${req.host}`;
4
3
  const { filename, url } = data;
5
4
  if (typeof url === 'string') {
6
- const fileURL = `${baseUrl}${url}`;
5
+ let fileURL = url;
6
+ if (!url.startsWith('http')) {
7
+ const baseUrl = req.headers.get('origin') || `${req.protocol}://${req.headers.get('host')}`;
8
+ fileURL = `${baseUrl}${url}`;
9
+ }
7
10
  const headers = uploadConfig.externalFileHeaderFilter ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers))) : {
8
11
  cookie: req.headers.get('cookie')
9
12
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequestWithData } from '../types/index.js'\nimport type { File, FileData, UploadConfig } from './types.js'\n\nimport { APIError } from '../errors/index.js'\n\ntype Args = {\n data: FileData\n req: PayloadRequestWithData\n uploadConfig: UploadConfig\n}\nexport const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise<File> => {\n const baseUrl = req.origin || `${req.protocol}://${req.host}`\n const { filename, url } = data\n\n if (typeof url === 'string') {\n const fileURL = `${baseUrl}${url}`\n\n const headers = uploadConfig.externalFileHeaderFilter\n ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers)))\n : { cookie: req.headers.get('cookie') }\n\n const res = await fetch(fileURL, {\n credentials: 'include',\n headers,\n method: 'GET',\n })\n\n if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)\n\n const data = await res.arrayBuffer()\n\n return {\n name: filename,\n data: Buffer.from(data),\n mimetype: res.headers.get('content-type') || undefined,\n size: Number(res.headers.get('content-length')) || 0,\n }\n }\n\n throw new APIError('Invalid file url', 400)\n}\n"],"names":["APIError","getExternalFile","data","req","uploadConfig","baseUrl","origin","protocol","host","filename","url","fileURL","headers","externalFileHeaderFilter","Object","fromEntries","Headers","cookie","get","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","undefined","size","Number"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAO7C,OAAO,MAAMC,kBAAkB,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAEC,YAAY,EAAQ;IACrE,MAAMC,UAAUF,IAAIG,MAAM,IAAI,CAAC,EAAEH,IAAII,QAAQ,CAAC,GAAG,EAAEJ,IAAIK,IAAI,CAAC,CAAC;IAC7D,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAE,GAAGR;IAE1B,IAAI,OAAOQ,QAAQ,UAAU;QAC3B,MAAMC,UAAU,CAAC,EAAEN,QAAQ,EAAEK,IAAI,CAAC;QAElC,MAAME,UAAUR,aAAaS,wBAAwB,GACjDT,aAAaS,wBAAwB,CAACC,OAAOC,WAAW,CAAC,IAAIC,QAAQb,IAAIS,OAAO,MAChF;YAAEK,QAAQd,IAAIS,OAAO,CAACM,GAAG,CAAC;QAAU;QAExC,MAAMC,MAAM,MAAMC,MAAMT,SAAS;YAC/BU,aAAa;YACbT;YACAU,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE,MAAM,IAAIvB,SAAS,CAAC,0BAA0B,EAAEW,QAAQ,CAAC,EAAEQ,IAAIK,MAAM;QAElF,MAAMtB,OAAO,MAAMiB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMjB;YACNP,MAAMyB,OAAOC,IAAI,CAAC1B;YAClB2B,UAAUV,IAAIP,OAAO,CAACM,GAAG,CAAC,mBAAmBY;YAC7CC,MAAMC,OAAOb,IAAIP,OAAO,CAACM,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAIlB,SAAS,oBAAoB;AACzC,EAAC"}
1
+ {"version":3,"sources":["../../src/uploads/getExternalFile.ts"],"sourcesContent":["import type { PayloadRequestWithData } from '../types/index.js'\nimport type { File, FileData, UploadConfig } from './types.js'\n\nimport { APIError } from '../errors/index.js'\n\ntype Args = {\n data: FileData\n req: PayloadRequestWithData\n uploadConfig: UploadConfig\n}\nexport const getExternalFile = async ({ data, req, uploadConfig }: Args): Promise<File> => {\n const { filename, url } = data\n\n if (typeof url === 'string') {\n let fileURL = url\n if (!url.startsWith('http')) {\n const baseUrl = req.headers.get('origin') || `${req.protocol}://${req.headers.get('host')}`\n fileURL = `${baseUrl}${url}`\n }\n\n const headers = uploadConfig.externalFileHeaderFilter\n ? uploadConfig.externalFileHeaderFilter(Object.fromEntries(new Headers(req.headers)))\n : { cookie: req.headers.get('cookie') }\n\n const res = await fetch(fileURL, {\n credentials: 'include',\n headers,\n method: 'GET',\n })\n\n if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)\n\n const data = await res.arrayBuffer()\n\n return {\n name: filename,\n data: Buffer.from(data),\n mimetype: res.headers.get('content-type') || undefined,\n size: Number(res.headers.get('content-length')) || 0,\n }\n }\n\n throw new APIError('Invalid file url', 400)\n}\n"],"names":["APIError","getExternalFile","data","req","uploadConfig","filename","url","fileURL","startsWith","baseUrl","headers","get","protocol","externalFileHeaderFilter","Object","fromEntries","Headers","cookie","res","fetch","credentials","method","ok","status","arrayBuffer","name","Buffer","from","mimetype","undefined","size","Number"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAGA,SAASA,QAAQ,QAAQ,qBAAoB;AAO7C,OAAO,MAAMC,kBAAkB,OAAO,EAAEC,IAAI,EAAEC,GAAG,EAAEC,YAAY,EAAQ;IACrE,MAAM,EAAEC,QAAQ,EAAEC,GAAG,EAAE,GAAGJ;IAE1B,IAAI,OAAOI,QAAQ,UAAU;QAC3B,IAAIC,UAAUD;QACd,IAAI,CAACA,IAAIE,UAAU,CAAC,SAAS;YAC3B,MAAMC,UAAUN,IAAIO,OAAO,CAACC,GAAG,CAAC,aAAa,CAAC,EAAER,IAAIS,QAAQ,CAAC,GAAG,EAAET,IAAIO,OAAO,CAACC,GAAG,CAAC,QAAQ,CAAC;YAC3FJ,UAAU,CAAC,EAAEE,QAAQ,EAAEH,IAAI,CAAC;QAC9B;QAEA,MAAMI,UAAUN,aAAaS,wBAAwB,GACjDT,aAAaS,wBAAwB,CAACC,OAAOC,WAAW,CAAC,IAAIC,QAAQb,IAAIO,OAAO,MAChF;YAAEO,QAAQd,IAAIO,OAAO,CAACC,GAAG,CAAC;QAAU;QAExC,MAAMO,MAAM,MAAMC,MAAMZ,SAAS;YAC/Ba,aAAa;YACbV;YACAW,QAAQ;QACV;QAEA,IAAI,CAACH,IAAII,EAAE,EAAE,MAAM,IAAItB,SAAS,CAAC,0BAA0B,EAAEO,QAAQ,CAAC,EAAEW,IAAIK,MAAM;QAElF,MAAMrB,OAAO,MAAMgB,IAAIM,WAAW;QAElC,OAAO;YACLC,MAAMpB;YACNH,MAAMwB,OAAOC,IAAI,CAACzB;YAClB0B,UAAUV,IAAIR,OAAO,CAACC,GAAG,CAAC,mBAAmBkB;YAC7CC,MAAMC,OAAOb,IAAIR,OAAO,CAACC,GAAG,CAAC,sBAAsB;QACrD;IACF;IAEA,MAAM,IAAIX,SAAS,oBAAoB;AACzC,EAAC"}
@@ -63,6 +63,10 @@ export type GetAdminThumbnail = (args: {
63
63
  doc: Record<string, unknown>;
64
64
  }) => false | null | string;
65
65
  export type UploadConfig = {
66
+ /**
67
+ * The adapter to use for uploads.
68
+ */
69
+ adapter?: string;
66
70
  /**
67
71
  * Represents an admin thumbnail, which can be either a React component or a string.
68
72
  * - If a string, it should be one of the image size names.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,KAAK,WAAW,MAAM,cAAc,CAAA;AAC3C,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAEjD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAE/D,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAA;IACvB,KAAK,EAAE,IAAI,GAAG,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,SAAS,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACxC,OAAO,CAAC,EAAE,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;CAC3C,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAEjE,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,GAAG;IAClE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,aAAa,CAAC,EAAE,wBAAwB,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,sBAAsB,CAAA;IACpC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAA;CACzD,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,KAAK,KAAK,GAAG,IAAI,GAAG,MAAM,CAAA;AAEjG,MAAM,MAAM,YAAY,GAAG;IACzB;;;;QAII;IACJ,cAAc,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAA;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtF,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6FAA6F;IAC7F,aAAa,CAAC,EAAE,wBAAwB,CAAA;IACxC,QAAQ,CAAC,EAAE,CAAC,CACV,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE;QAAE,MAAM,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAA;IACpC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,WAAW,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1F,WAAW,CAAC,EAAE,sBAAsB,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG,YAAY,GAAG;IACjD,SAAS,EAAE,YAAY,CAAC,WAAW,CAAC,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,IAAI,GAAG;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type express from 'express'\nimport type serveStatic from 'serve-static'\nimport type { ResizeOptions, Sharp } from 'sharp'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nexport type FileSize = {\n filename: null | string\n filesize: null | number\n height: null | number\n mimeType: null | string\n width: null | number\n}\n\nexport type FileSizes = {\n [size: string]: FileSize\n}\n\nexport type FileData = {\n filename: string\n filesize: number\n height: number\n mimeType: string\n sizes: FileSizes\n tempFilePath?: string\n url?: string\n width: number\n}\n\nexport type ProbedImageSize = {\n height: number\n width: number\n}\n\n/**\n * Params sent to the sharp toFormat() function\n * @link https://sharp.pixelplumbing.com/api-output#toformat\n */\nexport type ImageUploadFormatOptions = {\n format: Parameters<Sharp['toFormat']>[0]\n options?: Parameters<Sharp['toFormat']>[1]\n}\n\n/**\n * Params sent to the sharp trim() function\n * @link https://sharp.pixelplumbing.com/api-resize#trim\n */\nexport type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0]\n\nexport type ImageSize = Omit<ResizeOptions, 'withoutEnlargement'> & {\n /**\n * @deprecated prefer position\n */\n crop?: string // comes from sharp package\n formatOptions?: ImageUploadFormatOptions\n name: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * When an uploaded image is smaller than the defined image size, we have 3 options:\n *\n * `undefined | false | true`\n *\n * 1. `undefined` [default]: uploading images with smaller width AND height than the image size will return null\n * 2. `false`: always enlarge images to the image size\n * 3. `true`: if the image is smaller than the image size, return the original image\n */\n withoutEnlargement?: ResizeOptions['withoutEnlargement']\n}\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type UploadConfig = {\n /**\n * Represents an admin thumbnail, which can be either a React component or a string.\n * - If a string, it should be one of the image size names.\n * - If a React component, register a function that generates the thumbnail URL using the `useAdminThumbnail` hook.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n crop?: boolean\n disableLocalStorage?: boolean\n /**\n * Accepts existing headers and can filter/modify them.\n *\n * Useful for adding custom headers to fetch from external providers.\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n filesRequiredOnCreate?: boolean\n focalPoint?: boolean\n /** Options for original upload file only. For sizes, set each formatOptions individually. */\n formatOptions?: ImageUploadFormatOptions\n handlers?: ((\n req: PayloadRequestWithData,\n args: { params: { collection: string; filename: string } },\n ) => Promise<Response> | Response)[]\n imageSizes?: ImageSize[]\n mimeTypes?: string[]\n resizeOptions?: ResizeOptions\n staticDir?: string\n staticOptions?: serveStatic.ServeStaticOptions<express.Response<any, Record<string, any>>>\n trimOptions?: ImageUploadTrimOptions\n}\n\nexport type SanitizedUploadConfig = UploadConfig & {\n staticDir: UploadConfig['staticDir']\n}\n\nexport type File = {\n data: Buffer\n mimetype: string\n name: string\n size: number\n}\n\nexport type FileToSave = {\n buffer: Buffer\n path: string\n}\n"],"names":[],"rangeMappings":"","mappings":"AAiHA,WAGC"}
1
+ {"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type express from 'express'\nimport type serveStatic from 'serve-static'\nimport type { ResizeOptions, Sharp } from 'sharp'\n\nimport type { PayloadRequestWithData } from '../types/index.js'\n\nexport type FileSize = {\n filename: null | string\n filesize: null | number\n height: null | number\n mimeType: null | string\n width: null | number\n}\n\nexport type FileSizes = {\n [size: string]: FileSize\n}\n\nexport type FileData = {\n filename: string\n filesize: number\n height: number\n mimeType: string\n sizes: FileSizes\n tempFilePath?: string\n url?: string\n width: number\n}\n\nexport type ProbedImageSize = {\n height: number\n width: number\n}\n\n/**\n * Params sent to the sharp toFormat() function\n * @link https://sharp.pixelplumbing.com/api-output#toformat\n */\nexport type ImageUploadFormatOptions = {\n format: Parameters<Sharp['toFormat']>[0]\n options?: Parameters<Sharp['toFormat']>[1]\n}\n\n/**\n * Params sent to the sharp trim() function\n * @link https://sharp.pixelplumbing.com/api-resize#trim\n */\nexport type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0]\n\nexport type ImageSize = Omit<ResizeOptions, 'withoutEnlargement'> & {\n /**\n * @deprecated prefer position\n */\n crop?: string // comes from sharp package\n formatOptions?: ImageUploadFormatOptions\n name: string\n trimOptions?: ImageUploadTrimOptions\n /**\n * When an uploaded image is smaller than the defined image size, we have 3 options:\n *\n * `undefined | false | true`\n *\n * 1. `undefined` [default]: uploading images with smaller width AND height than the image size will return null\n * 2. `false`: always enlarge images to the image size\n * 3. `true`: if the image is smaller than the image size, return the original image\n */\n withoutEnlargement?: ResizeOptions['withoutEnlargement']\n}\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type UploadConfig = {\n /**\n * The adapter to use for uploads.\n */\n adapter?: string\n /**\n * Represents an admin thumbnail, which can be either a React component or a string.\n * - If a string, it should be one of the image size names.\n * - If a React component, register a function that generates the thumbnail URL using the `useAdminThumbnail` hook.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n crop?: boolean\n disableLocalStorage?: boolean\n /**\n * Accepts existing headers and can filter/modify them.\n *\n * Useful for adding custom headers to fetch from external providers.\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n filesRequiredOnCreate?: boolean\n focalPoint?: boolean\n /** Options for original upload file only. For sizes, set each formatOptions individually. */\n formatOptions?: ImageUploadFormatOptions\n handlers?: ((\n req: PayloadRequestWithData,\n args: { params: { collection: string; filename: string } },\n ) => Promise<Response> | Response)[]\n imageSizes?: ImageSize[]\n mimeTypes?: string[]\n resizeOptions?: ResizeOptions\n staticDir?: string\n staticOptions?: serveStatic.ServeStaticOptions<express.Response<any, Record<string, any>>>\n trimOptions?: ImageUploadTrimOptions\n}\n\nexport type SanitizedUploadConfig = UploadConfig & {\n staticDir: UploadConfig['staticDir']\n}\n\nexport type File = {\n data: Buffer\n mimetype: string\n name: string\n size: number\n}\n\nexport type FileToSave = {\n buffer: Buffer\n path: string\n}\n"],"names":[],"rangeMappings":"","mappings":"AAqHA,WAGC"}
@@ -1,4 +1,4 @@
1
- import DuplicateCollection from '../errors/DuplicateCollection.js';
1
+ import { DuplicateCollection } from '../errors/DuplicateCollection.js';
2
2
  const getDuplicates = (arr)=>arr.filter((item, index)=>arr.indexOf(item) !== index);
3
3
  const checkDuplicateCollections = (collections)=>{
4
4
  const duplicateSlugs = getDuplicates(collections.map((c)=>c.slug));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/checkDuplicateCollections.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../collections/config/types.js'\n\nimport DuplicateCollection from '../errors/DuplicateCollection.js'\n\nconst getDuplicates = (arr: string[]) => arr.filter((item, index) => arr.indexOf(item) !== index)\n\nconst checkDuplicateCollections = (collections: SanitizedCollectionConfig[]): void => {\n const duplicateSlugs = getDuplicates(collections.map((c) => c.slug))\n if (duplicateSlugs.length > 0) {\n throw new DuplicateCollection('slug', duplicateSlugs)\n }\n}\n\nexport default checkDuplicateCollections\n"],"names":["DuplicateCollection","getDuplicates","arr","filter","item","index","indexOf","checkDuplicateCollections","collections","duplicateSlugs","map","c","slug","length"],"rangeMappings":";;;;;;;;","mappings":"AAEA,OAAOA,yBAAyB,mCAAkC;AAElE,MAAMC,gBAAgB,CAACC,MAAkBA,IAAIC,MAAM,CAAC,CAACC,MAAMC,QAAUH,IAAII,OAAO,CAACF,UAAUC;AAE3F,MAAME,4BAA4B,CAACC;IACjC,MAAMC,iBAAiBR,cAAcO,YAAYE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IAClE,IAAIH,eAAeI,MAAM,GAAG,GAAG;QAC7B,MAAM,IAAIb,oBAAoB,QAAQS;IACxC;AACF;AAEA,eAAeF,0BAAyB"}
1
+ {"version":3,"sources":["../../src/utilities/checkDuplicateCollections.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../collections/config/types.js'\n\nimport { DuplicateCollection } from '../errors/DuplicateCollection.js'\n\nconst getDuplicates = (arr: string[]) => arr.filter((item, index) => arr.indexOf(item) !== index)\n\nconst checkDuplicateCollections = (collections: SanitizedCollectionConfig[]): void => {\n const duplicateSlugs = getDuplicates(collections.map((c) => c.slug))\n if (duplicateSlugs.length > 0) {\n throw new DuplicateCollection('slug', duplicateSlugs)\n }\n}\n\nexport default checkDuplicateCollections\n"],"names":["DuplicateCollection","getDuplicates","arr","filter","item","index","indexOf","checkDuplicateCollections","collections","duplicateSlugs","map","c","slug","length"],"rangeMappings":";;;;;;;;","mappings":"AAEA,SAASA,mBAAmB,QAAQ,mCAAkC;AAEtE,MAAMC,gBAAgB,CAACC,MAAkBA,IAAIC,MAAM,CAAC,CAACC,MAAMC,QAAUH,IAAII,OAAO,CAACF,UAAUC;AAE3F,MAAME,4BAA4B,CAACC;IACjC,MAAMC,iBAAiBR,cAAcO,YAAYE,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;IAClE,IAAIH,eAAeI,MAAM,GAAG,GAAG;QAC7B,MAAM,IAAIb,oBAAoB,QAAQS;IACxC;AACF;AAEA,eAAeF,0BAAyB"}
@@ -1 +1 @@
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,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAwGvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAK7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAmXA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,GAAG,qBAAqB,EACjE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,GAC/B,WAAW,CA8Cb;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CA4Bb"}
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,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAA8B,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAwGvE;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,mBAAmB,EAC9B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,CAK7C;AAED,wBAAgB,kBAAkB;AAChC;;;;GAIG;AACH,sBAAsB,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAA;CAAE,EAC9D,MAAM,EAAE,KAAK,EAAE;AACf;;GAEG;AACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,MAAM,CAAC,EAAE,eAAe,GACvB;IACD,UAAU,EAAE;QACV,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAA;KACzB,CAAA;IACD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAsXA;AAGD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,cAAc,EAAE,yBAAyB,GAAG,qBAAqB,EACjE,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,EAClD,aAAa,EAAE,QAAQ,GAAG,MAAM,GAC/B,WAAW,CA8Cb;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,eAAe,EACvB,aAAa,CAAC,EAAE,QAAQ,GAAG,MAAM,GAChC,WAAW,CA4Bb"}
@@ -183,6 +183,9 @@ export function fieldsToJSONSchema(/**
183
183
  }
184
184
  case 'richText':
185
185
  {
186
+ if (typeof field.editor === 'function') {
187
+ throw new Error('Attempted to access unsanitized rich text editor.');
188
+ }
186
189
  if (field.editor.outputSchema) {
187
190
  fieldSchema = field.editor.outputSchema({
188
191
  collectionIDFieldTypes,
@@ -1 +1 @@
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 { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Field, FieldAffectingData, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { deepCopyObject } from './deepCopyObject.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: Field) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) return false\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) return true\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.fields.some((subField) => fieldIsRequired(subField))\n }\n\n // if any tab subfields have required fields, this field is required\n if (field.type === 'tabs') {\n return field.tabs.some((tab) => {\n if ('name' in tab) {\n return tab.fields.some((subField) => fieldIsRequired(subField))\n }\n return false\n })\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 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 * 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) return fieldType\n fieldTypes.push('null')\n return fieldTypes\n}\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: Field[],\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): {\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) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n if (isRequired) requiredFieldNames.add(field.name)\n\n let fieldSchema: JSONSchema4\n switch (field.type) {\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n }\n break\n case 'textarea':\n case 'code':\n case 'email':\n case 'date': {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) }\n }\n break\n }\n\n case 'checkbox': {\n fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) }\n break\n }\n\n case 'json': {\n fieldSchema = {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\n if (field.editor.outputSchema) {\n fieldSchema = field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n interfaceNameDefinitions,\n isRequired,\n })\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'radio': {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n enum: optionEnums,\n },\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: optionEnums,\n }\n }\n\n break\n }\n\n case 'point': {\n fieldSchema = {\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 'relationship': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\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 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 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 oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo],\n isRequired,\n ),\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n }\n\n break\n }\n\n case 'upload': {\n fieldSchema = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n if (!isRequired) fieldSchema.oneOf.push({ type: 'null' })\n break\n }\n\n case 'blocks': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.blocks.map((block) => {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.fields,\n interfaceNameDefinitions,\n config,\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 break\n }\n\n case 'array': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\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\n case 'row':\n case 'collapsible': {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n )\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n tab.fields,\n interfaceNameDefinitions,\n config,\n )\n if (tabHasName(tab)) {\n // could have interface\n fieldSchemas.set(tab.name, {\n type: 'object',\n additionalProperties: false,\n ...childSchema,\n })\n requiredFieldNames.add(tab.name)\n } else {\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n }\n })\n break\n }\n\n case 'group': {\n fieldSchema = {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\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 default: {\n break\n }\n }\n\n if (fieldSchema && fieldAffectsData(field)) {\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 incomingEntity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n): JSONSchema4 {\n const entity: SanitizedCollectionConfig | SanitizedGlobalConfig = deepCopyObject(incomingEntity)\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = entity.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n ) as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n customIdField.required = true\n } else {\n entity.fields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n entity.fields = entity.fields.map((field) => {\n if (fieldAffectsData(field) && (field.name === 'createdAt' || field.name === 'updatedAt')) {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if ('auth' in entity && entity.auth && !entity.auth?.disableLocalStrategy) {\n entity.fields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n\n return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\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): 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 // 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 const entityDefinitions: { [k: string]: JSONSchema4 } = [\n ...config.globals,\n ...config.collections,\n ].reduce((acc, entity) => {\n acc[entity.slug] = entityToJSONSchema(config, entity, interfaceNameDefinitions, defaultIDType)\n return acc\n }, {})\n\n return {\n additionalProperties: false,\n definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },\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 collections: generateEntitySchemas(config.collections || []),\n globals: generateEntitySchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: ['user', 'locale', 'collections', 'globals'],\n title: 'Config',\n }\n}\n"],"names":["pluralize","singular","fieldAffectsData","tabHasName","deepCopyObject","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","fields","some","subField","tabs","tab","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","config","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","editor","outputSchema","optionEnums","maxItems","minItems","Array","isArray","relationTo","relation","const","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","Map","from","entityToJSONSchema","incomingEntity","defaultIDType","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","configToJSONSchema","entityDefinitions","globals","collections","definitions","user"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","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 { SanitizedCollectionConfig } from '../collections/config/types.js'\nimport type { SanitizedConfig } from '../config/types.js'\nimport type { Field, FieldAffectingData, Option } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../fields/config/types.js'\nimport { deepCopyObject } from './deepCopyObject.js'\nimport { toWords } from './formatLabels.js'\nimport { getCollectionIDFieldTypes } from './getCollectionIDFieldTypes.js'\n\nconst fieldIsRequired = (field: Field) => {\n const isConditional = Boolean(field?.admin && field?.admin?.condition)\n if (isConditional) return false\n\n const isMarkedRequired = 'required' in field && field.required === true\n if (fieldAffectsData(field) && isMarkedRequired) return true\n\n // if any subfields are required, this field is required\n if ('fields' in field && field.type !== 'array') {\n return field.fields.some((subField) => fieldIsRequired(subField))\n }\n\n // if any tab subfields have required fields, this field is required\n if (field.type === 'tabs') {\n return field.tabs.some((tab) => {\n if ('name' in tab) {\n return tab.fields.some((subField) => fieldIsRequired(subField))\n }\n return false\n })\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 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 * 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) return fieldType\n fieldTypes.push('null')\n return fieldTypes\n}\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: Field[],\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): {\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) => {\n const isRequired = fieldAffectsData(field) && fieldIsRequired(field)\n if (isRequired) requiredFieldNames.add(field.name)\n\n let fieldSchema: JSONSchema4\n switch (field.type) {\n case 'text':\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'string' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n }\n break\n case 'textarea':\n case 'code':\n case 'email':\n case 'date': {\n fieldSchema = { type: withNullableJSONSchemaType('string', isRequired) }\n break\n }\n\n case 'number': {\n if (field.hasMany === true) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: { type: 'number' },\n }\n } else {\n fieldSchema = { type: withNullableJSONSchemaType('number', isRequired) }\n }\n break\n }\n\n case 'checkbox': {\n fieldSchema = { type: withNullableJSONSchemaType('boolean', isRequired) }\n break\n }\n\n case 'json': {\n fieldSchema = {\n type: ['object', 'array', 'string', 'number', 'boolean', 'null'],\n }\n break\n }\n\n case 'richText': {\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 = field.editor.outputSchema({\n collectionIDFieldTypes,\n config,\n field,\n interfaceNameDefinitions,\n isRequired,\n })\n } else {\n // Maintain backwards compatibility with existing rich text editors\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n },\n }\n }\n\n break\n }\n\n case 'radio': {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: buildOptionEnums(field.options),\n }\n\n break\n }\n\n case 'select': {\n const optionEnums = buildOptionEnums(field.options)\n\n if (field.hasMany) {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'string',\n enum: optionEnums,\n },\n }\n } else {\n fieldSchema = {\n type: withNullableJSONSchemaType('string', isRequired),\n enum: optionEnums,\n }\n }\n\n break\n }\n\n case 'point': {\n fieldSchema = {\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 'relationship': {\n if (Array.isArray(field.relationTo)) {\n if (field.hasMany) {\n fieldSchema = {\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 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 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 oneOf: [\n {\n type: withNullableJSONSchemaType(\n collectionIDFieldTypes[field.relationTo],\n isRequired,\n ),\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n }\n\n break\n }\n\n case 'upload': {\n fieldSchema = {\n oneOf: [\n {\n type: collectionIDFieldTypes[field.relationTo],\n },\n {\n $ref: `#/definitions/${field.relationTo}`,\n },\n ],\n }\n if (!isRequired) fieldSchema.oneOf.push({ type: 'null' })\n break\n }\n\n case 'blocks': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n oneOf: field.blocks.map((block) => {\n const blockFieldSchemas = fieldsToJSONSchema(\n collectionIDFieldTypes,\n block.fields,\n interfaceNameDefinitions,\n config,\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 break\n }\n\n case 'array': {\n fieldSchema = {\n type: withNullableJSONSchemaType('array', isRequired),\n items: {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\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\n case 'row':\n case 'collapsible': {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\n )\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n break\n }\n\n case 'tabs': {\n field.tabs.forEach((tab) => {\n const childSchema = fieldsToJSONSchema(\n collectionIDFieldTypes,\n tab.fields,\n interfaceNameDefinitions,\n config,\n )\n if (tabHasName(tab)) {\n // could have interface\n fieldSchemas.set(tab.name, {\n type: 'object',\n additionalProperties: false,\n ...childSchema,\n })\n requiredFieldNames.add(tab.name)\n } else {\n Object.entries(childSchema.properties).forEach(([propName, propSchema]) => {\n fieldSchemas.set(propName, propSchema)\n })\n childSchema.required.forEach((propName) => {\n requiredFieldNames.add(propName)\n })\n }\n })\n break\n }\n\n case 'group': {\n fieldSchema = {\n type: 'object',\n additionalProperties: false,\n ...fieldsToJSONSchema(\n collectionIDFieldTypes,\n field.fields,\n interfaceNameDefinitions,\n config,\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 default: {\n break\n }\n }\n\n if (fieldSchema && fieldAffectsData(field)) {\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 incomingEntity: SanitizedCollectionConfig | SanitizedGlobalConfig,\n interfaceNameDefinitions: Map<string, JSONSchema4>,\n defaultIDType: 'number' | 'text',\n): JSONSchema4 {\n const entity: SanitizedCollectionConfig | SanitizedGlobalConfig = deepCopyObject(incomingEntity)\n const title = entity.typescript?.interface\n ? entity.typescript.interface\n : singular(toWords(entity.slug, true))\n\n const idField: FieldAffectingData = { name: 'id', type: defaultIDType as 'text', required: true }\n const customIdField = entity.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n ) as FieldAffectingData\n\n if (customIdField && customIdField.type !== 'group' && customIdField.type !== 'tab') {\n customIdField.required = true\n } else {\n entity.fields.unshift(idField)\n }\n\n // mark timestamp fields required\n if ('timestamps' in entity && entity.timestamps !== false) {\n entity.fields = entity.fields.map((field) => {\n if (fieldAffectsData(field) && (field.name === 'createdAt' || field.name === 'updatedAt')) {\n return {\n ...field,\n required: true,\n }\n }\n return field\n })\n }\n\n if ('auth' in entity && entity.auth && !entity.auth?.disableLocalStrategy) {\n entity.fields.push({\n name: 'password',\n type: 'text',\n })\n }\n\n // Used for relationship fields, to determine whether to use a string or number type for the ID.\n const collectionIDFieldTypes = getCollectionIDFieldTypes({ config, defaultIDType })\n\n return {\n type: 'object',\n additionalProperties: false,\n title,\n ...fieldsToJSONSchema(collectionIDFieldTypes, entity.fields, interfaceNameDefinitions, config),\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): 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 // 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 const entityDefinitions: { [k: string]: JSONSchema4 } = [\n ...config.globals,\n ...config.collections,\n ].reduce((acc, entity) => {\n acc[entity.slug] = entityToJSONSchema(config, entity, interfaceNameDefinitions, defaultIDType)\n return acc\n }, {})\n\n return {\n additionalProperties: false,\n definitions: { ...entityDefinitions, ...Object.fromEntries(interfaceNameDefinitions) },\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 collections: generateEntitySchemas(config.collections || []),\n globals: generateEntitySchemas(config.globals || []),\n locale: generateLocaleEntitySchemas(config.localization),\n user: generateAuthEntitySchemas(config.collections),\n },\n required: ['user', 'locale', 'collections', 'globals'],\n title: 'Config',\n }\n}\n"],"names":["pluralize","singular","fieldAffectsData","tabHasName","deepCopyObject","toWords","getCollectionIDFieldTypes","fieldIsRequired","field","isConditional","Boolean","admin","condition","isMarkedRequired","required","type","fields","some","subField","tabs","tab","buildOptionEnums","options","map","option","value","generateEntitySchemas","entities","properties","reduce","acc","slug","$ref","additionalProperties","Object","keys","generateLocaleEntitySchemas","localization","locales","localesFromConfig","locale","code","enum","generateAuthEntitySchemas","filter","auth","allOf","collection","oneOf","withNullableJSONSchemaType","fieldType","isRequired","fieldTypes","push","fieldsToJSONSchema","collectionIDFieldTypes","interfaceNameDefinitions","config","requiredFieldNames","Set","fromEntries","fieldSchemas","add","name","fieldSchema","hasMany","items","editor","Error","outputSchema","optionEnums","maxItems","minItems","Array","isArray","relationTo","relation","const","blocks","block","blockFieldSchemas","blockSchema","blockType","interfaceName","set","childSchema","entries","forEach","propName","propSchema","Map","from","entityToJSONSchema","incomingEntity","defaultIDType","entity","title","typescript","interface","idField","customIdField","find","unshift","timestamps","disableLocalStrategy","configToJSONSchema","entityDefinitions","globals","collections","definitions","user"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { sanitizeConfig } from '../config/sanitize.js';
2
2
  import { configToJSONSchema } from './configToJSONSchema.js';
3
3
  describe('configToJSONSchema', ()=>{
4
- it('should handle optional arrays with required fields', ()=>{
4
+ it('should handle optional arrays with required fields', async ()=>{
5
5
  const config = {
6
6
  collections: [
7
7
  {
@@ -23,7 +23,7 @@ describe('configToJSONSchema', ()=>{
23
23
  }
24
24
  ]
25
25
  };
26
- const sanitizedConfig = sanitizeConfig(config);
26
+ const sanitizedConfig = await sanitizeConfig(config);
27
27
  const schema = configToJSONSchema(sanitizedConfig, 'text');
28
28
  expect(schema?.definitions?.test).toStrictEqual({
29
29
  additionalProperties: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\nimport { sanitizeConfig } from '../config/sanitize.js'\nimport { configToJSONSchema } from './configToJSONSchema.js'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', () => {\n const config: Config = {\n collections: [\n {\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n required: true,\n type: 'text',\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n items: {\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n type: 'object',\n },\n type: ['array', 'null'],\n },\n },\n required: ['id'],\n title: 'Test',\n type: 'object',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","fields","name","type","required","slug","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,cAAc,QAAQ,wBAAuB;AACtD,SAASC,kBAAkB,QAAQ,0BAAyB;AAE5DC,SAAS,sBAAsB;IAC7BC,GAAG,sDAAsD;QACvD,MAAMC,SAAiB;YACrBC,aAAa;gBACX;oBACEC,QAAQ;wBACN;4BACEC,MAAM;4BACNC,MAAM;4BACNF,QAAQ;gCACN;oCACEC,MAAM;oCACNE,UAAU;oCACVD,MAAM;gCACR;6BACD;wBACH;qBACD;oBACDE,MAAM;oBACNC,YAAY;gBACd;aACD;QACH;QAEA,MAAMC,kBAAkBZ,eAAeI;QACvC,MAAMS,SAASZ,mBAAmBW,iBAAiB;QAEnDE,OAAOD,QAAQE,aAAaC,MAAMC,aAAa,CAAC;YAC9CC,sBAAsB;YACtBC,YAAY;gBACVC,IAAI;oBACFZ,MAAM;gBACR;gBACAa,mBAAmB;oBACjBC,OAAO;wBACLJ,sBAAsB;wBACtBC,YAAY;4BACVC,IAAI;gCACFZ,MAAM;oCAAC;oCAAU;iCAAO;4BAC1B;4BACAa,mBAAmB;gCACjBb,MAAM;4BACR;wBACF;wBACAC,UAAU;4BAAC;yBAAoB;wBAC/BD,MAAM;oBACR;oBACAA,MAAM;wBAAC;wBAAS;qBAAO;gBACzB;YACF;YACAC,UAAU;gBAAC;aAAK;YAChBc,OAAO;YACPf,MAAM;QACR;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { Config } from '../config/types.js'\n\nimport { sanitizeConfig } from '../config/sanitize.js'\nimport { configToJSONSchema } from './configToJSONSchema.js'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', async () => {\n const config: Config = {\n collections: [\n {\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n required: true,\n type: 'text',\n },\n ],\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n items: {\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n type: 'object',\n },\n type: ['array', 'null'],\n },\n },\n required: ['id'],\n title: 'Test',\n type: 'object',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","fields","name","type","required","slug","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA,SAASA,cAAc,QAAQ,wBAAuB;AACtD,SAASC,kBAAkB,QAAQ,0BAAyB;AAE5DC,SAAS,sBAAsB;IAC7BC,GAAG,sDAAsD;QACvD,MAAMC,SAAiB;YACrBC,aAAa;gBACX;oBACEC,QAAQ;wBACN;4BACEC,MAAM;4BACNC,MAAM;4BACNF,QAAQ;gCACN;oCACEC,MAAM;oCACNE,UAAU;oCACVD,MAAM;gCACR;6BACD;wBACH;qBACD;oBACDE,MAAM;oBACNC,YAAY;gBACd;aACD;QACH;QAEA,MAAMC,kBAAkB,MAAMZ,eAAeI;QAC7C,MAAMS,SAASZ,mBAAmBW,iBAAiB;QAEnDE,OAAOD,QAAQE,aAAaC,MAAMC,aAAa,CAAC;YAC9CC,sBAAsB;YACtBC,YAAY;gBACVC,IAAI;oBACFZ,MAAM;gBACR;gBACAa,mBAAmB;oBACjBC,OAAO;wBACLJ,sBAAsB;wBACtBC,YAAY;4BACVC,IAAI;gCACFZ,MAAM;oCAAC;oCAAU;iCAAO;4BAC1B;4BACAa,mBAAmB;gCACjBb,MAAM;4BACR;wBACF;wBACAC,UAAU;4BAAC;yBAAoB;wBAC/BD,MAAM;oBACR;oBACAA,MAAM;wBAAC;wBAAS;qBAAO;gBACzB;YACF;YACAC,UAAU;gBAAC;aAAK;YAChBc,OAAO;YACPf,MAAM;QACR;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"createLocalReq.d.ts","sourceRoot":"","sources":["../../src/utilities/createLocalReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAsD/D,KAAK,cAAc,GAAG,CACpB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,sBAAsB,CAAA;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,EACD,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,sBAAsB,CAAC,CAAA;AACpC,eAAO,MAAM,cAAc,EAAE,cAiC5B,CAAA"}
1
+ {"version":3,"file":"createLocalReq.d.ts","sourceRoot":"","sources":["../../src/utilities/createLocalReq.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAA;AAsD/D,KAAK,cAAc,GAAG,CACpB,OAAO,EAAE;IACP,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,sBAAsB,CAAA;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,EACD,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,sBAAsB,CAAC,CAAA;AACpC,eAAO,MAAM,cAAc,EAAE,cAmC5B,CAAA"}
@@ -22,7 +22,7 @@ const attachFakeURLProperties = (req)=>{
22
22
  * *NOTE*
23
23
  * If no URL is provided, the local API was called directly outside
24
24
  * the context of a request. Therefore we create a fake URL object.
25
- * `ts-ignore` is used below for properties that are 'read-only'
25
+ * `ts-expect-error` is used below for properties that are 'read-only'
26
26
  * since they do not exist yet we can safely ignore the error.
27
27
  */ let urlObject;
28
28
  function getURLObject() {
@@ -43,7 +43,7 @@ const attachFakeURLProperties = (req)=>{
43
43
  // @ts-expect-error
44
44
  if (!req.origin) req.origin = getURLObject().origin;
45
45
  // @ts-expect-error
46
- if (!req?.url) req.url = getURLObject().url;
46
+ if (!req?.url) req.url = getURLObject().href;
47
47
  };
48
48
  export const createLocalReq = async ({ context, fallbackLocale, locale: localeArg, req = {}, user }, payload)=>{
49
49
  const i18n = req?.i18n || await getLocalI18n({
@@ -60,6 +60,8 @@ export const createLocalReq = async ({ context, fallbackLocale, locale: localeAr
60
60
  req.fallbackLocale = fallbackLocaleFromConfig || defaultLocale;
61
61
  }
62
62
  }
63
+ // @ts-expect-error
64
+ if (!req.headers) req.headers = new Headers();
63
65
  req.context = getRequestContext(req, context);
64
66
  req.payloadAPI = req?.payloadAPI || 'local';
65
67
  req.payload = payload;