payload 3.0.0-beta.18 → 3.0.0-beta.19

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 (120) hide show
  1. package/dist/collections/config/sanitize.js +1 -1
  2. package/dist/collections/config/sanitize.js.map +1 -1
  3. package/dist/database/queryValidation/validateQueryPaths.js +1 -1
  4. package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
  5. package/dist/errors/APIError.d.ts +2 -2
  6. package/dist/errors/APIError.d.ts.map +1 -1
  7. package/dist/errors/APIError.js +1 -2
  8. package/dist/errors/APIError.js.map +1 -1
  9. package/dist/errors/AuthenticationError.d.ts +2 -3
  10. package/dist/errors/AuthenticationError.d.ts.map +1 -1
  11. package/dist/errors/AuthenticationError.js +2 -3
  12. package/dist/errors/AuthenticationError.js.map +1 -1
  13. package/dist/errors/DuplicateCollection.d.ts +2 -3
  14. package/dist/errors/DuplicateCollection.d.ts.map +1 -1
  15. package/dist/errors/DuplicateCollection.js +2 -3
  16. package/dist/errors/DuplicateCollection.js.map +1 -1
  17. package/dist/errors/DuplicateFieldName.d.ts +2 -3
  18. package/dist/errors/DuplicateFieldName.d.ts.map +1 -1
  19. package/dist/errors/DuplicateFieldName.js +2 -3
  20. package/dist/errors/DuplicateFieldName.js.map +1 -1
  21. package/dist/errors/DuplicateGlobal.d.ts +2 -3
  22. package/dist/errors/DuplicateGlobal.d.ts.map +1 -1
  23. package/dist/errors/DuplicateGlobal.js +2 -3
  24. package/dist/errors/DuplicateGlobal.js.map +1 -1
  25. package/dist/errors/ErrorDeletingFile.d.ts +2 -3
  26. package/dist/errors/ErrorDeletingFile.d.ts.map +1 -1
  27. package/dist/errors/ErrorDeletingFile.js +2 -3
  28. package/dist/errors/ErrorDeletingFile.js.map +1 -1
  29. package/dist/errors/FileRetrievalError.d.ts +6 -0
  30. package/dist/errors/FileRetrievalError.d.ts.map +1 -0
  31. package/dist/errors/FileRetrievalError.js +13 -0
  32. package/dist/errors/FileRetrievalError.js.map +1 -0
  33. package/dist/errors/FileUploadError.d.ts +2 -3
  34. package/dist/errors/FileUploadError.d.ts.map +1 -1
  35. package/dist/errors/FileUploadError.js +2 -3
  36. package/dist/errors/FileUploadError.js.map +1 -1
  37. package/dist/errors/Forbidden.d.ts +2 -3
  38. package/dist/errors/Forbidden.d.ts.map +1 -1
  39. package/dist/errors/Forbidden.js +2 -3
  40. package/dist/errors/Forbidden.js.map +1 -1
  41. package/dist/errors/InvalidConfiguration.d.ts +2 -3
  42. package/dist/errors/InvalidConfiguration.d.ts.map +1 -1
  43. package/dist/errors/InvalidConfiguration.js +2 -3
  44. package/dist/errors/InvalidConfiguration.js.map +1 -1
  45. package/dist/errors/InvalidFieldName.d.ts +2 -3
  46. package/dist/errors/InvalidFieldName.d.ts.map +1 -1
  47. package/dist/errors/InvalidFieldName.js +2 -3
  48. package/dist/errors/InvalidFieldName.js.map +1 -1
  49. package/dist/errors/InvalidFieldRelationship.d.ts +2 -3
  50. package/dist/errors/InvalidFieldRelationship.d.ts.map +1 -1
  51. package/dist/errors/InvalidFieldRelationship.js +2 -3
  52. package/dist/errors/InvalidFieldRelationship.js.map +1 -1
  53. package/dist/errors/InvalidSchema.d.ts +2 -3
  54. package/dist/errors/InvalidSchema.d.ts.map +1 -1
  55. package/dist/errors/InvalidSchema.js +2 -3
  56. package/dist/errors/InvalidSchema.js.map +1 -1
  57. package/dist/errors/LockedAuth.d.ts +2 -3
  58. package/dist/errors/LockedAuth.d.ts.map +1 -1
  59. package/dist/errors/LockedAuth.js +2 -3
  60. package/dist/errors/LockedAuth.js.map +1 -1
  61. package/dist/errors/MissingCollectionLabel.d.ts +2 -3
  62. package/dist/errors/MissingCollectionLabel.d.ts.map +1 -1
  63. package/dist/errors/MissingCollectionLabel.js +2 -3
  64. package/dist/errors/MissingCollectionLabel.js.map +1 -1
  65. package/dist/errors/MissingEditorProp.d.ts +2 -3
  66. package/dist/errors/MissingEditorProp.d.ts.map +1 -1
  67. package/dist/errors/MissingEditorProp.js +2 -3
  68. package/dist/errors/MissingEditorProp.js.map +1 -1
  69. package/dist/errors/MissingFieldInputOptions.d.ts +2 -3
  70. package/dist/errors/MissingFieldInputOptions.d.ts.map +1 -1
  71. package/dist/errors/MissingFieldInputOptions.js +2 -3
  72. package/dist/errors/MissingFieldInputOptions.js.map +1 -1
  73. package/dist/errors/MissingFieldType.d.ts +2 -3
  74. package/dist/errors/MissingFieldType.d.ts.map +1 -1
  75. package/dist/errors/MissingFieldType.js +2 -3
  76. package/dist/errors/MissingFieldType.js.map +1 -1
  77. package/dist/errors/MissingFile.d.ts +2 -3
  78. package/dist/errors/MissingFile.d.ts.map +1 -1
  79. package/dist/errors/MissingFile.js +2 -3
  80. package/dist/errors/MissingFile.js.map +1 -1
  81. package/dist/errors/NotFound.d.ts +2 -3
  82. package/dist/errors/NotFound.d.ts.map +1 -1
  83. package/dist/errors/NotFound.js +2 -3
  84. package/dist/errors/NotFound.js.map +1 -1
  85. package/dist/errors/QueryError.d.ts +2 -3
  86. package/dist/errors/QueryError.d.ts.map +1 -1
  87. package/dist/errors/QueryError.js +2 -3
  88. package/dist/errors/QueryError.js.map +1 -1
  89. package/dist/errors/TimestampsRequired.d.ts +2 -3
  90. package/dist/errors/TimestampsRequired.d.ts.map +1 -1
  91. package/dist/errors/TimestampsRequired.js +2 -3
  92. package/dist/errors/TimestampsRequired.js.map +1 -1
  93. package/dist/errors/UnathorizedError.d.ts +2 -3
  94. package/dist/errors/UnathorizedError.d.ts.map +1 -1
  95. package/dist/errors/UnathorizedError.js +2 -3
  96. package/dist/errors/UnathorizedError.js.map +1 -1
  97. package/dist/errors/ValidationError.d.ts +2 -3
  98. package/dist/errors/ValidationError.d.ts.map +1 -1
  99. package/dist/errors/ValidationError.js +2 -3
  100. package/dist/errors/ValidationError.js.map +1 -1
  101. package/dist/errors/index.d.ts +20 -19
  102. package/dist/errors/index.d.ts.map +1 -1
  103. package/dist/errors/index.js +20 -19
  104. package/dist/errors/index.js.map +1 -1
  105. package/dist/fields/config/sanitize.js +1 -1
  106. package/dist/fields/config/sanitize.js.map +1 -1
  107. package/dist/preferences/operations/delete.js +2 -2
  108. package/dist/preferences/operations/delete.js.map +1 -1
  109. package/dist/preferences/operations/update.js +1 -1
  110. package/dist/preferences/operations/update.js.map +1 -1
  111. package/dist/uploads/generateFileData.js +2 -2
  112. package/dist/uploads/generateFileData.js.map +1 -1
  113. package/dist/uploads/getExternalFile.d.ts.map +1 -1
  114. package/dist/uploads/getExternalFile.js +5 -2
  115. package/dist/uploads/getExternalFile.js.map +1 -1
  116. package/dist/utilities/checkDuplicateCollections.js +1 -1
  117. package/dist/utilities/checkDuplicateCollections.js.map +1 -1
  118. package/dist/utilities/parseCookies.js +1 -1
  119. package/dist/utilities/parseCookies.js.map +1 -1
  120. package/package.json +66 -69
