payload 3.23.0 → 3.24.0-canary.10637cd

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 (108) hide show
  1. package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
  2. package/dist/bin/generateImportMap/iterateConfig.js +15 -1
  3. package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
  4. package/dist/bin/generateImportMap/iterateFields.js +1 -1
  5. package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
  6. package/dist/collections/config/sanitize.d.ts +1 -1
  7. package/dist/collections/config/sanitize.d.ts.map +1 -1
  8. package/dist/collections/config/sanitize.js +2 -7
  9. package/dist/collections/config/sanitize.js.map +1 -1
  10. package/dist/config/client.d.ts +13 -0
  11. package/dist/config/client.d.ts.map +1 -1
  12. package/dist/config/client.js +12 -0
  13. package/dist/config/client.js.map +1 -1
  14. package/dist/config/sanitize.d.ts.map +1 -1
  15. package/dist/config/sanitize.js +40 -6
  16. package/dist/config/sanitize.js.map +1 -1
  17. package/dist/config/types.d.ts +4 -2
  18. package/dist/config/types.d.ts.map +1 -1
  19. package/dist/config/types.js.map +1 -1
  20. package/dist/database/getLocalizedPaths.d.ts.map +1 -1
  21. package/dist/database/getLocalizedPaths.js +7 -1
  22. package/dist/database/getLocalizedPaths.js.map +1 -1
  23. package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
  24. package/dist/database/queryValidation/validateSearchParams.js +1 -1
  25. package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
  26. package/dist/fields/config/client.d.ts +7 -1
  27. package/dist/fields/config/client.d.ts.map +1 -1
  28. package/dist/fields/config/client.js +75 -53
  29. package/dist/fields/config/client.js.map +1 -1
  30. package/dist/fields/config/sanitize.d.ts.map +1 -1
  31. package/dist/fields/config/sanitize.js +7 -1
  32. package/dist/fields/config/sanitize.js.map +1 -1
  33. package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
  34. package/dist/fields/config/sanitizeJoinField.js +1 -0
  35. package/dist/fields/config/sanitizeJoinField.js.map +1 -1
  36. package/dist/fields/config/types.d.ts +30 -7
  37. package/dist/fields/config/types.d.ts.map +1 -1
  38. package/dist/fields/config/types.js.map +1 -1
  39. package/dist/fields/hooks/afterChange/promise.d.ts +2 -1
  40. package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
  41. package/dist/fields/hooks/afterChange/promise.js +4 -2
  42. package/dist/fields/hooks/afterChange/promise.js.map +1 -1
  43. package/dist/fields/hooks/afterChange/traverseFields.d.ts +2 -1
  44. package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
  45. package/dist/fields/hooks/afterChange/traverseFields.js +3 -2
  46. package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
  47. package/dist/fields/hooks/afterRead/promise.d.ts +2 -1
  48. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  49. package/dist/fields/hooks/afterRead/promise.js +7 -3
  50. package/dist/fields/hooks/afterRead/promise.js.map +1 -1
  51. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  52. package/dist/fields/hooks/afterRead/traverseFields.js +1 -0
  53. package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
  54. package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
  55. package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
  56. package/dist/fields/hooks/beforeChange/promise.js +3 -2
  57. package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
  58. package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
  59. package/dist/fields/hooks/beforeChange/traverseFields.js +1 -0
  60. package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
  61. package/dist/fields/hooks/beforeDuplicate/promise.d.ts +2 -1
  62. package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
  63. package/dist/fields/hooks/beforeDuplicate/promise.js +5 -3
  64. package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
  65. package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
  66. package/dist/fields/hooks/beforeDuplicate/traverseFields.js +2 -1
  67. package/dist/fields/hooks/beforeDuplicate/traverseFields.js.map +1 -1
  68. package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -1
  69. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  70. package/dist/fields/hooks/beforeValidate/promise.js +3 -2
  71. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  72. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  73. package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -1
  74. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  75. package/dist/globals/config/sanitize.d.ts +1 -1
  76. package/dist/globals/config/sanitize.d.ts.map +1 -1
  77. package/dist/globals/config/sanitize.js +2 -2
  78. package/dist/globals/config/sanitize.js.map +1 -1
  79. package/dist/index.d.ts +9 -1
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +10 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/types/index.d.ts +3 -0
  84. package/dist/types/index.d.ts.map +1 -1
  85. package/dist/types/index.js.map +1 -1
  86. package/dist/uploads/types.d.ts +8 -0
  87. package/dist/uploads/types.d.ts.map +1 -1
  88. package/dist/uploads/types.js.map +1 -1
  89. package/dist/utilities/configToJSONSchema.d.ts +2 -1
  90. package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
  91. package/dist/utilities/configToJSONSchema.js +48 -5
  92. package/dist/utilities/configToJSONSchema.js.map +1 -1
  93. package/dist/utilities/fieldSchemaToJSON.d.ts +2 -1
  94. package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
  95. package/dist/utilities/fieldSchemaToJSON.js +9 -8
  96. package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
  97. package/dist/utilities/flattenAllFields.d.ts +4 -1
  98. package/dist/utilities/flattenAllFields.d.ts.map +1 -1
  99. package/dist/utilities/flattenAllFields.js +34 -9
  100. package/dist/utilities/flattenAllFields.js.map +1 -1
  101. package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
  102. package/dist/utilities/getEntityPolicies.js +4 -2
  103. package/dist/utilities/getEntityPolicies.js.map +1 -1
  104. package/dist/utilities/traverseFields.d.ts +12 -1
  105. package/dist/utilities/traverseFields.d.ts.map +1 -1
  106. package/dist/utilities/traverseFields.js +65 -8
  107. package/dist/utilities/traverseFields.js.map +1 -1
  108. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"iterateConfig.d.ts","sourceRoot":"","sources":["../../../src/bin/generateImportMap/iterateConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAK5E,wBAAgB,aAAa,CAAC,EAC5B,cAAc,EACd,OAAO,EACP,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;IACD,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAA;CACjB,QAkFA"}
