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.
- package/dist/bin/generateImportMap/iterateConfig.d.ts.map +1 -1
- package/dist/bin/generateImportMap/iterateConfig.js +15 -1
- package/dist/bin/generateImportMap/iterateConfig.js.map +1 -1
- package/dist/bin/generateImportMap/iterateFields.js +1 -1
- package/dist/bin/generateImportMap/iterateFields.js.map +1 -1
- package/dist/collections/config/sanitize.d.ts +1 -1
- package/dist/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +2 -7
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/config/client.d.ts +13 -0
- package/dist/config/client.d.ts.map +1 -1
- package/dist/config/client.js +12 -0
- package/dist/config/client.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +40 -6
- package/dist/config/sanitize.js.map +1 -1
- package/dist/config/types.d.ts +4 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/database/getLocalizedPaths.d.ts.map +1 -1
- package/dist/database/getLocalizedPaths.js +7 -1
- package/dist/database/getLocalizedPaths.js.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.d.ts.map +1 -1
- package/dist/database/queryValidation/validateSearchParams.js +1 -1
- package/dist/database/queryValidation/validateSearchParams.js.map +1 -1
- package/dist/fields/config/client.d.ts +7 -1
- package/dist/fields/config/client.d.ts.map +1 -1
- package/dist/fields/config/client.js +75 -53
- package/dist/fields/config/client.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +7 -1
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/sanitizeJoinField.d.ts.map +1 -1
- package/dist/fields/config/sanitizeJoinField.js +1 -0
- package/dist/fields/config/sanitizeJoinField.js.map +1 -1
- package/dist/fields/config/types.d.ts +30 -7
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.d.ts +2 -1
- package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js +4 -2
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterChange/traverseFields.d.ts +2 -1
- package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/traverseFields.js +3 -2
- package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts +2 -1
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js +7 -3
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.js +1 -0
- package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +3 -2
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +1 -0
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeDuplicate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/promise.js +5 -3
- package/dist/fields/hooks/beforeDuplicate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeDuplicate/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeDuplicate/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts +2 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +3 -2
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/dist/globals/config/sanitize.d.ts +1 -1
- package/dist/globals/config/sanitize.d.ts.map +1 -1
- package/dist/globals/config/sanitize.js +2 -2
- package/dist/globals/config/sanitize.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/uploads/types.d.ts +8 -0
- package/dist/uploads/types.d.ts.map +1 -1
- package/dist/uploads/types.js.map +1 -1
- package/dist/utilities/configToJSONSchema.d.ts +2 -1
- package/dist/utilities/configToJSONSchema.d.ts.map +1 -1
- package/dist/utilities/configToJSONSchema.js +48 -5
- package/dist/utilities/configToJSONSchema.js.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.d.ts +2 -1
- package/dist/utilities/fieldSchemaToJSON.d.ts.map +1 -1
- package/dist/utilities/fieldSchemaToJSON.js +9 -8
- package/dist/utilities/fieldSchemaToJSON.js.map +1 -1
- package/dist/utilities/flattenAllFields.d.ts +4 -1
- package/dist/utilities/flattenAllFields.d.ts.map +1 -1
- package/dist/utilities/flattenAllFields.js +34 -9
- package/dist/utilities/flattenAllFields.js.map +1 -1
- package/dist/utilities/getEntityPolicies.d.ts.map +1 -1
- package/dist/utilities/getEntityPolicies.js +4 -2
- package/dist/utilities/getEntityPolicies.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts +12 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +65 -8
- package/dist/utilities/traverseFields.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iterateConfig.d.ts","sourceRoot":"","sources":["../../../src/bin/generateImportMap/iterateConfig.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
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":["
|
|
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"}
|
|
@@ -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;
|
|
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
|
|
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,
|
|
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 =
|
|
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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"}
|
package/dist/config/client.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/config/client.js
CHANGED
|
@@ -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'\
|
|
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":"
|
|
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"}
|
package/dist/config/sanitize.js
CHANGED
|
@@ -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":"AAEA,SAASA,EAAE,QAAQ,wCAAuC;AAC1D,SAASC,eAAe,QAAQ,qCAAoC;AAUpE,SAASC,qBAAqB,QAAQ,yBAAwB;AAC9D,SAASC,iBAAiB,QAAQ,6BAA4B;AAC9D,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,oBAAoB,QAAQ,iDAAgD;AACrF,SAASC,mBAAmB,EAAEC,oBAAoB,QAAQ,qBAAoB;AAC9E,SAASC,gBAAgB,QAAQ,oDAAmD;AACpF,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SACEC,eAAe,EAEfC,YAAY,EAEZC,cAAc,QACT,cAAa;AACpB,SAASC,4BAA4B,QAAQ,kDAAiD;AAC9F,OAAOC,8BAA8B,0CAAyC;AAC9E,SAASC,wBAAwB,QAAQ,qCAAoC;AAC7E,SAASC,YAAY,QAAQ,mCAAkC;AAC/D,SAASC,sBAAsB,QAAQ,8BAA6B;AACpE,SAASC,QAAQ,QAAQ,gBAAe;AAExC,MAAMC,sBAAsB,CAACC;IAC3B,MAAMC,kBAAkB;QAAE,GAAGD,gBAAgB;IAAC;IAE9C,wDAAwD;IACxDC,gBAAgBC,aAAa,GAAG;QAC9BC,WAAW;QACXC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,iBAAiB;QACjB,GAAIN,gBAAgBC,aAAa,IAAI,CAAC,CAAC;IACzC;IAEA,+CAA+C;IAC/C,IAAI,CAACD,iBAAiBO,OAAOC,MAAM;QACjC,MAAMC,0BAA0BT,gBAAgBU,WAAW,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKC,QAAQD;QACvF,IAAIH,yBAAyB;YAC3BT,gBAAgBO,KAAK,CAACC,IAAI,GAAGC,wBAAwBK,IAAI;QAC3D,OAAO;YACLd,gBAAgBO,KAAK,CAACC,IAAI,GAAG3B,sBAAsBiC,IAAI;YACvDd,gBAAgBU,WAAW,CAACK,IAAI,CAAClC;QACnC;IACF;IAEA,MAAMmC,iBAAiBhB,gBAAgBU,WAAW,CAACC,IAAI,CACrD,CAAC,EAAEG,IAAI,EAAE,GAAKA,SAASd,gBAAgBO,KAAK,CAACC,IAAI;IAEnD,IAAI,CAACQ,kBAAkB,CAACA,eAAeJ,IAAI,EAAE;QAC3C,MAAM,IAAI1B,qBACR,GAAGc,gBAAgBO,KAAK,CAACC,IAAI,CAAC,qCAAqC,CAAC;IAExE;IAEA,IAAIR,iBAAiBO,OAAOU,WAAW;QACrC,IAAI,OAAOjB,iBAAiBO,OAAOU,WAAWC,uBAAuB,YAAY;YAC/ElB,gBAAgBO,KAAK,CAACU,SAAS,CAACC,kBAAkB,GAChDlB,gBAAgBO,KAAK,CAACU,SAAS,CAACC,kBAAkB,CAAC;gBAAE/B;YAAiB;QAC1E;QAEA,IAAI,CAACa,iBAAiBO,OAAOU,WAAWC,oBAAoB;YAC1DlB,gBAAgBO,KAAK,CAACU,SAAS,CAACC,kBAAkB,GAAG/B;QACvD;IACF,OAAO;QACLa,gBAAgBO,KAAK,CAACU,SAAS,GAAG;YAChCC,oBAAoB/B;QACtB;IACF;IACA,sCAAsC;IACtC,MAAMgC,8BAA8BC,KAAKC,iBAAiB,CAAC;IAGzDrB,gBAAgBO,KAAK,CAACU,SAAS,CAACC,kBAAkB,CAAgBI,OAAO,CAAC,CAACC;QAC3E,IAAI,CAACJ,4BAA4BK,QAAQ,CAACD,SAASE,KAAK,GAAG;YACzD,MAAM,IAAIvC,qBACR,CAAC,SAAS,EAAEqC,SAASE,KAAK,CAAC,0DAA0D,CAAC;QAE1F;IACF;IAEA,OAAOzB;AACT;AAEA,OAAO,MAAM0B,iBAAiB,OAAOC;IACnC,MAAMC,qBAAqB;QACzB,GAAG/B,QAAQ;QACX,GAAG8B,cAAc;QACjBpB,OAAO;YACL,GAAGV,SAASU,KAAK;YACjB,GAAGoB,gBAAgBpB,KAAK;YACxBsB,MAAM;gBACJ,GAAGhC,SAASU,KAAK,CAACsB,IAAI;gBACtB,GAAGF,gBAAgBpB,OAAOsB,IAAI;YAChC;YACAC,QAAQ;gBACN,GAAGjC,SAASU,KAAK,CAACuB,MAAM;gBACxB,GAAGH,gBAAgBpB,OAAOuB,MAAM;YAClC;QACF;QACAC,SAAS;YACP,GAAGlC,SAASkC,OAAO;YACnB,GAAGJ,gBAAgBI,OAAO;QAC5B;QACAC,MAAM;YACJ,GAAGnC,SAASmC,IAAI;YAChB,GAAGL,gBAAgBK,IAAI;YACvBC,QAAQ;gBACN,GAAGpC,SAASmC,IAAI,CAACC,MAAM;gBACvB,GAAGN,gBAAgBK,MAAMC,MAAM;YACjC;YACAC,OAAOP,gBAAgBK,MAAME,SAAS,EAAE;YACxCC,WAAWR,gBAAgBK,MAAMG,aAAa,EAAE;QAClD;QACAL,QAAQ;YACN,GAAGjC,SAASiC,MAAM;YAClB,GAAGH,gBAAgBG,MAAM;QAC3B;QACAM,YAAY;YACV,GAAGvC,SAASuC,UAAU;YACtB,GAAGT,gBAAgBS,UAAU;QAC/B;IACF;IAEA,IAAI,CAACR,oBAAoBS,WAAW;QAClCT,mBAAmBS,SAAS,GAAG;IACjC;IAEA,IAAIC,QAAQC,GAAG,CAACC,cAAc,EAAE;QAC9B,IAAI,CAACb,gBAAgBG,QAAQW,KAAK;YAChC,kGAAkG;YAClGb,mBAAmBE,MAAM,CAACW,GAAG,GAAGH,QAAQC,GAAG,CAACC,cAAc,GAAG;QAC/D;IACF;IAEA,MAAME,SAAmC5C,oBAAoB8B;IAE7D,IAAI,CAACc,OAAOC,SAAS,EAAE;QACrBD,OAAOC,SAAS,GAAG,EAAE;IACvB;IAEA,KAAK,MAAMC,YAAY9D,kBAAmB;QACxC4D,OAAOC,SAAS,CAAC5B,IAAI,CAAC6B;IACxB;IAEA,IAAIF,OAAOG,YAAY,IAAIH,OAAOG,YAAY,CAACC,OAAO,EAAEC,SAAS,GAAG;QAClE,uDAAuD;QACvD,MAAMC,cAAcN,OAAOG,YAAY,CAACC,OAAO,CAAC,EAAE;QAClD,IAAI,OAAOE,gBAAgB,UAAU;YACnCN,OAAOG,YAAY,CAACI,WAAW,GAAG;mBAC7B,AAACP,OAAOG,YAAY,CAA+CC,OAAO;aAC9E;YAED,sCAAsC;YACtCJ,OAAOG,YAAY,CAACC,OAAO,GAAG,AAC5BJ,OAAOG,YAAY,CACnBC,OAAO,CAACI,GAAG,CAAC,CAACC,SAAY,CAAA;oBACzBC,MAAMD;oBACNE,OAAOF;oBACPG,KAAK;oBACLC,UAAU,IAAMJ;gBAClB,CAAA;QACF,OAAO;YACL,sDAAsD;YACtDT,OAAOG,YAAY,CAACI,WAAW,GAAGP,OAAOG,YAAY,CAACC,OAAO,CAACU,MAAM,CAAC,CAACV,SAASK;gBAC7EL,QAAQ/B,IAAI,CAACoC,OAAOC,IAAI;gBACxB,OAAON;YACT,GAAG,EAAE;YAELJ,OAAOG,YAAY,CAACC,OAAO,GAAG,AAC5BJ,OAAOG,YAAY,CACnBC,OAAO,CAACI,GAAG,CAAC,CAACC,SAAY,CAAA;oBACzB,GAAGA,MAAM;oBACTI,UAAU,IAAMJ,OAAOC,IAAI;gBAC7B,CAAA;QACF;QAEA,2CAA2C;QAC3CV,OAAOG,YAAY,CAACY,QAAQ,GAAGf,OAAOG,YAAY,EAAEY,YAAY;IAClE;IAEA,MAAMC,aAAsC;QAC1CC,kBAAkB;QAClBC,oBAAoB;YAClBjF;QACF;QACAkF,cAAc,CAAC;IACjB;IAEA,IAAIlC,gBAAgBmC,MAAM;QACxBJ,WAAWE,kBAAkB,GAC3BjC,eAAemC,IAAI,EAAEF,sBAAsBF,WAAWE,kBAAkB;QAE1E,MAAMG,oBAAyCC,OAAOC,IAAI,CAACP,WAAWE,kBAAkB;QACxF,MAAMM,eAAevC,eAAemC,IAAI,EAAEH,oBAAoBD,WAAWC,gBAAgB;QAEzFD,WAAWC,gBAAgB,GAAGI,kBAAkBvC,QAAQ,CAAC0C,gBACrDA,eACAH,iBAAiB,CAAC,EAAE;QACxBL,WAAWG,YAAY,GACrB,AAAClC,eAAemC,IAAI,EAAED,gBACtBH,WAAWG,YAAY;IAC3B;IAEAnB,OAAOoB,IAAI,GAAGJ;IAEd,MAAMS,+BAAkF,EAAE;IAE1F,MAAMC,6BAA+C,EAAE;IACvD,MAAMC,yBAAuC,EAAE;IAE/C,MAAMC,kBAAkB,IAAIC;IAE5B,MAAMC,qBAAqB;WACrB9B,OAAOhC,WAAW,CAACwC,GAAG,CAAC,CAACuB,IAAMA,EAAE3D,IAAI,KAAK,EAAE;QAC/C;QACA;QACA;KACD;IAED;;;GAGC,GACD4B,OAAOgC,MAAM,GAAG,EAAE;IAClB,IAAI/C,eAAe+C,MAAM,EAAE3B,QAAQ;QACjC,KAAK,MAAM4B,SAAShD,eAAe+C,MAAM,CAAE;YACzC,MAAME,iBAAiBjF,aAAa;gBAAEgF;YAAM;YAE5C,IAAIC,eAAeC,UAAU,KAAK,MAAM;gBACtC;YACF;YACAD,eAAeC,UAAU,GAAG;YAE5BD,eAAeE,MAAM,GAAGF,eAAeE,MAAM,CAACC,MAAM,CAAC1F;YAErDuF,eAAeI,MAAM,GAAG,CAACJ,eAAeI,MAAM,GAC1C1F,aAAasF,eAAe9D,IAAI,IAChC8D,eAAeI,MAAM;YACzBJ,eAAeE,MAAM,GAAG,MAAMvF,eAAe;gBAC3CmD,QAAQA;gBACRuC,oBAAoB,IAAIV;gBACxBO,QAAQF,eAAeE,MAAM;gBAC7BI,mBAAmB;gBACnBf;gBACAK;YACF;YAEA9B,OAAOgC,MAAM,CAAC3D,IAAI,CAAC6D;QACrB;IACF;IAEA,IAAK,IAAIO,IAAI,GAAGA,IAAIzC,OAAOhC,WAAW,CAACqC,MAAM,EAAEoC,IAAK;QAClD,IAAIb,gBAAgBc,GAAG,CAAC1C,OAAOhC,WAAW,CAACyE,EAAE,CAACrE,IAAI,GAAG;YACnD,MAAM,IAAI7B,oBAAoB,QAAQyD,OAAOhC,WAAW,CAACyE,EAAE,CAACrE,IAAI;QAClE;QAEAwD,gBAAgBe,GAAG,CAAC3C,OAAOhC,WAAW,CAACyE,EAAE,CAACrE,IAAI;QAE9C,MAAMwE,eAAe5C,OAAOhC,WAAW,CAACyE,EAAE,EAAEI,UAAUC;QAEtD,IAAI,OAAOF,iBAAiB,YAAYA,aAAaG,eAAe,EAAE;YACpErB,2BAA2BrD,IAAI,CAAC2B,OAAOhC,WAAW,CAACyE,EAAE,CAACrE,IAAI;QAC5D;QAEA4B,OAAOhC,WAAW,CAACyE,EAAE,GAAG,MAAMpG,mBAC5B2D,QACAA,OAAOhC,WAAW,CAACyE,EAAE,EACrBhB,8BACAK;IAEJ;IAEA,IAAI9B,OAAOgD,OAAO,CAAC3C,MAAM,GAAG,GAAG;QAC7B,IAAK,IAAIoC,IAAI,GAAGA,IAAIzC,OAAOgD,OAAO,CAAC3C,MAAM,EAAEoC,IAAK;YAC9C,MAAMG,eAAe5C,OAAOgD,OAAO,CAACP,EAAE,EAAEI,UAAUC;YAElD,IAAI,OAAOF,iBAAiB,YAAYA,aAAaG,eAAe,EAAE;gBACpEpB,uBAAuBtD,IAAI,CAAC2B,OAAOgD,OAAO,CAACP,EAAE,CAACrE,IAAI;YACpD;YAEA4B,OAAOgD,OAAO,CAACP,EAAE,GAAG,MAAM/F,eACxBsD,QACAA,OAAOgD,OAAO,CAACP,EAAE,EACjBhB,8BACAK;QAEJ;IACF;IAEA,IAAIJ,2BAA2BrB,MAAM,GAAG,KAAKsB,uBAAuBtB,MAAM,GAAG,GAAG;QAC9E,IAAI,CAAC4C,MAAMC,OAAO,CAAChE,mBAAmBI,IAAI,EAAEE,QAAQ;YAClDN,mBAAmBI,IAAI,CAACE,KAAK,GAAG,EAAE;QACpC;QAEAN,mBAAmBI,IAAI,CAACE,KAAK,CAACnB,IAAI,CAChCnB,uBAAuB;YACrBiG,eAAenD,OAAOnC,KAAK,CAACC,IAAI;YAChCE,aAAa0D;YACbsB,SAASrB;QACX;IAEJ;IAEA,0EAA0E;IAC1E,IACE,AAACsB,MAAMC,OAAO,CAAChE,mBAAmBI,IAAI,EAAEE,UAAUN,mBAAmBI,IAAI,EAAEE,OAAOa,UACjF4C,MAAMC,OAAO,CAAChE,mBAAmBI,IAAI,EAAEG,cACtCP,mBAAmBI,IAAI,EAAEG,WAAWY,QACtC;QACA,IAAI+C,wBAAwBpG,yBAAyBgD;QAErD,IAAI,OAAOd,mBAAmBI,IAAI,CAAC+D,uBAAuB,KAAK,YAAY;YACzED,wBAAwBlE,mBAAmBI,IAAI,CAAC+D,uBAAuB,CAAC;gBACtED;YACF;QACF;QAEA,MAAME,0BAA0B,MAAMjH,mBACpC2D,QACAoD,uBACA3B,8BACAK;QAGF5C,mBAAmBlB,WAAW,CAACK,IAAI,CAACiF;IACtC;IAEApE,mBAAmBlB,WAAW,CAACK,IAAI,CACjC,MAAMhC,mBACJ2D,QACAlD,6BAA6BkD,SAC7ByB,8BACAK;IAGJ5C,mBAAmBlB,WAAW,CAACK,IAAI,CACjC,MAAMhC,mBACJ2D,QACAjD,yBAAyBiD,SACzByB,8BACAK;IAGJ5C,mBAAmBlB,WAAW,CAACK,IAAI,CACjC,MAAMhC,mBACJ2D,QACA1D,sBACAmF,8BACAK;IAIJ,IAAI9B,OAAOL,SAAS,KAAK,IAAI;QAC3BK,OAAOuD,IAAI,CAAClF,IAAI,CAAC2B,OAAOL,SAAS;IACnC;IAEA,sCAAsC;IACtC,IAAI,CAACK,OAAOwD,MAAM,EAAE;QAClBxD,OAAOwD,MAAM,GAAG;YAAEC,UAAU,EAAE;QAAC;IACjC;IAEAzD,OAAOwD,MAAM,CAACC,QAAQ,GAAGR,MAAMS,IAAI,CACjC,IAAI7B,IAAI7B,OAAOhC,WAAW,CAACwC,GAAG,CAAC,CAACuB,IAAMA,EAAEyB,MAAM,EAAEG,SAASC,MAAM,CAACzF;IAGlE,8DAA8D;IAC9D,IAAIc,eAAe4E,KAAK,EAAE;QACxB7D,OAAO6D,KAAK,GAAG5E,eAAe4E,KAAK;IACrC;IAEA;;GAEC,GACD,IAAI,OAAO5E,eAAe6E,MAAM,KAAK,YAAY;QAC/C9D,OAAO8D,MAAM,GAAG,MAAM7E,eAAe6E,MAAM,CAAC;YAC1C9D,QAAQA;YACR+D,QAAQ;YACRvB,mBAAmB;QACrB;QACA,IAAIxC,OAAO8D,MAAM,CAAC1C,IAAI,IAAIE,OAAOC,IAAI,CAACvB,OAAO8D,MAAM,CAAC1C,IAAI,EAAEf,MAAM,IAAI,GAAG;YACrEL,OAAOoB,IAAI,CAACD,YAAY,GAAGjF,gBAAgB8D,OAAOoB,IAAI,CAACD,YAAY,EAAEnB,OAAO8D,MAAM,CAAC1C,IAAI;QACzF;IACF;IAEA,MAAM4C,WAA4B,EAAE;IACpC,KAAK,MAAMC,oBAAoBxC,6BAA8B;QAC3DuC,SAAS3F,IAAI,CAAC4F,iBAAiBjE;IACjC;IACA,MAAMkE,QAAQC,GAAG,CAACH;IAElB,OAAOhE;AACT,EAAC"}
|
package/dist/config/types.d.ts
CHANGED
|
@@ -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;
|