@@ -1,4 +1,4 @@
1
- import MissingEditorProp from '../../errors/MissingEditorProp.js';
1
+ import { MissingEditorProp } from '../../errors/MissingEditorProp.js';
2
2
  import { DuplicateFieldName, InvalidFieldName, InvalidFieldRelationship, MissingFieldType } from '../../errors/index.js';
3
3
  import { formatLabels, toWords } from '../../utilities/formatLabels.js';
4
4
  import { baseBlockFields } from '../baseFields/baseBlockFields.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport MissingEditorProp from '../../errors/MissingEditorProp.js'\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = ({\n config,\n existingFieldNames = new Set(),\n fields,\n requireFieldLevelRichTextEditor = false,\n validRelationships,\n}: Args): Field[] => {\n if (!fields) return []\n\n return fields.map((unsanitizedField) => {\n const field: Field = { ...unsanitizedField }\n\n if (!field.type) throw new MissingFieldType(field)\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.type === 'relationship') {\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n field.blocks = field.blocks.map((block) => ({\n ...block,\n fields: block.fields.concat(baseBlockFields),\n }))\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (field.localized && !config.localization) delete field.localized\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = () => true\n }\n }\n\n if (!field.hooks) field.hooks = {}\n if (!field.access) field.access = {}\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n if (!field.editor) {\n if (config.editor && !requireFieldLevelRichTextEditor) {\n field.editor = config.editor\n } else {\n throw new MissingEditorProp(field)\n }\n }\n\n // Add editor adapter hooks to field hooks\n if (!field.hooks) field.hooks = {}\n\n if (field?.editor?.hooks?.afterRead?.length) {\n field.hooks.afterRead = field.hooks.afterRead\n ? field.hooks.afterRead.concat(field.editor.hooks.afterRead)\n : field.editor.hooks.afterRead\n }\n if (field?.editor?.hooks?.beforeChange?.length) {\n field.hooks.beforeChange = field.hooks.beforeChange\n ? field.hooks.beforeChange.concat(field.editor.hooks.beforeChange)\n : field.editor.hooks.beforeChange\n }\n if (field?.editor?.hooks?.beforeValidate?.length) {\n field.hooks.beforeValidate = field.hooks.beforeValidate\n ? field.hooks.beforeValidate.concat(field.editor.hooks.beforeValidate)\n : field.editor.hooks.beforeValidate\n }\n if (field?.editor?.hooks?.beforeChange?.length) {\n field.hooks.beforeChange = field.hooks.beforeChange\n ? field.hooks.beforeChange.concat(field.editor.hooks.beforeChange)\n : field.editor.hooks.beforeChange\n }\n }\n\n // TODO: Handle sanitization for any lexical sub-fields here as well\n if ('fields' in field && field.fields) {\n field.fields = sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs = field.tabs.map((tab) => {\n const unsanitizedTab = { ...tab }\n if (tabHasName(tab) && typeof tab.label === 'undefined') {\n unsanitizedTab.label = toWords(tab.name)\n }\n\n unsanitizedTab.fields = sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n\n return unsanitizedTab\n })\n }\n\n if ('blocks' in field && field.blocks) {\n field.blocks = field.blocks.map((block) => {\n const unsanitizedBlock = { ...block }\n unsanitizedBlock.labels = !unsanitizedBlock.labels\n ? formatLabels(unsanitizedBlock.slug)\n : unsanitizedBlock.labels\n\n unsanitizedBlock.fields = sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n\n return unsanitizedBlock\n })\n }\n\n return field\n })\n}\n"],"names":["MissingEditorProp","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","fieldAffectsData","tabHasName","sanitizeFields","config","existingFieldNames","Set","fields","requireFieldLevelRichTextEditor","validRelationships","map","unsanitizedField","field","type","name","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","blocks","block","concat","push","labels","has","add","localized","localization","validate","defaultValidate","val","options","hooks","access","admin","editor","afterRead","length","beforeChange","beforeValidate","tabs","tab","unsanitizedTab","unsanitizedBlock","slug"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/fields/config/sanitize.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type { Field } from './types.js'\n\nimport { MissingEditorProp } from '../../errors/MissingEditorProp.js'\nimport {\n DuplicateFieldName,\n InvalidFieldName,\n InvalidFieldRelationship,\n MissingFieldType,\n} from '../../errors/index.js'\nimport { formatLabels, toWords } from '../../utilities/formatLabels.js'\nimport { baseBlockFields } from '../baseFields/baseBlockFields.js'\nimport { baseIDField } from '../baseFields/baseIDField.js'\nimport { setDefaultBeforeDuplicate } from '../setDefaultBeforeDuplicate.js'\nimport validations from '../validations.js'\nimport { fieldAffectsData, tabHasName } from './types.js'\n\ntype Args = {\n config: Config\n existingFieldNames?: Set<string>\n fields: Field[]\n /**\n * If true, a richText field will require an editor property to be set, as the sanitizeFields function will not add it from the payload config if not present.\n *\n * @default false\n */\n requireFieldLevelRichTextEditor?: boolean\n /**\n * If not null, will validate that upload and relationship fields do not relate to a collection that is not in this array.\n * This validation will be skipped if validRelationships is null.\n */\n validRelationships: null | string[]\n}\n\nexport const sanitizeFields = ({\n config,\n existingFieldNames = new Set(),\n fields,\n requireFieldLevelRichTextEditor = false,\n validRelationships,\n}: Args): Field[] => {\n if (!fields) return []\n\n return fields.map((unsanitizedField) => {\n const field: Field = { ...unsanitizedField }\n\n if (!field.type) throw new MissingFieldType(field)\n\n // assert that field names do not contain forbidden characters\n if (fieldAffectsData(field) && field.name.includes('.')) {\n throw new InvalidFieldName(field, field.name)\n }\n\n // Auto-label\n if (\n 'name' in field &&\n field.name &&\n typeof field.label !== 'object' &&\n typeof field.label !== 'string' &&\n field.label !== false\n ) {\n field.label = toWords(field.name)\n }\n\n if (\n field.type === 'checkbox' &&\n typeof field.defaultValue === 'undefined' &&\n field.required === true\n ) {\n field.defaultValue = false\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (validRelationships) {\n const relationships = Array.isArray(field.relationTo)\n ? field.relationTo\n : [field.relationTo]\n relationships.forEach((relationship: string) => {\n if (!validRelationships.includes(relationship)) {\n throw new InvalidFieldRelationship(field, relationship)\n }\n })\n }\n\n if (field.type === 'relationship') {\n if (field.min && !field.minRows) {\n console.warn(\n `(payload): The \"min\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"minRows\" instead.`,\n )\n }\n if (field.max && !field.maxRows) {\n console.warn(\n `(payload): The \"max\" property is deprecated for the Relationship field \"${field.name}\" and will be removed in a future version. Please use \"maxRows\" instead.`,\n )\n }\n field.minRows = field.minRows || field.min\n field.maxRows = field.maxRows || field.max\n }\n }\n\n if (field.type === 'blocks' && field.blocks) {\n field.blocks = field.blocks.map((block) => ({\n ...block,\n fields: block.fields.concat(baseBlockFields),\n }))\n }\n\n if (field.type === 'array' && field.fields) {\n field.fields.push(baseIDField)\n }\n\n if ((field.type === 'blocks' || field.type === 'array') && field.label) {\n field.labels = field.labels || formatLabels(field.name)\n }\n\n if (fieldAffectsData(field)) {\n if (existingFieldNames.has(field.name)) {\n throw new DuplicateFieldName(field.name)\n } else if (!['blockName', 'id'].includes(field.name)) {\n existingFieldNames.add(field.name)\n }\n\n if (field.localized && !config.localization) delete field.localized\n\n if (typeof field.validate === 'undefined') {\n const defaultValidate = validations[field.type]\n if (defaultValidate) {\n field.validate = (val, options) => defaultValidate(val, { ...field, ...options })\n } else {\n field.validate = () => true\n }\n }\n\n if (!field.hooks) field.hooks = {}\n if (!field.access) field.access = {}\n\n setDefaultBeforeDuplicate(field)\n }\n\n if (!field.admin) {\n field.admin = {}\n }\n\n // Make sure that the richText field has an editor\n if (field.type === 'richText') {\n if (!field.editor) {\n if (config.editor && !requireFieldLevelRichTextEditor) {\n field.editor = config.editor\n } else {\n throw new MissingEditorProp(field)\n }\n }\n\n // Add editor adapter hooks to field hooks\n if (!field.hooks) field.hooks = {}\n\n if (field?.editor?.hooks?.afterRead?.length) {\n field.hooks.afterRead = field.hooks.afterRead\n ? field.hooks.afterRead.concat(field.editor.hooks.afterRead)\n : field.editor.hooks.afterRead\n }\n if (field?.editor?.hooks?.beforeChange?.length) {\n field.hooks.beforeChange = field.hooks.beforeChange\n ? field.hooks.beforeChange.concat(field.editor.hooks.beforeChange)\n : field.editor.hooks.beforeChange\n }\n if (field?.editor?.hooks?.beforeValidate?.length) {\n field.hooks.beforeValidate = field.hooks.beforeValidate\n ? field.hooks.beforeValidate.concat(field.editor.hooks.beforeValidate)\n : field.editor.hooks.beforeValidate\n }\n if (field?.editor?.hooks?.beforeChange?.length) {\n field.hooks.beforeChange = field.hooks.beforeChange\n ? field.hooks.beforeChange.concat(field.editor.hooks.beforeChange)\n : field.editor.hooks.beforeChange\n }\n }\n\n // TODO: Handle sanitization for any lexical sub-fields here as well\n if ('fields' in field && field.fields) {\n field.fields = sanitizeFields({\n config,\n existingFieldNames: fieldAffectsData(field) ? new Set() : existingFieldNames,\n fields: field.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n }\n\n if (field.type === 'tabs') {\n field.tabs = field.tabs.map((tab) => {\n const unsanitizedTab = { ...tab }\n if (tabHasName(tab) && typeof tab.label === 'undefined') {\n unsanitizedTab.label = toWords(tab.name)\n }\n\n unsanitizedTab.fields = sanitizeFields({\n config,\n existingFieldNames: tabHasName(tab) ? new Set() : existingFieldNames,\n fields: tab.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n\n return unsanitizedTab\n })\n }\n\n if ('blocks' in field && field.blocks) {\n field.blocks = field.blocks.map((block) => {\n const unsanitizedBlock = { ...block }\n unsanitizedBlock.labels = !unsanitizedBlock.labels\n ? formatLabels(unsanitizedBlock.slug)\n : unsanitizedBlock.labels\n\n unsanitizedBlock.fields = sanitizeFields({\n config,\n existingFieldNames: new Set(),\n fields: block.fields,\n requireFieldLevelRichTextEditor,\n validRelationships,\n })\n\n return unsanitizedBlock\n })\n }\n\n return field\n })\n}\n"],"names":["MissingEditorProp","DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","formatLabels","toWords","baseBlockFields","baseIDField","setDefaultBeforeDuplicate","validations","fieldAffectsData","tabHasName","sanitizeFields","config","existingFieldNames","Set","fields","requireFieldLevelRichTextEditor","validRelationships","map","unsanitizedField","field","type","name","includes","label","defaultValue","required","relationships","Array","isArray","relationTo","forEach","relationship","min","minRows","console","warn","max","maxRows","blocks","block","concat","push","labels","has","add","localized","localization","validate","defaultValidate","val","options","hooks","access","admin","editor","afterRead","length","beforeChange","beforeValidate","tabs","tab","unsanitizedTab","unsanitizedBlock","slug"],"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"}
