payload 3.0.0-beta.45 → 3.0.0-beta.46
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/admin/RichText.d.ts +117 -17
- package/dist/admin/RichText.d.ts.map +1 -1
- package/dist/admin/RichText.js.map +1 -1
- package/dist/auth/operations/forgotPassword.d.ts.map +1 -1
- package/dist/auth/operations/forgotPassword.js +1 -2
- package/dist/auth/operations/forgotPassword.js.map +1 -1
- package/dist/auth/sendVerificationEmail.d.ts.map +1 -1
- package/dist/auth/sendVerificationEmail.js +1 -2
- package/dist/auth/sendVerificationEmail.js.map +1 -1
- package/dist/bin/generateTypes.d.ts.map +1 -1
- package/dist/bin/generateTypes.js +9 -0
- package/dist/bin/generateTypes.js.map +1 -1
- package/dist/collections/operations/create.d.ts.map +1 -1
- package/dist/collections/operations/create.js +1 -2
- package/dist/collections/operations/create.js.map +1 -1
- package/dist/fields/config/sanitize.d.ts.map +1 -1
- package/dist/fields/config/sanitize.js +0 -15
- package/dist/fields/config/sanitize.js.map +1 -1
- package/dist/fields/config/schema.js +1 -1
- package/dist/fields/config/schema.js.map +1 -1
- package/dist/fields/config/types.d.ts +14 -2
- package/dist/fields/config/types.d.ts.map +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/getFieldPaths.d.ts +10 -0
- package/dist/fields/getFieldPaths.d.ts.map +1 -0
- package/dist/fields/getFieldPaths.js +45 -0
- package/dist/fields/getFieldPaths.js.map +1 -0
- package/dist/fields/hooks/afterChange/index.d.ts +6 -0
- package/dist/fields/hooks/afterChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/index.js +2 -0
- package/dist/fields/hooks/afterChange/index.js.map +1 -1
- package/dist/fields/hooks/afterChange/promise.d.ts +9 -1
- package/dist/fields/hooks/afterChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/promise.js +67 -3
- package/dist/fields/hooks/afterChange/promise.js.map +1 -1
- package/dist/fields/hooks/afterChange/traverseFields.d.ts +3 -1
- package/dist/fields/hooks/afterChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterChange/traverseFields.js +3 -1
- package/dist/fields/hooks/afterChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts +1 -1
- package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/index.js +3 -1
- package/dist/fields/hooks/afterRead/index.js.map +1 -1
- package/dist/fields/hooks/afterRead/promise.d.ts +9 -1
- package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/promise.js +129 -25
- package/dist/fields/hooks/afterRead/promise.js.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts +3 -1
- package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/afterRead/traverseFields.js +3 -1
- package/dist/fields/hooks/afterRead/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeChange/index.d.ts +1 -1
- package/dist/fields/hooks/beforeChange/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/index.js +3 -2
- package/dist/fields/hooks/beforeChange/index.js.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.d.ts +9 -2
- package/dist/fields/hooks/beforeChange/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/promise.js +77 -10
- package/dist/fields/hooks/beforeChange/promise.js.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts +4 -3
- package/dist/fields/hooks/beforeChange/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeChange/traverseFields.js +4 -3
- package/dist/fields/hooks/beforeChange/traverseFields.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/index.js +2 -0
- package/dist/fields/hooks/beforeValidate/index.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts +3 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +69 -4
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts +3 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +3 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import merge from 'deepmerge';
|
|
2
|
+
import { MissingEditorProp } from '../../../errors/index.js';
|
|
2
3
|
import { fieldAffectsData, tabHasName } from '../../config/types.js';
|
|
4
|
+
import { getFieldPaths } from '../../getFieldPaths.js';
|
|
3
5
|
import { beforeDuplicate } from './beforeDuplicate.js';
|
|
4
6
|
import { getExistingRowDoc } from './getExistingRowDoc.js';
|
|
5
7
|
import { traverseFields } from './traverseFields.js';
|
|
@@ -10,7 +12,7 @@ import { traverseFields } from './traverseFields.js';
|
|
|
10
12
|
// - Transform data for storage
|
|
11
13
|
// - beforeDuplicate hooks (if duplicate)
|
|
12
14
|
// - Unflatten locales
|
|
13
|
-
export const promise = async ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, field, global, mergeLocaleActions, operation,
|
|
15
|
+
export const promise = async ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, field, global, mergeLocaleActions, operation, parentPath, parentSchemaPath, req, siblingData, siblingDoc, siblingDocWithLocales, skipValidation })=>{
|
|
14
16
|
const passesCondition = field.admin?.condition ? Boolean(field.admin.condition(data, siblingData, {
|
|
15
17
|
user: req.user
|
|
16
18
|
})) : true;
|
|
@@ -18,6 +20,11 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
18
20
|
const { localization } = req.payload.config;
|
|
19
21
|
const defaultLocale = localization ? localization?.defaultLocale : 'en';
|
|
20
22
|
const operationLocale = req.locale || defaultLocale;
|
|
23
|
+
const { path: fieldPath, schemaPath: fieldSchemaPath } = getFieldPaths({
|
|
24
|
+
field,
|
|
25
|
+
parentPath,
|
|
26
|
+
parentSchemaPath
|
|
27
|
+
});
|
|
21
28
|
if (fieldAffectsData(field)) {
|
|
22
29
|
// skip validation if the field is localized and the incoming data is null
|
|
23
30
|
if (field.localized && operationLocale !== defaultLocale) {
|
|
@@ -40,10 +47,13 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
40
47
|
global,
|
|
41
48
|
operation,
|
|
42
49
|
originalDoc: doc,
|
|
50
|
+
path: fieldPath,
|
|
43
51
|
previousSiblingDoc: siblingDoc,
|
|
44
52
|
previousValue: siblingDoc[field.name],
|
|
45
53
|
req,
|
|
54
|
+
schemaPath: parentSchemaPath,
|
|
46
55
|
siblingData,
|
|
56
|
+
siblingDocWithLocales,
|
|
47
57
|
value: siblingData[field.name]
|
|
48
58
|
});
|
|
49
59
|
if (hookedValue !== undefined) {
|
|
@@ -80,7 +90,7 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
80
90
|
});
|
|
81
91
|
if (typeof validationResult === 'string') {
|
|
82
92
|
errors.push({
|
|
83
|
-
field:
|
|
93
|
+
field: fieldPath.join('.'),
|
|
84
94
|
message: validationResult
|
|
85
95
|
});
|
|
86
96
|
}
|
|
@@ -91,8 +101,13 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
91
101
|
data,
|
|
92
102
|
field,
|
|
93
103
|
global: undefined,
|
|
104
|
+
path: fieldPath,
|
|
105
|
+
previousSiblingDoc: siblingDoc,
|
|
106
|
+
previousValue: siblingDoc[field.name],
|
|
94
107
|
req,
|
|
108
|
+
schemaPath: parentSchemaPath,
|
|
95
109
|
siblingData,
|
|
110
|
+
siblingDocWithLocales,
|
|
96
111
|
value: siblingData[field.name]
|
|
97
112
|
};
|
|
98
113
|
// Push merge locale action if applicable
|
|
@@ -159,8 +174,9 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
159
174
|
global,
|
|
160
175
|
mergeLocaleActions,
|
|
161
176
|
operation,
|
|
162
|
-
path:
|
|
177
|
+
path: fieldPath,
|
|
163
178
|
req,
|
|
179
|
+
schemaPath: fieldSchemaPath,
|
|
164
180
|
siblingData: siblingData[field.name],
|
|
165
181
|
siblingDoc: siblingDoc[field.name],
|
|
166
182
|
siblingDocWithLocales: siblingDocWithLocales[field.name],
|
|
@@ -187,8 +203,12 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
187
203
|
global,
|
|
188
204
|
mergeLocaleActions,
|
|
189
205
|
operation,
|
|
190
|
-
path:
|
|
206
|
+
path: [
|
|
207
|
+
...fieldPath,
|
|
208
|
+
i
|
|
209
|
+
],
|
|
191
210
|
req,
|
|
211
|
+
schemaPath: fieldSchemaPath,
|
|
192
212
|
siblingData: row,
|
|
193
213
|
siblingDoc: getExistingRowDoc(row, siblingDoc[field.name]),
|
|
194
214
|
siblingDocWithLocales: getExistingRowDoc(row, siblingDocWithLocales[field.name]),
|
|
@@ -223,8 +243,12 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
223
243
|
global,
|
|
224
244
|
mergeLocaleActions,
|
|
225
245
|
operation,
|
|
226
|
-
path:
|
|
246
|
+
path: [
|
|
247
|
+
...fieldPath,
|
|
248
|
+
i
|
|
249
|
+
],
|
|
227
250
|
req,
|
|
251
|
+
schemaPath: fieldSchemaPath,
|
|
228
252
|
siblingData: row,
|
|
229
253
|
siblingDoc: rowSiblingDoc,
|
|
230
254
|
siblingDocWithLocales: rowSiblingDocWithLocales,
|
|
@@ -252,8 +276,9 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
252
276
|
global,
|
|
253
277
|
mergeLocaleActions,
|
|
254
278
|
operation,
|
|
255
|
-
path,
|
|
279
|
+
path: fieldPath,
|
|
256
280
|
req,
|
|
281
|
+
schemaPath: fieldSchemaPath,
|
|
257
282
|
siblingData,
|
|
258
283
|
siblingDoc,
|
|
259
284
|
siblingDocWithLocales,
|
|
@@ -263,12 +288,10 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
263
288
|
}
|
|
264
289
|
case 'tab':
|
|
265
290
|
{
|
|
266
|
-
let tabPath = path;
|
|
267
291
|
let tabSiblingData = siblingData;
|
|
268
292
|
let tabSiblingDoc = siblingDoc;
|
|
269
293
|
let tabSiblingDocWithLocales = siblingDocWithLocales;
|
|
270
294
|
if (tabHasName(field)) {
|
|
271
|
-
tabPath = `${path}${field.name}.`;
|
|
272
295
|
if (typeof siblingData[field.name] !== 'object') siblingData[field.name] = {};
|
|
273
296
|
if (typeof siblingDoc[field.name] !== 'object') siblingDoc[field.name] = {};
|
|
274
297
|
if (typeof siblingDocWithLocales[field.name] !== 'object') siblingDocWithLocales[field.name] = {};
|
|
@@ -289,8 +312,9 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
289
312
|
global,
|
|
290
313
|
mergeLocaleActions,
|
|
291
314
|
operation,
|
|
292
|
-
path:
|
|
315
|
+
path: fieldPath,
|
|
293
316
|
req,
|
|
317
|
+
schemaPath: fieldSchemaPath,
|
|
294
318
|
siblingData: tabSiblingData,
|
|
295
319
|
siblingDoc: tabSiblingDoc,
|
|
296
320
|
siblingDocWithLocales: tabSiblingDocWithLocales,
|
|
@@ -316,8 +340,9 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
316
340
|
global,
|
|
317
341
|
mergeLocaleActions,
|
|
318
342
|
operation,
|
|
319
|
-
path,
|
|
343
|
+
path: fieldPath,
|
|
320
344
|
req,
|
|
345
|
+
schemaPath: fieldSchemaPath,
|
|
321
346
|
siblingData,
|
|
322
347
|
siblingDoc,
|
|
323
348
|
siblingDocWithLocales,
|
|
@@ -325,6 +350,48 @@ export const promise = async ({ id, collection, context, data, doc, docWithLocal
|
|
|
325
350
|
});
|
|
326
351
|
break;
|
|
327
352
|
}
|
|
353
|
+
case 'richText':
|
|
354
|
+
{
|
|
355
|
+
if (!field?.editor) {
|
|
356
|
+
throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor
|
|
357
|
+
;
|
|
358
|
+
}
|
|
359
|
+
if (typeof field?.editor === 'function') {
|
|
360
|
+
throw new Error('Attempted to access unsanitized rich text editor.');
|
|
361
|
+
}
|
|
362
|
+
const editor = field?.editor;
|
|
363
|
+
if (editor?.hooks?.beforeChange?.length) {
|
|
364
|
+
await editor.hooks.beforeChange.reduce(async (priorHook, currentHook)=>{
|
|
365
|
+
await priorHook;
|
|
366
|
+
const hookedValue = await currentHook({
|
|
367
|
+
collection,
|
|
368
|
+
context,
|
|
369
|
+
data,
|
|
370
|
+
docWithLocales,
|
|
371
|
+
duplicate,
|
|
372
|
+
errors,
|
|
373
|
+
field,
|
|
374
|
+
global,
|
|
375
|
+
mergeLocaleActions,
|
|
376
|
+
operation,
|
|
377
|
+
originalDoc: doc,
|
|
378
|
+
path: fieldPath,
|
|
379
|
+
previousSiblingDoc: siblingDoc,
|
|
380
|
+
previousValue: siblingDoc[field.name],
|
|
381
|
+
req,
|
|
382
|
+
schemaPath: parentSchemaPath,
|
|
383
|
+
siblingData,
|
|
384
|
+
siblingDocWithLocales,
|
|
385
|
+
skipValidation,
|
|
386
|
+
value: siblingData[field.name]
|
|
387
|
+
});
|
|
388
|
+
if (hookedValue !== undefined) {
|
|
389
|
+
siblingData[field.name] = hookedValue;
|
|
390
|
+
}
|
|
391
|
+
}, Promise.resolve());
|
|
392
|
+
}
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
328
395
|
default:
|
|
329
396
|
{
|
|
330
397
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/promise.ts"],"sourcesContent":["import merge from 'deepmerge'\n\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { Operation, PayloadRequestWithData, RequestContext } from '../../../types/index.js'\nimport type { Field, FieldHookArgs, TabAsField, ValidateOptions } from '../../config/types.js'\n\nimport { fieldAffectsData, tabHasName } from '../../config/types.js'\nimport { beforeDuplicate } from './beforeDuplicate.js'\nimport { getExistingRowDoc } from './getExistingRowDoc.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown>\n doc: Record<string, unknown>\n docWithLocales: Record<string, unknown>\n duplicate: boolean\n errors: { field: string; message: string }[]\n field: Field | TabAsField\n global: SanitizedGlobalConfig | null\n id?: number | string\n mergeLocaleActions: (() => Promise<void>)[]\n operation: Operation\n path: string\n req: PayloadRequestWithData\n siblingData: Record<string, unknown>\n siblingDoc: Record<string, unknown>\n siblingDocWithLocales?: Record<string, unknown>\n skipValidation: boolean\n}\n\n// This function is responsible for the following actions, in order:\n// - Run condition\n// - Execute field hooks\n// - Validate data\n// - Transform data for storage\n// - beforeDuplicate hooks (if duplicate)\n// - Unflatten locales\n\nexport const promise = async ({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n field,\n global,\n mergeLocaleActions,\n operation,\n path,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation,\n}: Args): Promise<void> => {\n const passesCondition = field.admin?.condition\n ? Boolean(field.admin.condition(data, siblingData, { user: req.user }))\n : true\n let skipValidationFromHere = skipValidation || !passesCondition\n const { localization } = req.payload.config\n const defaultLocale = localization ? localization?.defaultLocale : 'en'\n const operationLocale = req.locale || defaultLocale\n\n if (fieldAffectsData(field)) {\n // skip validation if the field is localized and the incoming data is null\n if (field.localized && operationLocale !== defaultLocale) {\n if (['array', 'blocks'].includes(field.type) && siblingData[field.name] === null) {\n skipValidationFromHere = true\n }\n }\n\n // Execute hooks\n if (field.hooks?.beforeChange) {\n await field.hooks.beforeChange.reduce(async (priorHook, currentHook) => {\n await priorHook\n\n const hookedValue = await currentHook({\n collection,\n context,\n data,\n field,\n global,\n operation,\n originalDoc: doc,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n siblingData,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }, Promise.resolve())\n }\n\n // Validate\n if (!skipValidationFromHere && field.validate) {\n const valueToValidate = siblingData[field.name]\n let jsonError: object\n\n if (field.type === 'json' && typeof siblingData[field.name] === 'string') {\n try {\n JSON.parse(siblingData[field.name] as string)\n } catch (e) {\n jsonError = e\n }\n }\n\n const validationResult = await field.validate(valueToValidate, {\n ...field,\n id,\n data: merge(doc, data, { arrayMerge: (_, source) => source }),\n jsonError,\n operation,\n preferences: { fields: {} },\n req,\n siblingData: merge(siblingDoc, siblingData, { arrayMerge: (_, source) => source }),\n } as ValidateOptions<any, any, { jsonError: object }>)\n\n if (typeof validationResult === 'string') {\n errors.push({\n field: `${path}${field.name}`,\n message: validationResult,\n })\n }\n }\n\n const beforeDuplicateArgs: FieldHookArgs = {\n collection,\n context,\n data,\n field,\n global: undefined,\n req,\n siblingData,\n value: siblingData[field.name],\n }\n\n // Push merge locale action if applicable\n if (localization && field.localized) {\n mergeLocaleActions.push(async () => {\n const localeData = await localization.localeCodes.reduce(\n async (localizedValuesPromise: Promise<Record<string, unknown>>, locale) => {\n const localizedValues = await localizedValuesPromise\n let fieldValue =\n locale === req.locale\n ? siblingData[field.name]\n : siblingDocWithLocales?.[field.name]?.[locale]\n\n if (duplicate && field.hooks?.beforeDuplicate?.length) {\n beforeDuplicateArgs.value = fieldValue\n fieldValue = await beforeDuplicate(beforeDuplicateArgs)\n }\n\n // const result = await localizedValues\n // update locale value if it's not undefined\n if (typeof fieldValue !== 'undefined') {\n return {\n ...localizedValues,\n [locale]: fieldValue,\n }\n }\n\n return localizedValuesPromise\n },\n Promise.resolve({}),\n )\n\n // If there are locales with data, set the data\n if (Object.keys(localeData).length > 0) {\n siblingData[field.name] = localeData\n }\n })\n } else if (duplicate && field.hooks?.beforeDuplicate?.length) {\n mergeLocaleActions.push(async () => {\n siblingData[field.name] = await beforeDuplicate(beforeDuplicateArgs)\n })\n }\n }\n\n switch (field.type) {\n case 'point': {\n // Transform point data for storage\n if (\n Array.isArray(siblingData[field.name]) &&\n siblingData[field.name][0] !== null &&\n siblingData[field.name][1] !== null\n ) {\n siblingData[field.name] = {\n type: 'Point',\n coordinates: [\n parseFloat(siblingData[field.name][0]),\n parseFloat(siblingData[field.name][1]),\n ],\n }\n }\n\n break\n }\n\n case 'group': {\n if (typeof siblingData[field.name] !== 'object') siblingData[field.name] = {}\n if (typeof siblingDoc[field.name] !== 'object') siblingDoc[field.name] = {}\n if (typeof siblingDocWithLocales[field.name] !== 'object')\n siblingDocWithLocales[field.name] = {}\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: `${path}${field.name}.`,\n req,\n siblingData: siblingData[field.name] as Record<string, unknown>,\n siblingDoc: siblingDoc[field.name] as Record<string, unknown>,\n siblingDocWithLocales: siblingDocWithLocales[field.name] as Record<string, unknown>,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'array': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises = []\n rows.forEach((row, i) => {\n promises.push(\n traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: `${path}${field.name}.${i}.`,\n req,\n siblingData: row,\n siblingDoc: getExistingRowDoc(row, siblingDoc[field.name]),\n siblingDocWithLocales: getExistingRowDoc(row, siblingDocWithLocales[field.name]),\n skipValidation: skipValidationFromHere,\n }),\n )\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises = []\n rows.forEach((row, i) => {\n const rowSiblingDoc = getExistingRowDoc(row, siblingDoc[field.name])\n const rowSiblingDocWithLocales = getExistingRowDoc(row, siblingDocWithLocales[field.name])\n\n const blockTypeToMatch = row.blockType || rowSiblingDoc.blockType\n const block = field.blocks.find((blockType) => blockType.slug === blockTypeToMatch)\n\n if (block) {\n promises.push(\n traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: block.fields,\n global,\n mergeLocaleActions,\n operation,\n path: `${path}${field.name}.${i}.`,\n req,\n siblingData: row,\n siblingDoc: rowSiblingDoc,\n siblingDocWithLocales: rowSiblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'row':\n case 'collapsible': {\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'tab': {\n let tabPath = path\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabSiblingDocWithLocales = siblingDocWithLocales\n\n if (tabHasName(field)) {\n tabPath = `${path}${field.name}.`\n if (typeof siblingData[field.name] !== 'object') siblingData[field.name] = {}\n if (typeof siblingDoc[field.name] !== 'object') siblingDoc[field.name] = {}\n if (typeof siblingDocWithLocales[field.name] !== 'object')\n siblingDocWithLocales[field.name] = {}\n\n tabSiblingData = siblingData[field.name] as Record<string, unknown>\n tabSiblingDoc = siblingDoc[field.name] as Record<string, unknown>\n tabSiblingDocWithLocales = siblingDocWithLocales[field.name] as Record<string, unknown>\n }\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: tabPath,\n req,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n siblingDocWithLocales: tabSiblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n mergeLocaleActions,\n operation,\n path,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n default: {\n break\n }\n }\n}\n"],"names":["merge","fieldAffectsData","tabHasName","beforeDuplicate","getExistingRowDoc","traverseFields","promise","id","collection","context","data","doc","docWithLocales","duplicate","errors","field","global","mergeLocaleActions","operation","path","req","siblingData","siblingDoc","siblingDocWithLocales","skipValidation","passesCondition","admin","condition","Boolean","user","skipValidationFromHere","localization","payload","config","defaultLocale","operationLocale","locale","localized","includes","type","name","hooks","beforeChange","reduce","priorHook","currentHook","hookedValue","originalDoc","previousSiblingDoc","previousValue","value","undefined","Promise","resolve","validate","valueToValidate","jsonError","JSON","parse","e","validationResult","arrayMerge","_","source","preferences","fields","push","message","beforeDuplicateArgs","localeData","localeCodes","localizedValuesPromise","localizedValues","fieldValue","length","Object","keys","Array","isArray","coordinates","parseFloat","rows","promises","forEach","row","i","all","rowSiblingDoc","rowSiblingDocWithLocales","blockTypeToMatch","blockType","block","blocks","find","slug","tabPath","tabSiblingData","tabSiblingDoc","tabSiblingDocWithLocales","tabs","map","tab"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/promise.ts"],"sourcesContent":["import merge from 'deepmerge'\n\nimport type { RichTextAdapter } from '../../../admin/RichText.js'\nimport type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { Operation, PayloadRequestWithData, RequestContext } from '../../../types/index.js'\nimport type { Field, FieldHookArgs, TabAsField, ValidateOptions } from '../../config/types.js'\n\nimport { MissingEditorProp } from '../../../errors/index.js'\nimport { fieldAffectsData, tabHasName } from '../../config/types.js'\nimport { getFieldPaths } from '../../getFieldPaths.js'\nimport { beforeDuplicate } from './beforeDuplicate.js'\nimport { getExistingRowDoc } from './getExistingRowDoc.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown>\n doc: Record<string, unknown>\n docWithLocales: Record<string, unknown>\n duplicate: boolean\n errors: { field: string; message: string }[]\n field: Field | TabAsField\n global: SanitizedGlobalConfig | null\n id?: number | string\n mergeLocaleActions: (() => Promise<void>)[]\n operation: Operation\n /**\n * The parent's path.\n */\n parentPath: (number | string)[]\n /**\n * The parent's schemaPath (path without indexes).\n */\n parentSchemaPath: string[]\n req: PayloadRequestWithData\n siblingData: Record<string, unknown>\n siblingDoc: Record<string, unknown>\n siblingDocWithLocales?: Record<string, unknown>\n skipValidation: boolean\n}\n\n// This function is responsible for the following actions, in order:\n// - Run condition\n// - Execute field hooks\n// - Validate data\n// - Transform data for storage\n// - beforeDuplicate hooks (if duplicate)\n// - Unflatten locales\n\nexport const promise = async ({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n field,\n global,\n mergeLocaleActions,\n operation,\n parentPath,\n parentSchemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation,\n}: Args): Promise<void> => {\n const passesCondition = field.admin?.condition\n ? Boolean(field.admin.condition(data, siblingData, { user: req.user }))\n : true\n let skipValidationFromHere = skipValidation || !passesCondition\n const { localization } = req.payload.config\n const defaultLocale = localization ? localization?.defaultLocale : 'en'\n const operationLocale = req.locale || defaultLocale\n\n const { path: fieldPath, schemaPath: fieldSchemaPath } = getFieldPaths({\n field,\n parentPath,\n parentSchemaPath,\n })\n\n if (fieldAffectsData(field)) {\n // skip validation if the field is localized and the incoming data is null\n if (field.localized && operationLocale !== defaultLocale) {\n if (['array', 'blocks'].includes(field.type) && siblingData[field.name] === null) {\n skipValidationFromHere = true\n }\n }\n\n // Execute hooks\n if (field.hooks?.beforeChange) {\n await field.hooks.beforeChange.reduce(async (priorHook, currentHook) => {\n await priorHook\n\n const hookedValue = await currentHook({\n collection,\n context,\n data,\n field,\n global,\n operation,\n originalDoc: doc,\n path: fieldPath,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: parentSchemaPath,\n siblingData,\n siblingDocWithLocales,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }, Promise.resolve())\n }\n\n // Validate\n if (!skipValidationFromHere && field.validate) {\n const valueToValidate = siblingData[field.name]\n let jsonError: object\n\n if (field.type === 'json' && typeof siblingData[field.name] === 'string') {\n try {\n JSON.parse(siblingData[field.name] as string)\n } catch (e) {\n jsonError = e\n }\n }\n\n const validationResult = await field.validate(valueToValidate, {\n ...field,\n id,\n data: merge(doc, data, { arrayMerge: (_, source) => source }),\n jsonError,\n operation,\n preferences: { fields: {} },\n req,\n siblingData: merge(siblingDoc, siblingData, { arrayMerge: (_, source) => source }),\n } as ValidateOptions<any, any, { jsonError: object }>)\n\n if (typeof validationResult === 'string') {\n errors.push({\n field: fieldPath.join('.'),\n message: validationResult,\n })\n }\n }\n\n const beforeDuplicateArgs: FieldHookArgs = {\n collection,\n context,\n data,\n field,\n global: undefined,\n path: fieldPath,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: parentSchemaPath,\n siblingData,\n siblingDocWithLocales,\n value: siblingData[field.name],\n }\n\n // Push merge locale action if applicable\n if (localization && field.localized) {\n mergeLocaleActions.push(async () => {\n const localeData = await localization.localeCodes.reduce(\n async (localizedValuesPromise: Promise<Record<string, unknown>>, locale) => {\n const localizedValues = await localizedValuesPromise\n let fieldValue =\n locale === req.locale\n ? siblingData[field.name]\n : siblingDocWithLocales?.[field.name]?.[locale]\n\n if (duplicate && field.hooks?.beforeDuplicate?.length) {\n beforeDuplicateArgs.value = fieldValue\n fieldValue = await beforeDuplicate(beforeDuplicateArgs)\n }\n\n // const result = await localizedValues\n // update locale value if it's not undefined\n if (typeof fieldValue !== 'undefined') {\n return {\n ...localizedValues,\n [locale]: fieldValue,\n }\n }\n\n return localizedValuesPromise\n },\n Promise.resolve({}),\n )\n\n // If there are locales with data, set the data\n if (Object.keys(localeData).length > 0) {\n siblingData[field.name] = localeData\n }\n })\n } else if (duplicate && field.hooks?.beforeDuplicate?.length) {\n mergeLocaleActions.push(async () => {\n siblingData[field.name] = await beforeDuplicate(beforeDuplicateArgs)\n })\n }\n }\n\n switch (field.type) {\n case 'point': {\n // Transform point data for storage\n if (\n Array.isArray(siblingData[field.name]) &&\n siblingData[field.name][0] !== null &&\n siblingData[field.name][1] !== null\n ) {\n siblingData[field.name] = {\n type: 'Point',\n coordinates: [\n parseFloat(siblingData[field.name][0]),\n parseFloat(siblingData[field.name][1]),\n ],\n }\n }\n\n break\n }\n\n case 'group': {\n if (typeof siblingData[field.name] !== 'object') siblingData[field.name] = {}\n if (typeof siblingDoc[field.name] !== 'object') siblingDoc[field.name] = {}\n if (typeof siblingDocWithLocales[field.name] !== 'object')\n siblingDocWithLocales[field.name] = {}\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: fieldPath,\n req,\n schemaPath: fieldSchemaPath,\n siblingData: siblingData[field.name] as Record<string, unknown>,\n siblingDoc: siblingDoc[field.name] as Record<string, unknown>,\n siblingDocWithLocales: siblingDocWithLocales[field.name] as Record<string, unknown>,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'array': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises = []\n rows.forEach((row, i) => {\n promises.push(\n traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: [...fieldPath, i],\n req,\n schemaPath: fieldSchemaPath,\n siblingData: row,\n siblingDoc: getExistingRowDoc(row, siblingDoc[field.name]),\n siblingDocWithLocales: getExistingRowDoc(row, siblingDocWithLocales[field.name]),\n skipValidation: skipValidationFromHere,\n }),\n )\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'blocks': {\n const rows = siblingData[field.name]\n\n if (Array.isArray(rows)) {\n const promises = []\n rows.forEach((row, i) => {\n const rowSiblingDoc = getExistingRowDoc(row, siblingDoc[field.name])\n const rowSiblingDocWithLocales = getExistingRowDoc(row, siblingDocWithLocales[field.name])\n\n const blockTypeToMatch = row.blockType || rowSiblingDoc.blockType\n const block = field.blocks.find((blockType) => blockType.slug === blockTypeToMatch)\n\n if (block) {\n promises.push(\n traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: block.fields,\n global,\n mergeLocaleActions,\n operation,\n path: [...fieldPath, i],\n req,\n schemaPath: fieldSchemaPath,\n siblingData: row,\n siblingDoc: rowSiblingDoc,\n siblingDocWithLocales: rowSiblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n }),\n )\n }\n })\n\n await Promise.all(promises)\n }\n\n break\n }\n\n case 'row':\n case 'collapsible': {\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: fieldPath,\n req,\n schemaPath: fieldSchemaPath,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'tab': {\n let tabSiblingData = siblingData\n let tabSiblingDoc = siblingDoc\n let tabSiblingDocWithLocales = siblingDocWithLocales\n\n if (tabHasName(field)) {\n if (typeof siblingData[field.name] !== 'object') siblingData[field.name] = {}\n if (typeof siblingDoc[field.name] !== 'object') siblingDoc[field.name] = {}\n if (typeof siblingDocWithLocales[field.name] !== 'object')\n siblingDocWithLocales[field.name] = {}\n\n tabSiblingData = siblingData[field.name] as Record<string, unknown>\n tabSiblingDoc = siblingDoc[field.name] as Record<string, unknown>\n tabSiblingDocWithLocales = siblingDocWithLocales[field.name] as Record<string, unknown>\n }\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.fields,\n global,\n mergeLocaleActions,\n operation,\n path: fieldPath,\n req,\n schemaPath: fieldSchemaPath,\n siblingData: tabSiblingData,\n siblingDoc: tabSiblingDoc,\n siblingDocWithLocales: tabSiblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'tabs': {\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n global,\n mergeLocaleActions,\n operation,\n path: fieldPath,\n req,\n schemaPath: fieldSchemaPath,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation: skipValidationFromHere,\n })\n\n break\n }\n\n case 'richText': {\n if (!field?.editor) {\n throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor\n }\n if (typeof field?.editor === 'function') {\n throw new Error('Attempted to access unsanitized rich text editor.')\n }\n\n const editor: RichTextAdapter = field?.editor\n\n if (editor?.hooks?.beforeChange?.length) {\n await editor.hooks.beforeChange.reduce(async (priorHook, currentHook) => {\n await priorHook\n\n const hookedValue = await currentHook({\n collection,\n context,\n data,\n docWithLocales,\n duplicate,\n errors,\n field,\n global,\n mergeLocaleActions,\n operation,\n originalDoc: doc,\n path: fieldPath,\n previousSiblingDoc: siblingDoc,\n previousValue: siblingDoc[field.name],\n req,\n schemaPath: parentSchemaPath,\n siblingData,\n siblingDocWithLocales,\n skipValidation,\n value: siblingData[field.name],\n })\n\n if (hookedValue !== undefined) {\n siblingData[field.name] = hookedValue\n }\n }, Promise.resolve())\n }\n\n break\n }\n\n default: {\n break\n }\n }\n}\n"],"names":["merge","MissingEditorProp","fieldAffectsData","tabHasName","getFieldPaths","beforeDuplicate","getExistingRowDoc","traverseFields","promise","id","collection","context","data","doc","docWithLocales","duplicate","errors","field","global","mergeLocaleActions","operation","parentPath","parentSchemaPath","req","siblingData","siblingDoc","siblingDocWithLocales","skipValidation","passesCondition","admin","condition","Boolean","user","skipValidationFromHere","localization","payload","config","defaultLocale","operationLocale","locale","path","fieldPath","schemaPath","fieldSchemaPath","localized","includes","type","name","hooks","beforeChange","reduce","priorHook","currentHook","hookedValue","originalDoc","previousSiblingDoc","previousValue","value","undefined","Promise","resolve","validate","valueToValidate","jsonError","JSON","parse","e","validationResult","arrayMerge","_","source","preferences","fields","push","join","message","beforeDuplicateArgs","localeData","localeCodes","localizedValuesPromise","localizedValues","fieldValue","length","Object","keys","Array","isArray","coordinates","parseFloat","rows","promises","forEach","row","i","all","rowSiblingDoc","rowSiblingDocWithLocales","blockTypeToMatch","blockType","block","blocks","find","slug","tabSiblingData","tabSiblingDoc","tabSiblingDocWithLocales","tabs","map","tab","editor","Error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,OAAOA,WAAW,YAAW;AAQ7B,SAASC,iBAAiB,QAAQ,2BAA0B;AAC5D,SAASC,gBAAgB,EAAEC,UAAU,QAAQ,wBAAuB;AACpE,SAASC,aAAa,QAAQ,yBAAwB;AACtD,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,cAAc,QAAQ,sBAAqB;AA8BpD,oEAAoE;AACpE,kBAAkB;AAClB,wBAAwB;AACxB,kBAAkB;AAClB,+BAA+B;AAC/B,yCAAyC;AACzC,sBAAsB;AAEtB,OAAO,MAAMC,UAAU,OAAO,EAC5BC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,IAAI,EACJC,GAAG,EACHC,cAAc,EACdC,SAAS,EACTC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,kBAAkB,EAClBC,SAAS,EACTC,UAAU,EACVC,gBAAgB,EAChBC,GAAG,EACHC,WAAW,EACXC,UAAU,EACVC,qBAAqB,EACrBC,cAAc,EACT;IACL,MAAMC,kBAAkBX,MAAMY,KAAK,EAAEC,YACjCC,QAAQd,MAAMY,KAAK,CAACC,SAAS,CAAClB,MAAMY,aAAa;QAAEQ,MAAMT,IAAIS,IAAI;IAAC,MAClE;IACJ,IAAIC,yBAAyBN,kBAAkB,CAACC;IAChD,MAAM,EAAEM,YAAY,EAAE,GAAGX,IAAIY,OAAO,CAACC,MAAM;IAC3C,MAAMC,gBAAgBH,eAAeA,cAAcG,gBAAgB;IACnE,MAAMC,kBAAkBf,IAAIgB,MAAM,IAAIF;IAEtC,MAAM,EAAEG,MAAMC,SAAS,EAAEC,YAAYC,eAAe,EAAE,GAAGvC,cAAc;QACrEa;QACAI;QACAC;IACF;IAEA,IAAIpB,iBAAiBe,QAAQ;QAC3B,0EAA0E;QAC1E,IAAIA,MAAM2B,SAAS,IAAIN,oBAAoBD,eAAe;YACxD,IAAI;gBAAC;gBAAS;aAAS,CAACQ,QAAQ,CAAC5B,MAAM6B,IAAI,KAAKtB,WAAW,CAACP,MAAM8B,IAAI,CAAC,KAAK,MAAM;gBAChFd,yBAAyB;YAC3B;QACF;QAEA,gBAAgB;QAChB,IAAIhB,MAAM+B,KAAK,EAAEC,cAAc;YAC7B,MAAMhC,MAAM+B,KAAK,CAACC,YAAY,CAACC,MAAM,CAAC,OAAOC,WAAWC;gBACtD,MAAMD;gBAEN,MAAME,cAAc,MAAMD,YAAY;oBACpC1C;oBACAC;oBACAC;oBACAK;oBACAC;oBACAE;oBACAkC,aAAazC;oBACb2B,MAAMC;oBACNc,oBAAoB9B;oBACpB+B,eAAe/B,UAAU,CAACR,MAAM8B,IAAI,CAAC;oBACrCxB;oBACAmB,YAAYpB;oBACZE;oBACAE;oBACA+B,OAAOjC,WAAW,CAACP,MAAM8B,IAAI,CAAC;gBAChC;gBAEA,IAAIM,gBAAgBK,WAAW;oBAC7BlC,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAGM;gBAC5B;YACF,GAAGM,QAAQC,OAAO;QACpB;QAEA,WAAW;QACX,IAAI,CAAC3B,0BAA0BhB,MAAM4C,QAAQ,EAAE;YAC7C,MAAMC,kBAAkBtC,WAAW,CAACP,MAAM8B,IAAI,CAAC;YAC/C,IAAIgB;YAEJ,IAAI9C,MAAM6B,IAAI,KAAK,UAAU,OAAOtB,WAAW,CAACP,MAAM8B,IAAI,CAAC,KAAK,UAAU;gBACxE,IAAI;oBACFiB,KAAKC,KAAK,CAACzC,WAAW,CAACP,MAAM8B,IAAI,CAAC;gBACpC,EAAE,OAAOmB,GAAG;oBACVH,YAAYG;gBACd;YACF;YAEA,MAAMC,mBAAmB,MAAMlD,MAAM4C,QAAQ,CAACC,iBAAiB;gBAC7D,GAAG7C,KAAK;gBACRR;gBACAG,MAAMZ,MAAMa,KAAKD,MAAM;oBAAEwD,YAAY,CAACC,GAAGC,SAAWA;gBAAO;gBAC3DP;gBACA3C;gBACAmD,aAAa;oBAAEC,QAAQ,CAAC;gBAAE;gBAC1BjD;gBACAC,aAAaxB,MAAMyB,YAAYD,aAAa;oBAAE4C,YAAY,CAACC,GAAGC,SAAWA;gBAAO;YAClF;YAEA,IAAI,OAAOH,qBAAqB,UAAU;gBACxCnD,OAAOyD,IAAI,CAAC;oBACVxD,OAAOwB,UAAUiC,IAAI,CAAC;oBACtBC,SAASR;gBACX;YACF;QACF;QAEA,MAAMS,sBAAqC;YACzClE;YACAC;YACAC;YACAK;YACAC,QAAQwC;YACRlB,MAAMC;YACNc,oBAAoB9B;YACpB+B,eAAe/B,UAAU,CAACR,MAAM8B,IAAI,CAAC;YACrCxB;YACAmB,YAAYpB;YACZE;YACAE;YACA+B,OAAOjC,WAAW,CAACP,MAAM8B,IAAI,CAAC;QAChC;QAEA,yCAAyC;QACzC,IAAIb,gBAAgBjB,MAAM2B,SAAS,EAAE;YACnCzB,mBAAmBsD,IAAI,CAAC;gBACtB,MAAMI,aAAa,MAAM3C,aAAa4C,WAAW,CAAC5B,MAAM,CACtD,OAAO6B,wBAA0DxC;oBAC/D,MAAMyC,kBAAkB,MAAMD;oBAC9B,IAAIE,aACF1C,WAAWhB,IAAIgB,MAAM,GACjBf,WAAW,CAACP,MAAM8B,IAAI,CAAC,GACvBrB,uBAAuB,CAACT,MAAM8B,IAAI,CAAC,EAAE,CAACR,OAAO;oBAEnD,IAAIxB,aAAaE,MAAM+B,KAAK,EAAE3C,iBAAiB6E,QAAQ;wBACrDN,oBAAoBnB,KAAK,GAAGwB;wBAC5BA,aAAa,MAAM5E,gBAAgBuE;oBACrC;oBAEA,uCAAuC;oBACvC,4CAA4C;oBAC5C,IAAI,OAAOK,eAAe,aAAa;wBACrC,OAAO;4BACL,GAAGD,eAAe;4BAClB,CAACzC,OAAO,EAAE0C;wBACZ;oBACF;oBAEA,OAAOF;gBACT,GACApB,QAAQC,OAAO,CAAC,CAAC;gBAGnB,+CAA+C;gBAC/C,IAAIuB,OAAOC,IAAI,CAACP,YAAYK,MAAM,GAAG,GAAG;oBACtC1D,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAG8B;gBAC5B;YACF;QACF,OAAO,IAAI9D,aAAaE,MAAM+B,KAAK,EAAE3C,iBAAiB6E,QAAQ;YAC5D/D,mBAAmBsD,IAAI,CAAC;gBACtBjD,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAG,MAAM1C,gBAAgBuE;YAClD;QACF;IACF;IAEA,OAAQ3D,MAAM6B,IAAI;QAChB,KAAK;YAAS;gBACZ,mCAAmC;gBACnC,IACEuC,MAAMC,OAAO,CAAC9D,WAAW,CAACP,MAAM8B,IAAI,CAAC,KACrCvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,CAAC,EAAE,KAAK,QAC/BvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,CAAC,EAAE,KAAK,MAC/B;oBACAvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAG;wBACxBD,MAAM;wBACNyC,aAAa;4BACXC,WAAWhE,WAAW,CAACP,MAAM8B,IAAI,CAAC,CAAC,EAAE;4BACrCyC,WAAWhE,WAAW,CAACP,MAAM8B,IAAI,CAAC,CAAC,EAAE;yBACtC;oBACH;gBACF;gBAEA;YACF;QAEA,KAAK;YAAS;gBACZ,IAAI,OAAOvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,KAAK,UAAUvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAG,CAAC;gBAC5E,IAAI,OAAOtB,UAAU,CAACR,MAAM8B,IAAI,CAAC,KAAK,UAAUtB,UAAU,CAACR,MAAM8B,IAAI,CAAC,GAAG,CAAC;gBAC1E,IAAI,OAAOrB,qBAAqB,CAACT,MAAM8B,IAAI,CAAC,KAAK,UAC/CrB,qBAAqB,CAACT,MAAM8B,IAAI,CAAC,GAAG,CAAC;gBAEvC,MAAMxC,eAAe;oBACnBE;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAwD,QAAQvD,MAAMuD,MAAM;oBACpBtD;oBACAC;oBACAC;oBACAoB,MAAMC;oBACNlB;oBACAmB,YAAYC;oBACZnB,aAAaA,WAAW,CAACP,MAAM8B,IAAI,CAAC;oBACpCtB,YAAYA,UAAU,CAACR,MAAM8B,IAAI,CAAC;oBAClCrB,uBAAuBA,qBAAqB,CAACT,MAAM8B,IAAI,CAAC;oBACxDpB,gBAAgBM;gBAClB;gBAEA;YACF;QAEA,KAAK;YAAS;gBACZ,MAAMwD,OAAOjE,WAAW,CAACP,MAAM8B,IAAI,CAAC;gBAEpC,IAAIsC,MAAMC,OAAO,CAACG,OAAO;oBACvB,MAAMC,WAAW,EAAE;oBACnBD,KAAKE,OAAO,CAAC,CAACC,KAAKC;wBACjBH,SAASjB,IAAI,CACXlE,eAAe;4BACbE;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAwD,QAAQvD,MAAMuD,MAAM;4BACpBtD;4BACAC;4BACAC;4BACAoB,MAAM;mCAAIC;gCAAWoD;6BAAE;4BACvBtE;4BACAmB,YAAYC;4BACZnB,aAAaoE;4BACbnE,YAAYnB,kBAAkBsF,KAAKnE,UAAU,CAACR,MAAM8B,IAAI,CAAC;4BACzDrB,uBAAuBpB,kBAAkBsF,KAAKlE,qBAAqB,CAACT,MAAM8B,IAAI,CAAC;4BAC/EpB,gBAAgBM;wBAClB;oBAEJ;oBAEA,MAAM0B,QAAQmC,GAAG,CAACJ;gBACpB;gBAEA;YACF;QAEA,KAAK;YAAU;gBACb,MAAMD,OAAOjE,WAAW,CAACP,MAAM8B,IAAI,CAAC;gBAEpC,IAAIsC,MAAMC,OAAO,CAACG,OAAO;oBACvB,MAAMC,WAAW,EAAE;oBACnBD,KAAKE,OAAO,CAAC,CAACC,KAAKC;wBACjB,MAAME,gBAAgBzF,kBAAkBsF,KAAKnE,UAAU,CAACR,MAAM8B,IAAI,CAAC;wBACnE,MAAMiD,2BAA2B1F,kBAAkBsF,KAAKlE,qBAAqB,CAACT,MAAM8B,IAAI,CAAC;wBAEzF,MAAMkD,mBAAmBL,IAAIM,SAAS,IAAIH,cAAcG,SAAS;wBACjE,MAAMC,QAAQlF,MAAMmF,MAAM,CAACC,IAAI,CAAC,CAACH,YAAcA,UAAUI,IAAI,KAAKL;wBAElE,IAAIE,OAAO;4BACTT,SAASjB,IAAI,CACXlE,eAAe;gCACbE;gCACAC;gCACAC;gCACAC;gCACAC;gCACAC;gCACAC;gCACAC;gCACAwD,QAAQ2B,MAAM3B,MAAM;gCACpBtD;gCACAC;gCACAC;gCACAoB,MAAM;uCAAIC;oCAAWoD;iCAAE;gCACvBtE;gCACAmB,YAAYC;gCACZnB,aAAaoE;gCACbnE,YAAYsE;gCACZrE,uBAAuBsE;gCACvBrE,gBAAgBM;4BAClB;wBAEJ;oBACF;oBAEA,MAAM0B,QAAQmC,GAAG,CAACJ;gBACpB;gBAEA;YACF;QAEA,KAAK;QACL,KAAK;YAAe;gBAClB,MAAMnF,eAAe;oBACnBE;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAwD,QAAQvD,MAAMuD,MAAM;oBACpBtD;oBACAC;oBACAC;oBACAoB,MAAMC;oBACNlB;oBACAmB,YAAYC;oBACZnB;oBACAC;oBACAC;oBACAC,gBAAgBM;gBAClB;gBAEA;YACF;QAEA,KAAK;YAAO;gBACV,IAAIsE,iBAAiB/E;gBACrB,IAAIgF,gBAAgB/E;gBACpB,IAAIgF,2BAA2B/E;gBAE/B,IAAIvB,WAAWc,QAAQ;oBACrB,IAAI,OAAOO,WAAW,CAACP,MAAM8B,IAAI,CAAC,KAAK,UAAUvB,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAG,CAAC;oBAC5E,IAAI,OAAOtB,UAAU,CAACR,MAAM8B,IAAI,CAAC,KAAK,UAAUtB,UAAU,CAACR,MAAM8B,IAAI,CAAC,GAAG,CAAC;oBAC1E,IAAI,OAAOrB,qBAAqB,CAACT,MAAM8B,IAAI,CAAC,KAAK,UAC/CrB,qBAAqB,CAACT,MAAM8B,IAAI,CAAC,GAAG,CAAC;oBAEvCwD,iBAAiB/E,WAAW,CAACP,MAAM8B,IAAI,CAAC;oBACxCyD,gBAAgB/E,UAAU,CAACR,MAAM8B,IAAI,CAAC;oBACtC0D,2BAA2B/E,qBAAqB,CAACT,MAAM8B,IAAI,CAAC;gBAC9D;gBAEA,MAAMxC,eAAe;oBACnBE;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAwD,QAAQvD,MAAMuD,MAAM;oBACpBtD;oBACAC;oBACAC;oBACAoB,MAAMC;oBACNlB;oBACAmB,YAAYC;oBACZnB,aAAa+E;oBACb9E,YAAY+E;oBACZ9E,uBAAuB+E;oBACvB9E,gBAAgBM;gBAClB;gBAEA;YACF;QAEA,KAAK;YAAQ;gBACX,MAAM1B,eAAe;oBACnBE;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAwD,QAAQvD,MAAMyF,IAAI,CAACC,GAAG,CAAC,CAACC,MAAS,CAAA;4BAAE,GAAGA,GAAG;4BAAE9D,MAAM;wBAAM,CAAA;oBACvD5B;oBACAC;oBACAC;oBACAoB,MAAMC;oBACNlB;oBACAmB,YAAYC;oBACZnB;oBACAC;oBACAC;oBACAC,gBAAgBM;gBAClB;gBAEA;YACF;QAEA,KAAK;YAAY;gBACf,IAAI,CAAChB,OAAO4F,QAAQ;oBAClB,MAAM,IAAI5G,kBAAkBgB,OAAO,8HAA8H;;gBACnK;gBACA,IAAI,OAAOA,OAAO4F,WAAW,YAAY;oBACvC,MAAM,IAAIC,MAAM;gBAClB;gBAEA,MAAMD,SAA0B5F,OAAO4F;gBAEvC,IAAIA,QAAQ7D,OAAOC,cAAciC,QAAQ;oBACvC,MAAM2B,OAAO7D,KAAK,CAACC,YAAY,CAACC,MAAM,CAAC,OAAOC,WAAWC;wBACvD,MAAMD;wBAEN,MAAME,cAAc,MAAMD,YAAY;4BACpC1C;4BACAC;4BACAC;4BACAE;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAC;4BACAkC,aAAazC;4BACb2B,MAAMC;4BACNc,oBAAoB9B;4BACpB+B,eAAe/B,UAAU,CAACR,MAAM8B,IAAI,CAAC;4BACrCxB;4BACAmB,YAAYpB;4BACZE;4BACAE;4BACAC;4BACA8B,OAAOjC,WAAW,CAACP,MAAM8B,IAAI,CAAC;wBAChC;wBAEA,IAAIM,gBAAgBK,WAAW;4BAC7BlC,WAAW,CAACP,MAAM8B,IAAI,CAAC,GAAGM;wBAC5B;oBACF,GAAGM,QAAQC,OAAO;gBACpB;gBAEA;YACF;QAEA;YAAS;gBACP;YACF;IACF;AACF,EAAC"}
|
|
@@ -24,8 +24,9 @@ type Args = {
|
|
|
24
24
|
id?: number | string;
|
|
25
25
|
mergeLocaleActions: (() => Promise<void>)[];
|
|
26
26
|
operation: Operation;
|
|
27
|
-
path: string;
|
|
27
|
+
path: (number | string)[];
|
|
28
28
|
req: PayloadRequestWithData;
|
|
29
|
+
schemaPath: string[];
|
|
29
30
|
siblingData: Record<string, unknown>;
|
|
30
31
|
/**
|
|
31
32
|
* The original siblingData (not modified by any hooks)
|
|
@@ -43,8 +44,8 @@ type Args = {
|
|
|
43
44
|
* - Execute field hooks
|
|
44
45
|
* - Validate data
|
|
45
46
|
* - Transform data for storage
|
|
46
|
-
* - Unflatten locales
|
|
47
|
+
* - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.
|
|
47
48
|
*/
|
|
48
|
-
export declare const traverseFields: ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, fields, global, mergeLocaleActions, operation, path, req, siblingData, siblingDoc, siblingDocWithLocales, skipValidation, }: Args) => Promise<void>;
|
|
49
|
+
export declare const traverseFields: ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, fields, global, mergeLocaleActions, operation, path, req, schemaPath, siblingData, siblingDoc, siblingDocWithLocales, skipValidation, }: Args) => Promise<void>;
|
|
49
50
|
export {};
|
|
50
51
|
//# sourceMappingURL=traverseFields.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAChG,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5C,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,kBAAkB,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAC3C,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAChG,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC5C,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,kBAAkB,EAAE,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAA;IAC3C,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IACzB,GAAG,EAAE,sBAAsB,CAAA;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC;;OAEG;IACH,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9C,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qNAoBxB,IAAI,KAAG,QAAQ,IAAI,CA8BrB,CAAA"}
|
|
@@ -5,8 +5,8 @@ import { promise } from './promise.js';
|
|
|
5
5
|
* - Execute field hooks
|
|
6
6
|
* - Validate data
|
|
7
7
|
* - Transform data for storage
|
|
8
|
-
* - Unflatten locales
|
|
9
|
-
*/ export const traverseFields = async ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, fields, global, mergeLocaleActions, operation, path, req, siblingData, siblingDoc, siblingDocWithLocales, skipValidation })=>{
|
|
8
|
+
* - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.
|
|
9
|
+
*/ export const traverseFields = async ({ id, collection, context, data, doc, docWithLocales, duplicate, errors, fields, global, mergeLocaleActions, operation, path, req, schemaPath, siblingData, siblingDoc, siblingDocWithLocales, skipValidation })=>{
|
|
10
10
|
const promises = [];
|
|
11
11
|
fields.forEach((field)=>{
|
|
12
12
|
promises.push(promise({
|
|
@@ -22,7 +22,8 @@ import { promise } from './promise.js';
|
|
|
22
22
|
global,
|
|
23
23
|
mergeLocaleActions,
|
|
24
24
|
operation,
|
|
25
|
-
path,
|
|
25
|
+
parentPath: path,
|
|
26
|
+
parentSchemaPath: schemaPath,
|
|
26
27
|
req,
|
|
27
28
|
siblingData,
|
|
28
29
|
siblingDoc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { Operation, PayloadRequestWithData, RequestContext } from '../../../types/index.js'\nimport type { Field, TabAsField } from '../../config/types.js'\n\nimport { promise } from './promise.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown>\n /**\n * The original data (not modified by any hooks)\n */\n doc: Record<string, unknown>\n /**\n * The original data with locales (not modified by any hooks)\n */\n docWithLocales: Record<string, unknown>\n duplicate: boolean\n errors: { field: string; message: string }[]\n fields: (Field | TabAsField)[]\n global: SanitizedGlobalConfig | null\n id?: number | string\n mergeLocaleActions: (() => Promise<void>)[]\n operation: Operation\n path: string\n req: PayloadRequestWithData\n siblingData: Record<string, unknown>\n /**\n * The original siblingData (not modified by any hooks)\n */\n siblingDoc: Record<string, unknown>\n /**\n * The original siblingData with locales (not modified by any hooks)\n */\n siblingDocWithLocales: Record<string, unknown>\n skipValidation?: boolean\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Run condition\n * - Execute field hooks\n * - Validate data\n * - Transform data for storage\n * - Unflatten locales
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/beforeChange/traverseFields.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { Operation, PayloadRequestWithData, RequestContext } from '../../../types/index.js'\nimport type { Field, TabAsField } from '../../config/types.js'\n\nimport { promise } from './promise.js'\n\ntype Args = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown>\n /**\n * The original data (not modified by any hooks)\n */\n doc: Record<string, unknown>\n /**\n * The original data with locales (not modified by any hooks)\n */\n docWithLocales: Record<string, unknown>\n duplicate: boolean\n errors: { field: string; message: string }[]\n fields: (Field | TabAsField)[]\n global: SanitizedGlobalConfig | null\n id?: number | string\n mergeLocaleActions: (() => Promise<void>)[]\n operation: Operation\n path: (number | string)[]\n req: PayloadRequestWithData\n schemaPath: string[]\n siblingData: Record<string, unknown>\n /**\n * The original siblingData (not modified by any hooks)\n */\n siblingDoc: Record<string, unknown>\n /**\n * The original siblingData with locales (not modified by any hooks)\n */\n siblingDocWithLocales: Record<string, unknown>\n skipValidation?: boolean\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Run condition\n * - Execute field hooks\n * - Validate data\n * - Transform data for storage\n * - Unflatten locales. The input `data` is the normal document for one locale. The output result will become the document with locales.\n */\nexport const traverseFields = async ({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n fields,\n global,\n mergeLocaleActions,\n operation,\n path,\n req,\n schemaPath,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation,\n}: Args): Promise<void> => {\n const promises = []\n\n fields.forEach((field) => {\n promises.push(\n promise({\n id,\n collection,\n context,\n data,\n doc,\n docWithLocales,\n duplicate,\n errors,\n field,\n global,\n mergeLocaleActions,\n operation,\n parentPath: path,\n parentSchemaPath: schemaPath,\n req,\n siblingData,\n siblingDoc,\n siblingDocWithLocales,\n skipValidation,\n }),\n )\n })\n\n await Promise.all(promises)\n}\n"],"names":["promise","traverseFields","id","collection","context","data","doc","docWithLocales","duplicate","errors","fields","global","mergeLocaleActions","operation","path","req","schemaPath","siblingData","siblingDoc","siblingDocWithLocales","skipValidation","promises","forEach","field","push","parentPath","parentSchemaPath","Promise","all"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAKA,SAASA,OAAO,QAAQ,eAAc;AAoCtC;;;;;;;CAOC,GACD,OAAO,MAAMC,iBAAiB,OAAO,EACnCC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,IAAI,EACJC,GAAG,EACHC,cAAc,EACdC,SAAS,EACTC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,kBAAkB,EAClBC,SAAS,EACTC,IAAI,EACJC,GAAG,EACHC,UAAU,EACVC,WAAW,EACXC,UAAU,EACVC,qBAAqB,EACrBC,cAAc,EACT;IACL,MAAMC,WAAW,EAAE;IAEnBX,OAAOY,OAAO,CAAC,CAACC;QACdF,SAASG,IAAI,CACXxB,QAAQ;YACNE;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAC;YACAc;YACAZ;YACAC;YACAC;YACAY,YAAYX;YACZY,kBAAkBV;YAClBD;YACAE;YACAC;YACAC;YACAC;QACF;IAEJ;IAEA,MAAMO,QAAQC,GAAG,CAACP;AACpB,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeValidate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAKrF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,sBAAsB,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qIAUxB,KAAK,CAAC,CAAC,KAAG,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeValidate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAKrF,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,cAAc,EAAE,OAAO,CAAA;IACvB,GAAG,EAAE,sBAAsB,CAAA;CAC5B,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,qIAUxB,KAAK,CAAC,CAAC,KAAG,QAAQ,CAAC,CAqBrB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/fields/hooks/beforeValidate/index.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { PayloadRequestWithData, RequestContext } from '../../../types/index.js'\n\nimport { deepCopyObject } from '../../../utilities/deepCopyObject.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args<T> = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown> | T\n doc?: Record<string, unknown> | T\n duplicate?: boolean\n global: SanitizedGlobalConfig | null\n id?: number | string\n operation: 'create' | 'update'\n overrideAccess: boolean\n req: PayloadRequestWithData\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Sanitize incoming data\n * - Execute field hooks\n * - Execute field access control\n * - Merge original document data into incoming data\n * - Compute default values for undefined fields\n */\nexport const beforeValidate = async <T extends Record<string, unknown>>({\n id,\n collection,\n context,\n data: incomingData,\n doc,\n global,\n operation,\n overrideAccess,\n req,\n}: Args<T>): Promise<T> => {\n const data = deepCopyObject(incomingData)\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n fields: collection?.fields || global?.fields,\n global,\n operation,\n overrideAccess,\n req,\n siblingData: data,\n siblingDoc: doc,\n })\n\n return data\n}\n"],"names":["deepCopyObject","traverseFields","beforeValidate","id","collection","context","data","incomingData","doc","global","operation","overrideAccess","req","fields","siblingData","siblingDoc"],"rangeMappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/fields/hooks/beforeValidate/index.ts"],"sourcesContent":["import type { SanitizedCollectionConfig } from '../../../collections/config/types.js'\nimport type { SanitizedGlobalConfig } from '../../../globals/config/types.js'\nimport type { PayloadRequestWithData, RequestContext } from '../../../types/index.js'\n\nimport { deepCopyObject } from '../../../utilities/deepCopyObject.js'\nimport { traverseFields } from './traverseFields.js'\n\ntype Args<T> = {\n collection: SanitizedCollectionConfig | null\n context: RequestContext\n data: Record<string, unknown> | T\n doc?: Record<string, unknown> | T\n duplicate?: boolean\n global: SanitizedGlobalConfig | null\n id?: number | string\n operation: 'create' | 'update'\n overrideAccess: boolean\n req: PayloadRequestWithData\n}\n\n/**\n * This function is responsible for the following actions, in order:\n * - Sanitize incoming data\n * - Execute field hooks\n * - Execute field access control\n * - Merge original document data into incoming data\n * - Compute default values for undefined fields\n */\nexport const beforeValidate = async <T extends Record<string, unknown>>({\n id,\n collection,\n context,\n data: incomingData,\n doc,\n global,\n operation,\n overrideAccess,\n req,\n}: Args<T>): Promise<T> => {\n const data = deepCopyObject(incomingData)\n\n await traverseFields({\n id,\n collection,\n context,\n data,\n doc,\n fields: collection?.fields || global?.fields,\n global,\n operation,\n overrideAccess,\n path: [],\n req,\n schemaPath: [],\n siblingData: data,\n siblingDoc: doc,\n })\n\n return data\n}\n"],"names":["deepCopyObject","traverseFields","beforeValidate","id","collection","context","data","incomingData","doc","global","operation","overrideAccess","req","fields","path","schemaPath","siblingData","siblingDoc"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAIA,SAASA,cAAc,QAAQ,uCAAsC;AACrE,SAASC,cAAc,QAAQ,sBAAqB;AAepD;;;;;;;CAOC,GACD,OAAO,MAAMC,iBAAiB,OAA0C,EACtEC,EAAE,EACFC,UAAU,EACVC,OAAO,EACPC,MAAMC,YAAY,EAClBC,GAAG,EACHC,MAAM,EACNC,SAAS,EACTC,cAAc,EACdC,GAAG,EACK;IACR,MAAMN,OAAON,eAAeO;IAE5B,MAAMN,eAAe;QACnBE;QACAC;QACAC;QACAC;QACAE;QACAK,QAAQT,YAAYS,UAAUJ,QAAQI;QACtCJ;QACAC;QACAC;QACAG,MAAM,EAAE;QACRF;QACAG,YAAY,EAAE;QACdC,aAAaV;QACbW,YAAYT;IACd;IAEA,OAAOF;AACT,EAAC"}
|
|
@@ -15,6 +15,8 @@ type Args<T> = {
|
|
|
15
15
|
id?: number | string;
|
|
16
16
|
operation: 'create' | 'update';
|
|
17
17
|
overrideAccess: boolean;
|
|
18
|
+
parentPath: (number | string)[];
|
|
19
|
+
parentSchemaPath: string[];
|
|
18
20
|
req: PayloadRequestWithData;
|
|
19
21
|
siblingData: Record<string, unknown>;
|
|
20
22
|
/**
|
|
@@ -22,6 +24,6 @@ type Args<T> = {
|
|
|
22
24
|
*/
|
|
23
25
|
siblingDoc: Record<string, unknown>;
|
|
24
26
|
};
|
|
25
|
-
export declare const promise: <T>({ id, collection, context, data, doc, field, global, operation, overrideAccess, req, siblingData, siblingDoc, }: Args<T>) => Promise<void>;
|
|
27
|
+
export declare const promise: <T>({ id, collection, context, data, doc, field, global, operation, overrideAccess, parentPath, parentSchemaPath, req, siblingData, siblingDoc, }: Args<T>) => Promise<void>;
|
|
26
28
|
export {};
|
|
27
29
|
//# sourceMappingURL=promise.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeValidate/promise.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../../../../src/fields/hooks/beforeValidate/promise.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAA;AACrF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACrF,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAU9D,KAAK,IAAI,CAAC,CAAC,IAAI;IACb,UAAU,EAAE,yBAAyB,GAAG,IAAI,CAAA;IAC5C,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,CAAC,CAAA;IACP;;OAEG;IACH,GAAG,EAAE,CAAC,CAAA;IACN,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAA;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACpB,SAAS,EAAE,QAAQ,GAAG,QAAQ,CAAA;IAC9B,cAAc,EAAE,OAAO,CAAA;IACvB,UAAU,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAA;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,GAAG,EAAE,sBAAsB,CAAA;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC,CAAA;AASD,eAAO,MAAM,OAAO,qJAejB,KAAK,CAAC,CAAC,KAAG,QAAQ,IAAI,CA8bxB,CAAA"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/* eslint-disable no-param-reassign */ import {
|
|
1
|
+
/* eslint-disable no-param-reassign */ import { MissingEditorProp } from '../../../errors/index.js';
|
|
2
|
+
import { fieldAffectsData, tabHasName, valueIsValueWithRelation } from '../../config/types.js';
|
|
2
3
|
import getValueWithDefault from '../../getDefaultValue.js';
|
|
4
|
+
import { getFieldPaths } from '../../getFieldPaths.js';
|
|
3
5
|
import { cloneDataFromOriginalDoc } from '../beforeChange/cloneDataFromOriginalDoc.js';
|
|
4
6
|
import { getExistingRowDoc } from '../beforeChange/getExistingRowDoc.js';
|
|
5
7
|
import { traverseFields } from './traverseFields.js';
|
|
@@ -9,7 +11,12 @@ import { traverseFields } from './traverseFields.js';
|
|
|
9
11
|
// - Execute field access control
|
|
10
12
|
// - Merge original document data into incoming data
|
|
11
13
|
// - Compute default values for undefined fields
|
|
12
|
-
export const promise = async ({ id, collection, context, data, doc, field, global, operation, overrideAccess, req, siblingData, siblingDoc })=>{
|
|
14
|
+
export const promise = async ({ id, collection, context, data, doc, field, global, operation, overrideAccess, parentPath, parentSchemaPath, req, siblingData, siblingDoc })=>{
|
|
15
|
+
const { path: fieldPath, schemaPath: fieldSchemaPath } = getFieldPaths({
|
|
16
|
+
field,
|
|
17
|
+
parentPath,
|
|
18
|
+
parentSchemaPath
|
|
19
|
+
});
|
|
13
20
|
if (fieldAffectsData(field)) {
|
|
14
21
|
if (field.name === 'id') {
|
|
15
22
|
if (field.type === 'number' && typeof siblingData[field.name] === 'string') {
|
|
@@ -146,8 +153,11 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
146
153
|
operation,
|
|
147
154
|
originalDoc: doc,
|
|
148
155
|
overrideAccess,
|
|
156
|
+
path: fieldPath,
|
|
149
157
|
previousSiblingDoc: siblingDoc,
|
|
158
|
+
previousValue: siblingData[field.name],
|
|
150
159
|
req,
|
|
160
|
+
schemaPath: fieldSchemaPath,
|
|
151
161
|
siblingData,
|
|
152
162
|
value: siblingData[field.name]
|
|
153
163
|
});
|
|
@@ -202,7 +212,9 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
202
212
|
global,
|
|
203
213
|
operation,
|
|
204
214
|
overrideAccess,
|
|
215
|
+
path: fieldPath,
|
|
205
216
|
req,
|
|
217
|
+
schemaPath: fieldSchemaPath,
|
|
206
218
|
siblingData: groupData,
|
|
207
219
|
siblingDoc: groupDoc
|
|
208
220
|
});
|
|
@@ -213,7 +225,7 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
213
225
|
const rows = siblingData[field.name];
|
|
214
226
|
if (Array.isArray(rows)) {
|
|
215
227
|
const promises = [];
|
|
216
|
-
rows.forEach((row)=>{
|
|
228
|
+
rows.forEach((row, i)=>{
|
|
217
229
|
promises.push(traverseFields({
|
|
218
230
|
id,
|
|
219
231
|
collection,
|
|
@@ -224,7 +236,12 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
224
236
|
global,
|
|
225
237
|
operation,
|
|
226
238
|
overrideAccess,
|
|
239
|
+
path: [
|
|
240
|
+
...fieldPath,
|
|
241
|
+
i
|
|
242
|
+
],
|
|
227
243
|
req,
|
|
244
|
+
schemaPath: fieldSchemaPath,
|
|
228
245
|
siblingData: row,
|
|
229
246
|
siblingDoc: getExistingRowDoc(row, siblingDoc[field.name])
|
|
230
247
|
}));
|
|
@@ -238,7 +255,7 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
238
255
|
const rows = siblingData[field.name];
|
|
239
256
|
if (Array.isArray(rows)) {
|
|
240
257
|
const promises = [];
|
|
241
|
-
rows.forEach((row)=>{
|
|
258
|
+
rows.forEach((row, i)=>{
|
|
242
259
|
const rowSiblingDoc = getExistingRowDoc(row, siblingDoc[field.name]);
|
|
243
260
|
const blockTypeToMatch = row.blockType || rowSiblingDoc.blockType;
|
|
244
261
|
const block = field.blocks.find((blockType)=>blockType.slug === blockTypeToMatch);
|
|
@@ -254,7 +271,12 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
254
271
|
global,
|
|
255
272
|
operation,
|
|
256
273
|
overrideAccess,
|
|
274
|
+
path: [
|
|
275
|
+
...fieldPath,
|
|
276
|
+
i
|
|
277
|
+
],
|
|
257
278
|
req,
|
|
279
|
+
schemaPath: fieldSchemaPath,
|
|
258
280
|
siblingData: row,
|
|
259
281
|
siblingDoc: rowSiblingDoc
|
|
260
282
|
}));
|
|
@@ -277,7 +299,9 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
277
299
|
global,
|
|
278
300
|
operation,
|
|
279
301
|
overrideAccess,
|
|
302
|
+
path: fieldPath,
|
|
280
303
|
req,
|
|
304
|
+
schemaPath: fieldSchemaPath,
|
|
281
305
|
siblingData,
|
|
282
306
|
siblingDoc
|
|
283
307
|
});
|
|
@@ -306,7 +330,9 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
306
330
|
global,
|
|
307
331
|
operation,
|
|
308
332
|
overrideAccess,
|
|
333
|
+
path: fieldPath,
|
|
309
334
|
req,
|
|
335
|
+
schemaPath: fieldSchemaPath,
|
|
310
336
|
siblingData: tabSiblingData,
|
|
311
337
|
siblingDoc: tabSiblingDoc
|
|
312
338
|
});
|
|
@@ -327,12 +353,51 @@ export const promise = async ({ id, collection, context, data, doc, field, globa
|
|
|
327
353
|
global,
|
|
328
354
|
operation,
|
|
329
355
|
overrideAccess,
|
|
356
|
+
path: fieldPath,
|
|
330
357
|
req,
|
|
358
|
+
schemaPath: fieldSchemaPath,
|
|
331
359
|
siblingData,
|
|
332
360
|
siblingDoc
|
|
333
361
|
});
|
|
334
362
|
break;
|
|
335
363
|
}
|
|
364
|
+
case 'richText':
|
|
365
|
+
{
|
|
366
|
+
if (!field?.editor) {
|
|
367
|
+
throw new MissingEditorProp(field) // while we allow disabling editor functionality, you should not have any richText fields defined if you do not have an editor
|
|
368
|
+
;
|
|
369
|
+
}
|
|
370
|
+
if (typeof field?.editor === 'function') {
|
|
371
|
+
throw new Error('Attempted to access unsanitized rich text editor.');
|
|
372
|
+
}
|
|
373
|
+
const editor = field?.editor;
|
|
374
|
+
if (editor?.hooks?.beforeValidate?.length) {
|
|
375
|
+
await editor.hooks.beforeValidate.reduce(async (priorHook, currentHook)=>{
|
|
376
|
+
await priorHook;
|
|
377
|
+
const hookedValue = await currentHook({
|
|
378
|
+
collection,
|
|
379
|
+
context,
|
|
380
|
+
data,
|
|
381
|
+
field,
|
|
382
|
+
global,
|
|
383
|
+
operation,
|
|
384
|
+
originalDoc: doc,
|
|
385
|
+
overrideAccess,
|
|
386
|
+
path: fieldPath,
|
|
387
|
+
previousSiblingDoc: siblingDoc,
|
|
388
|
+
previousValue: siblingData[field.name],
|
|
389
|
+
req,
|
|
390
|
+
schemaPath: fieldSchemaPath,
|
|
391
|
+
siblingData,
|
|
392
|
+
value: siblingData[field.name]
|
|
393
|
+
});
|
|
394
|
+
if (hookedValue !== undefined) {
|
|
395
|
+
siblingData[field.name] = hookedValue;
|
|
396
|
+
}
|
|
397
|
+
}, Promise.resolve());
|
|
398
|
+
}
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
336
401
|
default:
|
|
337
402
|
{
|
|
338
403
|
break;
|