payload 3.0.0-beta.60 → 3.0.0-beta.62

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 (190) hide show
  1. package/dist/admin/RichText.d.ts +6 -6
  2. package/dist/admin/RichText.d.ts.map +1 -1
  3. package/dist/admin/RichText.js.map +1 -1
  4. package/dist/admin/elements/Cell.d.ts +2 -2
  5. package/dist/admin/elements/Cell.d.ts.map +1 -1
  6. package/dist/admin/elements/Cell.js.map +1 -1
  7. package/dist/admin/elements/DatePicker.d.ts +7 -7
  8. package/dist/admin/elements/DatePicker.d.ts.map +1 -1
  9. package/dist/admin/elements/DatePicker.js.map +1 -1
  10. package/dist/auth/getFieldsToSign.d.ts.map +1 -1
  11. package/dist/auth/getFieldsToSign.js +1 -1
  12. package/dist/auth/getFieldsToSign.js.map +1 -1
  13. package/dist/auth/index.d.ts +2 -2
  14. package/dist/auth/index.d.ts.map +1 -1
  15. package/dist/auth/index.js +2 -2
  16. package/dist/auth/index.js.map +1 -1
  17. package/dist/auth/operations/local/login.d.ts +2 -2
  18. package/dist/auth/operations/local/login.d.ts.map +1 -1
  19. package/dist/auth/operations/local/login.js.map +1 -1
  20. package/dist/auth/operations/login.d.ts +2 -2
  21. package/dist/auth/operations/login.d.ts.map +1 -1
  22. package/dist/auth/operations/login.js.map +1 -1
  23. package/dist/auth/operations/registerFirstUser.d.ts +1 -1
  24. package/dist/auth/operations/registerFirstUser.d.ts.map +1 -1
  25. package/dist/auth/operations/registerFirstUser.js.map +1 -1
  26. package/dist/auth/strategies/jwt.js.map +1 -1
  27. package/dist/auth/strategies/local/authenticate.d.ts +1 -1
  28. package/dist/auth/strategies/local/authenticate.d.ts.map +1 -1
  29. package/dist/auth/strategies/local/authenticate.js.map +1 -1
  30. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts +1 -1
  31. package/dist/auth/strategies/local/incrementLoginAttempts.d.ts.map +1 -1
  32. package/dist/auth/strategies/local/incrementLoginAttempts.js.map +1 -1
  33. package/dist/auth/strategies/local/resetLoginAttempts.d.ts +1 -1
  34. package/dist/auth/strategies/local/resetLoginAttempts.d.ts.map +1 -1
  35. package/dist/auth/strategies/local/resetLoginAttempts.js.map +1 -1
  36. package/dist/bin/loader/compile.d.ts +2 -2
  37. package/dist/bin/loader/compile.d.ts.map +1 -1
  38. package/dist/bin/loader/compile.js.map +1 -1
  39. package/dist/collections/config/client.d.ts +21 -21
  40. package/dist/collections/config/client.d.ts.map +1 -1
  41. package/dist/collections/config/client.js.map +1 -1
  42. package/dist/collections/config/sanitize.js +10 -10
  43. package/dist/collections/config/sanitize.js.map +1 -1
  44. package/dist/collections/operations/delete.d.ts.map +1 -1
  45. package/dist/collections/operations/delete.js +1 -1
  46. package/dist/collections/operations/delete.js.map +1 -1
  47. package/dist/collections/operations/findByID.d.ts.map +1 -1
  48. package/dist/collections/operations/findByID.js +1 -1
  49. package/dist/collections/operations/findByID.js.map +1 -1
  50. package/dist/collections/operations/findVersionByID.d.ts.map +1 -1
  51. package/dist/collections/operations/findVersionByID.js +1 -1
  52. package/dist/collections/operations/findVersionByID.js.map +1 -1
  53. package/dist/collections/operations/local/delete.d.ts +4 -4
  54. package/dist/collections/operations/local/delete.d.ts.map +1 -1
  55. package/dist/collections/operations/local/delete.js.map +1 -1
  56. package/dist/collections/operations/local/update.d.ts +4 -4
  57. package/dist/collections/operations/local/update.d.ts.map +1 -1
  58. package/dist/collections/operations/local/update.js.map +1 -1
  59. package/dist/collections/operations/restoreVersion.d.ts.map +1 -1
  60. package/dist/collections/operations/restoreVersion.js +1 -1
  61. package/dist/collections/operations/restoreVersion.js.map +1 -1
  62. package/dist/collections/operations/utils.d.ts +2 -2
  63. package/dist/collections/operations/utils.d.ts.map +1 -1
  64. package/dist/collections/operations/utils.js.map +1 -1
  65. package/dist/config/client.d.ts +4 -4
  66. package/dist/config/client.d.ts.map +1 -1
  67. package/dist/config/client.js.map +1 -1
  68. package/dist/config/find.d.ts.map +1 -1
  69. package/dist/config/find.js +0 -1
  70. package/dist/config/find.js.map +1 -1
  71. package/dist/config/types.d.ts +13 -13
  72. package/dist/config/types.d.ts.map +1 -1
  73. package/dist/config/types.js.map +1 -1
  74. package/dist/database/createDatabaseAdapter.d.ts.map +1 -1
  75. package/dist/database/createDatabaseAdapter.js +1 -1
  76. package/dist/database/createDatabaseAdapter.js.map +1 -1
  77. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  78. package/dist/database/getLocalizedPaths.js +0 -1
  79. package/dist/database/getLocalizedPaths.js.map +1 -1
  80. package/dist/database/migrations/createMigration.d.ts.map +1 -1
  81. package/dist/database/migrations/createMigration.js +1 -1
  82. package/dist/database/migrations/createMigration.js.map +1 -1
  83. package/dist/database/migrations/migrate.d.ts.map +1 -1
  84. package/dist/database/migrations/migrate.js +2 -2
  85. package/dist/database/migrations/migrate.js.map +1 -1
  86. package/dist/database/migrations/migrateDown.d.ts.map +1 -1
  87. package/dist/database/migrations/migrateDown.js +1 -1
  88. package/dist/database/migrations/migrateDown.js.map +1 -1
  89. package/dist/database/migrations/migrateRefresh.d.ts.map +1 -1
  90. package/dist/database/migrations/migrateRefresh.js +1 -1
  91. package/dist/database/migrations/migrateRefresh.js.map +1 -1
  92. package/dist/database/migrations/migrateReset.d.ts.map +1 -1
  93. package/dist/database/migrations/migrateReset.js +1 -1
  94. package/dist/database/migrations/migrateReset.js.map +1 -1
  95. package/dist/database/migrations/migrateStatus.js +0 -1
  96. package/dist/database/migrations/migrateStatus.js.map +1 -1
  97. package/dist/database/queryValidation/validateQueryPaths.d.ts.map +1 -1
  98. package/dist/database/queryValidation/validateQueryPaths.js +1 -1
  99. package/dist/database/queryValidation/validateQueryPaths.js.map +1 -1
  100. package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
  101. package/dist/database/queryValidation/validateSearchParams.js +0 -3
  102. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  103. package/dist/database/types.d.ts +6 -6
  104. package/dist/database/types.d.ts.map +1 -1
  105. package/dist/database/types.js.map +1 -1
  106. package/dist/errors/APIError.d.ts.map +1 -1
  107. package/dist/errors/APIError.js +1 -1
  108. package/dist/errors/APIError.js.map +1 -1
  109. package/dist/errors/ReservedFieldName.d.ts +6 -0
  110. package/dist/errors/ReservedFieldName.d.ts.map +1 -0
  111. package/dist/errors/ReservedFieldName.js +8 -0
  112. package/dist/errors/ReservedFieldName.js.map +1 -0
  113. package/dist/errors/index.d.ts +1 -0
  114. package/dist/errors/index.d.ts.map +1 -1
  115. package/dist/errors/index.js +1 -0
  116. package/dist/errors/index.js.map +1 -1
  117. package/dist/exports/shared.d.ts +1 -1
  118. package/dist/exports/shared.d.ts.map +1 -1
  119. package/dist/exports/shared.js +1 -1
  120. package/dist/exports/shared.js.map +1 -1
  121. package/dist/fields/config/client.d.ts +448 -448
  122. package/dist/fields/config/client.d.ts.map +1 -1
  123. package/dist/fields/config/sanitize.d.ts +1 -0
  124. package/dist/fields/config/sanitize.d.ts.map +1 -1
  125. package/dist/fields/config/sanitize.js +11 -1
  126. package/dist/fields/config/sanitize.js.map +1 -1
  127. package/dist/fields/config/sanitize.spec.js +71 -55
  128. package/dist/fields/config/sanitize.spec.js.map +1 -1
  129. package/dist/fields/config/types.d.ts +98 -92
  130. package/dist/fields/config/types.d.ts.map +1 -1
  131. package/dist/fields/config/types.js +1 -1
  132. package/dist/fields/config/types.js.map +1 -1
  133. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  134. package/dist/fields/hooks/afterChange/promise.js +1 -1
  135. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  136. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  137. package/dist/fields/hooks/afterRead/promise.js +1 -1
  138. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  139. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  140. package/dist/fields/hooks/beforeValidate/promise.js +1 -1
  141. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  142. package/dist/fields/validations.d.ts +12 -12
  143. package/dist/fields/validations.d.ts.map +1 -1
  144. package/dist/fields/validations.js +1 -1
  145. package/dist/fields/validations.js.map +1 -1
  146. package/dist/fields/validations.spec.js +15 -15
  147. package/dist/fields/validations.spec.js.map +1 -1
  148. package/dist/globals/config/client.d.ts +4 -4
  149. package/dist/globals/config/client.d.ts.map +1 -1
  150. package/dist/globals/config/client.js.map +1 -1
  151. package/dist/globals/config/sanitize.d.ts.map +1 -1
  152. package/dist/globals/config/sanitize.js +8 -7
  153. package/dist/globals/config/sanitize.js.map +1 -1
  154. package/dist/globals/operations/findVersionByID.d.ts.map +1 -1
  155. package/dist/globals/operations/findVersionByID.js +1 -1
  156. package/dist/globals/operations/findVersionByID.js.map +1 -1
  157. package/dist/index.d.ts +78 -78
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +60 -59
  160. package/dist/index.js.map +1 -1
  161. package/dist/preferences/types.d.ts +2 -2
  162. package/dist/preferences/types.d.ts.map +1 -1
  163. package/dist/preferences/types.js.map +1 -1
  164. package/dist/types/index.d.ts +1 -1
  165. package/dist/types/index.d.ts.map +1 -1
  166. package/dist/types/index.js.map +1 -1
  167. package/dist/uploads/deleteAssociatedFiles.d.ts.map +1 -1
  168. package/dist/uploads/deleteAssociatedFiles.js +0 -2
  169. package/dist/uploads/deleteAssociatedFiles.js.map +1 -1
  170. package/dist/uploads/generateFileData.js +3 -3
  171. package/dist/uploads/generateFileData.js.map +1 -1
  172. package/dist/uploads/getBaseFields.js +2 -2
  173. package/dist/uploads/getBaseFields.js.map +1 -1
  174. package/dist/uploads/getSafeFilename.d.ts.map +1 -1
  175. package/dist/uploads/getSafeFilename.js +0 -1
  176. package/dist/uploads/getSafeFilename.js.map +1 -1
  177. package/dist/uploads/types.d.ts +4 -4
  178. package/dist/uploads/types.d.ts.map +1 -1
  179. package/dist/uploads/types.js.map +1 -1
  180. package/dist/utilities/configToJSONSchema.spec.js +37 -37
  181. package/dist/utilities/configToJSONSchema.spec.js.map +1 -1
  182. package/dist/utilities/convertData.d.ts.map +1 -1
  183. package/dist/utilities/convertData.js +1 -1
  184. package/dist/utilities/convertData.js.map +1 -1
  185. package/dist/utilities/getEntityPolicies.js.map +1 -1
  186. package/dist/versions/drafts/replaceWithDraftIfAvailable.js.map +1 -1
  187. package/dist/versions/getLatestGlobalVersion.d.ts.map +1 -1
  188. package/dist/versions/getLatestGlobalVersion.js +0 -1
  189. package/dist/versions/getLatestGlobalVersion.js.map +1 -1
  190. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"getSafeFilename.d.ts","sourceRoot":"","sources":["../../src/uploads/getSafeFilename.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAsBvD,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAsB,eAAe,CAAC,EACpC,cAAc,EACd,eAAe,EACf,GAAG,EACH,UAAU,GACX,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxB"}