@@ -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,4 +1,4 @@
1
- import APIError from '../errors/APIError.js';
1
+ import { APIError } from '../errors/APIError.js';
2
2
  export const parseCookies = (headers)=>{
3
3
  const list = new Map();
4
4
  const rc = headers.get('Cookie');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/parseCookies.ts"],"sourcesContent":["import APIError from '../errors/APIError.js'\n\nexport const parseCookies = (headers: Request['headers']): Map<string, string> => {\n const list = new Map<string, string>()\n const rc = headers.get('Cookie')\n\n if (rc) {\n rc.split(';').forEach((cookie) => {\n const parts = cookie.split('=')\n const key = parts.shift().trim()\n const encodedValue = parts.join('=')\n\n try {\n const decodedValue = decodeURI(encodedValue)\n list.set(key, decodedValue)\n } catch (e) {\n throw new APIError(`Error decoding cookie value for key ${key}: ${e.message}`)\n }\n })\n }\n\n return list\n}\n"],"names":["APIError","parseCookies","headers","list","Map","rc","get","split","forEach","cookie","parts","key","shift","trim","encodedValue","join","decodedValue","decodeURI","set","e","message"],"rangeMappings":";;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,cAAc,wBAAuB;AAE5C,OAAO,MAAMC,eAAe,CAACC;IAC3B,MAAMC,OAAO,IAAIC;IACjB,MAAMC,KAAKH,QAAQI,GAAG,CAAC;IAEvB,IAAID,IAAI;QACNA,GAAGE,KAAK,CAAC,KAAKC,OAAO,CAAC,CAACC;YACrB,MAAMC,QAAQD,OAAOF,KAAK,CAAC;YAC3B,MAAMI,MAAMD,MAAME,KAAK,GAAGC,IAAI;YAC9B,MAAMC,eAAeJ,MAAMK,IAAI,CAAC;YAEhC,IAAI;gBACF,MAAMC,eAAeC,UAAUH;gBAC/BX,KAAKe,GAAG,CAACP,KAAKK;YAChB,EAAE,OAAOG,GAAG;gBACV,MAAM,IAAInB,SAAS,CAAC,oCAAoC,EAAEW,IAAI,EAAE,EAAEQ,EAAEC,OAAO,CAAC,CAAC;YAC/E;QACF;IACF;IAEA,OAAOjB;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/parseCookies.ts"],"sourcesContent":["import { APIError } from '../errors/APIError.js'\n\nexport const parseCookies = (headers: Request['headers']): Map<string, string> => {\n const list = new Map<string, string>()\n const rc = headers.get('Cookie')\n\n if (rc) {\n rc.split(';').forEach((cookie) => {\n const parts = cookie.split('=')\n const key = parts.shift().trim()\n const encodedValue = parts.join('=')\n\n try {\n const decodedValue = decodeURI(encodedValue)\n list.set(key, decodedValue)\n } catch (e) {\n throw new APIError(`Error decoding cookie value for key ${key}: ${e.message}`)\n }\n })\n }\n\n return list\n}\n"],"names":["APIError","parseCookies","headers","list","Map","rc","get","split","forEach","cookie","parts","key","shift","trim","encodedValue","join","decodedValue","decodeURI","set","e","message"],"rangeMappings":";;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,QAAQ,wBAAuB;AAEhD,OAAO,MAAMC,eAAe,CAACC;IAC3B,MAAMC,OAAO,IAAIC;IACjB,MAAMC,KAAKH,QAAQI,GAAG,CAAC;IAEvB,IAAID,IAAI;QACNA,GAAGE,KAAK,CAAC,KAAKC,OAAO,CAAC,CAACC;YACrB,MAAMC,QAAQD,OAAOF,KAAK,CAAC;YAC3B,MAAMI,MAAMD,MAAME,KAAK,GAAGC,IAAI;YAC9B,MAAMC,eAAeJ,MAAMK,IAAI,CAAC;YAEhC,IAAI;gBACF,MAAMC,eAAeC,UAAUH;gBAC/BX,KAAKe,GAAG,CAACP,KAAKK;YAChB,EAAE,OAAOG,GAAG;gBACV,MAAM,IAAInB,SAAS,CAAC,oCAAoC,EAAEW,IAAI,EAAE,EAAEQ,EAAEC,OAAO,CAAC,CAAC;YAC/E;QACF;IACF;IAEA,OAAOjB;AACT,EAAC"}
package/package.json CHANGED
@@ -1,14 +1,48 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.0.0-beta.18",
4
- "description": "Node, React and MongoDB Headless CMS and Application Framework",
3
+ "version": "3.0.0-beta.19",
4
+ "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
+ "keywords": [
6
+ "admin panel",
7
+ "api",
8
+ "cms",
9
+ "content management",
10
+ "dashboard",
11
+ "framework",
12
+ "graphQL",
13
+ "headless",
14
+ "javascript",
15
+ "next.js",
16
+ "node",
17
+ "payload",
18
+ "react",
19
+ "self hosted",
20
+ "typescript"
21
+ ],
22
+ "homepage": "https://payloadcms.com",
23
+ "bugs": {
24
+ "url": "https://github.com/payloadcms/payload"
25
+ },
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "https://github.com/payloadcms/payload.git",
29
+ "directory": "packages/payload"
30
+ },
5
31
  "license": "MIT",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "type": "module",
