payload 4.0.0-internal.d28e9fb → 4.0.0-internal.e16cf59
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/collections/config/sanitize.d.ts.map +1 -1
- package/dist/collections/config/sanitize.js +222 -228
- package/dist/collections/config/sanitize.js.map +1 -1
- package/dist/config/sanitize.d.ts.map +1 -1
- package/dist/config/sanitize.js +233 -254
- package/dist/config/sanitize.js.map +1 -1
- package/dist/exports/internal.d.ts +0 -1
- package/dist/exports/internal.d.ts.map +1 -1
- package/dist/exports/internal.js +0 -1
- package/dist/exports/internal.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +323 -334
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/globals/config/sanitize.d.ts.map +1 -1
- package/dist/globals/config/sanitize.js +125 -131
- package/dist/globals/config/sanitize.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -19
- package/dist/index.js.map +1 -1
- package/dist/utilities/flattenAllFields.d.ts.map +1 -1
- package/dist/utilities/flattenAllFields.js +93 -102
- package/dist/utilities/flattenAllFields.js.map +1 -1
- package/package.json +2 -2
- package/dist/utilities/sanitizeProfiler.d.ts +0 -38
- package/dist/utilities/sanitizeProfiler.d.ts.map +0 -1
- package/dist/utilities/sanitizeProfiler.js +0 -101
- package/dist/utilities/sanitizeProfiler.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AACjF,OAAO,KAAK,EACV,gBAAgB,EAChB,yBAAyB,EAG1B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/collections/config/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AACjF,OAAO,KAAK,EACV,gBAAgB,EAChB,yBAAyB,EAG1B,MAAM,YAAY,CAAA;AA2BnB;;;GAGG;AACH,eAAO,MAAM,wBAAwB,eAAgB,gBAAgB,KAAG,IAuBvE,CAAA;AAED,eAAO,MAAM,kBAAkB,WACrB,MAAM,cACF,gBAAgB,iCAKG,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,wBAC1D,MAAM,EAAE,mBAIb,iBAAiB,EAAE,KACnC,OAAO,CAAC,yBAAyB,CA0TnC,CAAA"}
|
|
@@ -11,7 +11,6 @@ import { getBaseUploadFields } from '../../uploads/getBaseFields.js';
|
|
|
11
11
|
import { flattenAllFields } from '../../utilities/flattenAllFields.js';
|
|
12
12
|
import { formatLabels } from '../../utilities/formatLabels.js';
|
|
13
13
|
import { miniChalk } from '../../utilities/miniChalk.js';
|
|
14
|
-
import { endSpan, startSpan } from '../../utilities/sanitizeProfiler.js';
|
|
15
14
|
import { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js';
|
|
16
15
|
import { baseVersionFields } from '../../versions/baseFields.js';
|
|
17
16
|
import { versionDefaults } from '../../versions/defaults.js';
|
|
@@ -48,257 +47,252 @@ export const sanitizeCollection = async (config, collection, /**
|
|
|
48
47
|
if (collection._sanitized) {
|
|
49
48
|
return collection;
|
|
50
49
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
50
|
+
collection._sanitized = true;
|
|
51
|
+
warnOnInvalidCustomViews(collection);
|
|
52
|
+
// /////////////////////////////////
|
|
53
|
+
// Make copy of collection config
|
|
54
|
+
// /////////////////////////////////
|
|
55
|
+
const sanitized = addDefaultsToCollectionConfig(collection);
|
|
56
|
+
// /////////////////////////////////
|
|
57
|
+
// Convert folders/tags to hierarchy
|
|
58
|
+
// /////////////////////////////////
|
|
59
|
+
const presetCount = [
|
|
60
|
+
sanitized.folders,
|
|
61
|
+
sanitized.tags,
|
|
62
|
+
sanitized.hierarchy
|
|
63
|
+
].filter(Boolean).length;
|
|
64
|
+
if (presetCount > 1) {
|
|
65
|
+
throw new Error(`Collection "${sanitized.slug}": Only one of 'folders', 'tags', or 'hierarchy' can be specified`);
|
|
66
|
+
}
|
|
67
|
+
if (sanitized.folders) {
|
|
68
|
+
sanitized.labels = {
|
|
69
|
+
plural: 'Folders',
|
|
70
|
+
singular: 'Folder',
|
|
71
|
+
...sanitized.labels
|
|
72
|
+
};
|
|
73
|
+
sanitized.hierarchy = buildFoldersHierarchy(sanitized.folders, sanitized.slug);
|
|
74
|
+
// Set admin.group: false when sidebar tab enabled (folders accessed via tab)
|
|
75
|
+
const sidebarTabEnabled = typeof sanitized.hierarchy === 'object' && sanitized.hierarchy.admin?.injectSidebarTab !== false;
|
|
76
|
+
if (sidebarTabEnabled && sanitized.admin.group === undefined) {
|
|
77
|
+
sanitized.admin.group = false;
|
|
69
78
|
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
sanitized.
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
delete sanitized.folders;
|
|
79
|
+
delete sanitized.folders;
|
|
80
|
+
}
|
|
81
|
+
if (sanitized.tags) {
|
|
82
|
+
sanitized.labels = {
|
|
83
|
+
plural: 'Tags',
|
|
84
|
+
singular: 'Tag',
|
|
85
|
+
...sanitized.labels
|
|
86
|
+
};
|
|
87
|
+
sanitized.hierarchy = buildTagsHierarchy(sanitized.tags, sanitized.slug);
|
|
88
|
+
// Tags also hidden from nav by default
|
|
89
|
+
if (sanitized.admin.group === undefined) {
|
|
90
|
+
sanitized.admin.group = false;
|
|
83
91
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
delete sanitized.tags;
|
|
93
|
+
}
|
|
94
|
+
// /////////////////////////////////
|
|
95
|
+
// Sanitize fields
|
|
96
|
+
// /////////////////////////////////
|
|
97
|
+
const validRelationships = _validRelationships ?? config.collections.map((c)=>c.slug) ?? [];
|
|
98
|
+
const joins = {};
|
|
99
|
+
const polymorphicJoins = [];
|
|
100
|
+
sanitized.fields = await sanitizeFields({
|
|
101
|
+
collectionConfig: sanitized,
|
|
102
|
+
config,
|
|
103
|
+
fields: sanitized.fields,
|
|
104
|
+
joinPath: '',
|
|
105
|
+
joins,
|
|
106
|
+
orderableJoins,
|
|
107
|
+
parentIsLocalized: false,
|
|
108
|
+
polymorphicJoins,
|
|
109
|
+
richTextSanitizationPromises,
|
|
110
|
+
validRelationships
|
|
111
|
+
});
|
|
112
|
+
if (sanitized.endpoints !== false) {
|
|
113
|
+
if (!sanitized.endpoints) {
|
|
114
|
+
sanitized.endpoints = [];
|
|
96
115
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
const validRelationships = _validRelationships ?? config.collections.map((c)=>c.slug) ?? [];
|
|
101
|
-
const joins = {};
|
|
102
|
-
const polymorphicJoins = [];
|
|
103
|
-
sanitized.fields = await sanitizeFields({
|
|
104
|
-
collectionConfig: sanitized,
|
|
105
|
-
config,
|
|
106
|
-
fields: sanitized.fields,
|
|
107
|
-
joinPath: '',
|
|
108
|
-
joins,
|
|
109
|
-
orderableJoins,
|
|
110
|
-
parentIsLocalized: false,
|
|
111
|
-
polymorphicJoins,
|
|
112
|
-
richTextSanitizationPromises,
|
|
113
|
-
validRelationships
|
|
114
|
-
});
|
|
115
|
-
if (sanitized.endpoints !== false) {
|
|
116
|
-
if (!sanitized.endpoints) {
|
|
117
|
-
sanitized.endpoints = [];
|
|
118
|
-
}
|
|
119
|
-
if (sanitized.auth) {
|
|
120
|
-
for (const endpoint of authCollectionEndpoints){
|
|
121
|
-
sanitized.endpoints.push(endpoint);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
if (sanitized.upload) {
|
|
125
|
-
for (const endpoint of uploadCollectionEndpoints){
|
|
126
|
-
sanitized.endpoints.push(endpoint);
|
|
127
|
-
}
|
|
116
|
+
if (sanitized.auth) {
|
|
117
|
+
for (const endpoint of authCollectionEndpoints){
|
|
118
|
+
sanitized.endpoints.push(endpoint);
|
|
128
119
|
}
|
|
129
|
-
|
|
120
|
+
}
|
|
121
|
+
if (sanitized.upload) {
|
|
122
|
+
for (const endpoint of uploadCollectionEndpoints){
|
|
130
123
|
sanitized.endpoints.push(endpoint);
|
|
131
124
|
}
|
|
132
125
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
126
|
+
for (const endpoint of defaultCollectionEndpoints){
|
|
127
|
+
sanitized.endpoints.push(endpoint);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (sanitized.timestamps !== false) {
|
|
131
|
+
// add default timestamps fields only as needed
|
|
132
|
+
let hasUpdatedAt = null;
|
|
133
|
+
let hasCreatedAt = null;
|
|
134
|
+
let hasDeletedAt = null;
|
|
135
|
+
sanitized.fields.some((field)=>{
|
|
136
|
+
if (fieldAffectsData(field)) {
|
|
137
|
+
if (field.name === 'updatedAt') {
|
|
138
|
+
hasUpdatedAt = true;
|
|
139
|
+
}
|
|
140
|
+
if (field.name === 'createdAt') {
|
|
141
|
+
hasCreatedAt = true;
|
|
142
|
+
}
|
|
143
|
+
if (field.name === 'deletedAt') {
|
|
144
|
+
hasDeletedAt = true;
|
|
149
145
|
}
|
|
150
|
-
return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt);
|
|
151
|
-
});
|
|
152
|
-
if (!hasUpdatedAt) {
|
|
153
|
-
sanitized.fields.push({
|
|
154
|
-
name: 'updatedAt',
|
|
155
|
-
type: 'date',
|
|
156
|
-
admin: {
|
|
157
|
-
disabled: {
|
|
158
|
-
bulkEdit: true
|
|
159
|
-
},
|
|
160
|
-
hidden: true
|
|
161
|
-
},
|
|
162
|
-
index: true,
|
|
163
|
-
label: ({ t })=>t('general:updatedAt')
|
|
164
|
-
});
|
|
165
146
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
147
|
+
return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt);
|
|
148
|
+
});
|
|
149
|
+
if (!hasUpdatedAt) {
|
|
150
|
+
sanitized.fields.push({
|
|
151
|
+
name: 'updatedAt',
|
|
152
|
+
type: 'date',
|
|
153
|
+
admin: {
|
|
154
|
+
disabled: {
|
|
155
|
+
bulkEdit: true
|
|
174
156
|
},
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
bulkEdit: true
|
|
188
|
-
},
|
|
189
|
-
hidden: true
|
|
157
|
+
hidden: true
|
|
158
|
+
},
|
|
159
|
+
index: true,
|
|
160
|
+
label: ({ t })=>t('general:updatedAt')
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (!hasCreatedAt) {
|
|
164
|
+
sanitized.fields.push({
|
|
165
|
+
name: 'createdAt',
|
|
166
|
+
admin: {
|
|
167
|
+
disabled: {
|
|
168
|
+
bulkEdit: true
|
|
190
169
|
},
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
170
|
+
hidden: true
|
|
171
|
+
},
|
|
172
|
+
// 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.
|
|
173
|
+
type: 'date',
|
|
174
|
+
index: true,
|
|
175
|
+
label: ({ t })=>t('general:createdAt')
|
|
176
|
+
});
|
|
195
177
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
178
|
+
if (sanitized.trash && !hasDeletedAt) {
|
|
179
|
+
sanitized.fields.push({
|
|
180
|
+
name: 'deletedAt',
|
|
181
|
+
type: 'date',
|
|
182
|
+
admin: {
|
|
183
|
+
disabled: {
|
|
184
|
+
bulkEdit: true
|
|
185
|
+
},
|
|
186
|
+
hidden: true
|
|
187
|
+
},
|
|
188
|
+
index: true,
|
|
189
|
+
label: ({ t })=>t('general:deletedAt')
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
const defaultLabels = formatLabels(sanitized.slug);
|
|
194
|
+
sanitized.labels = {
|
|
195
|
+
plural: sanitized.labels?.plural || defaultLabels.plural,
|
|
196
|
+
singular: sanitized.labels?.singular || defaultLabels.singular
|
|
197
|
+
};
|
|
198
|
+
if (sanitized.versions) {
|
|
199
|
+
if (sanitized.timestamps === false) {
|
|
200
|
+
throw new TimestampsRequired(collection);
|
|
201
|
+
}
|
|
202
|
+
if (sanitized.versions === true) {
|
|
203
|
+
sanitized.versions = {
|
|
204
|
+
drafts: false,
|
|
205
|
+
maxPerDoc: 100
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
sanitized.versions.maxPerDoc = typeof sanitized.versions.maxPerDoc === 'number' ? sanitized.versions.maxPerDoc : 100;
|
|
209
|
+
if (sanitized.versions.drafts) {
|
|
210
|
+
if (sanitized.versions.drafts === true) {
|
|
211
|
+
sanitized.versions.drafts = {
|
|
212
|
+
autosave: false,
|
|
213
|
+
validate: false
|
|
209
214
|
};
|
|
210
215
|
}
|
|
211
|
-
|
|
212
|
-
if (
|
|
213
|
-
if (sanitized.versions.drafts ===
|
|
214
|
-
sanitized.versions.drafts = {
|
|
215
|
-
autosave: false,
|
|
216
|
-
validate: false
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields);
|
|
220
|
-
if (config.localization) {
|
|
221
|
-
if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {
|
|
222
|
-
sanitized.versions.drafts.localizeStatus = false;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
// TODO v4: remove this sanitization check, should not need to enable the experimental flag
|
|
226
|
-
if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {
|
|
216
|
+
const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields);
|
|
217
|
+
if (config.localization) {
|
|
218
|
+
if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {
|
|
227
219
|
sanitized.versions.drafts.localizeStatus = false;
|
|
228
|
-
console.log(miniChalk.yellowBold(`Warning: "localizeStatus" for drafts is an experimental feature. To enable, set "experimental.localizeStatus" to true in your Payload config.`));
|
|
229
|
-
}
|
|
230
|
-
if (sanitized.versions.drafts.autosave === true) {
|
|
231
|
-
sanitized.versions.drafts.autosave = {
|
|
232
|
-
interval: versionDefaults.autosaveInterval
|
|
233
|
-
};
|
|
234
220
|
}
|
|
235
|
-
if (sanitized.versions.drafts.validate === undefined) {
|
|
236
|
-
sanitized.versions.drafts.validate = false;
|
|
237
|
-
}
|
|
238
|
-
sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields({
|
|
239
|
-
localized: sanitized.versions.drafts.localizeStatus ?? false
|
|
240
|
-
}));
|
|
241
221
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
sanitizeHierarchyCollection(sanitized, config);
|
|
247
|
-
if (sanitized.upload) {
|
|
248
|
-
if (sanitized.upload === true) {
|
|
249
|
-
sanitized.upload = {};
|
|
222
|
+
// TODO v4: remove this sanitization check, should not need to enable the experimental flag
|
|
223
|
+
if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {
|
|
224
|
+
sanitized.versions.drafts.localizeStatus = false;
|
|
225
|
+
console.log(miniChalk.yellowBold(`Warning: "localizeStatus" for drafts is an experimental feature. To enable, set "experimental.localizeStatus" to true in your Payload config.`));
|
|
250
226
|
}
|
|
251
|
-
sanitized.
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const uploadFields = getBaseUploadFields({
|
|
256
|
-
collection: sanitized,
|
|
257
|
-
config
|
|
258
|
-
});
|
|
259
|
-
sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields);
|
|
260
|
-
}
|
|
261
|
-
if (sanitized.auth) {
|
|
262
|
-
sanitized.auth = addDefaultsToAuthConfig(typeof sanitized.auth === 'boolean' ? {} : sanitized.auth);
|
|
263
|
-
// disable duplicate for auth enabled collections by default
|
|
264
|
-
sanitized.disableDuplicate = sanitized.disableDuplicate ?? true;
|
|
265
|
-
if (sanitized.auth.loginWithUsername) {
|
|
266
|
-
if (sanitized.auth.loginWithUsername === true) {
|
|
267
|
-
sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({});
|
|
268
|
-
} else {
|
|
269
|
-
const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(sanitized.auth.loginWithUsername);
|
|
270
|
-
// if allowEmailLogin is false, requireUsername must be true
|
|
271
|
-
if (loginWithUsernameWithDefaults.allowEmailLogin === false) {
|
|
272
|
-
loginWithUsernameWithDefaults.requireUsername = true;
|
|
273
|
-
}
|
|
274
|
-
sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults;
|
|
275
|
-
}
|
|
276
|
-
} else {
|
|
277
|
-
sanitized.auth.loginWithUsername = false;
|
|
227
|
+
if (sanitized.versions.drafts.autosave === true) {
|
|
228
|
+
sanitized.versions.drafts.autosave = {
|
|
229
|
+
interval: versionDefaults.autosaveInterval
|
|
230
|
+
};
|
|
278
231
|
}
|
|
279
|
-
if (
|
|
280
|
-
sanitized.
|
|
232
|
+
if (sanitized.versions.drafts.validate === undefined) {
|
|
233
|
+
sanitized.versions.drafts.validate = false;
|
|
281
234
|
}
|
|
282
|
-
sanitized.fields = mergeBaseFields(sanitized.fields,
|
|
235
|
+
sanitized.fields = mergeBaseFields(sanitized.fields, baseVersionFields({
|
|
236
|
+
localized: sanitized.versions.drafts.localizeStatus ?? false
|
|
237
|
+
}));
|
|
283
238
|
}
|
|
284
|
-
|
|
285
|
-
|
|
239
|
+
} else {
|
|
240
|
+
delete sanitized.versions;
|
|
241
|
+
}
|
|
242
|
+
// Sanitize hierarchy configuration (phase 1 - per collection)
|
|
243
|
+
sanitizeHierarchyCollection(sanitized, config);
|
|
244
|
+
if (sanitized.upload) {
|
|
245
|
+
if (sanitized.upload === true) {
|
|
246
|
+
sanitized.upload = {};
|
|
286
247
|
}
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({
|
|
295
|
-
fields: sanitizedConfig.flattenedFields,
|
|
296
|
-
indexes: sanitizedConfig.indexes
|
|
248
|
+
sanitized.upload.cacheTags = sanitized.upload?.cacheTags ?? true;
|
|
249
|
+
sanitized.upload.bulkUpload = sanitized.upload?.bulkUpload ?? true;
|
|
250
|
+
sanitized.upload.staticDir = sanitized.upload.staticDir || sanitized.slug;
|
|
251
|
+
sanitized.admin.useAsTitle = sanitized.admin?.useAsTitle && sanitized.admin.useAsTitle !== 'id' ? sanitized.admin.useAsTitle : 'filename';
|
|
252
|
+
const uploadFields = getBaseUploadFields({
|
|
253
|
+
collection: sanitized,
|
|
254
|
+
config
|
|
297
255
|
});
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
|
|
256
|
+
sanitized.fields = mergeBaseFields(sanitized.fields, uploadFields);
|
|
257
|
+
}
|
|
258
|
+
if (sanitized.auth) {
|
|
259
|
+
sanitized.auth = addDefaultsToAuthConfig(typeof sanitized.auth === 'boolean' ? {} : sanitized.auth);
|
|
260
|
+
// disable duplicate for auth enabled collections by default
|
|
261
|
+
sanitized.disableDuplicate = sanitized.disableDuplicate ?? true;
|
|
262
|
+
if (sanitized.auth.loginWithUsername) {
|
|
263
|
+
if (sanitized.auth.loginWithUsername === true) {
|
|
264
|
+
sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({});
|
|
265
|
+
} else {
|
|
266
|
+
const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(sanitized.auth.loginWithUsername);
|
|
267
|
+
// if allowEmailLogin is false, requireUsername must be true
|
|
268
|
+
if (loginWithUsernameWithDefaults.allowEmailLogin === false) {
|
|
269
|
+
loginWithUsernameWithDefaults.requireUsername = true;
|
|
270
|
+
}
|
|
271
|
+
sanitized.auth.loginWithUsername = loginWithUsernameWithDefaults;
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
sanitized.auth.loginWithUsername = false;
|
|
275
|
+
}
|
|
276
|
+
if (!collection?.admin?.useAsTitle) {
|
|
277
|
+
sanitized.admin.useAsTitle = sanitized.auth.loginWithUsername ? 'username' : 'email';
|
|
278
|
+
}
|
|
279
|
+
sanitized.fields = mergeBaseFields(sanitized.fields, getBaseAuthFields(sanitized.auth));
|
|
280
|
+
}
|
|
281
|
+
if (collection?.admin?.pagination?.limits?.length) {
|
|
282
|
+
sanitized.admin.pagination.limits = collection.admin.pagination.limits;
|
|
301
283
|
}
|
|
284
|
+
validateUseAsTitle(sanitized);
|
|
285
|
+
const sanitizedConfig = sanitized;
|
|
286
|
+
sanitizedConfig.joins = joins;
|
|
287
|
+
sanitizedConfig.polymorphicJoins = polymorphicJoins;
|
|
288
|
+
sanitizedConfig.flattenedFields = flattenAllFields({
|
|
289
|
+
fields: sanitizedConfig.fields
|
|
290
|
+
});
|
|
291
|
+
sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({
|
|
292
|
+
fields: sanitizedConfig.flattenedFields,
|
|
293
|
+
indexes: sanitizedConfig.indexes
|
|
294
|
+
});
|
|
295
|
+
return sanitizedConfig;
|
|
302
296
|
};
|
|
303
297
|
|
|
304
298
|
//# sourceMappingURL=sanitize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { OrderableJoinInfo } from '../../fields/config/sanitizeJoinField.js'\nimport type {\n CollectionConfig,\n SanitizedCollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from './types.js'\n\nimport { authCollectionEndpoints } from '../../auth/endpoints/index.js'\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 { buildFoldersHierarchy, buildTagsHierarchy } from '../../hierarchy/presets.js'\nimport { sanitizeHierarchyCollection } from '../../hierarchy/sanitizeHierarchyCollection.js'\nimport { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport { miniChalk } from '../../utilities/miniChalk.js'\nimport { endSpan, startSpan } from '../../utilities/sanitizeProfiler.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { baseVersionFields } from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport {\n addDefaultsToAuthConfig,\n addDefaultsToCollectionConfig,\n addDefaultsToLoginWithUsernameConfig,\n} from './defaults.js'\nimport { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\n/**\n * Warns at startup when custom collection views are misconfigured with a missing `path`.\n * Views without `path` will never be matched by the router and are silently ignored.\n */\nexport const warnOnInvalidCustomViews = (collection: CollectionConfig): void => {\n const views = collection.admin?.components?.views\n if (!views || typeof views !== 'object') {\n return\n }\n\n for (const [key, view] of Object.entries(views)) {\n if (key === 'edit' || key === 'list') {\n continue\n }\n\n if (view && typeof view === 'object' && 'Component' in view && !('path' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" is missing a \"path\" property. The view will never be rendered.`,\n )\n }\n\n if (view && typeof view === 'object' && 'path' in view && !('Component' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" has a \"path\" but is missing a \"Component\". The view will never be rendered.`,\n )\n }\n }\n}\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 /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[],\n): Promise<SanitizedCollectionConfig> => {\n if (collection._sanitized) {\n return collection as SanitizedCollectionConfig\n }\n\n const __profSpan = startSpan('sanitizeCollection', collection.slug)\n try {\n collection._sanitized = true\n\n warnOnInvalidCustomViews(collection)\n\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection)\n\n // /////////////////////////////////\n // Convert folders/tags to hierarchy\n // /////////////////////////////////\n\n const presetCount = [sanitized.folders, sanitized.tags, sanitized.hierarchy].filter(\n Boolean,\n ).length\n if (presetCount > 1) {\n throw new Error(\n `Collection \"${sanitized.slug}\": Only one of 'folders', 'tags', or 'hierarchy' can be specified`,\n )\n }\n\n if (sanitized.folders) {\n sanitized.labels = {\n plural: 'Folders',\n singular: 'Folder',\n ...sanitized.labels,\n }\n sanitized.hierarchy = buildFoldersHierarchy(sanitized.folders, sanitized.slug)\n // Set admin.group: false when sidebar tab enabled (folders accessed via tab)\n const sidebarTabEnabled =\n typeof sanitized.hierarchy === 'object' &&\n sanitized.hierarchy.admin?.injectSidebarTab !== false\n if (sidebarTabEnabled && sanitized.admin!.group === undefined) {\n sanitized.admin!.group = false\n }\n delete sanitized.folders\n }\n\n if (sanitized.tags) {\n sanitized.labels = {\n plural: 'Tags',\n singular: 'Tag',\n ...sanitized.labels,\n }\n sanitized.hierarchy = buildTagsHierarchy(sanitized.tags, sanitized.slug)\n // Tags also hidden from nav by default\n if (sanitized.admin!.group === undefined) {\n sanitized.admin!.group = false\n }\n delete sanitized.tags\n }\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = _validRelationships ?? config.collections!.map((c) => c.slug) ?? []\n\n const joins: SanitizedJoins = {}\n\n const polymorphicJoins: SanitizedJoin[] = []\n\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n orderableJoins,\n parentIsLocalized: false,\n polymorphicJoins,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n if (sanitized.auth) {\n for (const endpoint of authCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.upload) {\n for (const endpoint of uploadCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\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 let hasDeletedAt: boolean | null = null\n\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n\n if (field.name === 'deletedAt') {\n hasDeletedAt = true\n }\n }\n\n return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt)\n })\n\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disabled: { bulkEdit: 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 if (sanitized.trash && !hasDeletedAt) {\n sanitized.fields.push({\n name: 'deletedAt',\n type: 'date',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:deletedAt'),\n })\n }\n }\n\n const defaultLabels = formatLabels(sanitized.slug)\n\n sanitized.labels = {\n plural: sanitized.labels?.plural || defaultLabels.plural,\n singular: sanitized.labels?.singular || defaultLabels.singular,\n }\n\n if (sanitized.versions) {\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n if (sanitized.versions === true) {\n sanitized.versions = {\n drafts: false,\n maxPerDoc: 100,\n }\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 const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields)\n\n if (config.localization) {\n if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {\n sanitized.versions.drafts.localizeStatus = false\n }\n }\n\n // TODO v4: remove this sanitization check, should not need to enable the experimental flag\n if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {\n sanitized.versions.drafts.localizeStatus = false\n console.log(\n miniChalk.yellowBold(\n `Warning: \"localizeStatus\" for drafts is an experimental feature. To enable, set \"experimental.localizeStatus\" to true in your Payload config.`,\n ),\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(\n sanitized.fields,\n baseVersionFields({\n localized: sanitized.versions.drafts.localizeStatus ?? false,\n }),\n )\n }\n } else {\n delete sanitized.versions\n }\n\n // Sanitize hierarchy configuration (phase 1 - per collection)\n sanitizeHierarchyCollection(sanitized, config)\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\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 sanitized.auth = addDefaultsToAuthConfig(\n typeof sanitized.auth === 'boolean' ? {} : sanitized.auth,\n )\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({})\n } else {\n const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(\n sanitized.auth.loginWithUsername,\n )\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 sanitizedConfig.polymorphicJoins = polymorphicJoins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({\n fields: sanitizedConfig.flattenedFields,\n indexes: sanitizedConfig.indexes,\n })\n\n return sanitizedConfig\n } finally {\n endSpan(__profSpan)\n }\n}\n"],"names":["authCollectionEndpoints","getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","buildFoldersHierarchy","buildTagsHierarchy","sanitizeHierarchyCollection","uploadCollectionEndpoints","getBaseUploadFields","flattenAllFields","formatLabels","miniChalk","endSpan","startSpan","traverseForLocalizedFields","baseVersionFields","versionDefaults","defaultCollectionEndpoints","addDefaultsToAuthConfig","addDefaultsToCollectionConfig","addDefaultsToLoginWithUsernameConfig","sanitizeCompoundIndexes","validateUseAsTitle","warnOnInvalidCustomViews","collection","views","admin","components","key","view","Object","entries","console","warn","slug","sanitizeCollection","config","richTextSanitizationPromises","_validRelationships","orderableJoins","_sanitized","__profSpan","sanitized","presetCount","folders","tags","hierarchy","filter","Boolean","length","Error","labels","plural","singular","sidebarTabEnabled","injectSidebarTab","group","undefined","validRelationships","collections","map","c","joins","polymorphicJoins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","auth","endpoint","push","upload","timestamps","hasUpdatedAt","hasCreatedAt","hasDeletedAt","some","field","name","trash","type","disabled","bulkEdit","hidden","index","label","t","defaultLabels","versions","drafts","maxPerDoc","autosave","validate","hasLocalizedFields","localization","localizeStatus","experimental","log","yellowBold","interval","autosaveInterval","localized","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","disableDuplicate","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","sanitizedConfig","flattenedFields","sanitizedIndexes","indexes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/collections/config/sanitize.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../../config/types.js'\nimport type { OrderableJoinInfo } from '../../fields/config/sanitizeJoinField.js'\nimport type {\n CollectionConfig,\n SanitizedCollectionConfig,\n SanitizedJoin,\n SanitizedJoins,\n} from './types.js'\n\nimport { authCollectionEndpoints } from '../../auth/endpoints/index.js'\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 { buildFoldersHierarchy, buildTagsHierarchy } from '../../hierarchy/presets.js'\nimport { sanitizeHierarchyCollection } from '../../hierarchy/sanitizeHierarchyCollection.js'\nimport { uploadCollectionEndpoints } from '../../uploads/endpoints/index.js'\nimport { getBaseUploadFields } from '../../uploads/getBaseFields.js'\nimport { flattenAllFields } from '../../utilities/flattenAllFields.js'\nimport { formatLabels } from '../../utilities/formatLabels.js'\nimport { miniChalk } from '../../utilities/miniChalk.js'\nimport { traverseForLocalizedFields } from '../../utilities/traverseForLocalizedFields.js'\nimport { baseVersionFields } from '../../versions/baseFields.js'\nimport { versionDefaults } from '../../versions/defaults.js'\nimport { defaultCollectionEndpoints } from '../endpoints/index.js'\nimport {\n addDefaultsToAuthConfig,\n addDefaultsToCollectionConfig,\n addDefaultsToLoginWithUsernameConfig,\n} from './defaults.js'\nimport { sanitizeCompoundIndexes } from './sanitizeCompoundIndexes.js'\nimport { validateUseAsTitle } from './useAsTitle.js'\n\n/**\n * Warns at startup when custom collection views are misconfigured with a missing `path`.\n * Views without `path` will never be matched by the router and are silently ignored.\n */\nexport const warnOnInvalidCustomViews = (collection: CollectionConfig): void => {\n const views = collection.admin?.components?.views\n if (!views || typeof views !== 'object') {\n return\n }\n\n for (const [key, view] of Object.entries(views)) {\n if (key === 'edit' || key === 'list') {\n continue\n }\n\n if (view && typeof view === 'object' && 'Component' in view && !('path' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" is missing a \"path\" property. The view will never be rendered.`,\n )\n }\n\n if (view && typeof view === 'object' && 'path' in view && !('Component' in view)) {\n console.warn(\n `[Payload] Custom collection view \"${key}\" in collection \"${collection.slug}\" has a \"path\" but is missing a \"Component\". The view will never be rendered.`,\n )\n }\n }\n}\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 /**\n * Tracker for orderable join fields - populated during sanitization\n */\n orderableJoins?: OrderableJoinInfo[],\n): Promise<SanitizedCollectionConfig> => {\n if (collection._sanitized) {\n return collection as SanitizedCollectionConfig\n }\n\n collection._sanitized = true\n\n warnOnInvalidCustomViews(collection)\n\n // /////////////////////////////////\n // Make copy of collection config\n // /////////////////////////////////\n\n const sanitized: CollectionConfig = addDefaultsToCollectionConfig(collection)\n\n // /////////////////////////////////\n // Convert folders/tags to hierarchy\n // /////////////////////////////////\n\n const presetCount = [sanitized.folders, sanitized.tags, sanitized.hierarchy].filter(\n Boolean,\n ).length\n if (presetCount > 1) {\n throw new Error(\n `Collection \"${sanitized.slug}\": Only one of 'folders', 'tags', or 'hierarchy' can be specified`,\n )\n }\n\n if (sanitized.folders) {\n sanitized.labels = {\n plural: 'Folders',\n singular: 'Folder',\n ...sanitized.labels,\n }\n sanitized.hierarchy = buildFoldersHierarchy(sanitized.folders, sanitized.slug)\n // Set admin.group: false when sidebar tab enabled (folders accessed via tab)\n const sidebarTabEnabled =\n typeof sanitized.hierarchy === 'object' &&\n sanitized.hierarchy.admin?.injectSidebarTab !== false\n if (sidebarTabEnabled && sanitized.admin!.group === undefined) {\n sanitized.admin!.group = false\n }\n delete sanitized.folders\n }\n\n if (sanitized.tags) {\n sanitized.labels = {\n plural: 'Tags',\n singular: 'Tag',\n ...sanitized.labels,\n }\n sanitized.hierarchy = buildTagsHierarchy(sanitized.tags, sanitized.slug)\n // Tags also hidden from nav by default\n if (sanitized.admin!.group === undefined) {\n sanitized.admin!.group = false\n }\n delete sanitized.tags\n }\n\n // /////////////////////////////////\n // Sanitize fields\n // /////////////////////////////////\n\n const validRelationships = _validRelationships ?? config.collections!.map((c) => c.slug) ?? []\n\n const joins: SanitizedJoins = {}\n\n const polymorphicJoins: SanitizedJoin[] = []\n\n sanitized.fields = await sanitizeFields({\n collectionConfig: sanitized,\n config,\n fields: sanitized.fields,\n joinPath: '',\n joins,\n orderableJoins,\n parentIsLocalized: false,\n polymorphicJoins,\n richTextSanitizationPromises,\n validRelationships,\n })\n\n if (sanitized.endpoints !== false) {\n if (!sanitized.endpoints) {\n sanitized.endpoints = []\n }\n\n if (sanitized.auth) {\n for (const endpoint of authCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\n }\n\n if (sanitized.upload) {\n for (const endpoint of uploadCollectionEndpoints) {\n sanitized.endpoints.push(endpoint)\n }\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 let hasDeletedAt: boolean | null = null\n\n sanitized.fields.some((field) => {\n if (fieldAffectsData(field)) {\n if (field.name === 'updatedAt') {\n hasUpdatedAt = true\n }\n\n if (field.name === 'createdAt') {\n hasCreatedAt = true\n }\n\n if (field.name === 'deletedAt') {\n hasDeletedAt = true\n }\n }\n\n return hasCreatedAt && hasUpdatedAt && (!sanitized.trash || hasDeletedAt)\n })\n\n if (!hasUpdatedAt) {\n sanitized.fields.push({\n name: 'updatedAt',\n type: 'date',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:updatedAt'),\n })\n }\n\n if (!hasCreatedAt) {\n sanitized.fields.push({\n name: 'createdAt',\n admin: {\n disabled: { bulkEdit: 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 if (sanitized.trash && !hasDeletedAt) {\n sanitized.fields.push({\n name: 'deletedAt',\n type: 'date',\n admin: {\n disabled: { bulkEdit: true },\n hidden: true,\n },\n index: true,\n label: ({ t }) => t('general:deletedAt'),\n })\n }\n }\n\n const defaultLabels = formatLabels(sanitized.slug)\n\n sanitized.labels = {\n plural: sanitized.labels?.plural || defaultLabels.plural,\n singular: sanitized.labels?.singular || defaultLabels.singular,\n }\n\n if (sanitized.versions) {\n if (sanitized.timestamps === false) {\n throw new TimestampsRequired(collection)\n }\n\n if (sanitized.versions === true) {\n sanitized.versions = {\n drafts: false,\n maxPerDoc: 100,\n }\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 const hasLocalizedFields = traverseForLocalizedFields(sanitized.fields)\n\n if (config.localization) {\n if (hasLocalizedFields && sanitized.versions.drafts.localizeStatus === undefined) {\n sanitized.versions.drafts.localizeStatus = false\n }\n }\n\n // TODO v4: remove this sanitization check, should not need to enable the experimental flag\n if (sanitized.versions.drafts.localizeStatus && !config.experimental?.localizeStatus) {\n sanitized.versions.drafts.localizeStatus = false\n console.log(\n miniChalk.yellowBold(\n `Warning: \"localizeStatus\" for drafts is an experimental feature. To enable, set \"experimental.localizeStatus\" to true in your Payload config.`,\n ),\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(\n sanitized.fields,\n baseVersionFields({\n localized: sanitized.versions.drafts.localizeStatus ?? false,\n }),\n )\n }\n } else {\n delete sanitized.versions\n }\n\n // Sanitize hierarchy configuration (phase 1 - per collection)\n sanitizeHierarchyCollection(sanitized, config)\n\n if (sanitized.upload) {\n if (sanitized.upload === true) {\n sanitized.upload = {}\n }\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 sanitized.auth = addDefaultsToAuthConfig(\n typeof sanitized.auth === 'boolean' ? {} : sanitized.auth,\n )\n\n // disable duplicate for auth enabled collections by default\n sanitized.disableDuplicate = sanitized.disableDuplicate ?? true\n\n if (sanitized.auth.loginWithUsername) {\n if (sanitized.auth.loginWithUsername === true) {\n sanitized.auth.loginWithUsername = addDefaultsToLoginWithUsernameConfig({})\n } else {\n const loginWithUsernameWithDefaults = addDefaultsToLoginWithUsernameConfig(\n sanitized.auth.loginWithUsername,\n )\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 sanitizedConfig.polymorphicJoins = polymorphicJoins\n\n sanitizedConfig.flattenedFields = flattenAllFields({ fields: sanitizedConfig.fields })\n\n sanitizedConfig.sanitizedIndexes = sanitizeCompoundIndexes({\n fields: sanitizedConfig.flattenedFields,\n indexes: sanitizedConfig.indexes,\n })\n\n return sanitizedConfig\n}\n"],"names":["authCollectionEndpoints","getBaseAuthFields","TimestampsRequired","sanitizeFields","fieldAffectsData","mergeBaseFields","buildFoldersHierarchy","buildTagsHierarchy","sanitizeHierarchyCollection","uploadCollectionEndpoints","getBaseUploadFields","flattenAllFields","formatLabels","miniChalk","traverseForLocalizedFields","baseVersionFields","versionDefaults","defaultCollectionEndpoints","addDefaultsToAuthConfig","addDefaultsToCollectionConfig","addDefaultsToLoginWithUsernameConfig","sanitizeCompoundIndexes","validateUseAsTitle","warnOnInvalidCustomViews","collection","views","admin","components","key","view","Object","entries","console","warn","slug","sanitizeCollection","config","richTextSanitizationPromises","_validRelationships","orderableJoins","_sanitized","sanitized","presetCount","folders","tags","hierarchy","filter","Boolean","length","Error","labels","plural","singular","sidebarTabEnabled","injectSidebarTab","group","undefined","validRelationships","collections","map","c","joins","polymorphicJoins","fields","collectionConfig","joinPath","parentIsLocalized","endpoints","auth","endpoint","push","upload","timestamps","hasUpdatedAt","hasCreatedAt","hasDeletedAt","some","field","name","trash","type","disabled","bulkEdit","hidden","index","label","t","defaultLabels","versions","drafts","maxPerDoc","autosave","validate","hasLocalizedFields","localization","localizeStatus","experimental","log","yellowBold","interval","autosaveInterval","localized","cacheTags","bulkUpload","staticDir","useAsTitle","uploadFields","disableDuplicate","loginWithUsername","loginWithUsernameWithDefaults","allowEmailLogin","requireUsername","pagination","limits","sanitizedConfig","flattenedFields","sanitizedIndexes","indexes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAIhB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/config/sanitize.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,MAAM,EAGN,eAAe,EAIhB,MAAM,YAAY,CAAA;AAmGnB,eAAO,MAAM,cAAc,mBAA0B,MAAM,KAAG,OAAO,CAAC,eAAe,CAwYpF,CAAA"}
|