1
+ {"version":3,"file":"getSafeFilename.d.ts","sourceRoot":"","sources":["../../src/uploads/getSafeFilename.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAsBvD,KAAK,IAAI,GAAG;IACV,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,GAAG,EAAE,cAAc,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,wBAAsB,eAAe,CAAC,EACpC,cAAc,EACd,eAAe,EACf,GAAG,EACH,UAAU,GACX,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAexB"}
@@ -19,7 +19,6 @@ const incrementName = (name)=>{
19
19
  };
20
20
  export async function getSafeFileName({ collectionSlug, desiredFilename, req, staticPath }) {
21
21
  let modifiedFilename = desiredFilename;
22
- // eslint-disable-next-line no-await-in-loop
23
22
  while(await docWithFilenameExists({
24
23
  collectionSlug,
25
24
  filename: modifiedFilename,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/uploads/getSafeFilename.ts"],"sourcesContent":["import sanitize from 'sanitize-filename'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nimport docWithFilenameExists from './docWithFilenameExists.js'\nimport fileExists from './fileExists.js'\n\nconst incrementName = (name: string) => {\n const extension = name.split('.').pop()\n const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name)\n let incrementedName = baseFilename\n const regex = /(.*)-(\\d+)$/\n const found = baseFilename.match(regex)\n if (found === null) {\n incrementedName += '-1'\n } else {\n const matchedName = found[1]\n const matchedNumber = found[2]\n const incremented = Number(matchedNumber) + 1\n incrementedName = `${matchedName}-${incremented}`\n }\n return `${incrementedName}.${extension}`\n}\n\ntype Args = {\n collectionSlug: string\n desiredFilename: string\n req: PayloadRequest\n staticPath: string\n}\n\nexport async function getSafeFileName({\n collectionSlug,\n desiredFilename,\n req,\n staticPath,\n}: Args): Promise<string> {\n let modifiedFilename = desiredFilename\n\n // eslint-disable-next-line no-await-in-loop\n while (\n (await docWithFilenameExists({\n collectionSlug,\n filename: modifiedFilename,\n path: staticPath,\n req,\n })) ||\n (await fileExists(`${staticPath}/${modifiedFilename}`))\n ) {\n modifiedFilename = incrementName(modifiedFilename)\n }\n return modifiedFilename\n}\n"],"names":["sanitize","docWithFilenameExists","fileExists","incrementName","name","extension","split","pop","baseFilename","substring","lastIndexOf","incrementedName","regex","found","match","matchedName","matchedNumber","incremented","Number","getSafeFileName","collectionSlug","desiredFilename","req","staticPath","modifiedFilename","filename","path"],"mappings":"AAAA,OAAOA,cAAc,oBAAmB;AAIxC,OAAOC,2BAA2B,6BAA4B;AAC9D,OAAOC,gBAAgB,kBAAiB;AAExC,MAAMC,gBAAgB,CAACC;IACrB,MAAMC,YAAYD,KAAKE,KAAK,CAAC,KAAKC,GAAG;IACrC,MAAMC,eAAeR,SAASI,KAAKK,SAAS,CAAC,GAAGL,KAAKM,WAAW,CAAC,SAASN;IAC1E,IAAIO,kBAAkBH;IACtB,MAAMI,QAAQ;IACd,MAAMC,QAAQL,aAAaM,KAAK,CAACF;IACjC,IAAIC,UAAU,MAAM;QAClBF,mBAAmB;IACrB,OAAO;QACL,MAAMI,cAAcF,KAAK,CAAC,EAAE;QAC5B,MAAMG,gBAAgBH,KAAK,CAAC,EAAE;QAC9B,MAAMI,cAAcC,OAAOF,iBAAiB;QAC5CL,kBAAkB,CAAC,EAAEI,YAAY,CAAC,EAAEE,YAAY,CAAC;IACnD;IACA,OAAO,CAAC,EAAEN,gBAAgB,CAAC,EAAEN,UAAU,CAAC;AAC1C;AASA,OAAO,eAAec,gBAAgB,EACpCC,cAAc,EACdC,eAAe,EACfC,GAAG,EACHC,UAAU,EACL;IACL,IAAIC,mBAAmBH;IAEvB,4CAA4C;IAC5C,MACE,AAAC,MAAMpB,sBAAsB;QAC3BmB;QACAK,UAAUD;QACVE,MAAMH;QACND;IACF,MACC,MAAMpB,WAAW,CAAC,EAAEqB,WAAW,CAAC,EAAEC,iBAAiB,CAAC,EACrD;QACAA,mBAAmBrB,cAAcqB;IACnC;IACA,OAAOA;AACT"}
1
+ {"version":3,"sources":["../../src/uploads/getSafeFilename.ts"],"sourcesContent":["import sanitize from 'sanitize-filename'\n\nimport type { PayloadRequest } from '../types/index.js'\n\nimport docWithFilenameExists from './docWithFilenameExists.js'\nimport fileExists from './fileExists.js'\n\nconst incrementName = (name: string) => {\n const extension = name.split('.').pop()\n const baseFilename = sanitize(name.substring(0, name.lastIndexOf('.')) || name)\n let incrementedName = baseFilename\n const regex = /(.*)-(\\d+)$/\n const found = baseFilename.match(regex)\n if (found === null) {\n incrementedName += '-1'\n } else {\n const matchedName = found[1]\n const matchedNumber = found[2]\n const incremented = Number(matchedNumber) + 1\n incrementedName = `${matchedName}-${incremented}`\n }\n return `${incrementedName}.${extension}`\n}\n\ntype Args = {\n collectionSlug: string\n desiredFilename: string\n req: PayloadRequest\n staticPath: string\n}\n\nexport async function getSafeFileName({\n collectionSlug,\n desiredFilename,\n req,\n staticPath,\n}: Args): Promise<string> {\n let modifiedFilename = desiredFilename\n\n while (\n (await docWithFilenameExists({\n collectionSlug,\n filename: modifiedFilename,\n path: staticPath,\n req,\n })) ||\n (await fileExists(`${staticPath}/${modifiedFilename}`))\n ) {\n modifiedFilename = incrementName(modifiedFilename)\n }\n return modifiedFilename\n}\n"],"names":["sanitize","docWithFilenameExists","fileExists","incrementName","name","extension","split","pop","baseFilename","substring","lastIndexOf","incrementedName","regex","found","match","matchedName","matchedNumber","incremented","Number","getSafeFileName","collectionSlug","desiredFilename","req","staticPath","modifiedFilename","filename","path"],"mappings":"AAAA,OAAOA,cAAc,oBAAmB;AAIxC,OAAOC,2BAA2B,6BAA4B;AAC9D,OAAOC,gBAAgB,kBAAiB;AAExC,MAAMC,gBAAgB,CAACC;IACrB,MAAMC,YAAYD,KAAKE,KAAK,CAAC,KAAKC,GAAG;IACrC,MAAMC,eAAeR,SAASI,KAAKK,SAAS,CAAC,GAAGL,KAAKM,WAAW,CAAC,SAASN;IAC1E,IAAIO,kBAAkBH;IACtB,MAAMI,QAAQ;IACd,MAAMC,QAAQL,aAAaM,KAAK,CAACF;IACjC,IAAIC,UAAU,MAAM;QAClBF,mBAAmB;IACrB,OAAO;QACL,MAAMI,cAAcF,KAAK,CAAC,EAAE;QAC5B,MAAMG,gBAAgBH,KAAK,CAAC,EAAE;QAC9B,MAAMI,cAAcC,OAAOF,iBAAiB;QAC5CL,kBAAkB,CAAC,EAAEI,YAAY,CAAC,EAAEE,YAAY,CAAC;IACnD;IACA,OAAO,CAAC,EAAEN,gBAAgB,CAAC,EAAEN,UAAU,CAAC;AAC1C;AASA,OAAO,eAAec,gBAAgB,EACpCC,cAAc,EACdC,eAAe,EACfC,GAAG,EACHC,UAAU,EACL;IACL,IAAIC,mBAAmBH;IAEvB,MACE,AAAC,MAAMpB,sBAAsB;QAC3BmB;QACAK,UAAUD;QACVE,MAAMH;QACND;IACF,MACC,MAAMpB,WAAW,CAAC,EAAEqB,WAAW,CAAC,EAAEC,iBAAiB,CAAC,EACrD;QACAA,mBAAmBrB,cAAcqB;IACnC;IACA,OAAOA;AACT"}
@@ -40,7 +40,7 @@ export type ImageUploadFormatOptions = {
40
40
  * @link https://sharp.pixelplumbing.com/api-resize#trim
41
41
  */
42
42
  export type ImageUploadTrimOptions = Parameters<Sharp['trim']>[0];
43
- export type ImageSize = Omit<ResizeOptions, 'withoutEnlargement'> & {
43
+ export type ImageSize = {
44
44
  /**
45
45
  * @deprecated prefer position
46
46
  */
@@ -58,7 +58,7 @@ export type ImageSize = Omit<ResizeOptions, 'withoutEnlargement'> & {
58
58
  * 3. `true`: if the image is smaller than the image size, return the original image
59
59
  */
60
60
  withoutEnlargement?: ResizeOptions['withoutEnlargement'];
61
- };
61
+ } & Omit<ResizeOptions, 'withoutEnlargement'>;
62
62
  export type GetAdminThumbnail = (args: {
63
63
  doc: Record<string, unknown>;
64
64
  }) => false | null | string;
@@ -148,9 +148,9 @@ export type UploadConfig = {
148
148
  staticDir?: string;
149
149
  trimOptions?: ImageUploadTrimOptions;
150
150
  };
151
- export type SanitizedUploadConfig = UploadConfig & {
151
+ export type SanitizedUploadConfig = {
152
152
  staticDir: UploadConfig['staticDir'];
153
- };
153
+ } & UploadConfig;
154
154
  export type File = {
155
155
  /**
156
156
  * The buffer of the file.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/uploads/types.ts"],"names":[],"mappings":"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"}
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 { ResizeOptions, Sharp } from 'sharp'\n\nimport type { TypeWithID } from '../collections/config/types.js'\nimport type { PayloadRequest } 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 focalX?: number\n focalY?: 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 name to use for uploads. Used for storage adapter telemetry.\n * @default undefined\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 * - A function that generates a fully qualified URL for the thumbnail, receives the doc as the only argument.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n /**\n * Enables cropping of images.\n * @default true\n */\n crop?: boolean\n /**\n * Disable the ability to save files to disk.\n * @default false\n */\n disableLocalStorage?: boolean\n /**\n * Ability to filter/modify Request Headers when fetching a file.\n *\n * Useful for adding custom headers to fetch from external providers.\n * @default undefined\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n /**\n * Require files to be uploaded when creating a document.\n * @default true\n */\n filesRequiredOnCreate?: boolean\n /**\n * Enables focal point positioning for image manipulation.\n * @default false\n */\n focalPoint?: boolean\n /**\n * Format options for the uploaded file. Formatting image sizes needs to be done within each formatOptions individually.\n */\n formatOptions?: ImageUploadFormatOptions\n /**\n * Custom handlers to run when a file is fetched.\n *\n * - If a handler returns a Response, the response will be sent to the client and no further handlers will be run.\n * - If a handler returns null, the next handler will be run.\n * - If no handlers return a response the file will be returned by default.\n *\n * @default undefined\n */\n handlers?: ((\n req: PayloadRequest,\n args: {\n doc: TypeWithID\n params: { collection: string; filename: string }\n },\n ) => Promise<Response> | Promise<void> | Response | void)[]\n imageSizes?: ImageSize[]\n /**\n * Restrict mimeTypes in the file picker. Array of valid mime types or mimetype wildcards\n * @example ['image/*', 'application/pdf']\n * @default undefined\n */\n mimeTypes?: string[]\n /**\n * Ability to modify the response headers fetching a file.\n * @default undefined\n */\n modifyResponseHeaders?: ({ headers }: { headers: Headers }) => Headers\n /**\n * Sharp resize options for the original image.\n * @link https://sharp.pixelplumbing.com/api-resize#resize\n * @default undefined\n */\n resizeOptions?: ResizeOptions\n /**\n * The directory to serve static files from. Defaults to collection slug.\n * @default undefined\n */\n staticDir?: string\n trimOptions?: ImageUploadTrimOptions\n}\n\nexport type SanitizedUploadConfig = UploadConfig & {\n staticDir: UploadConfig['staticDir']\n}\n\nexport type File = {\n /**\n * The buffer of the file.\n */\n data: Buffer\n /**\n * The mimetype of the file.\n */\n mimetype: string\n /**\n * The name of the file.\n */\n name: string\n /**\n * The size of the file in bytes.\n */\n size: number\n}\n\nexport type FileToSave = {\n /**\n * The buffer of the file.\n */\n buffer: Buffer\n /**\n * The path to save the file.\n */\n path: string\n}\n\nexport type UploadEdits = {\n crop?: {\n height?: number\n width?: number\n x?: number\n y?: number\n }\n focalPoint?: {\n x?: number\n y?: number\n }\n}\n"],"names":[],"mappings":"AA+LA,WAWC"}
1
+ {"version":3,"sources":["../../src/uploads/types.ts"],"sourcesContent":["import type { ResizeOptions, Sharp } from 'sharp'\n\nimport type { TypeWithID } from '../collections/config/types.js'\nimport type { PayloadRequest } 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 focalX?: number\n focalY?: 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 = {\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} & Omit<ResizeOptions, 'withoutEnlargement'>\n\nexport type GetAdminThumbnail = (args: { doc: Record<string, unknown> }) => false | null | string\n\nexport type UploadConfig = {\n /**\n * The adapter name to use for uploads. Used for storage adapter telemetry.\n * @default undefined\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 * - A function that generates a fully qualified URL for the thumbnail, receives the doc as the only argument.\n **/\n adminThumbnail?: GetAdminThumbnail | string\n /**\n * Enables cropping of images.\n * @default true\n */\n crop?: boolean\n /**\n * Disable the ability to save files to disk.\n * @default false\n */\n disableLocalStorage?: boolean\n /**\n * Ability to filter/modify Request Headers when fetching a file.\n *\n * Useful for adding custom headers to fetch from external providers.\n * @default undefined\n */\n externalFileHeaderFilter?: (headers: Record<string, string>) => Record<string, string>\n /**\n * Require files to be uploaded when creating a document.\n * @default true\n */\n filesRequiredOnCreate?: boolean\n /**\n * Enables focal point positioning for image manipulation.\n * @default false\n */\n focalPoint?: boolean\n /**\n * Format options for the uploaded file. Formatting image sizes needs to be done within each formatOptions individually.\n */\n formatOptions?: ImageUploadFormatOptions\n /**\n * Custom handlers to run when a file is fetched.\n *\n * - If a handler returns a Response, the response will be sent to the client and no further handlers will be run.\n * - If a handler returns null, the next handler will be run.\n * - If no handlers return a response the file will be returned by default.\n *\n * @default undefined\n */\n handlers?: ((\n req: PayloadRequest,\n args: {\n doc: TypeWithID\n params: { collection: string; filename: string }\n },\n ) => Promise<Response> | Promise<void> | Response | void)[]\n imageSizes?: ImageSize[]\n /**\n * Restrict mimeTypes in the file picker. Array of valid mime types or mimetype wildcards\n * @example ['image/*', 'application/pdf']\n * @default undefined\n */\n mimeTypes?: string[]\n /**\n * Ability to modify the response headers fetching a file.\n * @default undefined\n */\n modifyResponseHeaders?: ({ headers }: { headers: Headers }) => Headers\n /**\n * Sharp resize options for the original image.\n * @link https://sharp.pixelplumbing.com/api-resize#resize\n * @default undefined\n */\n resizeOptions?: ResizeOptions\n /**\n * The directory to serve static files from. Defaults to collection slug.\n * @default undefined\n */\n staticDir?: string\n trimOptions?: ImageUploadTrimOptions\n}\n\nexport type SanitizedUploadConfig = {\n staticDir: UploadConfig['staticDir']\n} & UploadConfig\n\nexport type File = {\n /**\n * The buffer of the file.\n */\n data: Buffer\n /**\n * The mimetype of the file.\n */\n mimetype: string\n /**\n * The name of the file.\n */\n name: string\n /**\n * The size of the file in bytes.\n */\n size: number\n}\n\nexport type FileToSave = {\n /**\n * The buffer of the file.\n */\n buffer: Buffer\n /**\n * The path to save the file.\n */\n path: string\n}\n\nexport type UploadEdits = {\n crop?: {\n height?: number\n width?: number\n x?: number\n y?: number\n }\n focalPoint?: {\n x?: number\n y?: number\n }\n}\n"],"names":[],"mappings":"AA+LA,WAWC"}
@@ -6,6 +6,7 @@ describe('configToJSONSchema', ()=>{
6
6
  const config = {
7
7
  collections: [
8
8
  {
9
+ slug: 'test',
9
10
  fields: [
10
11
  {
11
12
  name: 'someRequiredField',
@@ -13,13 +14,12 @@ describe('configToJSONSchema', ()=>{
13
14
  fields: [
14
15
  {
15
16
  name: 'someRequiredField',
16
- required: true,
17
- type: 'text'
17
+ type: 'text',
18
+ required: true
18
19
  }
19
20
  ]
20
21
  }
21
22
  ],
22
- slug: 'test',
23
23
  timestamps: false
24
24
  }
25
25
  ]
@@ -27,13 +27,19 @@ describe('configToJSONSchema', ()=>{
27
27
  const sanitizedConfig = await sanitizeConfig(config);
28
28
  const schema = configToJSONSchema(sanitizedConfig, 'text');
29
29
  expect(schema?.definitions?.test).toStrictEqual({
30
+ type: 'object',
30
31
  additionalProperties: false,
31
32
  properties: {
32
33
  id: {
33
34
  type: 'string'
34
35
  },
35
36
  someRequiredField: {
37
+ type: [
38
+ 'array',
39
+ 'null'
40
+ ],
36
41
  items: {
42
+ type: 'object',
37
43
  additionalProperties: false,
38
44
  properties: {
39
45
  id: {
@@ -48,20 +54,14 @@ describe('configToJSONSchema', ()=>{
48
54
  },
49
55
  required: [
50
56
  'someRequiredField'
51
- ],
52
- type: 'object'
53
- },
54
- type: [
55
- 'array',
56
- 'null'
57
- ]
57
+ ]
58
+ }
58
59
  }
59
60
  },
60
61
  required: [
61
62
  'id'
62
63
  ],
63
- title: 'Test',
64
- type: 'object'
64
+ title: 'Test'
65
65
  });
66
66
  });
67
67
  it('should handle tabs and named tabs with required fields', async ()=>{
@@ -69,44 +69,44 @@ describe('configToJSONSchema', ()=>{
69
69
  const config = {
70
70
  collections: [
71
71
  {
72
+ slug: 'test',
72
73
  fields: [
73
74
  {
74
75
  type: 'tabs',
75
76
  tabs: [
76
77
  {
77
- label: 'unnamedTab',
78
78
  fields: [
79
79
  {
80
- type: 'text',
81
- name: 'fieldInUnnamedTab'
80
+ name: 'fieldInUnnamedTab',
81
+ type: 'text'
82
82
  }
83
- ]
83
+ ],
84
+ label: 'unnamedTab'
84
85
  },
85
86
  {
86
- label: 'namedTab',
87
87
  name: 'namedTab',
88
88
  fields: [
89
89
  {
90
- type: 'text',
91
- name: 'fieldInNamedTab'
90
+ name: 'fieldInNamedTab',
91
+ type: 'text'
92
92
  }
93
- ]
93
+ ],
94
+ label: 'namedTab'
94
95
  },
95
96
  {
96
- label: 'namedTabWithRequired',
97
97
  name: 'namedTabWithRequired',
98
98
  fields: [
99
99
  {
100
- type: 'text',
101
100
  name: 'fieldInNamedTab',
101
+ type: 'text',
102
102
  required: true
103
103
  }
104
- ]
104
+ ],
105
+ label: 'namedTabWithRequired'
105
106
  }
106
107
  ]
107
108
  }
108
109
  ],
109
- slug: 'test',
110
110
  timestamps: false
111
111
  }
112
112
  ]
@@ -114,6 +114,7 @@ describe('configToJSONSchema', ()=>{
114
114
  const sanitizedConfig = await sanitizeConfig(config);
115
115
  const schema = configToJSONSchema(sanitizedConfig, 'text');
116
116
  expect(schema?.definitions?.test).toStrictEqual({
117
+ type: 'object',
117
118
  additionalProperties: false,
118
119
  properties: {
119
120
  id: {
@@ -126,8 +127,8 @@ describe('configToJSONSchema', ()=>{
126
127
  ]
127
128
  },
128
129
  namedTab: {
129
- additionalProperties: false,
130
130
  type: 'object',
131
+ additionalProperties: false,
131
132
  properties: {
132
133
  fieldInNamedTab: {
133
134
  type: [
@@ -139,8 +140,8 @@ describe('configToJSONSchema', ()=>{
139
140
  required: []
140
141
  },
141
142
  namedTabWithRequired: {
142
- additionalProperties: false,
143
143
  type: 'object',
144
+ additionalProperties: false,
144
145
  properties: {
145
146
  fieldInNamedTab: {
146
147
  type: 'string'
@@ -155,8 +156,7 @@ describe('configToJSONSchema', ()=>{
155
156
  'id',
156
157
  'namedTabWithRequired'
157
158
  ],
158
- title: 'Test',
159
- type: 'object'
159
+ title: 'Test'
160
160
  });
161
161
  });
162
162
  it('should handle custom typescript schema and JSON field schema', async ()=>{
@@ -174,27 +174,27 @@ describe('configToJSONSchema', ()=>{
174
174
  const config = {
175
175
  collections: [
176
176
  {
177
+ slug: 'test',
177
178
  fields: [
178
179
  {
179
- type: 'text',
180
180
  name: 'withCustom',
181
+ type: 'text',
181
182
  typescriptSchema: [
182
183
  ()=>customSchema
183
184
  ]
184
185
  },
185
186
  {
186
- type: 'json',
187
187
  name: 'jsonWithSchema',
188
+ type: 'json',
188
189
  jsonSchema: {
189
- uri: 'a://b/foo.json',
190
190
  fileMatch: [
191
191
  'a://b/foo.json'
192
192
  ],
193
- schema: customSchema
193
+ schema: customSchema,
194
+ uri: 'a://b/foo.json'
194
195
  }
195
196
  }
196
197
  ],
197
- slug: 'test',
198
198
  timestamps: false
199
199
  }
200
200
  ]
@@ -202,19 +202,19 @@ describe('configToJSONSchema', ()=>{
202
202
  const sanitizedConfig = await sanitizeConfig(config);
203
203
  const schema = configToJSONSchema(sanitizedConfig, 'text');
204
204
  expect(schema?.definitions?.test).toStrictEqual({
205
+ type: 'object',
205
206
  additionalProperties: false,
206
207
  properties: {
207
208
  id: {
208
209
  type: 'string'
209
210
  },
210
- withCustom: customSchema,
211
- jsonWithSchema: customSchema
211
+ jsonWithSchema: customSchema,
212
+ withCustom: customSchema
212
213
  },
213
214
  required: [
214
215
  'id'
215
216
  ],
216
- title: 'Test',
217
- type: 'object'
217
+ title: 'Test'
218
218
  });
219
219
  });
220
220
  });
@@ -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'\nimport { JSONSchema4 } from 'json-schema'\n\ndescribe('configToJSONSchema', () => {\n it('should handle optional arrays with required fields', async () => {\n // @ts-expect-error\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 it('should handle tabs and named tabs with required fields', async () => {\n // @ts-expect-error\n const config: Config = {\n collections: [\n {\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'unnamedTab',\n fields: [\n {\n type: 'text',\n name: 'fieldInUnnamedTab',\n },\n ],\n },\n {\n label: 'namedTab',\n name: 'namedTab',\n fields: [\n {\n type: 'text',\n name: 'fieldInNamedTab',\n },\n ],\n },\n {\n label: 'namedTabWithRequired',\n name: 'namedTabWithRequired',\n fields: [\n {\n type: 'text',\n name: 'fieldInNamedTab',\n required: true,\n },\n ],\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 fieldInUnnamedTab: {\n type: ['string', 'null'],\n },\n namedTab: {\n additionalProperties: false,\n type: 'object',\n properties: {\n fieldInNamedTab: {\n type: ['string', 'null'],\n },\n },\n required: [],\n },\n namedTabWithRequired: {\n additionalProperties: false,\n type: 'object',\n properties: {\n fieldInNamedTab: {\n type: 'string',\n },\n },\n required: ['fieldInNamedTab'],\n },\n },\n required: ['id', 'namedTabWithRequired'],\n title: 'Test',\n type: 'object',\n })\n })\n\n it('should handle custom typescript schema and JSON field schema', async () => {\n const customSchema: JSONSchema4 = {\n type: 'object',\n properties: {\n id: {\n type: 'number',\n },\n required: ['id'],\n },\n }\n\n const config: Partial<Config> = {\n collections: [\n {\n fields: [\n {\n type: 'text',\n name: 'withCustom',\n typescriptSchema: [() => customSchema],\n },\n {\n type: 'json',\n name: 'jsonWithSchema',\n jsonSchema: {\n uri: 'a://b/foo.json',\n fileMatch: ['a://b/foo.json'],\n schema: customSchema,\n },\n },\n ],\n slug: 'test',\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config as 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 withCustom: customSchema,\n jsonWithSchema: customSchema,\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","tabs","label","fieldInUnnamedTab","namedTab","fieldInNamedTab","namedTabWithRequired","customSchema","typescriptSchema","jsonSchema","uri","fileMatch","withCustom","jsonWithSchema"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/configToJSONSchema.spec.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\n\nimport 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 // @ts-expect-error\n const config: Config = {\n collections: [\n {\n slug: 'test',\n fields: [\n {\n name: 'someRequiredField',\n type: 'array',\n fields: [\n {\n name: 'someRequiredField',\n type: 'text',\n required: true,\n },\n ],\n },\n ],\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 type: 'object',\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n someRequiredField: {\n type: ['array', 'null'],\n items: {\n type: 'object',\n additionalProperties: false,\n properties: {\n id: {\n type: ['string', 'null'],\n },\n someRequiredField: {\n type: 'string',\n },\n },\n required: ['someRequiredField'],\n },\n },\n },\n required: ['id'],\n title: 'Test',\n })\n })\n\n it('should handle tabs and named tabs with required fields', async () => {\n // @ts-expect-error\n const config: Config = {\n collections: [\n {\n slug: 'test',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'fieldInUnnamedTab',\n type: 'text',\n },\n ],\n label: 'unnamedTab',\n },\n {\n name: 'namedTab',\n fields: [\n {\n name: 'fieldInNamedTab',\n type: 'text',\n },\n ],\n label: 'namedTab',\n },\n {\n name: 'namedTabWithRequired',\n fields: [\n {\n name: 'fieldInNamedTab',\n type: 'text',\n required: true,\n },\n ],\n label: 'namedTabWithRequired',\n },\n ],\n },\n ],\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 type: 'object',\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n fieldInUnnamedTab: {\n type: ['string', 'null'],\n },\n namedTab: {\n type: 'object',\n additionalProperties: false,\n properties: {\n fieldInNamedTab: {\n type: ['string', 'null'],\n },\n },\n required: [],\n },\n namedTabWithRequired: {\n type: 'object',\n additionalProperties: false,\n properties: {\n fieldInNamedTab: {\n type: 'string',\n },\n },\n required: ['fieldInNamedTab'],\n },\n },\n required: ['id', 'namedTabWithRequired'],\n title: 'Test',\n })\n })\n\n it('should handle custom typescript schema and JSON field schema', async () => {\n const customSchema: JSONSchema4 = {\n type: 'object',\n properties: {\n id: {\n type: 'number',\n },\n required: ['id'],\n },\n }\n\n const config: Partial<Config> = {\n collections: [\n {\n slug: 'test',\n fields: [\n {\n name: 'withCustom',\n type: 'text',\n typescriptSchema: [() => customSchema],\n },\n {\n name: 'jsonWithSchema',\n type: 'json',\n jsonSchema: {\n fileMatch: ['a://b/foo.json'],\n schema: customSchema,\n uri: 'a://b/foo.json',\n },\n },\n ],\n timestamps: false,\n },\n ],\n }\n\n const sanitizedConfig = await sanitizeConfig(config as Config)\n const schema = configToJSONSchema(sanitizedConfig, 'text')\n\n expect(schema?.definitions?.test).toStrictEqual({\n type: 'object',\n additionalProperties: false,\n properties: {\n id: {\n type: 'string',\n },\n jsonWithSchema: customSchema,\n withCustom: customSchema,\n },\n required: ['id'],\n title: 'Test',\n })\n })\n})\n"],"names":["sanitizeConfig","configToJSONSchema","describe","it","config","collections","slug","fields","name","type","required","timestamps","sanitizedConfig","schema","expect","definitions","test","toStrictEqual","additionalProperties","properties","id","someRequiredField","items","title","tabs","label","fieldInUnnamedTab","namedTab","fieldInNamedTab","namedTabWithRequired","customSchema","typescriptSchema","jsonSchema","fileMatch","uri","jsonWithSchema","withCustom"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"convertData.d.ts","sourceRoot":"","sources":["../../src/utilities/convertData.ts"],"names":[],"mappings":"AACA,QAAA,MAAM,oBAAoB,6BASlB,CAAA;AAER,QAAA,MAAM,oBAAoB,yBAA8B,CAAA;AAExD,QAAA,MAAM,kBAAkB,6BAIhB,CAAA;AAER,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAA"}
1
+ {"version":3,"file":"convertData.d.ts","sourceRoot":"","sources":["../../src/utilities/convertData.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,oBAAoB,6BASlB,CAAA;AAER,QAAA,MAAM,oBAAoB,yBAA8B,CAAA;AAExD,QAAA,MAAM,kBAAkB,6BAIhB,CAAA;AAER,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAA"}
@@ -1,4 +1,4 @@
1
- /* eslint-disable no-param-reassign */ const convertArrayToObject = (arr, key)=>arr.reduce((obj, item)=>{
1
+ const convertArrayToObject = (arr, key)=>arr.reduce((obj, item)=>{
2
2
  if (key) {
3
3
  obj[item[key]] = item;
4
4
  return obj;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/convertData.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\nconst convertArrayToObject = (arr, key) =>\n arr.reduce((obj, item) => {\n if (key) {\n obj[item[key]] = item\n return obj\n }\n\n obj[item] = {}\n return obj\n }, {})\n\nconst convertObjectToArray = (arr) => Object.values(arr)\n\nconst convertArrayToHash = (arr, key) =>\n arr.reduce((obj, item, i) => {\n obj[item[key]] = i\n return obj\n }, {})\n\nexport { convertArrayToHash, convertArrayToObject, convertObjectToArray }\n"],"names":["convertArrayToObject","arr","key","reduce","obj","item","convertObjectToArray","Object","values","convertArrayToHash","i"],"mappings":"AAAA,oCAAoC,GACpC,MAAMA,uBAAuB,CAACC,KAAKC,MACjCD,IAAIE,MAAM,CAAC,CAACC,KAAKC;QACf,IAAIH,KAAK;YACPE,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGG;YACjB,OAAOD;QACT;QAEAA,GAAG,CAACC,KAAK,GAAG,CAAC;QACb,OAAOD;IACT,GAAG,CAAC;AAEN,MAAME,uBAAuB,CAACL,MAAQM,OAAOC,MAAM,CAACP;AAEpD,MAAMQ,qBAAqB,CAACR,KAAKC,MAC/BD,IAAIE,MAAM,CAAC,CAACC,KAAKC,MAAMK;QACrBN,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGQ;QACjB,OAAON;IACT,GAAG,CAAC;AAEN,SAASK,kBAAkB,EAAET,oBAAoB,EAAEM,oBAAoB,GAAE"}
1
+ {"version":3,"sources":["../../src/utilities/convertData.ts"],"sourcesContent":["const convertArrayToObject = (arr, key) =>\n arr.reduce((obj, item) => {\n if (key) {\n obj[item[key]] = item\n return obj\n }\n\n obj[item] = {}\n return obj\n }, {})\n\nconst convertObjectToArray = (arr) => Object.values(arr)\n\nconst convertArrayToHash = (arr, key) =>\n arr.reduce((obj, item, i) => {\n obj[item[key]] = i\n return obj\n }, {})\n\nexport { convertArrayToHash, convertArrayToObject, convertObjectToArray }\n"],"names":["convertArrayToObject","arr","key","reduce","obj","item","convertObjectToArray","Object","values","convertArrayToHash","i"],"mappings":"AAAA,MAAMA,uBAAuB,CAACC,KAAKC,MACjCD,IAAIE,MAAM,CAAC,CAACC,KAAKC;QACf,IAAIH,KAAK;YACPE,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGG;YACjB,OAAOD;QACT;QAEAA,GAAG,CAACC,KAAK,GAAG,CAAC;QACb,OAAOD;IACT,GAAG,CAAC;AAEN,MAAME,uBAAuB,CAACL,MAAQM,OAAOC,MAAM,CAACP;AAEpD,MAAMQ,qBAAqB,CAACR,KAAKC,MAC/BD,IAAIE,MAAM,CAAC,CAACC,KAAKC,MAAMK;QACrBN,GAAG,CAACC,IAAI,CAACH,IAAI,CAAC,GAAGQ;QACjB,OAAON;IACT,GAAG,CAAC;AAEN,SAASK,kBAAkB,EAAET,oBAAoB,EAAEM,oBAAoB,GAAE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, entity, operations, req } = args\n const { data, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<TypeWithID & Document> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n ...where,\n and: [\n ...(where.and || []),\n {\n id: {\n equals: id,\n },\n },\n ],\n },\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\n\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({ entityPermission, fields, operation, policiesObj }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if (field.name) {\n if (!mutablePolicies[field.name]) mutablePolicies[field.name] = {}\n\n if (field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: policiesObj[operation]?.permission,\n }\n }\n\n if (field.fields) {\n if (!mutablePolicies[field.name].fields) mutablePolicies[field.name].fields = {}\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) mutablePolicies[field.name].blocks = {}\n\n await Promise.all(\n field.blocks.map(async (block) => {\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if (field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = createAccessPromise({\n access: entity.access[operation],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n policies[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["tabHasName","getEntityPolicies","args","id","type","entity","operations","req","data","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","and","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/utilities/getEntityPolicies.ts"],"sourcesContent":["import type { CollectionPermission, GlobalPermission } from '../auth/types.js'\nimport type { SanitizedCollectionConfig, TypeWithID } from '../collections/config/types.js'\nimport type { Access } from '../config/types.js'\nimport type { FieldAccess } from '../fields/config/types.js'\nimport type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { AllOperations, Document, PayloadRequest, Where } from '../types/index.js'\n\nimport { tabHasName } from '../fields/config/types.js'\n\ntype Args = {\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n id?: number | string\n operations: AllOperations[]\n req: PayloadRequest\n type: 'collection' | 'global'\n}\n\ntype ReturnType<T extends Args> = T['type'] extends 'global'\n ? GlobalPermission\n : CollectionPermission\n\ntype CreateAccessPromise = (args: {\n access: Access | FieldAccess\n accessLevel: 'entity' | 'field'\n disableWhere?: boolean\n operation: AllOperations\n policiesObj: {\n [key: string]: any\n }\n}) => Promise<void>\n\nexport async function getEntityPolicies<T extends Args>(args: T): Promise<ReturnType<T>> {\n const { id, type, entity, operations, req } = args\n const { data, payload, user } = req\n const isLoggedIn = !!user\n\n const policies = {\n fields: {},\n } as ReturnType<T>\n\n let docBeingAccessed\n\n async function getEntityDoc({ where }: { where?: Where } = {}): Promise<Document & TypeWithID> {\n if (entity.slug) {\n if (type === 'global') {\n return payload.findGlobal({\n slug: entity.slug,\n overrideAccess: true,\n req,\n })\n }\n\n if (type === 'collection' && id) {\n if (typeof where === 'object') {\n const paginatedRes = await payload.find({\n collection: entity.slug,\n depth: 0,\n limit: 1,\n overrideAccess: true,\n pagination: false,\n req,\n where: {\n ...where,\n and: [\n ...(where.and || []),\n {\n id: {\n equals: id,\n },\n },\n ],\n },\n })\n\n return paginatedRes?.docs?.[0] || undefined\n }\n\n return payload.findByID({\n id,\n collection: entity.slug,\n depth: 0,\n overrideAccess: true,\n req,\n })\n }\n }\n\n return undefined\n }\n\n const createAccessPromise: CreateAccessPromise = async ({\n access,\n accessLevel,\n disableWhere = false,\n operation,\n policiesObj,\n }) => {\n const mutablePolicies = policiesObj\n\n if (accessLevel === 'field' && docBeingAccessed === undefined) {\n // assign docBeingAccessed first as the promise to avoid multiple calls to getEntityDoc\n docBeingAccessed = getEntityDoc().then((doc) => {\n docBeingAccessed = doc\n })\n }\n // awaiting the promise to ensure docBeingAccessed is assigned before it is used\n await docBeingAccessed\n\n // https://payloadcms.slack.com/archives/C048Z9C2BEX/p1702054928343769\n const accessResult = await access({ id, data, doc: docBeingAccessed, req })\n\n if (typeof accessResult === 'object' && !disableWhere) {\n mutablePolicies[operation] = {\n permission:\n id || type === 'global' ? !!(await getEntityDoc({ where: accessResult })) : true,\n where: accessResult,\n }\n } else if (mutablePolicies[operation]?.permission !== false) {\n mutablePolicies[operation] = {\n permission: !!accessResult,\n }\n }\n }\n\n const executeFieldPolicies = async ({ entityPermission, fields, operation, policiesObj }) => {\n const mutablePolicies = policiesObj.fields\n\n await Promise.all(\n fields.map(async (field) => {\n if (field.name) {\n if (!mutablePolicies[field.name]) mutablePolicies[field.name] = {}\n\n if (field.access && typeof field.access[operation] === 'function') {\n await createAccessPromise({\n access: field.access[operation],\n accessLevel: 'field',\n disableWhere: true,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n } else {\n mutablePolicies[field.name][operation] = {\n permission: policiesObj[operation]?.permission,\n }\n }\n\n if (field.fields) {\n if (!mutablePolicies[field.name].fields) mutablePolicies[field.name].fields = {}\n\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj: mutablePolicies[field.name],\n })\n }\n\n if (field?.blocks) {\n if (!mutablePolicies[field.name]?.blocks) mutablePolicies[field.name].blocks = {}\n\n await Promise.all(\n field.blocks.map(async (block) => {\n if (!mutablePolicies[field.name].blocks?.[block.slug]) {\n mutablePolicies[field.name].blocks[block.slug] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[field.name].blocks[block.slug][operation]) {\n mutablePolicies[field.name].blocks[block.slug][operation] = {\n permission: entityPermission,\n }\n }\n\n await executeFieldPolicies({\n entityPermission,\n fields: block.fields,\n operation,\n policiesObj: mutablePolicies[field.name].blocks[block.slug],\n })\n }),\n )\n }\n } else if (field.fields) {\n await executeFieldPolicies({\n entityPermission,\n fields: field.fields,\n operation,\n policiesObj,\n })\n } else if (field.type === 'tabs') {\n await Promise.all(\n field.tabs.map(async (tab) => {\n if (tabHasName(tab)) {\n if (!mutablePolicies[tab.name]) {\n mutablePolicies[tab.name] = {\n fields: {},\n [operation]: { permission: entityPermission },\n }\n } else if (!mutablePolicies[tab.name][operation]) {\n mutablePolicies[tab.name][operation] = { permission: entityPermission }\n }\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj: mutablePolicies[tab.name],\n })\n } else {\n await executeFieldPolicies({\n entityPermission,\n fields: tab.fields,\n operation,\n policiesObj,\n })\n }\n }),\n )\n }\n }),\n )\n }\n\n await operations.reduce(async (priorOperation, operation) => {\n await priorOperation\n\n let entityAccessPromise: Promise<void>\n\n if (typeof entity.access[operation] === 'function') {\n entityAccessPromise = createAccessPromise({\n access: entity.access[operation],\n accessLevel: 'entity',\n operation,\n policiesObj: policies,\n })\n } else {\n policies[operation] = {\n permission: isLoggedIn,\n }\n }\n\n await entityAccessPromise\n\n await executeFieldPolicies({\n entityPermission: policies[operation].permission,\n fields: entity.fields,\n operation,\n policiesObj: policies,\n })\n }, Promise.resolve())\n\n return policies\n}\n"],"names":["tabHasName","getEntityPolicies","args","id","type","entity","operations","req","data","payload","user","isLoggedIn","policies","fields","docBeingAccessed","getEntityDoc","where","slug","findGlobal","overrideAccess","paginatedRes","find","collection","depth","limit","pagination","and","equals","docs","undefined","findByID","createAccessPromise","access","accessLevel","disableWhere","operation","policiesObj","mutablePolicies","then","doc","accessResult","permission","executeFieldPolicies","entityPermission","Promise","all","map","field","name","blocks","block","tabs","tab","reduce","priorOperation","entityAccessPromise","resolve"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/versions/drafts/replaceWithDraftIfAvailable.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { AccessResult } from '../../config/types.js'\nimport type { FindGlobalVersionsArgs, FindVersionsArgs } from '../../database/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\n\nimport { hasWhereAccessResult } from '../../auth/index.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { docHasTimestamps } from '../../types/index.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { appendVersionToQueryKey } from './appendVersionToQueryKey.js'\n\ntype Arguments<T> = {\n accessResult: AccessResult\n doc: T\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n entityType: 'collection' | 'global'\n overrideAccess: boolean\n req: PayloadRequest\n}\n\nconst replaceWithDraftIfAvailable = async <T extends TypeWithID>({\n accessResult,\n doc,\n entity,\n entityType,\n req,\n}: Arguments<T>): Promise<T> => {\n const { locale } = req\n\n const queryToBuild: Where = {\n and: [\n {\n 'version._status': {\n equals: 'draft',\n },\n },\n ],\n }\n\n if (entityType === 'collection') {\n queryToBuild.and.push({\n parent: {\n equals: doc.id,\n },\n })\n }\n\n if (docHasTimestamps(doc)) {\n queryToBuild.and.push({\n updatedAt: {\n greater_than: doc.updatedAt,\n },\n })\n }\n\n let versionAccessResult\n\n if (hasWhereAccessResult(accessResult)) {\n versionAccessResult = appendVersionToQueryKey(accessResult)\n }\n\n const findVersionsArgs: FindVersionsArgs & FindGlobalVersionsArgs = {\n collection: entity.slug,\n global: entity.slug,\n limit: 1,\n locale,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: combineQueries(queryToBuild, versionAccessResult),\n }\n\n let versionDocs\n if (entityType === 'global') {\n versionDocs = (await req.payload.db.findGlobalVersions<T>(findVersionsArgs)).docs\n } else {\n versionDocs = (await req.payload.db.findVersions<T>(findVersionsArgs)).docs\n }\n\n let draft = versionDocs[0]\n\n if (!draft) {\n return doc\n }\n\n draft = JSON.parse(JSON.stringify(draft))\n draft = sanitizeInternalFields(draft)\n\n // Patch globalType onto version doc\n if (entityType === 'global' && 'globalType' in doc) {\n draft.version.globalType = doc.globalType\n }\n\n // Disregard all other draft content at this point,\n // Only interested in the version itself.\n // Operations will handle firing hooks, etc.\n return {\n id: doc.id,\n ...draft.version,\n createdAt: draft.createdAt,\n updatedAt: draft.updatedAt,\n }\n}\n\nexport default replaceWithDraftIfAvailable\n"],"names":["hasWhereAccessResult","combineQueries","docHasTimestamps","sanitizeInternalFields","appendVersionToQueryKey","replaceWithDraftIfAvailable","accessResult","doc","entity","entityType","req","locale","queryToBuild","and","equals","push","parent","id","updatedAt","greater_than","versionAccessResult","findVersionsArgs","collection","slug","global","limit","pagination","sort","where","versionDocs","payload","db","findGlobalVersions","docs","findVersions","draft","JSON","parse","stringify","version","globalType","createdAt"],"mappings":"AAMA,SAASA,oBAAoB,QAAQ,sBAAqB;AAC1D,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,gBAAgB,QAAQ,uBAAsB;AACvD,OAAOC,4BAA4B,4CAA2C;AAC9E,SAASC,uBAAuB,QAAQ,+BAA8B;AAWtE,MAAMC,8BAA8B,OAA6B,EAC/DC,YAAY,EACZC,GAAG,EACHC,MAAM,EACNC,UAAU,EACVC,GAAG,EACU;IACb,MAAM,EAAEC,MAAM,EAAE,GAAGD;IAEnB,MAAME,eAAsB;QAC1BC,KAAK;YACH;gBACE,mBAAmB;oBACjBC,QAAQ;gBACV;YACF;SACD;IACH;IAEA,IAAIL,eAAe,cAAc;QAC/BG,aAAaC,GAAG,CAACE,IAAI,CAAC;YACpBC,QAAQ;gBACNF,QAAQP,IAAIU,EAAE;YAChB;QACF;IACF;IAEA,IAAIf,iBAAiBK,MAAM;QACzBK,aAAaC,GAAG,CAACE,IAAI,CAAC;YACpBG,WAAW;gBACTC,cAAcZ,IAAIW,SAAS;YAC7B;QACF;IACF;IAEA,IAAIE;IAEJ,IAAIpB,qBAAqBM,eAAe;QACtCc,sBAAsBhB,wBAAwBE;IAChD;IAEA,MAAMe,mBAA8D;QAClEC,YAAYd,OAAOe,IAAI;QACvBC,QAAQhB,OAAOe,IAAI;QACnBE,OAAO;QACPd;QACAe,YAAY;QACZhB;QACAiB,MAAM;QACNC,OAAO3B,eAAeW,cAAcQ;IACtC;IAEA,IAAIS;IACJ,IAAIpB,eAAe,UAAU;QAC3BoB,cAAc,AAAC,CAAA,MAAMnB,IAAIoB,OAAO,CAACC,EAAE,CAACC,kBAAkB,CAAIX,iBAAgB,EAAGY,IAAI;IACnF,OAAO;QACLJ,cAAc,AAAC,CAAA,MAAMnB,IAAIoB,OAAO,CAACC,EAAE,CAACG,YAAY,CAAIb,iBAAgB,EAAGY,IAAI;IAC7E;IAEA,IAAIE,QAAQN,WAAW,CAAC,EAAE;IAE1B,IAAI,CAACM,OAAO;QACV,OAAO5B;IACT;IAEA4B,QAAQC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACH;IAClCA,QAAQhC,uBAAuBgC;IAE/B,oCAAoC;IACpC,IAAI1B,eAAe,YAAY,gBAAgBF,KAAK;QAClD4B,MAAMI,OAAO,CAACC,UAAU,GAAGjC,IAAIiC,UAAU;IAC3C;IAEA,mDAAmD;IACnD,yCAAyC;IACzC,4CAA4C;IAC5C,OAAO;QACLvB,IAAIV,IAAIU,EAAE;QACV,GAAGkB,MAAMI,OAAO;QAChBE,WAAWN,MAAMM,SAAS;QAC1BvB,WAAWiB,MAAMjB,SAAS;IAC5B;AACF;AAEA,eAAeb,4BAA2B"}
1
+ {"version":3,"sources":["../../../src/versions/drafts/replaceWithDraftIfAvailable.ts"],"sourcesContent":["import type { SanitizedCollectionConfig, TypeWithID } from '../../collections/config/types.js'\nimport type { AccessResult } from '../../config/types.js'\nimport type { FindGlobalVersionsArgs, FindVersionsArgs } from '../../database/types.js'\nimport type { SanitizedGlobalConfig } from '../../globals/config/types.js'\nimport type { PayloadRequest, Where } from '../../types/index.js'\n\nimport { hasWhereAccessResult } from '../../auth/index.js'\nimport { combineQueries } from '../../database/combineQueries.js'\nimport { docHasTimestamps } from '../../types/index.js'\nimport sanitizeInternalFields from '../../utilities/sanitizeInternalFields.js'\nimport { appendVersionToQueryKey } from './appendVersionToQueryKey.js'\n\ntype Arguments<T> = {\n accessResult: AccessResult\n doc: T\n entity: SanitizedCollectionConfig | SanitizedGlobalConfig\n entityType: 'collection' | 'global'\n overrideAccess: boolean\n req: PayloadRequest\n}\n\nconst replaceWithDraftIfAvailable = async <T extends TypeWithID>({\n accessResult,\n doc,\n entity,\n entityType,\n req,\n}: Arguments<T>): Promise<T> => {\n const { locale } = req\n\n const queryToBuild: Where = {\n and: [\n {\n 'version._status': {\n equals: 'draft',\n },\n },\n ],\n }\n\n if (entityType === 'collection') {\n queryToBuild.and.push({\n parent: {\n equals: doc.id,\n },\n })\n }\n\n if (docHasTimestamps(doc)) {\n queryToBuild.and.push({\n updatedAt: {\n greater_than: doc.updatedAt,\n },\n })\n }\n\n let versionAccessResult\n\n if (hasWhereAccessResult(accessResult)) {\n versionAccessResult = appendVersionToQueryKey(accessResult)\n }\n\n const findVersionsArgs: FindGlobalVersionsArgs & FindVersionsArgs = {\n collection: entity.slug,\n global: entity.slug,\n limit: 1,\n locale,\n pagination: false,\n req,\n sort: '-updatedAt',\n where: combineQueries(queryToBuild, versionAccessResult),\n }\n\n let versionDocs\n if (entityType === 'global') {\n versionDocs = (await req.payload.db.findGlobalVersions<T>(findVersionsArgs)).docs\n } else {\n versionDocs = (await req.payload.db.findVersions<T>(findVersionsArgs)).docs\n }\n\n let draft = versionDocs[0]\n\n if (!draft) {\n return doc\n }\n\n draft = JSON.parse(JSON.stringify(draft))\n draft = sanitizeInternalFields(draft)\n\n // Patch globalType onto version doc\n if (entityType === 'global' && 'globalType' in doc) {\n draft.version.globalType = doc.globalType\n }\n\n // Disregard all other draft content at this point,\n // Only interested in the version itself.\n // Operations will handle firing hooks, etc.\n return {\n id: doc.id,\n ...draft.version,\n createdAt: draft.createdAt,\n updatedAt: draft.updatedAt,\n }\n}\n\nexport default replaceWithDraftIfAvailable\n"],"names":["hasWhereAccessResult","combineQueries","docHasTimestamps","sanitizeInternalFields","appendVersionToQueryKey","replaceWithDraftIfAvailable","accessResult","doc","entity","entityType","req","locale","queryToBuild","and","equals","push","parent","id","updatedAt","greater_than","versionAccessResult","findVersionsArgs","collection","slug","global","limit","pagination","sort","where","versionDocs","payload","db","findGlobalVersions","docs","findVersions","draft","JSON","parse","stringify","version","globalType","createdAt"],"mappings":"AAMA,SAASA,oBAAoB,QAAQ,sBAAqB;AAC1D,SAASC,cAAc,QAAQ,mCAAkC;AACjE,SAASC,gBAAgB,QAAQ,uBAAsB;AACvD,OAAOC,4BAA4B,4CAA2C;AAC9E,SAASC,uBAAuB,QAAQ,+BAA8B;AAWtE,MAAMC,8BAA8B,OAA6B,EAC/DC,YAAY,EACZC,GAAG,EACHC,MAAM,EACNC,UAAU,EACVC,GAAG,EACU;IACb,MAAM,EAAEC,MAAM,EAAE,GAAGD;IAEnB,MAAME,eAAsB;QAC1BC,KAAK;YACH;gBACE,mBAAmB;oBACjBC,QAAQ;gBACV;YACF;SACD;IACH;IAEA,IAAIL,eAAe,cAAc;QAC/BG,aAAaC,GAAG,CAACE,IAAI,CAAC;YACpBC,QAAQ;gBACNF,QAAQP,IAAIU,EAAE;YAChB;QACF;IACF;IAEA,IAAIf,iBAAiBK,MAAM;QACzBK,aAAaC,GAAG,CAACE,IAAI,CAAC;YACpBG,WAAW;gBACTC,cAAcZ,IAAIW,SAAS;YAC7B;QACF;IACF;IAEA,IAAIE;IAEJ,IAAIpB,qBAAqBM,eAAe;QACtCc,sBAAsBhB,wBAAwBE;IAChD;IAEA,MAAMe,mBAA8D;QAClEC,YAAYd,OAAOe,IAAI;QACvBC,QAAQhB,OAAOe,IAAI;QACnBE,OAAO;QACPd;QACAe,YAAY;QACZhB;QACAiB,MAAM;QACNC,OAAO3B,eAAeW,cAAcQ;IACtC;IAEA,IAAIS;IACJ,IAAIpB,eAAe,UAAU;QAC3BoB,cAAc,AAAC,CAAA,MAAMnB,IAAIoB,OAAO,CAACC,EAAE,CAACC,kBAAkB,CAAIX,iBAAgB,EAAGY,IAAI;IACnF,OAAO;QACLJ,cAAc,AAAC,CAAA,MAAMnB,IAAIoB,OAAO,CAACC,EAAE,CAACG,YAAY,CAAIb,iBAAgB,EAAGY,IAAI;IAC7E;IAEA,IAAIE,QAAQN,WAAW,CAAC,EAAE;IAE1B,IAAI,CAACM,OAAO;QACV,OAAO5B;IACT;IAEA4B,QAAQC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACH;IAClCA,QAAQhC,uBAAuBgC;IAE/B,oCAAoC;IACpC,IAAI1B,eAAe,YAAY,gBAAgBF,KAAK;QAClD4B,MAAMI,OAAO,CAACC,UAAU,GAAGjC,IAAIiC,UAAU;IAC3C;IAEA,mDAAmD;IACnD,yCAAyC;IACzC,4CAA4C;IAC5C,OAAO;QACLvB,IAAIV,IAAIU,EAAE;QACV,GAAGkB,MAAMI,OAAO;QAChBE,WAAWN,MAAMM,SAAS;QAC1BvB,WAAWiB,MAAMjB,SAAS;IAC5B;AACF;AAEA,eAAeb,4BAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"getLatestGlobalVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestGlobalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAIjF,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,sBAAsB,mDAOhC,IAAI,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAwC5D,CAAA"}
1
+ {"version":3,"file":"getLatestGlobalVersion.d.ts","sourceRoot":"","sources":["../../src/versions/getLatestGlobalVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAIjF,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,cAAc,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,eAAO,MAAM,sBAAsB,mDAOhC,IAAI,KAAG,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAE,CAuC5D,CAAA"}
@@ -2,7 +2,6 @@ import { docHasTimestamps } from '../types/index.js';
2
2
  export const getLatestGlobalVersion = async ({ slug, config, locale, payload, req, where })=>{
3
3
  let latestVersion;
4
4
  if (config.versions?.drafts) {
5
- // eslint-disable-next-line prefer-destructuring
6
5
  latestVersion = (await payload.db.findGlobalVersions({
7
6
  global: slug,
8
7
  limit: 1,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/versions/getLatestGlobalVersion.ts"],"sourcesContent":["import type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { Document, Payload, PayloadRequest, Where } from '../types/index.js'\n\nimport { docHasTimestamps } from '../types/index.js'\n\ntype Args = {\n config: SanitizedGlobalConfig\n locale?: string\n payload: Payload\n req?: PayloadRequest\n slug: string\n where: Where\n}\n\nexport const getLatestGlobalVersion = async ({\n slug,\n config,\n locale,\n payload,\n req,\n where,\n}: Args): Promise<{ global: Document; globalExists: boolean }> => {\n let latestVersion\n\n if (config.versions?.drafts) {\n // eslint-disable-next-line prefer-destructuring\n latestVersion = (\n await payload.db.findGlobalVersions({\n global: slug,\n limit: 1,\n locale,\n pagination: false,\n req,\n sort: '-updatedAt',\n })\n ).docs[0]\n }\n\n const global = await payload.db.findGlobal({\n slug,\n locale,\n req,\n where,\n })\n const globalExists = Boolean(global)\n\n if (!latestVersion || (docHasTimestamps(global) && latestVersion.updatedAt < global.updatedAt)) {\n return {\n global,\n globalExists,\n }\n }\n\n return {\n global: {\n ...latestVersion.version,\n createdAt: latestVersion.createdAt,\n updatedAt: latestVersion.updatedAt,\n },\n globalExists,\n }\n}\n"],"names":["docHasTimestamps","getLatestGlobalVersion","slug","config","locale","payload","req","where","latestVersion","versions","drafts","db","findGlobalVersions","global","limit","pagination","sort","docs","findGlobal","globalExists","Boolean","updatedAt","version","createdAt"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,oBAAmB;AAWpD,OAAO,MAAMC,yBAAyB,OAAO,EAC3CC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,KAAK,EACA;IACL,IAAIC;IAEJ,IAAIL,OAAOM,QAAQ,EAAEC,QAAQ;QAC3B,gDAAgD;QAChDF,gBAAgB,AACd,CAAA,MAAMH,QAAQM,EAAE,CAACC,kBAAkB,CAAC;YAClCC,QAAQX;YACRY,OAAO;YACPV;YACAW,YAAY;YACZT;YACAU,MAAM;QACR,EAAC,EACDC,IAAI,CAAC,EAAE;IACX;IAEA,MAAMJ,SAAS,MAAMR,QAAQM,EAAE,CAACO,UAAU,CAAC;QACzChB;QACAE;QACAE;QACAC;IACF;IACA,MAAMY,eAAeC,QAAQP;IAE7B,IAAI,CAACL,iBAAkBR,iBAAiBa,WAAWL,cAAca,SAAS,GAAGR,OAAOQ,SAAS,EAAG;QAC9F,OAAO;YACLR;YACAM;QACF;IACF;IAEA,OAAO;QACLN,QAAQ;YACN,GAAGL,cAAcc,OAAO;YACxBC,WAAWf,cAAce,SAAS;YAClCF,WAAWb,cAAca,SAAS;QACpC;QACAF;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/versions/getLatestGlobalVersion.ts"],"sourcesContent":["import type { SanitizedGlobalConfig } from '../globals/config/types.js'\nimport type { Document, Payload, PayloadRequest, Where } from '../types/index.js'\n\nimport { docHasTimestamps } from '../types/index.js'\n\ntype Args = {\n config: SanitizedGlobalConfig\n locale?: string\n payload: Payload\n req?: PayloadRequest\n slug: string\n where: Where\n}\n\nexport const getLatestGlobalVersion = async ({\n slug,\n config,\n locale,\n payload,\n req,\n where,\n}: Args): Promise<{ global: Document; globalExists: boolean }> => {\n let latestVersion\n\n if (config.versions?.drafts) {\n latestVersion = (\n await payload.db.findGlobalVersions({\n global: slug,\n limit: 1,\n locale,\n pagination: false,\n req,\n sort: '-updatedAt',\n })\n ).docs[0]\n }\n\n const global = await payload.db.findGlobal({\n slug,\n locale,\n req,\n where,\n })\n const globalExists = Boolean(global)\n\n if (!latestVersion || (docHasTimestamps(global) && latestVersion.updatedAt < global.updatedAt)) {\n return {\n global,\n globalExists,\n }\n }\n\n return {\n global: {\n ...latestVersion.version,\n createdAt: latestVersion.createdAt,\n updatedAt: latestVersion.updatedAt,\n },\n globalExists,\n }\n}\n"],"names":["docHasTimestamps","getLatestGlobalVersion","slug","config","locale","payload","req","where","latestVersion","versions","drafts","db","findGlobalVersions","global","limit","pagination","sort","docs","findGlobal","globalExists","Boolean","updatedAt","version","createdAt"],"mappings":"AAGA,SAASA,gBAAgB,QAAQ,oBAAmB;AAWpD,OAAO,MAAMC,yBAAyB,OAAO,EAC3CC,IAAI,EACJC,MAAM,EACNC,MAAM,EACNC,OAAO,EACPC,GAAG,EACHC,KAAK,EACA;IACL,IAAIC;IAEJ,IAAIL,OAAOM,QAAQ,EAAEC,QAAQ;QAC3BF,gBAAgB,AACd,CAAA,MAAMH,QAAQM,EAAE,CAACC,kBAAkB,CAAC;YAClCC,QAAQX;YACRY,OAAO;YACPV;YACAW,YAAY;YACZT;YACAU,MAAM;QACR,EAAC,EACDC,IAAI,CAAC,EAAE;IACX;IAEA,MAAMJ,SAAS,MAAMR,QAAQM,EAAE,CAACO,UAAU,CAAC;QACzChB;QACAE;QACAE;QACAC;IACF;IACA,MAAMY,eAAeC,QAAQP;IAE7B,IAAI,CAACL,iBAAkBR,iBAAiBa,WAAWL,cAAca,SAAS,GAAGR,OAAOQ,SAAS,EAAG;QAC9F,OAAO;YACLR;YACAM;QACF;IACF;IAEA,OAAO;QACLN,QAAQ;YACN,GAAGL,cAAcc,OAAO;YACxBC,WAAWf,cAAce,SAAS;YAClCF,WAAWb,cAAca,SAAS;QACpC;QACAF;IACF;AACF,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "payload",
3
- "version": "3.0.0-beta.60",
3
+ "version": "3.0.0-beta.62",
4
4
  "description": "Node, React, Headless CMS and Application Framework built on Next.js",
5
5
  "keywords": [
6
6
  "admin panel",
@@ -98,7 +98,7 @@
98
98
  "scmp": "2.1.0",
99
99
  "ts-essentials": "7.0.3",
100
100
  "uuid": "10.0.0",
101
- "@payloadcms/translations": "3.0.0-beta.60"
101
+ "@payloadcms/translations": "3.0.0-beta.62"
102
102
  },
103
103
  "devDependencies": {
104
104
  "@hyrious/esbuild-plugin-commonjs": "^0.2.4",
@@ -114,14 +114,14 @@
114
114
  "@types/uuid": "10.0.0",
115
115
  "copyfiles": "2.4.1",
116
116
  "cross-env": "7.0.3",
117
- "esbuild": "^0.21.4",
117
+ "esbuild": "0.23.0",
118
118
  "graphql-http": "^1.22.0",
119
119
  "rimraf": "3.0.2",
120
120
  "sharp": "0.32.6",
121
121
  "@payloadcms/eslint-config": "3.0.0-beta.59"
122
122
  },
123
123
  "peerDependencies": {
124
- "@swc/core": "^1.6.1",
124
+ "@swc/core": "^1.6.13",
125
125
  "graphql": "^16.8.1"
126
126
  },
127
127
  "peerDependenciesMeta": {