1
+ {"version":3,"file":"iterateConfig.d.ts","sourceRoot":"","sources":["../../../src/bin/generateImportMap/iterateConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAM5E,wBAAgB,aAAa,CAAC,EAC5B,cAAc,EACd,OAAO,EACP,MAAM,EACN,SAAS,EACT,OAAO,GACR,EAAE;IACD,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,OAAO,EAAE,OAAO,CAAA;CACjB,QAgGA"}
@@ -1,4 +1,5 @@
1
- /* eslint-disable @typescript-eslint/no-unused-expressions */ import { iterateCollections } from './iterateCollections.js';
1
+ import { iterateCollections } from './iterateCollections.js';
2
+ import { genImportMapIterateFields } from './iterateFields.js';
2
3
  import { iterateGlobals } from './iterateGlobals.js';
3
4
  export function iterateConfig({ addToImportMap, baseDir, config, importMap, imports }) {
4
5
  iterateCollections({
@@ -17,6 +18,19 @@ export function iterateConfig({ addToImportMap, baseDir, config, importMap, impo
17
18
  importMap,
18
19
  imports
19
20
  });
21
+ if (config?.blocks) {
22
+ const blocks = Object.values(config.blocks);
23
+ if (blocks?.length) {
24
+ genImportMapIterateFields({
25
+ addToImportMap,
26
+ baseDir,
27
+ config,
28
+ fields: blocks,
29
+ importMap,
30
+ imports
31
+ });
32
+ }
33
+ }
20
34
  if (typeof config.admin?.avatar === 'object') {
21
35
  addToImportMap(config.admin?.avatar?.Component);
22
36
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/bin/generateImportMap/iterateConfig.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport type { AdminViewConfig } from '../../admin/views/types.js'\nimport type { SanitizedConfig } from '../../config/types.js'\nimport type { AddToImportMap, Imports, InternalImportMap } from './index.js'\n\nimport { iterateCollections } from './iterateCollections.js'\nimport { iterateGlobals } from './iterateGlobals.js'\n\nexport function iterateConfig({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n}: {\n addToImportMap: AddToImportMap\n baseDir: string\n config: SanitizedConfig\n importMap: InternalImportMap\n imports: Imports\n}) {\n iterateCollections({\n addToImportMap,\n baseDir,\n collections: config.collections,\n config,\n importMap,\n imports,\n })\n\n iterateGlobals({\n addToImportMap,\n baseDir,\n config,\n globals: config.globals,\n importMap,\n imports,\n })\n\n if (typeof config.admin?.avatar === 'object') {\n addToImportMap(config.admin?.avatar?.Component)\n }\n\n addToImportMap(config.admin?.components?.Nav)\n addToImportMap(config.admin?.components?.header)\n addToImportMap(config.admin?.components?.logout?.Button)\n addToImportMap(config.admin?.components?.graphics?.Icon)\n addToImportMap(config.admin?.components?.graphics?.Logo)\n\n addToImportMap(config.admin?.components?.actions)\n addToImportMap(config.admin?.components?.afterDashboard)\n addToImportMap(config.admin?.components?.afterLogin)\n addToImportMap(config.admin?.components?.afterNavLinks)\n addToImportMap(config.admin?.components?.beforeDashboard)\n addToImportMap(config.admin?.components?.beforeLogin)\n addToImportMap(config.admin?.components?.beforeNavLinks)\n\n addToImportMap(config.admin?.components?.providers)\n\n if (config.admin?.components?.views) {\n if (Object.keys(config.admin?.components?.views)?.length) {\n for (const key in config.admin?.components?.views) {\n const adminViewConfig: AdminViewConfig = config.admin?.components?.views[key]\n addToImportMap(adminViewConfig?.Component)\n }\n }\n }\n\n if (config?.admin?.importMap?.generators?.length) {\n for (const generator of config.admin.importMap.generators) {\n generator({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n }\n }\n\n if (config?.admin?.dependencies) {\n for (const key in config.admin.dependencies) {\n const dependency = config.admin.dependencies[key]\n addToImportMap(dependency.path)\n }\n }\n\n /*\n if (\n config?.editor &&\n typeof config.editor === 'object' &&\n config.editor.generateImportMap &&\n typeof config.editor.generateImportMap === 'function'\n ) {\n config.editor.generateImportMap({\n addToImportMap,\n baseDir,\n componentMap,\n config,\n importMap,\n })\n }*/ // No need to do that here since in the sanitized editor config, this root editor is already added to the field editor - and we already process that in iterateFields\n}\n"],"names":["iterateCollections","iterateGlobals","iterateConfig","addToImportMap","baseDir","config","importMap","imports","collections","globals","admin","avatar","Component","components","Nav","header","logout","Button","graphics","Icon","Logo","actions","afterDashboard","afterLogin","afterNavLinks","beforeDashboard","beforeLogin","beforeNavLinks","providers","views","Object","keys","length","key","adminViewConfig","generators","generator","dependencies","dependency","path"],"mappings":"AAAA,2DAA2D,GAK3D,SAASA,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,cAAc,QAAQ,sBAAqB;AAEpD,OAAO,SAASC,cAAc,EAC5BC,cAAc,EACdC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,OAAO,EAOR;IACCP,mBAAmB;QACjBG;QACAC;QACAI,aAAaH,OAAOG,WAAW;QAC/BH;QACAC;QACAC;IACF;IAEAN,eAAe;QACbE;QACAC;QACAC;QACAI,SAASJ,OAAOI,OAAO;QACvBH;QACAC;IACF;IAEA,IAAI,OAAOF,OAAOK,KAAK,EAAEC,WAAW,UAAU;QAC5CR,eAAeE,OAAOK,KAAK,EAAEC,QAAQC;IACvC;IAEAT,eAAeE,OAAOK,KAAK,EAAEG,YAAYC;IACzCX,eAAeE,OAAOK,KAAK,EAAEG,YAAYE;IACzCZ,eAAeE,OAAOK,KAAK,EAAEG,YAAYG,QAAQC;IACjDd,eAAeE,OAAOK,KAAK,EAAEG,YAAYK,UAAUC;IACnDhB,eAAeE,OAAOK,KAAK,EAAEG,YAAYK,UAAUE;IAEnDjB,eAAeE,OAAOK,KAAK,EAAEG,YAAYQ;IACzClB,eAAeE,OAAOK,KAAK,EAAEG,YAAYS;IACzCnB,eAAeE,OAAOK,KAAK,EAAEG,YAAYU;IACzCpB,eAAeE,OAAOK,KAAK,EAAEG,YAAYW;IACzCrB,eAAeE,OAAOK,KAAK,EAAEG,YAAYY;IACzCtB,eAAeE,OAAOK,KAAK,EAAEG,YAAYa;IACzCvB,eAAeE,OAAOK,KAAK,EAAEG,YAAYc;IAEzCxB,eAAeE,OAAOK,KAAK,EAAEG,YAAYe;IAEzC,IAAIvB,OAAOK,KAAK,EAAEG,YAAYgB,OAAO;QACnC,IAAIC,OAAOC,IAAI,CAAC1B,OAAOK,KAAK,EAAEG,YAAYgB,QAAQG,QAAQ;YACxD,IAAK,MAAMC,OAAO5B,OAAOK,KAAK,EAAEG,YAAYgB,MAAO;gBACjD,MAAMK,kBAAmC7B,OAAOK,KAAK,EAAEG,YAAYgB,KAAK,CAACI,IAAI;gBAC7E9B,eAAe+B,iBAAiBtB;YAClC;QACF;IACF;IAEA,IAAIP,QAAQK,OAAOJ,WAAW6B,YAAYH,QAAQ;QAChD,KAAK,MAAMI,aAAa/B,OAAOK,KAAK,CAACJ,SAAS,CAAC6B,UAAU,CAAE;YACzDC,UAAU;gBACRjC;gBACAC;gBACAC;gBACAC;gBACAC;YACF;QACF;IACF;IAEA,IAAIF,QAAQK,OAAO2B,cAAc;QAC/B,IAAK,MAAMJ,OAAO5B,OAAOK,KAAK,CAAC2B,YAAY,CAAE;YAC3C,MAAMC,aAAajC,OAAOK,KAAK,CAAC2B,YAAY,CAACJ,IAAI;YACjD9B,eAAemC,WAAWC,IAAI;QAChC;IACF;AAEA;;;;;;;;;;;;;;GAcC,GAAG,qKAAqK;AAC3K"}
1
+ {"version":3,"sources":["../../../src/bin/generateImportMap/iterateConfig.ts"],"sourcesContent":["import type { AdminViewConfig } from '../../admin/views/types.js'\nimport type { SanitizedConfig } from '../../config/types.js'\nimport type { AddToImportMap, Imports, InternalImportMap } from './index.js'\n\nimport { iterateCollections } from './iterateCollections.js'\nimport { genImportMapIterateFields } from './iterateFields.js'\nimport { iterateGlobals } from './iterateGlobals.js'\n\nexport function iterateConfig({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n}: {\n addToImportMap: AddToImportMap\n baseDir: string\n config: SanitizedConfig\n importMap: InternalImportMap\n imports: Imports\n}) {\n iterateCollections({\n addToImportMap,\n baseDir,\n collections: config.collections,\n config,\n importMap,\n imports,\n })\n\n iterateGlobals({\n addToImportMap,\n baseDir,\n config,\n globals: config.globals,\n importMap,\n imports,\n })\n\n if (config?.blocks) {\n const blocks = Object.values(config.blocks)\n if (blocks?.length) {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: blocks,\n importMap,\n imports,\n })\n }\n }\n\n if (typeof config.admin?.avatar === 'object') {\n addToImportMap(config.admin?.avatar?.Component)\n }\n\n addToImportMap(config.admin?.components?.Nav)\n addToImportMap(config.admin?.components?.header)\n addToImportMap(config.admin?.components?.logout?.Button)\n addToImportMap(config.admin?.components?.graphics?.Icon)\n addToImportMap(config.admin?.components?.graphics?.Logo)\n\n addToImportMap(config.admin?.components?.actions)\n addToImportMap(config.admin?.components?.afterDashboard)\n addToImportMap(config.admin?.components?.afterLogin)\n addToImportMap(config.admin?.components?.afterNavLinks)\n addToImportMap(config.admin?.components?.beforeDashboard)\n addToImportMap(config.admin?.components?.beforeLogin)\n addToImportMap(config.admin?.components?.beforeNavLinks)\n\n addToImportMap(config.admin?.components?.providers)\n\n if (config.admin?.components?.views) {\n if (Object.keys(config.admin?.components?.views)?.length) {\n for (const key in config.admin?.components?.views) {\n const adminViewConfig: AdminViewConfig = config.admin?.components?.views[key]\n addToImportMap(adminViewConfig?.Component)\n }\n }\n }\n\n if (config?.admin?.importMap?.generators?.length) {\n for (const generator of config.admin.importMap.generators) {\n generator({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n }\n }\n\n if (config?.admin?.dependencies) {\n for (const key in config.admin.dependencies) {\n const dependency = config.admin.dependencies[key]\n addToImportMap(dependency.path)\n }\n }\n\n /*\n if (\n config?.editor &&\n typeof config.editor === 'object' &&\n config.editor.generateImportMap &&\n typeof config.editor.generateImportMap === 'function'\n ) {\n config.editor.generateImportMap({\n addToImportMap,\n baseDir,\n componentMap,\n config,\n importMap,\n })\n }*/ // No need to do that here since in the sanitized editor config, this root editor is already added to the field editor - and we already process that in iterateFields\n}\n"],"names":["iterateCollections","genImportMapIterateFields","iterateGlobals","iterateConfig","addToImportMap","baseDir","config","importMap","imports","collections","globals","blocks","Object","values","length","fields","admin","avatar","Component","components","Nav","header","logout","Button","graphics","Icon","Logo","actions","afterDashboard","afterLogin","afterNavLinks","beforeDashboard","beforeLogin","beforeNavLinks","providers","views","keys","key","adminViewConfig","generators","generator","dependencies","dependency","path"],"mappings":"AAIA,SAASA,kBAAkB,QAAQ,0BAAyB;AAC5D,SAASC,yBAAyB,QAAQ,qBAAoB;AAC9D,SAASC,cAAc,QAAQ,sBAAqB;AAEpD,OAAO,SAASC,cAAc,EAC5BC,cAAc,EACdC,OAAO,EACPC,MAAM,EACNC,SAAS,EACTC,OAAO,EAOR;IACCR,mBAAmB;QACjBI;QACAC;QACAI,aAAaH,OAAOG,WAAW;QAC/BH;QACAC;QACAC;IACF;IAEAN,eAAe;QACbE;QACAC;QACAC;QACAI,SAASJ,OAAOI,OAAO;QACvBH;QACAC;IACF;IAEA,IAAIF,QAAQK,QAAQ;QAClB,MAAMA,SAASC,OAAOC,MAAM,CAACP,OAAOK,MAAM;QAC1C,IAAIA,QAAQG,QAAQ;YAClBb,0BAA0B;gBACxBG;gBACAC;gBACAC;gBACAS,QAAQJ;gBACRJ;gBACAC;YACF;QACF;IACF;IAEA,IAAI,OAAOF,OAAOU,KAAK,EAAEC,WAAW,UAAU;QAC5Cb,eAAeE,OAAOU,KAAK,EAAEC,QAAQC;IACvC;IAEAd,eAAeE,OAAOU,KAAK,EAAEG,YAAYC;IACzChB,eAAeE,OAAOU,KAAK,EAAEG,YAAYE;IACzCjB,eAAeE,OAAOU,KAAK,EAAEG,YAAYG,QAAQC;IACjDnB,eAAeE,OAAOU,KAAK,EAAEG,YAAYK,UAAUC;IACnDrB,eAAeE,OAAOU,KAAK,EAAEG,YAAYK,UAAUE;IAEnDtB,eAAeE,OAAOU,KAAK,EAAEG,YAAYQ;IACzCvB,eAAeE,OAAOU,KAAK,EAAEG,YAAYS;IACzCxB,eAAeE,OAAOU,KAAK,EAAEG,YAAYU;IACzCzB,eAAeE,OAAOU,KAAK,EAAEG,YAAYW;IACzC1B,eAAeE,OAAOU,KAAK,EAAEG,YAAYY;IACzC3B,eAAeE,OAAOU,KAAK,EAAEG,YAAYa;IACzC5B,eAAeE,OAAOU,KAAK,EAAEG,YAAYc;IAEzC7B,eAAeE,OAAOU,KAAK,EAAEG,YAAYe;IAEzC,IAAI5B,OAAOU,KAAK,EAAEG,YAAYgB,OAAO;QACnC,IAAIvB,OAAOwB,IAAI,CAAC9B,OAAOU,KAAK,EAAEG,YAAYgB,QAAQrB,QAAQ;YACxD,IAAK,MAAMuB,OAAO/B,OAAOU,KAAK,EAAEG,YAAYgB,MAAO;gBACjD,MAAMG,kBAAmChC,OAAOU,KAAK,EAAEG,YAAYgB,KAAK,CAACE,IAAI;gBAC7EjC,eAAekC,iBAAiBpB;YAClC;QACF;IACF;IAEA,IAAIZ,QAAQU,OAAOT,WAAWgC,YAAYzB,QAAQ;QAChD,KAAK,MAAM0B,aAAalC,OAAOU,KAAK,CAACT,SAAS,CAACgC,UAAU,CAAE;YACzDC,UAAU;gBACRpC;gBACAC;gBACAC;gBACAC;gBACAC;YACF;QACF;IACF;IAEA,IAAIF,QAAQU,OAAOyB,cAAc;QAC/B,IAAK,MAAMJ,OAAO/B,OAAOU,KAAK,CAACyB,YAAY,CAAE;YAC3C,MAAMC,aAAapC,OAAOU,KAAK,CAACyB,YAAY,CAACJ,IAAI;YACjDjC,eAAesC,WAAWC,IAAI;QAChC;IACF;AAEA;;;;;;;;;;;;;;GAcC,GAAG,qKAAqK;AAC3K"}
@@ -23,7 +23,7 @@ export function genImportMapIterateFields({ addToImportMap, baseDir, config, fie
23
23
  addToImportMap,
24
24
  baseDir,
25
25
  config,
26
- fields: field.blocks,
26
+ fields: field.blocks.filter((block)=>typeof block !== 'string'),
27
27
  importMap,
28
28
  imports
29
29
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/bin/generateImportMap/iterateFields.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport type { PayloadComponent, SanitizedConfig } from '../../config/types.js'\nimport type { Block, Field, Tab } from '../../fields/config/types.js'\nimport type { AddToImportMap, Imports, InternalImportMap } from './index.js'\n\nfunction hasKey<T, K extends string>(\n obj: null | T | undefined,\n key: K,\n): obj is { [P in K]: PayloadComponent | PayloadComponent[] } & T {\n return obj != null && Object.prototype.hasOwnProperty.call(obj, key)\n}\n\nconst defaultUIFieldComponentKeys: Array<'Cell' | 'Description' | 'Field' | 'Filter'> = [\n 'Cell',\n 'Description',\n 'Field',\n 'Filter',\n]\nexport function genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields,\n importMap,\n imports,\n}: {\n addToImportMap: AddToImportMap\n baseDir: string\n config: SanitizedConfig\n fields: Block[] | Field[] | Tab[]\n importMap: InternalImportMap\n imports: Imports\n}) {\n for (const field of fields) {\n if ('fields' in field) {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.fields,\n importMap,\n imports,\n })\n } else if (field.type === 'blocks') {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.blocks,\n importMap,\n imports,\n })\n } else if (field.type === 'tabs') {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.tabs,\n importMap,\n imports,\n })\n } else if (field.type === 'richText') {\n if (\n field?.editor &&\n typeof field.editor === 'object' &&\n field.editor.generateImportMap &&\n typeof field.editor.generateImportMap === 'function'\n ) {\n field.editor.generateImportMap({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n }\n } else if (field.type === 'ui') {\n if (field?.admin?.components) {\n // Render any extra, untyped components\n for (const key in field.admin.components) {\n if (key in defaultUIFieldComponentKeys) {\n continue\n }\n addToImportMap(field.admin.components[key])\n }\n }\n }\n\n hasKey(field?.admin, 'jsx') && addToImportMap(field.admin.jsx) // For Blocks\n\n hasKey(field?.admin?.components, 'Label') && addToImportMap(field.admin.components.Label)\n\n hasKey(field?.admin?.components, 'Block') && addToImportMap(field.admin.components.Block)\n\n hasKey(field?.admin?.components, 'Cell') && addToImportMap(field?.admin?.components?.Cell)\n\n hasKey(field?.admin?.components, 'Description') &&\n addToImportMap(field?.admin?.components?.Description)\n\n hasKey(field?.admin?.components, 'Field') && addToImportMap(field?.admin?.components?.Field)\n hasKey(field?.admin?.components, 'Filter') && addToImportMap(field?.admin?.components?.Filter)\n\n hasKey(field?.admin?.components, 'Error') && addToImportMap(field?.admin?.components?.Error)\n\n hasKey(field?.admin?.components, 'afterInput') &&\n addToImportMap(field?.admin?.components?.afterInput)\n\n hasKey(field?.admin?.components, 'beforeInput') &&\n addToImportMap(field?.admin?.components?.beforeInput)\n\n hasKey(field?.admin?.components, 'RowLabel') &&\n addToImportMap(field?.admin?.components?.RowLabel)\n\n hasKey(field?.admin?.components, 'Diff') && addToImportMap(field?.admin?.components?.Diff)\n }\n}\n"],"names":["hasKey","obj","key","Object","prototype","hasOwnProperty","call","defaultUIFieldComponentKeys","genImportMapIterateFields","addToImportMap","baseDir","config","fields","importMap","imports","field","type","blocks","tabs","editor","generateImportMap","admin","components","jsx","Label","Block","Cell","Description","Field","Filter","Error","afterInput","beforeInput","RowLabel","Diff"],"mappings":"AAAA,2DAA2D,GAK3D,SAASA,OACPC,GAAyB,EACzBC,GAAM;IAEN,OAAOD,OAAO,QAAQE,OAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACL,KAAKC;AAClE;AAEA,MAAMK,8BAAkF;IACtF;IACA;IACA;IACA;CACD;AACD,OAAO,SAASC,0BAA0B,EACxCC,cAAc,EACdC,OAAO,EACPC,MAAM,EACNC,MAAM,EACNC,SAAS,EACTC,OAAO,EAQR;IACC,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAI,YAAYG,OAAO;YACrBP,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAMH,MAAM;gBACpBC;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,UAAU;YAClCR,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAME,MAAM;gBACpBJ;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,QAAQ;YAChCR,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAMG,IAAI;gBAClBL;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,YAAY;YACpC,IACED,OAAOI,UACP,OAAOJ,MAAMI,MAAM,KAAK,YACxBJ,MAAMI,MAAM,CAACC,iBAAiB,IAC9B,OAAOL,MAAMI,MAAM,CAACC,iBAAiB,KAAK,YAC1C;gBACAL,MAAMI,MAAM,CAACC,iBAAiB,CAAC;oBAC7BX;oBACAC;oBACAC;oBACAE;oBACAC;gBACF;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,MAAM;YAC9B,IAAID,OAAOM,OAAOC,YAAY;gBAC5B,uCAAuC;gBACvC,IAAK,MAAMpB,OAAOa,MAAMM,KAAK,CAACC,UAAU,CAAE;oBACxC,IAAIpB,OAAOK,6BAA6B;wBACtC;oBACF;oBACAE,eAAeM,MAAMM,KAAK,CAACC,UAAU,CAACpB,IAAI;gBAC5C;YACF;QACF;QAEAF,OAAOe,OAAOM,OAAO,UAAUZ,eAAeM,MAAMM,KAAK,CAACE,GAAG,EAAE,aAAa;;QAE5EvB,OAAOe,OAAOM,OAAOC,YAAY,YAAYb,eAAeM,MAAMM,KAAK,CAACC,UAAU,CAACE,KAAK;QAExFxB,OAAOe,OAAOM,OAAOC,YAAY,YAAYb,eAAeM,MAAMM,KAAK,CAACC,UAAU,CAACG,KAAK;QAExFzB,OAAOe,OAAOM,OAAOC,YAAY,WAAWb,eAAeM,OAAOM,OAAOC,YAAYI;QAErF1B,OAAOe,OAAOM,OAAOC,YAAY,kBAC/Bb,eAAeM,OAAOM,OAAOC,YAAYK;QAE3C3B,OAAOe,OAAOM,OAAOC,YAAY,YAAYb,eAAeM,OAAOM,OAAOC,YAAYM;QACtF5B,OAAOe,OAAOM,OAAOC,YAAY,aAAab,eAAeM,OAAOM,OAAOC,YAAYO;QAEvF7B,OAAOe,OAAOM,OAAOC,YAAY,YAAYb,eAAeM,OAAOM,OAAOC,YAAYQ;QAEtF9B,OAAOe,OAAOM,OAAOC,YAAY,iBAC/Bb,eAAeM,OAAOM,OAAOC,YAAYS;QAE3C/B,OAAOe,OAAOM,OAAOC,YAAY,kBAC/Bb,eAAeM,OAAOM,OAAOC,YAAYU;QAE3ChC,OAAOe,OAAOM,OAAOC,YAAY,eAC/Bb,eAAeM,OAAOM,OAAOC,YAAYW;QAE3CjC,OAAOe,OAAOM,OAAOC,YAAY,WAAWb,eAAeM,OAAOM,OAAOC,YAAYY;IACvF;AACF"}
1
+ {"version":3,"sources":["../../../src/bin/generateImportMap/iterateFields.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-expressions */\nimport type { PayloadComponent, SanitizedConfig } from '../../config/types.js'\nimport type { Block, Field, Tab } from '../../fields/config/types.js'\nimport type { AddToImportMap, Imports, InternalImportMap } from './index.js'\n\nfunction hasKey<T, K extends string>(\n obj: null | T | undefined,\n key: K,\n): obj is { [P in K]: PayloadComponent | PayloadComponent[] } & T {\n return obj != null && Object.prototype.hasOwnProperty.call(obj, key)\n}\n\nconst defaultUIFieldComponentKeys: Array<'Cell' | 'Description' | 'Field' | 'Filter'> = [\n 'Cell',\n 'Description',\n 'Field',\n 'Filter',\n]\nexport function genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields,\n importMap,\n imports,\n}: {\n addToImportMap: AddToImportMap\n baseDir: string\n config: SanitizedConfig\n fields: Block[] | Field[] | Tab[]\n importMap: InternalImportMap\n imports: Imports\n}) {\n for (const field of fields) {\n if ('fields' in field) {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.fields,\n importMap,\n imports,\n })\n } else if (field.type === 'blocks') {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.blocks.filter((block) => typeof block !== 'string'),\n importMap,\n imports,\n })\n } else if (field.type === 'tabs') {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: field.tabs,\n importMap,\n imports,\n })\n } else if (field.type === 'richText') {\n if (\n field?.editor &&\n typeof field.editor === 'object' &&\n field.editor.generateImportMap &&\n typeof field.editor.generateImportMap === 'function'\n ) {\n field.editor.generateImportMap({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n }\n } else if (field.type === 'ui') {\n if (field?.admin?.components) {\n // Render any extra, untyped components\n for (const key in field.admin.components) {\n if (key in defaultUIFieldComponentKeys) {\n continue\n }\n addToImportMap(field.admin.components[key])\n }\n }\n }\n\n hasKey(field?.admin, 'jsx') && addToImportMap(field.admin.jsx) // For Blocks\n\n hasKey(field?.admin?.components, 'Label') && addToImportMap(field.admin.components.Label)\n\n hasKey(field?.admin?.components, 'Block') && addToImportMap(field.admin.components.Block)\n\n hasKey(field?.admin?.components, 'Cell') && addToImportMap(field?.admin?.components?.Cell)\n\n hasKey(field?.admin?.components, 'Description') &&\n addToImportMap(field?.admin?.components?.Description)\n\n hasKey(field?.admin?.components, 'Field') && addToImportMap(field?.admin?.components?.Field)\n hasKey(field?.admin?.components, 'Filter') && addToImportMap(field?.admin?.components?.Filter)\n\n hasKey(field?.admin?.components, 'Error') && addToImportMap(field?.admin?.components?.Error)\n\n hasKey(field?.admin?.components, 'afterInput') &&\n addToImportMap(field?.admin?.components?.afterInput)\n\n hasKey(field?.admin?.components, 'beforeInput') &&\n addToImportMap(field?.admin?.components?.beforeInput)\n\n hasKey(field?.admin?.components, 'RowLabel') &&\n addToImportMap(field?.admin?.components?.RowLabel)\n\n hasKey(field?.admin?.components, 'Diff') && addToImportMap(field?.admin?.components?.Diff)\n }\n}\n"],"names":["hasKey","obj","key","Object","prototype","hasOwnProperty","call","defaultUIFieldComponentKeys","genImportMapIterateFields","addToImportMap","baseDir","config","fields","importMap","imports","field","type","blocks","filter","block","tabs","editor","generateImportMap","admin","components","jsx","Label","Block","Cell","Description","Field","Filter","Error","afterInput","beforeInput","RowLabel","Diff"],"mappings":"AAAA,2DAA2D,GAK3D,SAASA,OACPC,GAAyB,EACzBC,GAAM;IAEN,OAAOD,OAAO,QAAQE,OAAOC,SAAS,CAACC,cAAc,CAACC,IAAI,CAACL,KAAKC;AAClE;AAEA,MAAMK,8BAAkF;IACtF;IACA;IACA;IACA;CACD;AACD,OAAO,SAASC,0BAA0B,EACxCC,cAAc,EACdC,OAAO,EACPC,MAAM,EACNC,MAAM,EACNC,SAAS,EACTC,OAAO,EAQR;IACC,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAI,YAAYG,OAAO;YACrBP,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAMH,MAAM;gBACpBC;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,UAAU;YAClCR,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAME,MAAM,CAACC,MAAM,CAAC,CAACC,QAAU,OAAOA,UAAU;gBACxDN;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,QAAQ;YAChCR,0BAA0B;gBACxBC;gBACAC;gBACAC;gBACAC,QAAQG,MAAMK,IAAI;gBAClBP;gBACAC;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,YAAY;YACpC,IACED,OAAOM,UACP,OAAON,MAAMM,MAAM,KAAK,YACxBN,MAAMM,MAAM,CAACC,iBAAiB,IAC9B,OAAOP,MAAMM,MAAM,CAACC,iBAAiB,KAAK,YAC1C;gBACAP,MAAMM,MAAM,CAACC,iBAAiB,CAAC;oBAC7Bb;oBACAC;oBACAC;oBACAE;oBACAC;gBACF;YACF;QACF,OAAO,IAAIC,MAAMC,IAAI,KAAK,MAAM;YAC9B,IAAID,OAAOQ,OAAOC,YAAY;gBAC5B,uCAAuC;gBACvC,IAAK,MAAMtB,OAAOa,MAAMQ,KAAK,CAACC,UAAU,CAAE;oBACxC,IAAItB,OAAOK,6BAA6B;wBACtC;oBACF;oBACAE,eAAeM,MAAMQ,KAAK,CAACC,UAAU,CAACtB,IAAI;gBAC5C;YACF;QACF;QAEAF,OAAOe,OAAOQ,OAAO,UAAUd,eAAeM,MAAMQ,KAAK,CAACE,GAAG,EAAE,aAAa;;QAE5EzB,OAAOe,OAAOQ,OAAOC,YAAY,YAAYf,eAAeM,MAAMQ,KAAK,CAACC,UAAU,CAACE,KAAK;QAExF1B,OAAOe,OAAOQ,OAAOC,YAAY,YAAYf,eAAeM,MAAMQ,KAAK,CAACC,UAAU,CAACG,KAAK;QAExF3B,OAAOe,OAAOQ,OAAOC,YAAY,WAAWf,eAAeM,OAAOQ,OAAOC,YAAYI;QAErF5B,OAAOe,OAAOQ,OAAOC,YAAY,kBAC/Bf,eAAeM,OAAOQ,OAAOC,YAAYK;QAE3C7B,OAAOe,OAAOQ,OAAOC,YAAY,YAAYf,eAAeM,OAAOQ,OAAOC,YAAYM;QACtF9B,OAAOe,OAAOQ,OAAOC,YAAY,aAAaf,eAAeM,OAAOQ,OAAOC,YAAYO;QAEvF/B,OAAOe,OAAOQ,OAAOC,YAAY,YAAYf,eAAeM,OAAOQ,OAAOC,YAAYQ;QAEtFhC,OAAOe,OAAOQ,OAAOC,YAAY,iBAC/Bf,eAAeM,OAAOQ,OAAOC,YAAYS;QAE3CjC,OAAOe,OAAOQ,OAAOC,YAAY,kBAC/Bf,eAAeM,OAAOQ,OAAOC,YAAYU;QAE3ClC,OAAOe,OAAOQ,OAAOC,YAAY,eAC/Bf,eAAeM,OAAOQ,OAAOC,YAAYW;QAE3CnC,OAAOe,OAAOQ,OAAOC,YAAY,WAAWf,eAAeM,OAAOQ,OAAOC,YAAYY;IACvF;AACF"}
@@ -1,4 +1,4 @@
1
1
  import type { Config, SanitizedConfig } from '../../config/types.js';
2
2
  import type { CollectionConfig, SanitizedCollectionConfig } from './types.js';
3
- export declare const sanitizeCollection: (config: Config, collection: CollectionConfig, richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>) => Promise<SanitizedCollectionConfig>;
3
+ export declare const sanitizeCollection: (config: Config, collection: CollectionConfig, richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>, _validRelationships?: string[]) => Promise<SanitizedCollectionConfig>;
4
4
  //# sourceMappingURL=sanitize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAkB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,KAC/E,OAAO,CAAC,yBAAyB,CAyMnC,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAkB,MAAM,YAAY,CAAA;AAkB7F,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,wBAC1D,MAAM,EAAE,KAC7B,OAAO,CAAC,yBAAyB,CAoMnC,CAAA"}
@@ -16,7 +16,7 @@ import { validateUseAsTitle } from './useAsTitle.js';
16
16
  export const sanitizeCollection = async (config, collection, /**
17
17
  * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises
18
18
  * so that you can sanitize them together, after the config has been sanitized.
19
- */ richTextSanitizationPromises)=>{
19
+ */ richTextSanitizationPromises, _validRelationships)=>{
20
20
  // /////////////////////////////////
21
21
  // Make copy of collection config
22
22
  // /////////////////////////////////
@@ -24,12 +24,7 @@ export const sanitizeCollection = async (config, collection, /**
24
24
  // /////////////////////////////////
25
25
  // Sanitize fields
26
26
  // /////////////////////////////////
27
- const validRelationships = (config.collections || []).reduce((acc, c)=>{
28
- acc.push(c.slug);
29
- return acc;
30
- }, [
31
- collection.slug
32
- ]);
27
+ const validRelationships = _validRelationships ?? config.collections.map((c)=>c.slug) ?? [];
33
28
  const joins = {};
34
29
  sanitized.fields = await sanitizeFields({
35
30
  collectionConfig: sanitized,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = (config.collections || []).reduce(\n (acc, c) => {\n acc.push(c.slug)\n return acc\n },\n [collection.slug],\n )\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","defaultCollectionEndpoints","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","sanitized","validRelationships","collections","reduce","acc","c","push","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","endpoint","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { LoginWithUsernameOptions } from '../../auth/types.js'\nimport type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { CollectionConfig, SanitizedCollectionConfig, SanitizedJoins } from './types.js'\n\nimport { getBaseAuthFields } from '../../auth/getAuthFields.js'\nimport { TimestampsRequired } from '../../errors/TimestampsRequired.js'\nimport { sanitizeFields } from '../../fields/config/sanitize.js'\nimport { fieldAffectsData } from '../../fields/config/types.js'\nimport mergeBaseFields from '../../fields/mergeBaseFields.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { deepMergeWithReactComponents } from '../../utilities/deepMerge.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport baseVersionFields from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport { authDefaults, defaults, loginWithUsernameDefaults } from './defaults.js'\nimport { sanitizeAuthFields, sanitizeUploadFields } from './reservedFieldNames.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\nexport const sanitizeCollection = async (\n config: Config,\n collection: CollectionConfig,\n /**\n * If this property is set, RichText fields won't be sanitized immediately. Instead, they will be added to this array as promises\n * so that you can sanitize them together, after the config has been sanitized.\n */\n richTextSanitizationPromises?: Array<(config: SanitizedConfig) => Promise<void>>,\n _validRelationships?: string[],\n): Promise<SanitizedCollectionConfig> => {\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = deepMergeWithReactComponents(defaults, collection)\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = _validRelationships ?? config.collections.map((c) => c.slug) ?? []\n\n const joins: SanitizedJoins = {}\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n for (const endpoint of defaultCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.timestamps !== false) {\n // add default timestamps fields only as needed\n let hasUpdatedAt: boolean | null = null\n let hasCreatedAt: boolean | null = null\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n }\n return hasCreatedAt && hasUpdatedAt\n })\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disableBulkEdit: true,\n hidden: true,\n },\n // The default sort for list view is createdAt. Thus, enabling indexing by default, is a major performance improvement, especially for large or a large amount of collections.\n type: 'date',\n index: true,\n label: ({ t }) => t('general:createdAt'),\n })\n }\n }\n\n sanitized.labels = sanitized.labels || formatLabels(sanitized.slug)\n\n if (sanitized.versions) {\n if (sanitized.versions === true) {\n sanitized.versions = { drafts: false, maxPerDoc: 100 }\n }\n\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n sanitized.versions.maxPerDoc =\n typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100\n\n if (sanitized.versions.drafts) {\n if (sanitized.versions.drafts === true) {\n sanitized.versions.drafts = {\n autosave: false,\n validate: false,\n }\n }\n\n if (sanitized.versions.drafts.autosave === true) {\n sanitized.versions.drafts.autosave = {\n interval: versionDefaults.autosaveInterval,\n }\n }\n\n if (sanitized.versions.drafts.validate === undefined) {\n sanitized.versions.drafts.validate = false\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields)\n }\n }\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\n\n // sanitize fields for reserved names\n sanitizeUploadFields(sanitized.fields, sanitized)\n\n sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true\n sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true\n sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug\n sanitized.admin.useAsTitle =\n sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id'\n ? sanitized.admin.useAsTitle\n : 'filename'\n\n const uploadFields = getBaseUploadFields({\n collection: sanitized,\n config,\n })\n\n sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields)\n }\n\n if (sanitized.auth) {\n // sanitize fields for reserved names\n sanitizeAuthFields(sanitized.fields, sanitized)\n\n sanitized.auth = deepMergeWithReactComponents(\n authDefaults,\n typeof sanitized.auth === 'object' ? sanitized.auth : {},\n )\n\n if (!sanitized.auth.disableLocalStrategy && sanitized.auth.verify === true) {\n sanitized.auth.verify = {}\n }\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (!sanitized.auth.strategies) {\n sanitized.auth.strategies = []\n }\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = loginWithUsernameDefaults\n } else {\n const loginWithUsernameWithDefaults = {\n ...loginWithUsernameDefaults,\n ...sanitized.auth.loginWithUsername,\n } as LoginWithUsernameOptions\n\n // if allowEmailLogin is false, requireUsername must be true\n if (loginWithUsernameWithDefaults.allowEmailLogin === false) {\n loginWithUsernameWithDefaults.requireUsername = true\n }\n sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults\n }\n } else {\n sanitized.auth.loginWithUsername = false\n }\n\n if (!collection?.admin?.useAsTitle) {\n sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email'\n }\n\n sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth))\n }\n\n if (collection?.admin?.pagination?.limits?.length) {\n sanitized.admin.pagination.limits = collection.admin.pagination.limits\n }\n\n validateUseAsTitle(sanitized)\n\n const sanitizedConfig = sanitized as SanitizedCollectionConfig\n\n sanitizedConfig.joins = joins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n return sanitizedConfig\n}\n"],"names":["getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","getBaseUploadFields","deepMergeWithReactComponents","flattenAllFields","formatLabels","baseVersionFields","versionDefaults","defaultCollectionEndpoints","authDefaults","defaults","loginWithUsernameDefaults","sanitizeAuthFields","sanitizeUploadFields","validateUseAsTitle","sanitizeCollection","config","collection","richTextSanitizationPromises","_validRelationships","sanitized","validRelationships","collections","map","c","slug","joins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","endpoint","push","timestamps","hasUpdatedAt","hasCreatedAt","some","field","name","type","admin","disableBulkEdit","hidden","index","label","t","labels","versions","drafts","maxPerDoc","autosave","validate","interval","autosaveInterval","undefined","upload","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","auth","disableLocalStrategy","verify","disableDuplicate","strategies","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","length","sanitizedConfig","flattenedFields"],"mappings":"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"}
@@ -1,14 +1,27 @@
1
1
  import type { I18nClient } from '@payloadcms/translations';
2
2
  import type { ImportMap } from '../bin/generateImportMap/index.js';
3
+ import type { ClientBlock } from '../fields/config/types.js';
4
+ import type { BlockSlug } from '../index.js';
3
5
  import type { LivePreviewConfig, SanitizedConfig, ServerOnlyLivePreviewProperties } from './types.js';
4
6
  import { type ClientCollectionConfig } from '../collections/config/client.js';
5
7
  import { type ClientGlobalConfig } from '../globals/config/client.js';
6
8
  export type ServerOnlyRootProperties = keyof Pick<SanitizedConfig, 'bin' | 'cors' | 'csrf' | 'custom' | 'db' | 'editor' | 'email' | 'endpoints' | 'graphQL' | 'hooks' | 'i18n' | 'jobs' | 'logger' | 'onInit' | 'plugins' | 'secret' | 'sharp' | 'typescript'>;
7
9
  export type ServerOnlyRootAdminProperties = keyof Pick<SanitizedConfig['admin'], 'components'>;
10
+ export type UnsanitizedClientConfig = {
11
+ admin: {
12
+ livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>;
13
+ } & Omit<SanitizedConfig['admin'], 'components' | 'dependencies' | 'livePreview'>;
14
+ blocks: ClientBlock[];
15
+ collections: ClientCollectionConfig[];
16
+ custom?: Record<string, any>;
17
+ globals: ClientGlobalConfig[];
18
+ } & Omit<SanitizedConfig, 'admin' | 'collections' | 'globals' | 'i18n' | ServerOnlyRootProperties>;
8
19
  export type ClientConfig = {
9
20
  admin: {
10
21
  livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>;
11
22
  } & Omit<SanitizedConfig['admin'], 'components' | 'dependencies' | 'livePreview'>;
23
+ blocks: ClientBlock[];
24
+ blocksMap: Record<BlockSlug, ClientBlock>;
12
25
  collections: ClientCollectionConfig[];
13
26
  custom?: Record<string, any>;
14
27
  globals: ClientGlobalConfig[];
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,+BAA+B,EAChC,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAAE,KAAK,kBAAkB,EAA6B,MAAM,6BAA6B,CAAA;AAEhG,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAC/C,eAAe,EACb,KAAK,GACL,MAAM,GACN,MAAM,GACN,QAAQ,GACR,IAAI,GACJ,QAAQ,GACR,OAAO,GACP,WAAW,GACX,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,YAAY,CACf,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;AAE9F,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE;QACL,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;KACvE,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC,CAAA;IACjF,WAAW,EAAE,sBAAsB,EAAE,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,wBAAwB,CAAC,CAAA;AAElG,eAAO,MAAM,+BAA+B,EAAE,SAAS,OAAO,CAAC,6BAA6B,CAAC,EAAO,CAAA;AAEpG,eAAO,MAAM,0BAA0B,EAAE,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAoBlF,CAAA;AAED,eAAO,MAAM,kBAAkB,iCAI5B;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,YAyFH,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/config/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAG1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,+BAA+B,EAChC,MAAM,YAAY,CAAA;AAEnB,OAAO,EACL,KAAK,sBAAsB,EAE5B,MAAM,iCAAiC,CAAA;AAExC,OAAO,EAAE,KAAK,kBAAkB,EAA6B,MAAM,6BAA6B,CAAA;AAChG,MAAM,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAC/C,eAAe,EACb,KAAK,GACL,MAAM,GACN,MAAM,GACN,QAAQ,GACR,IAAI,GACJ,QAAQ,GACR,OAAO,GACP,WAAW,GACX,SAAS,GACT,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,OAAO,GACP,YAAY,CACf,CAAA;AAED,MAAM,MAAM,6BAA6B,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC,CAAA;AAE9F,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE;QACL,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;KACvE,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC,CAAA;IACjF,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,WAAW,EAAE,sBAAsB,EAAE,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,wBAAwB,CAAC,CAAA;AAElG,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE;QACL,WAAW,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;KACvE,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,cAAc,GAAG,aAAa,CAAC,CAAA;IACjF,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACzC,WAAW,EAAE,sBAAsB,EAAE,CAAA;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAA;CAC9B,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,wBAAwB,CAAC,CAAA;AAElG,eAAO,MAAM,+BAA+B,EAAE,SAAS,OAAO,CAAC,6BAA6B,CAAC,EAAO,CAAA;AAEpG,eAAO,MAAM,0BAA0B,EAAE,SAAS,OAAO,CAAC,wBAAwB,CAAC,EAoBlF,CAAA;AAED,eAAO,MAAM,kBAAkB,iCAI5B;IACD,MAAM,EAAE,eAAe,CAAA;IACvB,IAAI,EAAE,UAAU,CAAA;IAChB,SAAS,EAAE,SAAS,CAAA;CACrB,KAAG,YAoGH,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { createClientCollectionConfigs } from '../collections/config/client.js';
2
+ import { createClientBlocks } from '../fields/config/client.js';
2
3
  import { createClientGlobalConfigs } from '../globals/config/client.js';
3
4
  export const serverOnlyAdminConfigProperties = [];
4
5
  export const serverOnlyConfigProperties = [
@@ -48,6 +49,17 @@ export const createClientConfig = ({ config, i18n, importMap })=>{
48
49
  }
49
50
  }
50
51
  break;
52
+ case 'blocks':
53
+ {
54
+ ;
55
+ clientConfig.blocks = createClientBlocks({
56
+ blocks: config.blocks,
57
+ defaultIDType: config.db.defaultIDType,
58
+ i18n,
59
+ importMap
60
+ }).filter((block)=>typeof block !== 'string');
61
+ break;
62
+ }
51
63
  case 'collections':
52
64
  ;
53
65
  clientConfig.collections = createClientCollectionConfigs({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/client.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { DeepPartial } from 'ts-essentials'\n\nimport type { ImportMap } from '../bin/generateImportMap/index.js'\nimport type {\n LivePreviewConfig,\n SanitizedConfig,\n ServerOnlyLivePreviewProperties,\n} from './types.js'\n\nimport {\n type ClientCollectionConfig,\n createClientCollectionConfigs,\n} from '../collections/config/client.js'\nimport { type ClientGlobalConfig, createClientGlobalConfigs } from '../globals/config/client.js'\n\nexport type ServerOnlyRootProperties = keyof Pick<\n SanitizedConfig,\n | 'bin'\n | 'cors'\n | 'csrf'\n | 'custom'\n | 'db'\n | 'editor'\n | 'email'\n | 'endpoints'\n | 'graphQL'\n | 'hooks'\n | 'i18n'\n | 'jobs'\n | 'logger'\n | 'onInit'\n | 'plugins'\n | 'secret'\n | 'sharp'\n | 'typescript'\n>\n\nexport type ServerOnlyRootAdminProperties = keyof Pick<SanitizedConfig['admin'], 'components'>\n\nexport type ClientConfig = {\n admin: {\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n } & Omit<SanitizedConfig['admin'], 'components' | 'dependencies' | 'livePreview'>\n collections: ClientCollectionConfig[]\n custom?: Record<string, any>\n globals: ClientGlobalConfig[]\n} & Omit<SanitizedConfig, 'admin' | 'collections' | 'globals' | 'i18n' | ServerOnlyRootProperties>\n\nexport const serverOnlyAdminConfigProperties: readonly Partial<ServerOnlyRootAdminProperties>[] = []\n\nexport const serverOnlyConfigProperties: readonly Partial<ServerOnlyRootProperties>[] = [\n 'endpoints',\n 'db',\n 'editor',\n 'plugins',\n 'sharp',\n 'onInit',\n 'secret',\n 'hooks',\n 'bin',\n 'i18n',\n 'typescript',\n 'cors',\n 'csrf',\n 'email',\n 'custom',\n 'graphQL',\n 'jobs',\n 'logger',\n // `admin`, `onInit`, `localization`, `collections`, and `globals` are all handled separately\n]\n\nexport const createClientConfig = ({\n config,\n i18n,\n importMap,\n}: {\n config: SanitizedConfig\n i18n: I18nClient\n importMap: ImportMap\n}): ClientConfig => {\n const clientConfig = {} as DeepPartial<ClientConfig>\n\n for (const key in config) {\n if (serverOnlyConfigProperties.includes(key as any)) {\n continue\n }\n switch (key) {\n case 'admin':\n clientConfig.admin = {\n autoLogin: config.admin.autoLogin,\n avatar: config.admin.avatar,\n custom: config.admin.custom,\n dateFormat: config.admin.dateFormat,\n importMap: config.admin.importMap,\n meta: config.admin.meta,\n routes: config.admin.routes,\n theme: config.admin.theme,\n timezones: config.admin.timezones,\n user: config.admin.user,\n }\n if (config.admin.livePreview) {\n clientConfig.admin.livePreview = {}\n\n if (config.admin.livePreview.breakpoints) {\n clientConfig.admin.livePreview.breakpoints = config.admin.livePreview.breakpoints\n }\n }\n break\n case 'collections':\n ;(clientConfig.collections as ClientCollectionConfig[]) = createClientCollectionConfigs({\n collections: config.collections,\n defaultIDType: config.db.defaultIDType,\n i18n,\n importMap,\n })\n break\n case 'globals':\n ;(clientConfig.globals as ClientGlobalConfig[]) = createClientGlobalConfigs({\n defaultIDType: config.db.defaultIDType,\n globals: config.globals,\n i18n,\n importMap,\n })\n break\n case 'localization':\n if (typeof config.localization === 'object' && config.localization) {\n clientConfig.localization = {}\n if (config.localization.defaultLocale) {\n clientConfig.localization.defaultLocale = config.localization.defaultLocale\n }\n if (config.localization.defaultLocalePublishOption) {\n clientConfig.localization.defaultLocalePublishOption =\n config.localization.defaultLocalePublishOption\n }\n if (config.localization.fallback) {\n clientConfig.localization.fallback = config.localization.fallback\n }\n if (config.localization.localeCodes) {\n clientConfig.localization.localeCodes = config.localization.localeCodes\n }\n if (config.localization.locales) {\n clientConfig.localization.locales = []\n for (const locale of config.localization.locales) {\n if (locale) {\n const clientLocale: Partial<(typeof config.localization.locales)[0]> = {}\n if (locale.code) {\n clientLocale.code = locale.code\n }\n if (locale.fallbackLocale) {\n clientLocale.fallbackLocale = locale.fallbackLocale\n }\n if (locale.label) {\n clientLocale.label = locale.label\n }\n if (locale.rtl) {\n clientLocale.rtl = locale.rtl\n }\n clientConfig.localization.locales.push(clientLocale)\n }\n }\n }\n }\n break\n default:\n clientConfig[key] = config[key]\n }\n }\n return clientConfig as ClientConfig\n}\n"],"names":["createClientCollectionConfigs","createClientGlobalConfigs","serverOnlyAdminConfigProperties","serverOnlyConfigProperties","createClientConfig","config","i18n","importMap","clientConfig","key","includes","admin","autoLogin","avatar","custom","dateFormat","meta","routes","theme","timezones","user","livePreview","breakpoints","collections","defaultIDType","db","globals","localization","defaultLocale","defaultLocalePublishOption","fallback","localeCodes","locales","locale","clientLocale","code","fallbackLocale","label","rtl","push"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/config/client.ts"],"sourcesContent":["import type { I18nClient } from '@payloadcms/translations'\nimport type { DeepPartial } from 'ts-essentials'\n\nimport type { ImportMap } from '../bin/generateImportMap/index.js'\nimport type { ClientBlock } from '../fields/config/types.js'\nimport type { BlockSlug } from '../index.js'\nimport type {\n LivePreviewConfig,\n SanitizedConfig,\n ServerOnlyLivePreviewProperties,\n} from './types.js'\n\nimport {\n type ClientCollectionConfig,\n createClientCollectionConfigs,\n} from '../collections/config/client.js'\nimport { createClientBlocks } from '../fields/config/client.js'\nimport { type ClientGlobalConfig, createClientGlobalConfigs } from '../globals/config/client.js'\nexport type ServerOnlyRootProperties = keyof Pick<\n SanitizedConfig,\n | 'bin'\n | 'cors'\n | 'csrf'\n | 'custom'\n | 'db'\n | 'editor'\n | 'email'\n | 'endpoints'\n | 'graphQL'\n | 'hooks'\n | 'i18n'\n | 'jobs'\n | 'logger'\n | 'onInit'\n | 'plugins'\n | 'secret'\n | 'sharp'\n | 'typescript'\n>\n\nexport type ServerOnlyRootAdminProperties = keyof Pick<SanitizedConfig['admin'], 'components'>\n\nexport type UnsanitizedClientConfig = {\n admin: {\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n } & Omit<SanitizedConfig['admin'], 'components' | 'dependencies' | 'livePreview'>\n blocks: ClientBlock[]\n collections: ClientCollectionConfig[]\n custom?: Record<string, any>\n globals: ClientGlobalConfig[]\n} & Omit<SanitizedConfig, 'admin' | 'collections' | 'globals' | 'i18n' | ServerOnlyRootProperties>\n\nexport type ClientConfig = {\n admin: {\n livePreview?: Omit<LivePreviewConfig, ServerOnlyLivePreviewProperties>\n } & Omit<SanitizedConfig['admin'], 'components' | 'dependencies' | 'livePreview'>\n blocks: ClientBlock[]\n blocksMap: Record<BlockSlug, ClientBlock>\n collections: ClientCollectionConfig[]\n custom?: Record<string, any>\n globals: ClientGlobalConfig[]\n} & Omit<SanitizedConfig, 'admin' | 'collections' | 'globals' | 'i18n' | ServerOnlyRootProperties>\n\nexport const serverOnlyAdminConfigProperties: readonly Partial<ServerOnlyRootAdminProperties>[] = []\n\nexport const serverOnlyConfigProperties: readonly Partial<ServerOnlyRootProperties>[] = [\n 'endpoints',\n 'db',\n 'editor',\n 'plugins',\n 'sharp',\n 'onInit',\n 'secret',\n 'hooks',\n 'bin',\n 'i18n',\n 'typescript',\n 'cors',\n 'csrf',\n 'email',\n 'custom',\n 'graphQL',\n 'jobs',\n 'logger',\n // `admin`, `onInit`, `localization`, `collections`, and `globals` are all handled separately\n]\n\nexport const createClientConfig = ({\n config,\n i18n,\n importMap,\n}: {\n config: SanitizedConfig\n i18n: I18nClient\n importMap: ImportMap\n}): ClientConfig => {\n const clientConfig = {} as DeepPartial<ClientConfig>\n\n for (const key in config) {\n if (serverOnlyConfigProperties.includes(key as any)) {\n continue\n }\n switch (key) {\n case 'admin':\n clientConfig.admin = {\n autoLogin: config.admin.autoLogin,\n avatar: config.admin.avatar,\n custom: config.admin.custom,\n dateFormat: config.admin.dateFormat,\n importMap: config.admin.importMap,\n meta: config.admin.meta,\n routes: config.admin.routes,\n theme: config.admin.theme,\n timezones: config.admin.timezones,\n user: config.admin.user,\n }\n if (config.admin.livePreview) {\n clientConfig.admin.livePreview = {}\n\n if (config.admin.livePreview.breakpoints) {\n clientConfig.admin.livePreview.breakpoints = config.admin.livePreview.breakpoints\n }\n }\n break\n case 'blocks': {\n ;(clientConfig.blocks as ClientBlock[]) = createClientBlocks({\n blocks: config.blocks,\n defaultIDType: config.db.defaultIDType,\n i18n,\n importMap,\n }).filter((block) => typeof block !== 'string') as ClientBlock[]\n\n break\n }\n case 'collections':\n ;(clientConfig.collections as ClientCollectionConfig[]) = createClientCollectionConfigs({\n collections: config.collections,\n defaultIDType: config.db.defaultIDType,\n i18n,\n importMap,\n })\n break\n case 'globals':\n ;(clientConfig.globals as ClientGlobalConfig[]) = createClientGlobalConfigs({\n defaultIDType: config.db.defaultIDType,\n globals: config.globals,\n i18n,\n importMap,\n })\n break\n\n case 'localization':\n if (typeof config.localization === 'object' && config.localization) {\n clientConfig.localization = {}\n if (config.localization.defaultLocale) {\n clientConfig.localization.defaultLocale = config.localization.defaultLocale\n }\n if (config.localization.defaultLocalePublishOption) {\n clientConfig.localization.defaultLocalePublishOption =\n config.localization.defaultLocalePublishOption\n }\n if (config.localization.fallback) {\n clientConfig.localization.fallback = config.localization.fallback\n }\n if (config.localization.localeCodes) {\n clientConfig.localization.localeCodes = config.localization.localeCodes\n }\n if (config.localization.locales) {\n clientConfig.localization.locales = []\n for (const locale of config.localization.locales) {\n if (locale) {\n const clientLocale: Partial<(typeof config.localization.locales)[0]> = {}\n if (locale.code) {\n clientLocale.code = locale.code\n }\n if (locale.fallbackLocale) {\n clientLocale.fallbackLocale = locale.fallbackLocale\n }\n if (locale.label) {\n clientLocale.label = locale.label\n }\n if (locale.rtl) {\n clientLocale.rtl = locale.rtl\n }\n clientConfig.localization.locales.push(clientLocale)\n }\n }\n }\n }\n break\n default:\n clientConfig[key] = config[key]\n }\n }\n return clientConfig as ClientConfig\n}\n"],"names":["createClientCollectionConfigs","createClientBlocks","createClientGlobalConfigs","serverOnlyAdminConfigProperties","serverOnlyConfigProperties","createClientConfig","config","i18n","importMap","clientConfig","key","includes","admin","autoLogin","avatar","custom","dateFormat","meta","routes","theme","timezones","user","livePreview","breakpoints","blocks","defaultIDType","db","filter","block","collections","globals","localization","defaultLocale","defaultLocalePublishOption","fallback","localeCodes","locales","locale","clientLocale","code","fallbackLocale","label","rtl","push"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAEhB,MAAM,YAAY,CAAA;AA6EnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAuQpF,CAAA"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAEhB,MAAM,YAAY,CAAA;AAqFnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAoTpF,CAAA"}
@@ -7,9 +7,11 @@ import { migrationsCollection } from '../database/migrations/migrationsCollectio
7
7
  import { DuplicateCollection, InvalidConfiguration } from '../errors/index.js';
8
8
  import { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js';
9
9
  import { sanitizeGlobal } from '../globals/config/sanitize.js';
10
+ import { baseBlockFields, formatLabels, sanitizeFields } from '../index.js';
10
11
  import { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js';
11
12
  import getPreferencesCollection from '../preferences/preferencesCollection.js';
12
13
  import { getDefaultJobsCollection } from '../queues/config/jobsCollection.js';
14
+ import { flattenBlock } from '../utilities/flattenAllFields.js';
13
15
  import { getSchedulePublishTask } from '../versions/schedule/job.js';
14
16
  import { defaults } from './defaults.js';
15
17
  const sanitizeAdminConfig = (configToSanitize)=>{
@@ -164,6 +166,38 @@ export const sanitizeConfig = async (incomingConfig)=>{
164
166
  const schedulePublishCollections = [];
165
167
  const schedulePublishGlobals = [];
166
168
  const collectionSlugs = new Set();
169
+ const validRelationships = [
170
+ ...config.collections.map((c)=>c.slug) ?? [],
171
+ 'payload-jobs',
172
+ 'payload-locked-documents',
173
+ 'payload-preferences'
174
+ ];
175
+ /**
176
+ * Blocks sanitization needs to happen before collections, as collection/global join field sanitization needs config.blocks
177
+ * to be populated with the sanitized blocks
178
+ */ config.blocks = [];
179
+ if (incomingConfig.blocks?.length) {
180
+ for (const block of incomingConfig.blocks){
181
+ const sanitizedBlock = flattenBlock({
182
+ block
183
+ });
184
+ if (sanitizedBlock._sanitized === true) {
185
+ continue;
186
+ }
187
+ sanitizedBlock._sanitized = true;
188
+ sanitizedBlock.fields = sanitizedBlock.fields.concat(baseBlockFields);
189
+ sanitizedBlock.labels = !sanitizedBlock.labels ? formatLabels(sanitizedBlock.slug) : sanitizedBlock.labels;
190
+ sanitizedBlock.fields = await sanitizeFields({
191
+ config: config,
192
+ existingFieldNames: new Set(),
193
+ fields: sanitizedBlock.fields,
194
+ parentIsLocalized: false,
195
+ richTextSanitizationPromises,
196
+ validRelationships
197
+ });
198
+ config.blocks.push(sanitizedBlock);
199
+ }
200
+ }
167
201
  for(let i = 0; i < config.collections.length; i++){
168
202
  if (collectionSlugs.has(config.collections[i].slug)) {
169
203
  throw new DuplicateCollection('slug', config.collections[i].slug);
@@ -173,7 +207,7 @@ export const sanitizeConfig = async (incomingConfig)=>{
173
207
  if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {
174
208
  schedulePublishCollections.push(config.collections[i].slug);
175
209
  }
176
- config.collections[i] = await sanitizeCollection(config, config.collections[i], richTextSanitizationPromises);
210
+ config.collections[i] = await sanitizeCollection(config, config.collections[i], richTextSanitizationPromises, validRelationships);
177
211
  }
178
212
  if (config.globals.length > 0) {
179
213
  for(let i = 0; i < config.globals.length; i++){
@@ -181,7 +215,7 @@ export const sanitizeConfig = async (incomingConfig)=>{
181
215
  if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {
182
216
  schedulePublishGlobals.push(config.globals[i].slug);
183
217
  }
184
- config.globals[i] = await sanitizeGlobal(config, config.globals[i], richTextSanitizationPromises);
218
+ config.globals[i] = await sanitizeGlobal(config, config.globals[i], richTextSanitizationPromises, validRelationships);
185
219
  }
186
220
  }
187
221
  if (schedulePublishCollections.length > 0 || schedulePublishGlobals.length > 0) {
@@ -202,12 +236,12 @@ export const sanitizeConfig = async (incomingConfig)=>{
202
236
  defaultJobsCollection
203
237
  });
204
238
  }
205
- const sanitizedJobsCollection = await sanitizeCollection(config, defaultJobsCollection, richTextSanitizationPromises);
239
+ const sanitizedJobsCollection = await sanitizeCollection(config, defaultJobsCollection, richTextSanitizationPromises, validRelationships);
206
240
  configWithDefaults.collections.push(sanitizedJobsCollection);
207
241
  }
208
- configWithDefaults.collections.push(await sanitizeCollection(config, getLockedDocumentsCollection(config), richTextSanitizationPromises));
209
- configWithDefaults.collections.push(await sanitizeCollection(config, getPreferencesCollection(config), richTextSanitizationPromises));
210
- configWithDefaults.collections.push(await sanitizeCollection(config, migrationsCollection, richTextSanitizationPromises));
242
+ configWithDefaults.collections.push(await sanitizeCollection(config, getLockedDocumentsCollection(config), richTextSanitizationPromises, validRelationships));
243
+ configWithDefaults.collections.push(await sanitizeCollection(config, getPreferencesCollection(config), richTextSanitizationPromises, validRelationships));
244
+ configWithDefaults.collections.push(await sanitizeCollection(config, migrationsCollection, richTextSanitizationPromises, validRelationships));
211
245
  if (config.serverURL !== '') {
212
246
  config.csrf.push(config.serverURL);
213
247
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config/sanitize.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\nimport { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type { CollectionSlug, GlobalSlug } from '../index.js'\nimport type {\n Config,\n LocalizationConfigWithLabels,\n LocalizationConfigWithNoLabels,\n SanitizedConfig,\n Timezone,\n} from './types.js'\n\nimport { defaultUserCollection } from '../auth/defaultUser.js'\nimport { authRootEndpoints } from '../auth/endpoints/index.js'\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { migrationsCollection } from '../database/migrations/migrationsCollection.js'\nimport { DuplicateCollection, InvalidConfiguration } from '../errors/index.js'\nimport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\nimport { sanitizeGlobal } from '../globals/config/sanitize.js'\nimport { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js'\nimport getPreferencesCollection from '../preferences/preferencesCollection.js'\nimport { getDefaultJobsCollection } from '../queues/config/jobsCollection.js'\nimport { getSchedulePublishTask } from '../versions/schedule/job.js'\nimport { defaults } from './defaults.js'\n\nconst sanitizeAdminConfig = (configToSanitize: Config): Partial<SanitizedConfig> => {\n const sanitizedConfig = { ...configToSanitize }\n\n // default logging level will be 'error' if not provided\n sanitizedConfig.loggingLevels = {\n Forbidden: 'info',\n Locked: 'info',\n MissingFile: 'info',\n NotFound: 'info',\n ValidationError: 'info',\n ...(sanitizedConfig.loggingLevels || {}),\n }\n\n // add default user collection if none provided\n if (!sanitizedConfig?.admin?.user) {\n const firstCollectionWithAuth = sanitizedConfig.collections.find(({ auth }) => Boolean(auth))\n if (firstCollectionWithAuth) {\n sanitizedConfig.admin.user = firstCollectionWithAuth.slug\n } else {\n sanitizedConfig.admin.user = defaultUserCollection.slug\n sanitizedConfig.collections.push(defaultUserCollection)\n }\n }\n\n const userCollection = sanitizedConfig.collections.find(\n ({ slug }) => slug === sanitizedConfig.admin.user,\n )\n if (!userCollection || !userCollection.auth) {\n throw new InvalidConfiguration(\n `${sanitizedConfig.admin.user} is not a valid admin user collection`,\n )\n }\n\n if (sanitizedConfig?.admin?.timezones) {\n if (typeof sanitizedConfig?.admin?.timezones?.supportedTimezones === 'function') {\n sanitizedConfig.admin.timezones.supportedTimezones =\n sanitizedConfig.admin.timezones.supportedTimezones({ defaultTimezones })\n }\n\n if (!sanitizedConfig?.admin?.timezones?.supportedTimezones) {\n sanitizedConfig.admin.timezones.supportedTimezones = defaultTimezones\n }\n } else {\n sanitizedConfig.admin.timezones = {\n supportedTimezones: defaultTimezones,\n }\n }\n // Timezones supported by the Intl API\n const _internalSupportedTimezones = Intl.supportedValuesOf('timeZone')\n\n // We're casting here because it's already been sanitised above but TS still thinks it could be a function\n ;(sanitizedConfig.admin.timezones.supportedTimezones as Timezone[]).forEach((timezone) => {\n if (!_internalSupportedTimezones.includes(timezone.value)) {\n throw new InvalidConfiguration(\n `Timezone ${timezone.value} is not supported by the current runtime via the Intl API.`,\n )\n }\n })\n\n return sanitizedConfig as unknown as Partial<SanitizedConfig>\n}\n\nexport const sanitizeConfig = async (incomingConfig: Config): Promise<SanitizedConfig> => {\n const configWithDefaults = {\n ...defaults,\n ...incomingConfig,\n admin: {\n ...defaults.admin,\n ...incomingConfig?.admin,\n meta: {\n ...defaults.admin.meta,\n ...incomingConfig?.admin?.meta,\n },\n routes: {\n ...defaults.admin.routes,\n ...incomingConfig?.admin?.routes,\n },\n },\n graphQL: {\n ...defaults.graphQL,\n ...incomingConfig?.graphQL,\n },\n jobs: {\n ...defaults.jobs,\n ...incomingConfig?.jobs,\n access: {\n ...defaults.jobs.access,\n ...incomingConfig?.jobs?.access,\n },\n tasks: incomingConfig?.jobs?.tasks || [],\n workflows: incomingConfig?.jobs?.workflows || [],\n },\n routes: {\n ...defaults.routes,\n ...incomingConfig?.routes,\n },\n typescript: {\n ...defaults.typescript,\n ...incomingConfig?.typescript,\n },\n }\n\n if (!configWithDefaults?.serverURL) {\n configWithDefaults.serverURL = ''\n }\n\n if (process.env.NEXT_BASE_PATH) {\n if (!incomingConfig?.routes?.api) {\n // check for incomingConfig, as configWithDefaults will always have a default value for routes.api\n configWithDefaults.routes.api = process.env.NEXT_BASE_PATH + '/api'\n }\n }\n\n const config: Partial<SanitizedConfig> = sanitizeAdminConfig(configWithDefaults)\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n for (const endpoint of authRootEndpoints) {\n config.endpoints.push(endpoint)\n }\n\n if (config.localization && config.localization.locales?.length > 0) {\n // clone localization config so to not break everything\n const firstLocale = config.localization.locales[0]\n if (typeof firstLocale === 'string') {\n config.localization.localeCodes = [\n ...(config.localization as unknown as LocalizationConfigWithNoLabels).locales,\n ]\n\n // is string[], so convert to Locale[]\n config.localization.locales = (\n config.localization as unknown as LocalizationConfigWithNoLabels\n ).locales.map((locale) => ({\n code: locale,\n label: locale,\n rtl: false,\n toString: () => locale,\n }))\n } else {\n // is Locale[], so convert to string[] for localeCodes\n config.localization.localeCodes = config.localization.locales.reduce((locales, locale) => {\n locales.push(locale.code)\n return locales\n }, [] as string[])\n\n config.localization.locales = (\n config.localization as LocalizationConfigWithLabels\n ).locales.map((locale) => ({\n ...locale,\n toString: () => locale.code,\n }))\n }\n\n // Default fallback to true if not provided\n config.localization.fallback = config.localization?.fallback ?? true\n }\n\n const i18nConfig: SanitizedConfig['i18n'] = {\n fallbackLanguage: 'en',\n supportedLanguages: {\n en,\n },\n translations: {},\n }\n\n if (incomingConfig?.i18n) {\n i18nConfig.supportedLanguages =\n incomingConfig.i18n?.supportedLanguages || i18nConfig.supportedLanguages\n\n const supportedLangKeys = <AcceptedLanguages[]>Object.keys(i18nConfig.supportedLanguages)\n const fallbackLang = incomingConfig.i18n?.fallbackLanguage || i18nConfig.fallbackLanguage\n\n i18nConfig.fallbackLanguage = supportedLangKeys.includes(fallbackLang)\n ? fallbackLang\n : supportedLangKeys[0]\n i18nConfig.translations =\n (incomingConfig.i18n?.translations as SanitizedConfig['i18n']['translations']) ||\n i18nConfig.translations\n }\n\n config.i18n = i18nConfig\n\n const richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>> = []\n\n const schedulePublishCollections: CollectionSlug[] = []\n const schedulePublishGlobals: GlobalSlug[] = []\n\n const collectionSlugs = new Set<CollectionSlug>()\n\n for (let i = 0; i < config.collections.length; i++) {\n if (collectionSlugs.has(config.collections[i].slug)) {\n throw new DuplicateCollection('slug', config.collections[i].slug)\n }\n\n collectionSlugs.add(config.collections[i].slug)\n\n const draftsConfig = config.collections[i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishCollections.push(config.collections[i].slug)\n }\n\n config.collections[i] = await sanitizeCollection(\n config as unknown as Config,\n config.collections[i],\n richTextSanitizationPromises,\n )\n }\n\n if (config.globals.length > 0) {\n for (let i = 0; i < config.globals.length; i++) {\n const draftsConfig = config.globals[i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishGlobals.push(config.globals[i].slug)\n }\n\n config.globals[i] = await sanitizeGlobal(\n config as unknown as Config,\n config.globals[i],\n richTextSanitizationPromises,\n )\n }\n }\n\n if (schedulePublishCollections.length > 0 || schedulePublishGlobals.length > 0) {\n if (!Array.isArray(configWithDefaults.jobs?.tasks)) {\n configWithDefaults.jobs.tasks = []\n }\n\n configWithDefaults.jobs.tasks.push(\n getSchedulePublishTask({\n adminUserSlug: config.admin.user,\n collections: schedulePublishCollections,\n globals: schedulePublishGlobals,\n }),\n )\n }\n\n // Need to add default jobs collection before locked documents collections\n if (\n (Array.isArray(configWithDefaults.jobs?.tasks) && configWithDefaults.jobs?.tasks?.length) ||\n (Array.isArray(configWithDefaults.jobs?.workflows) &&\n configWithDefaults.jobs?.workflows?.length)\n ) {\n let defaultJobsCollection = getDefaultJobsCollection(config as unknown as Config)\n\n if (typeof configWithDefaults.jobs.jobsCollectionOverrides === 'function') {\n defaultJobsCollection = configWithDefaults.jobs.jobsCollectionOverrides({\n defaultJobsCollection,\n })\n }\n\n const sanitizedJobsCollection = await sanitizeCollection(\n config as unknown as Config,\n defaultJobsCollection,\n richTextSanitizationPromises,\n )\n\n configWithDefaults.collections.push(sanitizedJobsCollection)\n }\n\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n getLockedDocumentsCollection(config as unknown as Config),\n richTextSanitizationPromises,\n ),\n )\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n getPreferencesCollection(config as unknown as Config),\n richTextSanitizationPromises,\n ),\n )\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n migrationsCollection,\n richTextSanitizationPromises,\n ),\n )\n\n if (config.serverURL !== '') {\n config.csrf.push(config.serverURL)\n }\n\n // Get deduped list of upload adapters\n if (!config.upload) {\n config.upload = { adapters: [] }\n }\n\n config.upload.adapters = Array.from(\n new Set(config.collections.map((c) => c.upload?.adapter).filter(Boolean)),\n )\n\n // Pass through the email config as is so adapters don't break\n if (incomingConfig.email) {\n config.email = incomingConfig.email\n }\n\n /*\n Execute richText sanitization\n */\n if (typeof incomingConfig.editor === 'function') {\n config.editor = await incomingConfig.editor({\n config: config as SanitizedConfig,\n isRoot: true,\n parentIsLocalized: false,\n })\n if (config.editor.i18n && Object.keys(config.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, config.editor.i18n)\n }\n }\n\n const promises: Promise<void>[] = []\n for (const sanitizeFunction of richTextSanitizationPromises) {\n promises.push(sanitizeFunction(config as SanitizedConfig))\n }\n await Promise.all(promises)\n\n return config as SanitizedConfig\n}\n"],"names":["en","deepMergeSimple","defaultUserCollection","authRootEndpoints","sanitizeCollection","migrationsCollection","DuplicateCollection","InvalidConfiguration","defaultTimezones","sanitizeGlobal","getLockedDocumentsCollection","getPreferencesCollection","getDefaultJobsCollection","getSchedulePublishTask","defaults","sanitizeAdminConfig","configToSanitize","sanitizedConfig","loggingLevels","Forbidden","Locked","MissingFile","NotFound","ValidationError","admin","user","firstCollectionWithAuth","collections","find","auth","Boolean","slug","push","userCollection","timezones","supportedTimezones","_internalSupportedTimezones","Intl","supportedValuesOf","forEach","timezone","includes","value","sanitizeConfig","incomingConfig","configWithDefaults","meta","routes","graphQL","jobs","access","tasks","workflows","typescript","serverURL","process","env","NEXT_BASE_PATH","api","config","endpoints","endpoint","localization","locales","length","firstLocale","localeCodes","map","locale","code","label","rtl","toString","reduce","fallback","i18nConfig","fallbackLanguage","supportedLanguages","translations","i18n","supportedLangKeys","Object","keys","fallbackLang","richTextSanitizationPromises","schedulePublishCollections","schedulePublishGlobals","collectionSlugs","Set","i","has","add","draftsConfig","versions","drafts","schedulePublish","globals","Array","isArray","adminUserSlug","defaultJobsCollection","jobsCollectionOverrides","sanitizedJobsCollection","csrf","upload","adapters","from","c","adapter","filter","email","editor","isRoot","parentIsLocalized","promises","sanitizeFunction","Promise","all"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/config/sanitize.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\n\nimport { en } from '@payloadcms/translations/languages/en'\nimport { deepMergeSimple } from '@payloadcms/translations/utilities'\n\nimport type {\n Config,\n LocalizationConfigWithLabels,\n LocalizationConfigWithNoLabels,\n SanitizedConfig,\n Timezone,\n} from './types.js'\n\nimport { defaultUserCollection } from '../auth/defaultUser.js'\nimport { authRootEndpoints } from '../auth/endpoints/index.js'\nimport { sanitizeCollection } from '../collections/config/sanitize.js'\nimport { migrationsCollection } from '../database/migrations/migrationsCollection.js'\nimport { DuplicateCollection, InvalidConfiguration } from '../errors/index.js'\nimport { defaultTimezones } from '../fields/baseFields/timezone/defaultTimezones.js'\nimport { sanitizeGlobal } from '../globals/config/sanitize.js'\nimport {\n baseBlockFields,\n type CollectionSlug,\n formatLabels,\n type GlobalSlug,\n sanitizeFields,\n} from '../index.js'\nimport { getLockedDocumentsCollection } from '../lockedDocuments/lockedDocumentsCollection.js'\nimport getPreferencesCollection from '../preferences/preferencesCollection.js'\nimport { getDefaultJobsCollection } from '../queues/config/jobsCollection.js'\nimport { flattenBlock } from '../utilities/flattenAllFields.js'\nimport { getSchedulePublishTask } from '../versions/schedule/job.js'\nimport { defaults } from './defaults.js'\n\nconst sanitizeAdminConfig = (configToSanitize: Config): Partial<SanitizedConfig> => {\n const sanitizedConfig = { ...configToSanitize }\n\n // default logging level will be 'error' if not provided\n sanitizedConfig.loggingLevels = {\n Forbidden: 'info',\n Locked: 'info',\n MissingFile: 'info',\n NotFound: 'info',\n ValidationError: 'info',\n ...(sanitizedConfig.loggingLevels || {}),\n }\n\n // add default user collection if none provided\n if (!sanitizedConfig?.admin?.user) {\n const firstCollectionWithAuth = sanitizedConfig.collections.find(({ auth }) => Boolean(auth))\n if (firstCollectionWithAuth) {\n sanitizedConfig.admin.user = firstCollectionWithAuth.slug\n } else {\n sanitizedConfig.admin.user = defaultUserCollection.slug\n sanitizedConfig.collections.push(defaultUserCollection)\n }\n }\n\n const userCollection = sanitizedConfig.collections.find(\n ({ slug }) => slug === sanitizedConfig.admin.user,\n )\n if (!userCollection || !userCollection.auth) {\n throw new InvalidConfiguration(\n `${sanitizedConfig.admin.user} is not a valid admin user collection`,\n )\n }\n\n if (sanitizedConfig?.admin?.timezones) {\n if (typeof sanitizedConfig?.admin?.timezones?.supportedTimezones === 'function') {\n sanitizedConfig.admin.timezones.supportedTimezones =\n sanitizedConfig.admin.timezones.supportedTimezones({ defaultTimezones })\n }\n\n if (!sanitizedConfig?.admin?.timezones?.supportedTimezones) {\n sanitizedConfig.admin.timezones.supportedTimezones = defaultTimezones\n }\n } else {\n sanitizedConfig.admin.timezones = {\n supportedTimezones: defaultTimezones,\n }\n }\n // Timezones supported by the Intl API\n const _internalSupportedTimezones = Intl.supportedValuesOf('timeZone')\n\n // We're casting here because it's already been sanitised above but TS still thinks it could be a function\n ;(sanitizedConfig.admin.timezones.supportedTimezones as Timezone[]).forEach((timezone) => {\n if (!_internalSupportedTimezones.includes(timezone.value)) {\n throw new InvalidConfiguration(\n `Timezone ${timezone.value} is not supported by the current runtime via the Intl API.`,\n )\n }\n })\n\n return sanitizedConfig as unknown as Partial<SanitizedConfig>\n}\n\nexport const sanitizeConfig = async (incomingConfig: Config): Promise<SanitizedConfig> => {\n const configWithDefaults = {\n ...defaults,\n ...incomingConfig,\n admin: {\n ...defaults.admin,\n ...incomingConfig?.admin,\n meta: {\n ...defaults.admin.meta,\n ...incomingConfig?.admin?.meta,\n },\n routes: {\n ...defaults.admin.routes,\n ...incomingConfig?.admin?.routes,\n },\n },\n graphQL: {\n ...defaults.graphQL,\n ...incomingConfig?.graphQL,\n },\n jobs: {\n ...defaults.jobs,\n ...incomingConfig?.jobs,\n access: {\n ...defaults.jobs.access,\n ...incomingConfig?.jobs?.access,\n },\n tasks: incomingConfig?.jobs?.tasks || [],\n workflows: incomingConfig?.jobs?.workflows || [],\n },\n routes: {\n ...defaults.routes,\n ...incomingConfig?.routes,\n },\n typescript: {\n ...defaults.typescript,\n ...incomingConfig?.typescript,\n },\n }\n\n if (!configWithDefaults?.serverURL) {\n configWithDefaults.serverURL = ''\n }\n\n if (process.env.NEXT_BASE_PATH) {\n if (!incomingConfig?.routes?.api) {\n // check for incomingConfig, as configWithDefaults will always have a default value for routes.api\n configWithDefaults.routes.api = process.env.NEXT_BASE_PATH + '/api'\n }\n }\n\n const config: Partial<SanitizedConfig> = sanitizeAdminConfig(configWithDefaults)\n\n if (!config.endpoints) {\n config.endpoints = []\n }\n\n for (const endpoint of authRootEndpoints) {\n config.endpoints.push(endpoint)\n }\n\n if (config.localization && config.localization.locales?.length > 0) {\n // clone localization config so to not break everything\n const firstLocale = config.localization.locales[0]\n if (typeof firstLocale === 'string') {\n config.localization.localeCodes = [\n ...(config.localization as unknown as LocalizationConfigWithNoLabels).locales,\n ]\n\n // is string[], so convert to Locale[]\n config.localization.locales = (\n config.localization as unknown as LocalizationConfigWithNoLabels\n ).locales.map((locale) => ({\n code: locale,\n label: locale,\n rtl: false,\n toString: () => locale,\n }))\n } else {\n // is Locale[], so convert to string[] for localeCodes\n config.localization.localeCodes = config.localization.locales.reduce((locales, locale) => {\n locales.push(locale.code)\n return locales\n }, [] as string[])\n\n config.localization.locales = (\n config.localization as LocalizationConfigWithLabels\n ).locales.map((locale) => ({\n ...locale,\n toString: () => locale.code,\n }))\n }\n\n // Default fallback to true if not provided\n config.localization.fallback = config.localization?.fallback ?? true\n }\n\n const i18nConfig: SanitizedConfig['i18n'] = {\n fallbackLanguage: 'en',\n supportedLanguages: {\n en,\n },\n translations: {},\n }\n\n if (incomingConfig?.i18n) {\n i18nConfig.supportedLanguages =\n incomingConfig.i18n?.supportedLanguages || i18nConfig.supportedLanguages\n\n const supportedLangKeys = <AcceptedLanguages[]>Object.keys(i18nConfig.supportedLanguages)\n const fallbackLang = incomingConfig.i18n?.fallbackLanguage || i18nConfig.fallbackLanguage\n\n i18nConfig.fallbackLanguage = supportedLangKeys.includes(fallbackLang)\n ? fallbackLang\n : supportedLangKeys[0]\n i18nConfig.translations =\n (incomingConfig.i18n?.translations as SanitizedConfig['i18n']['translations']) ||\n i18nConfig.translations\n }\n\n config.i18n = i18nConfig\n\n const richTextSanitizationPromises: Array<(config: SanitizedConfig) => Promise<void>> = []\n\n const schedulePublishCollections: CollectionSlug[] = []\n const schedulePublishGlobals: GlobalSlug[] = []\n\n const collectionSlugs = new Set<CollectionSlug>()\n\n const validRelationships = [\n ...(config.collections.map((c) => c.slug) ?? []),\n 'payload-jobs',\n 'payload-locked-documents',\n 'payload-preferences',\n ]\n\n /**\n * Blocks sanitization needs to happen before collections, as collection/global join field sanitization needs config.blocks\n * to be populated with the sanitized blocks\n */\n config.blocks = []\n if (incomingConfig.blocks?.length) {\n for (const block of incomingConfig.blocks) {\n const sanitizedBlock = flattenBlock({ block })\n\n if (sanitizedBlock._sanitized === true) {\n continue\n }\n sanitizedBlock._sanitized = true\n\n sanitizedBlock.fields = sanitizedBlock.fields.concat(baseBlockFields)\n\n sanitizedBlock.labels = !sanitizedBlock.labels\n ? formatLabels(sanitizedBlock.slug)\n : sanitizedBlock.labels\n sanitizedBlock.fields = await sanitizeFields({\n config: config as unknown as Config,\n existingFieldNames: new Set(),\n fields: sanitizedBlock.fields,\n parentIsLocalized: false,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n config.blocks.push(sanitizedBlock)\n }\n }\n\n for (let i = 0; i < config.collections.length; i++) {\n if (collectionSlugs.has(config.collections[i].slug)) {\n throw new DuplicateCollection('slug', config.collections[i].slug)\n }\n\n collectionSlugs.add(config.collections[i].slug)\n\n const draftsConfig = config.collections[i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishCollections.push(config.collections[i].slug)\n }\n\n config.collections[i] = await sanitizeCollection(\n config as unknown as Config,\n config.collections[i],\n richTextSanitizationPromises,\n validRelationships,\n )\n }\n\n if (config.globals.length > 0) {\n for (let i = 0; i < config.globals.length; i++) {\n const draftsConfig = config.globals[i]?.versions?.drafts\n\n if (typeof draftsConfig === 'object' && draftsConfig.schedulePublish) {\n schedulePublishGlobals.push(config.globals[i].slug)\n }\n\n config.globals[i] = await sanitizeGlobal(\n config as unknown as Config,\n config.globals[i],\n richTextSanitizationPromises,\n validRelationships,\n )\n }\n }\n\n if (schedulePublishCollections.length > 0 || schedulePublishGlobals.length > 0) {\n if (!Array.isArray(configWithDefaults.jobs?.tasks)) {\n configWithDefaults.jobs.tasks = []\n }\n\n configWithDefaults.jobs.tasks.push(\n getSchedulePublishTask({\n adminUserSlug: config.admin.user,\n collections: schedulePublishCollections,\n globals: schedulePublishGlobals,\n }),\n )\n }\n\n // Need to add default jobs collection before locked documents collections\n if (\n (Array.isArray(configWithDefaults.jobs?.tasks) && configWithDefaults.jobs?.tasks?.length) ||\n (Array.isArray(configWithDefaults.jobs?.workflows) &&\n configWithDefaults.jobs?.workflows?.length)\n ) {\n let defaultJobsCollection = getDefaultJobsCollection(config as unknown as Config)\n\n if (typeof configWithDefaults.jobs.jobsCollectionOverrides === 'function') {\n defaultJobsCollection = configWithDefaults.jobs.jobsCollectionOverrides({\n defaultJobsCollection,\n })\n }\n\n const sanitizedJobsCollection = await sanitizeCollection(\n config as unknown as Config,\n defaultJobsCollection,\n richTextSanitizationPromises,\n validRelationships,\n )\n\n configWithDefaults.collections.push(sanitizedJobsCollection)\n }\n\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n getLockedDocumentsCollection(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n getPreferencesCollection(config as unknown as Config),\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n configWithDefaults.collections.push(\n await sanitizeCollection(\n config as unknown as Config,\n migrationsCollection,\n richTextSanitizationPromises,\n validRelationships,\n ),\n )\n\n if (config.serverURL !== '') {\n config.csrf.push(config.serverURL)\n }\n\n // Get deduped list of upload adapters\n if (!config.upload) {\n config.upload = { adapters: [] }\n }\n\n config.upload.adapters = Array.from(\n new Set(config.collections.map((c) => c.upload?.adapter).filter(Boolean)),\n )\n\n // Pass through the email config as is so adapters don't break\n if (incomingConfig.email) {\n config.email = incomingConfig.email\n }\n\n /*\n Execute richText sanitization\n */\n if (typeof incomingConfig.editor === 'function') {\n config.editor = await incomingConfig.editor({\n config: config as SanitizedConfig,\n isRoot: true,\n parentIsLocalized: false,\n })\n if (config.editor.i18n && Object.keys(config.editor.i18n).length >= 0) {\n config.i18n.translations = deepMergeSimple(config.i18n.translations, config.editor.i18n)\n }\n }\n\n const promises: Promise<void>[] = []\n for (const sanitizeFunction of richTextSanitizationPromises) {\n promises.push(sanitizeFunction(config as SanitizedConfig))\n }\n await Promise.all(promises)\n\n return config as SanitizedConfig\n}\n"],"names":["en","deepMergeSimple","defaultUserCollection","authRootEndpoints","sanitizeCollection","migrationsCollection","DuplicateCollection","InvalidConfiguration","defaultTimezones","sanitizeGlobal","baseBlockFields","formatLabels","sanitizeFields","getLockedDocumentsCollection","getPreferencesCollection","getDefaultJobsCollection","flattenBlock","getSchedulePublishTask","defaults","sanitizeAdminConfig","configToSanitize","sanitizedConfig","loggingLevels","Forbidden","Locked","MissingFile","NotFound","ValidationError","admin","user","firstCollectionWithAuth","collections","find","auth","Boolean","slug","push","userCollection","timezones","supportedTimezones","_internalSupportedTimezones","Intl","supportedValuesOf","forEach","timezone","includes","value","sanitizeConfig","incomingConfig","configWithDefaults","meta","routes","graphQL","jobs","access","tasks","workflows","typescript","serverURL","process","env","NEXT_BASE_PATH","api","config","endpoints","endpoint","localization","locales","length","firstLocale","localeCodes","map","locale","code","label","rtl","toString","reduce","fallback","i18nConfig","fallbackLanguage","supportedLanguages","translations","i18n","supportedLangKeys","Object","keys","fallbackLang","richTextSanitizationPromises","schedulePublishCollections","schedulePublishGlobals","collectionSlugs","Set","validRelationships","c","blocks","block","sanitizedBlock","_sanitized","fields","concat","labels","existingFieldNames","parentIsLocalized","i","has","add","draftsConfig","versions","drafts","schedulePublish","globals","Array","isArray","adminUserSlug","defaultJobsCollection","jobsCollectionOverrides","sanitizedJobsCollection","csrf","upload","adapters","from","adapter","filter","email","editor","isRoot","promises","sanitizeFunction","Promise","all"],"mappings":"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"}
@@ -17,7 +17,7 @@ import type { DatabaseAdapterResult } from '../database/types.js';
17
17
  import type { EmailAdapter, SendEmailOptions } from '../email/types.js';
18
18
  import type { ErrorName } from '../errors/types.js';
19
19
  import type { GlobalConfig, Globals, SanitizedGlobalConfig } from '../globals/config/types.js';
20
- import type { JobsConfig, Payload, RequestContext, TypedUser } from '../index.js';
20
+ import type { Block, FlattenedBlock, JobsConfig, Payload, RequestContext, TypedUser } from '../index.js';
21
21
  import type { PayloadRequest, Where } from '../types/index.js';
22
22
  import type { PayloadLogger } from '../utilities/logger.js';
23
23
  /**
@@ -753,6 +753,7 @@ export type Config = {
753
753
  };
754
754
  /** Custom Payload bin scripts can be injected via the config. */
755
755
  bin?: BinScriptConfig[];
756
+ blocks?: Block[];
756
757
  /**
757
758
  * Manage the datamodel of your application
758
759
  *
@@ -1009,6 +1010,7 @@ export type SanitizedConfig = {
1009
1010
  admin: {
1010
1011
  timezones: SanitizedTimezoneConfig;
1011
1012
  } & DeepRequired<Config['admin']>;
1013
+ blocks?: FlattenedBlock[];
1012
1014
  collections: SanitizedCollectionConfig[];
1013
1015
  /** Default richtext editor to use for richText fields */
1014
1016
  editor?: RichTextAdapter<any, any, any>;
@@ -1028,7 +1030,7 @@ export type SanitizedConfig = {
1028
1030
  */
1029
1031
  adapters: string[];
1030
1032
  } & FetchAPIFileUploadOptions;
1031
- } & Omit<DeepRequired<Config>, 'admin' | 'collections' | 'editor' | 'endpoint' | 'globals' | 'i18n' | 'localization' | 'upload'>;
1033
+ } & Omit<DeepRequired<Config>, 'admin' | 'blocks' | 'collections' | 'editor' | 'endpoint' | 'globals' | 'i18n' | 'localization' | 'upload'>;
1032
1034
  export type EditConfig = EditConfigWithoutRoot | EditConfigWithRoot;
1033
1035
  export type EditConfigWithRoot = {
1034
1036
  api?: never;