9
- "bin": {
10
- "payload": "bin.js"
32
+ "author": {
33
+ "name": "Payload",
34
+ "email": "info@payloadcms.com",
35
+ "url": "https://payloadcms.com"
11
36
  },
37
+ "maintainers": [
38
+ {
39
+ "name": "Payload",
40
+ "email": "info@payloadcms.com",
41
+ "url": "https://payloadcms.com"
42
+ }
43
+ ],
44
+ "sideEffects": false,
45
+ "type": "module",
12
46
  "exports": {
13
47
  ".": {
14
48
  "import": "./dist/index.js",
@@ -21,10 +55,25 @@
21
55
  "types": "./dist/exports/*.d.ts"
22
56
  }
23
57
  },
58
+ "main": "./dist/index.js",
59
+ "types": "./dist/index.d.ts",
60
+ "bin": {
61
+ "payload": "bin.js"
62
+ },
63
+ "files": [
64
+ "bin.js",
65
+ "dist",
66
+ "docs",
67
+ "*.js",
68
+ "*.d.ts",
69
+ "!jest.config.js",
70
+ "!jest.components.config.js"
71
+ ],
24
72
  "dependencies": {
25
73
  "@swc-node/core": "^1.13.0",
26
74
  "@swc-node/sourcemap-support": "^0.5.0",
27
75
  "@types/probe-image-size": "^7.2.4",
76
+ "ajv": "^8.12.0",
28
77
  "bson-objectid": "2.0.4",
29
78
  "ci-info": "^4.0.0",
30
79
  "conf": "10.2.0",
@@ -50,16 +99,7 @@
50
99
  "scheduler": "0.23.0",
51
100
  "scmp": "2.1.0",
52
101
  "uuid": "^9.0.1",
53
- "@payloadcms/translations": "3.0.0-beta.18"
54
- },
55
- "peerDependencies": {
56
- "@swc/core": "^1.4.13",
57
- "graphql": "^16.8.1"
58
- },
59
- "peerDependenciesMeta": {
60
- "@swc/core": {
61
- "optional": true
62
- }
102
+ "@payloadcms/translations": "3.0.0-beta.19"
63
103
  },
64
104
  "devDependencies": {
65
105
  "@monaco-editor/react": "4.5.1",
@@ -105,65 +145,22 @@
105
145
  "ts-essentials": "7.0.3",
106
146
  "@payloadcms/eslint-config": "1.1.1"
107
147
  },
148
+ "peerDependencies": {
149
+ "@swc/core": "^1.4.13",
150
+ "graphql": "^16.8.1"
151
+ },
152
+ "peerDependenciesMeta": {
153
+ "@swc/core": {
154
+ "optional": true
155
+ }
156
+ },
108
157
  "engines": {
109
158
  "node": ">=18.20.2"
110
159
  },
111
- "files": [
112
- "bin.js",
113
- "dist",
114
- "docs",
115
- "*.js",
116
- "*.d.ts",
117
- "!jest.config.js",
118
- "!jest.components.config.js"
119
- ],
120
- "keywords": [
121
- "payload",
122
- "cms",
123
- "content management",
124
- "framework",
125
- "typescript",
126
- "javascript",
127
- "node",
128
- "express",
129
- "headless",
130
- "graphQL",
131
- "restful",
132
- "access control",
133
- "dashboard",
134
- "admin panel",
135
- "api",
136
- "MongoDB",
137
- "self hosted",
138
- "react",
139
- "auth"
140
- ],
141
160
  "publishConfig": {
142
161
  "access": "public",
143
162
  "registry": "https://registry.npmjs.org/"
144
163
  },
145
- "homepage": "https://payloadcms.com",
146
- "author": {
147
- "email": "info@payloadcms.com",
148
- "name": "Payload",
149
- "url": "https://payloadcms.com"
150
- },
151
- "maintainers": [
152
- {
153
- "email": "info@payloadcms.com",
154
- "name": "Payload",
155
- "url": "https://payloadcms.com"
156
- }
157
- ],
158
- "repository": {
159
- "type": "git",
160
- "url": "https://github.com/payloadcms/payload.git",
161
- "directory": "packages/payload"
162
- },
163
- "bugs": {
164
- "url": "https://github.com/payloadcms/payload"
165
- },
166
- "sideEffects": false,
167
164
  "scripts": {
168
165
  "build": "pnpm copyfiles && pnpm build:swc && pnpm build:types",
169
166
  "build:swc": "swc ./src -d ./dist --config-file .swcrc",