@payloadcms/plugin-import-export 3.75.0 → 3.76.0-canary.0
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/components/ExportPreview/index.d.ts.map +1 -1
- package/dist/components/ExportPreview/index.js +30 -12
- package/dist/components/ExportPreview/index.js.map +1 -1
- package/dist/components/ExportPreview/index.scss +12 -0
- package/dist/components/ImportPreview/index.js +3 -15
- package/dist/components/ImportPreview/index.js.map +1 -1
- package/dist/export/createExport.d.ts +5 -0
- package/dist/export/createExport.d.ts.map +1 -1
- package/dist/export/createExport.js +36 -12
- package/dist/export/createExport.js.map +1 -1
- package/dist/export/getCreateExportCollectionTask.d.ts.map +1 -1
- package/dist/export/getCreateExportCollectionTask.js +3 -0
- package/dist/export/getCreateExportCollectionTask.js.map +1 -1
- package/dist/export/getExportCollection.d.ts.map +1 -1
- package/dist/export/getExportCollection.js +21 -1
- package/dist/export/getExportCollection.js.map +1 -1
- package/dist/export/getFields.d.ts.map +1 -1
- package/dist/export/getFields.js +7 -3
- package/dist/export/getFields.js.map +1 -1
- package/dist/export/handleDownload.d.ts.map +1 -1
- package/dist/export/handleDownload.js +18 -1
- package/dist/export/handleDownload.js.map +1 -1
- package/dist/export/handlePreview.d.ts.map +1 -1
- package/dist/export/handlePreview.js +32 -10
- package/dist/export/handlePreview.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/import/batchProcessor.js +50 -53
- package/dist/import/batchProcessor.js.map +1 -1
- package/dist/import/createImport.d.ts +6 -1
- package/dist/import/createImport.d.ts.map +1 -1
- package/dist/import/createImport.js +5 -1
- package/dist/import/createImport.js.map +1 -1
- package/dist/import/getCreateImportCollectionTask.d.ts.map +1 -1
- package/dist/import/getCreateImportCollectionTask.js +3 -0
- package/dist/import/getCreateImportCollectionTask.js.map +1 -1
- package/dist/import/getImportCollection.d.ts.map +1 -1
- package/dist/import/getImportCollection.js +15 -0
- package/dist/import/getImportCollection.js.map +1 -1
- package/dist/import/handlePreview.d.ts.map +1 -1
- package/dist/import/handlePreview.js +11 -0
- package/dist/import/handlePreview.js.map +1 -1
- package/dist/index.d.ts +22 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/dist/translations/languages/ar.d.ts.map +1 -1
- package/dist/translations/languages/ar.js +3 -0
- package/dist/translations/languages/ar.js.map +1 -1
- package/dist/translations/languages/az.d.ts.map +1 -1
- package/dist/translations/languages/az.js +3 -0
- package/dist/translations/languages/az.js.map +1 -1
- package/dist/translations/languages/bg.d.ts.map +1 -1
- package/dist/translations/languages/bg.js +3 -0
- package/dist/translations/languages/bg.js.map +1 -1
- package/dist/translations/languages/bnBd.d.ts.map +1 -1
- package/dist/translations/languages/bnBd.js +22 -19
- package/dist/translations/languages/bnBd.js.map +1 -1
- package/dist/translations/languages/bnIn.d.ts.map +1 -1
- package/dist/translations/languages/bnIn.js +22 -19
- package/dist/translations/languages/bnIn.js.map +1 -1
- package/dist/translations/languages/ca.d.ts.map +1 -1
- package/dist/translations/languages/ca.js +3 -0
- package/dist/translations/languages/ca.js.map +1 -1
- package/dist/translations/languages/cs.d.ts.map +1 -1
- package/dist/translations/languages/cs.js +3 -0
- package/dist/translations/languages/cs.js.map +1 -1
- package/dist/translations/languages/da.d.ts.map +1 -1
- package/dist/translations/languages/da.js +3 -0
- package/dist/translations/languages/da.js.map +1 -1
- package/dist/translations/languages/de.d.ts.map +1 -1
- package/dist/translations/languages/de.js +3 -0
- package/dist/translations/languages/de.js.map +1 -1
- package/dist/translations/languages/en.d.ts +3 -0
- package/dist/translations/languages/en.d.ts.map +1 -1
- package/dist/translations/languages/en.js +3 -0
- package/dist/translations/languages/en.js.map +1 -1
- package/dist/translations/languages/es.d.ts.map +1 -1
- package/dist/translations/languages/es.js +3 -0
- package/dist/translations/languages/es.js.map +1 -1
- package/dist/translations/languages/et.d.ts.map +1 -1
- package/dist/translations/languages/et.js +3 -0
- package/dist/translations/languages/et.js.map +1 -1
- package/dist/translations/languages/fa.d.ts.map +1 -1
- package/dist/translations/languages/fa.js +3 -0
- package/dist/translations/languages/fa.js.map +1 -1
- package/dist/translations/languages/fr.d.ts.map +1 -1
- package/dist/translations/languages/fr.js +3 -0
- package/dist/translations/languages/fr.js.map +1 -1
- package/dist/translations/languages/he.d.ts.map +1 -1
- package/dist/translations/languages/he.js +3 -0
- package/dist/translations/languages/he.js.map +1 -1
- package/dist/translations/languages/hr.d.ts.map +1 -1
- package/dist/translations/languages/hr.js +3 -0
- package/dist/translations/languages/hr.js.map +1 -1
- package/dist/translations/languages/hu.d.ts.map +1 -1
- package/dist/translations/languages/hu.js +3 -0
- package/dist/translations/languages/hu.js.map +1 -1
- package/dist/translations/languages/hy.d.ts.map +1 -1
- package/dist/translations/languages/hy.js +3 -0
- package/dist/translations/languages/hy.js.map +1 -1
- package/dist/translations/languages/id.d.ts.map +1 -1
- package/dist/translations/languages/id.js +13 -10
- package/dist/translations/languages/id.js.map +1 -1
- package/dist/translations/languages/is.d.ts.map +1 -1
- package/dist/translations/languages/is.js +3 -0
- package/dist/translations/languages/is.js.map +1 -1
- package/dist/translations/languages/it.d.ts.map +1 -1
- package/dist/translations/languages/it.js +3 -0
- package/dist/translations/languages/it.js.map +1 -1
- package/dist/translations/languages/ja.d.ts.map +1 -1
- package/dist/translations/languages/ja.js +3 -0
- package/dist/translations/languages/ja.js.map +1 -1
- package/dist/translations/languages/ko.d.ts.map +1 -1
- package/dist/translations/languages/ko.js +3 -0
- package/dist/translations/languages/ko.js.map +1 -1
- package/dist/translations/languages/lt.d.ts.map +1 -1
- package/dist/translations/languages/lt.js +3 -0
- package/dist/translations/languages/lt.js.map +1 -1
- package/dist/translations/languages/lv.d.ts.map +1 -1
- package/dist/translations/languages/lv.js +16 -13
- package/dist/translations/languages/lv.js.map +1 -1
- package/dist/translations/languages/my.d.ts.map +1 -1
- package/dist/translations/languages/my.js +3 -0
- package/dist/translations/languages/my.js.map +1 -1
- package/dist/translations/languages/nb.d.ts.map +1 -1
- package/dist/translations/languages/nb.js +3 -0
- package/dist/translations/languages/nb.js.map +1 -1
- package/dist/translations/languages/nl.d.ts.map +1 -1
- package/dist/translations/languages/nl.js +3 -0
- package/dist/translations/languages/nl.js.map +1 -1
- package/dist/translations/languages/pl.d.ts.map +1 -1
- package/dist/translations/languages/pl.js +3 -0
- package/dist/translations/languages/pl.js.map +1 -1
- package/dist/translations/languages/pt.d.ts.map +1 -1
- package/dist/translations/languages/pt.js +3 -0
- package/dist/translations/languages/pt.js.map +1 -1
- package/dist/translations/languages/ro.d.ts.map +1 -1
- package/dist/translations/languages/ro.js +3 -0
- package/dist/translations/languages/ro.js.map +1 -1
- package/dist/translations/languages/rs.d.ts.map +1 -1
- package/dist/translations/languages/rs.js +3 -0
- package/dist/translations/languages/rs.js.map +1 -1
- package/dist/translations/languages/rsLatin.d.ts.map +1 -1
- package/dist/translations/languages/rsLatin.js +3 -0
- package/dist/translations/languages/rsLatin.js.map +1 -1
- package/dist/translations/languages/ru.d.ts.map +1 -1
- package/dist/translations/languages/ru.js +3 -0
- package/dist/translations/languages/ru.js.map +1 -1
- package/dist/translations/languages/sk.d.ts.map +1 -1
- package/dist/translations/languages/sk.js +3 -0
- package/dist/translations/languages/sk.js.map +1 -1
- package/dist/translations/languages/sl.d.ts.map +1 -1
- package/dist/translations/languages/sl.js +3 -0
- package/dist/translations/languages/sl.js.map +1 -1
- package/dist/translations/languages/sv.d.ts.map +1 -1
- package/dist/translations/languages/sv.js +3 -0
- package/dist/translations/languages/sv.js.map +1 -1
- package/dist/translations/languages/ta.d.ts.map +1 -1
- package/dist/translations/languages/ta.js +3 -0
- package/dist/translations/languages/ta.js.map +1 -1
- package/dist/translations/languages/th.d.ts.map +1 -1
- package/dist/translations/languages/th.js +3 -0
- package/dist/translations/languages/th.js.map +1 -1
- package/dist/translations/languages/tr.d.ts.map +1 -1
- package/dist/translations/languages/tr.js +3 -0
- package/dist/translations/languages/tr.js.map +1 -1
- package/dist/translations/languages/uk.d.ts.map +1 -1
- package/dist/translations/languages/uk.js +3 -0
- package/dist/translations/languages/uk.js.map +1 -1
- package/dist/translations/languages/vi.d.ts.map +1 -1
- package/dist/translations/languages/vi.js +3 -0
- package/dist/translations/languages/vi.js.map +1 -1
- package/dist/translations/languages/zh.d.ts.map +1 -1
- package/dist/translations/languages/zh.js +3 -0
- package/dist/translations/languages/zh.js.map +1 -1
- package/dist/translations/languages/zhTw.d.ts.map +1 -1
- package/dist/translations/languages/zhTw.js +3 -0
- package/dist/translations/languages/zhTw.js.map +1 -1
- package/dist/types.d.ts +44 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.d.ts +11 -2
- package/dist/utilities/buildDisabledFieldRegex.d.ts.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.js +33 -7
- package/dist/utilities/buildDisabledFieldRegex.js.map +1 -1
- package/dist/utilities/buildDisabledFieldRegex.spec.js +64 -0
- package/dist/utilities/buildDisabledFieldRegex.spec.js.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.d.ts +24 -0
- package/dist/utilities/collectTimezoneCompanionFields.d.ts.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.js +89 -0
- package/dist/utilities/collectTimezoneCompanionFields.js.map +1 -0
- package/dist/utilities/collectTimezoneCompanionFields.spec.js +319 -0
- package/dist/utilities/collectTimezoneCompanionFields.spec.js.map +1 -0
- package/dist/utilities/fieldToRegex.d.ts +14 -0
- package/dist/utilities/fieldToRegex.d.ts.map +1 -0
- package/dist/utilities/fieldToRegex.js +34 -0
- package/dist/utilities/fieldToRegex.js.map +1 -0
- package/dist/utilities/fieldToRegex.spec.js +151 -0
- package/dist/utilities/fieldToRegex.spec.js.map +1 -0
- package/dist/utilities/flattenObject.d.ts +7 -1
- package/dist/utilities/flattenObject.d.ts.map +1 -1
- package/dist/utilities/flattenObject.js +30 -18
- package/dist/utilities/flattenObject.js.map +1 -1
- package/dist/utilities/getExportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getExportFieldFunctions.js +7 -0
- package/dist/utilities/getExportFieldFunctions.js.map +1 -1
- package/dist/utilities/getImportFieldFunctions.d.ts.map +1 -1
- package/dist/utilities/getImportFieldFunctions.js +2 -16
- package/dist/utilities/getImportFieldFunctions.js.map +1 -1
- package/dist/utilities/getPluginCollections.d.ts +1 -0
- package/dist/utilities/getPluginCollections.d.ts.map +1 -1
- package/dist/utilities/getPluginCollections.js +43 -10
- package/dist/utilities/getPluginCollections.js.map +1 -1
- package/dist/utilities/getSchemaColumns.d.ts +8 -2
- package/dist/utilities/getSchemaColumns.d.ts.map +1 -1
- package/dist/utilities/getSchemaColumns.js +61 -27
- package/dist/utilities/getSchemaColumns.js.map +1 -1
- package/dist/utilities/parseCSV.d.ts.map +1 -1
- package/dist/utilities/parseCSV.js +4 -10
- package/dist/utilities/parseCSV.js.map +1 -1
- package/dist/utilities/resolveLimit.d.ts +15 -0
- package/dist/utilities/resolveLimit.d.ts.map +1 -0
- package/dist/utilities/resolveLimit.js +21 -0
- package/dist/utilities/resolveLimit.js.map +1 -0
- package/dist/utilities/unflattenObject.d.ts +13 -0
- package/dist/utilities/unflattenObject.d.ts.map +1 -1
- package/dist/utilities/unflattenObject.js +64 -65
- package/dist/utilities/unflattenObject.js.map +1 -1
- package/package.json +8 -8
- package/dist/utilities/getvalueAtPath.d.ts +0 -15
- package/dist/utilities/getvalueAtPath.d.ts.map +0 -1
- package/dist/utilities/getvalueAtPath.js +0 -49
- package/dist/utilities/getvalueAtPath.js.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collects the names of auto-generated timezone companion fields from the schema.
|
|
3
|
+
*
|
|
4
|
+
* When a date field has `timezone: true`, Payload automatically generates a companion
|
|
5
|
+
* select field and inserts it immediately after the date field in the fields array.
|
|
6
|
+
* This function identifies those auto-generated fields by looking at the field sequence
|
|
7
|
+
* rather than assuming a specific naming convention (since the name can be overridden).
|
|
8
|
+
*
|
|
9
|
+
* This is used to filter out timezone companions unless explicitly selected,
|
|
10
|
+
* without incorrectly filtering user-defined fields that happen to end with `_tz`.
|
|
11
|
+
*/ export const collectTimezoneCompanionFields = (fields, prefix = '')=>{
|
|
12
|
+
const result = new Set();
|
|
13
|
+
for(let i = 0; i < fields.length; i++){
|
|
14
|
+
const field = fields[i];
|
|
15
|
+
if (!field) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined;
|
|
19
|
+
const fullKey = name && prefix ? `${prefix}_${name}` : name ?? prefix;
|
|
20
|
+
switch(field.type){
|
|
21
|
+
case 'array':
|
|
22
|
+
{
|
|
23
|
+
// Recurse into array fields - companion fields inside arrays get the array prefix
|
|
24
|
+
const subFields = collectTimezoneCompanionFields(field.fields, fullKey);
|
|
25
|
+
for (const subField of subFields){
|
|
26
|
+
result.add(subField);
|
|
27
|
+
}
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case 'blocks':
|
|
31
|
+
{
|
|
32
|
+
// Recurse into each block type
|
|
33
|
+
for (const block of field.blocks){
|
|
34
|
+
if (typeof block === 'string') {
|
|
35
|
+
continue; // Skip block references
|
|
36
|
+
}
|
|
37
|
+
const blockPrefix = `${fullKey}_${block.slug}`;
|
|
38
|
+
const blockFields = collectTimezoneCompanionFields(block.flattenedFields ?? block.fields, blockPrefix);
|
|
39
|
+
for (const blockField of blockFields){
|
|
40
|
+
result.add(blockField);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case 'collapsible':
|
|
46
|
+
case 'group':
|
|
47
|
+
case 'row':
|
|
48
|
+
{
|
|
49
|
+
const subFields = collectTimezoneCompanionFields(field.fields, fullKey);
|
|
50
|
+
for (const subField of subFields){
|
|
51
|
+
result.add(subField);
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case 'date':
|
|
56
|
+
{
|
|
57
|
+
// If this date field has timezone enabled, the next field should be the companion
|
|
58
|
+
// (Payload splices it in right after the date field during sanitization)
|
|
59
|
+
if ('timezone' in field && field.timezone) {
|
|
60
|
+
const nextField = fields[i + 1];
|
|
61
|
+
if (nextField && 'name' in nextField && nextField.type === 'select') {
|
|
62
|
+
const companionName = prefix ? `${prefix}_${nextField.name}` : nextField.name;
|
|
63
|
+
result.add(companionName);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case 'tabs':
|
|
69
|
+
{
|
|
70
|
+
for (const tab of field.tabs ?? []){
|
|
71
|
+
let tabPrefix;
|
|
72
|
+
if (tab.name) {
|
|
73
|
+
tabPrefix = fullKey ? `${fullKey}_${tab.name}` : tab.name;
|
|
74
|
+
} else {
|
|
75
|
+
tabPrefix = fullKey;
|
|
76
|
+
}
|
|
77
|
+
const tabFields = collectTimezoneCompanionFields(tab.fields || [], tabPrefix);
|
|
78
|
+
for (const tabField of tabFields){
|
|
79
|
+
result.add(tabField);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return result;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
//# sourceMappingURL=collectTimezoneCompanionFields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/collectTimezoneCompanionFields.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\ntype FieldWithPresentational =\n | {\n fields?: FlattenedField[]\n name?: string\n tabs?: {\n fields: FlattenedField[]\n name?: string\n }[]\n type: 'collapsible' | 'row' | 'tabs'\n }\n | FlattenedField\n\n/**\n * Collects the names of auto-generated timezone companion fields from the schema.\n *\n * When a date field has `timezone: true`, Payload automatically generates a companion\n * select field and inserts it immediately after the date field in the fields array.\n * This function identifies those auto-generated fields by looking at the field sequence\n * rather than assuming a specific naming convention (since the name can be overridden).\n *\n * This is used to filter out timezone companions unless explicitly selected,\n * without incorrectly filtering user-defined fields that happen to end with `_tz`.\n */\nexport const collectTimezoneCompanionFields = (\n fields: FieldWithPresentational[],\n prefix = '',\n): Set<string> => {\n const result = new Set<string>()\n\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n\n if (!field) {\n continue\n }\n\n const name = 'name' in field && typeof field.name === 'string' ? field.name : undefined\n const fullKey = name && prefix ? `${prefix}_${name}` : (name ?? prefix)\n\n switch (field.type) {\n case 'array': {\n // Recurse into array fields - companion fields inside arrays get the array prefix\n const subFields = collectTimezoneCompanionFields(field.fields as FlattenedField[], fullKey)\n for (const subField of subFields) {\n result.add(subField)\n }\n break\n }\n\n case 'blocks': {\n // Recurse into each block type\n for (const block of field.blocks) {\n if (typeof block === 'string') {\n continue // Skip block references\n }\n const blockPrefix = `${fullKey}_${block.slug}`\n const blockFields = collectTimezoneCompanionFields(\n block.flattenedFields ?? block.fields,\n blockPrefix,\n )\n for (const blockField of blockFields) {\n result.add(blockField)\n }\n }\n break\n }\n\n case 'collapsible':\n case 'group':\n case 'row': {\n const subFields = collectTimezoneCompanionFields(field.fields as FlattenedField[], fullKey)\n for (const subField of subFields) {\n result.add(subField)\n }\n break\n }\n\n case 'date': {\n // If this date field has timezone enabled, the next field should be the companion\n // (Payload splices it in right after the date field during sanitization)\n if ('timezone' in field && field.timezone) {\n const nextField = fields[i + 1]\n if (nextField && 'name' in nextField && nextField.type === 'select') {\n const companionName = prefix ? `${prefix}_${nextField.name}` : nextField.name\n result.add(companionName)\n }\n }\n break\n }\n\n case 'tabs': {\n for (const tab of field.tabs ?? []) {\n let tabPrefix: string\n if (tab.name) {\n tabPrefix = fullKey ? `${fullKey}_${tab.name}` : tab.name\n } else {\n tabPrefix = fullKey\n }\n const tabFields = collectTimezoneCompanionFields(tab.fields || [], tabPrefix)\n for (const tabField of tabFields) {\n result.add(tabField)\n }\n }\n break\n }\n }\n }\n\n return result\n}\n"],"names":["collectTimezoneCompanionFields","fields","prefix","result","Set","i","length","field","name","undefined","fullKey","type","subFields","subField","add","block","blocks","blockPrefix","slug","blockFields","flattenedFields","blockField","timezone","nextField","companionName","tab","tabs","tabPrefix","tabFields","tabField"],"mappings":"AAcA;;;;;;;;;;CAUC,GACD,OAAO,MAAMA,iCAAiC,CAC5CC,QACAC,SAAS,EAAE;IAEX,MAAMC,SAAS,IAAIC;IAEnB,IAAK,IAAIC,IAAI,GAAGA,IAAIJ,OAAOK,MAAM,EAAED,IAAK;QACtC,MAAME,QAAQN,MAAM,CAACI,EAAE;QAEvB,IAAI,CAACE,OAAO;YACV;QACF;QAEA,MAAMC,OAAO,UAAUD,SAAS,OAAOA,MAAMC,IAAI,KAAK,WAAWD,MAAMC,IAAI,GAAGC;QAC9E,MAAMC,UAAUF,QAAQN,SAAS,GAAGA,OAAO,CAAC,EAAEM,MAAM,GAAIA,QAAQN;QAEhE,OAAQK,MAAMI,IAAI;YAChB,KAAK;gBAAS;oBACZ,kFAAkF;oBAClF,MAAMC,YAAYZ,+BAA+BO,MAAMN,MAAM,EAAsBS;oBACnF,KAAK,MAAMG,YAAYD,UAAW;wBAChCT,OAAOW,GAAG,CAACD;oBACb;oBACA;gBACF;YAEA,KAAK;gBAAU;oBACb,+BAA+B;oBAC/B,KAAK,MAAME,SAASR,MAAMS,MAAM,CAAE;wBAChC,IAAI,OAAOD,UAAU,UAAU;4BAC7B,UAAS,wBAAwB;wBACnC;wBACA,MAAME,cAAc,GAAGP,QAAQ,CAAC,EAAEK,MAAMG,IAAI,EAAE;wBAC9C,MAAMC,cAAcnB,+BAClBe,MAAMK,eAAe,IAAIL,MAAMd,MAAM,EACrCgB;wBAEF,KAAK,MAAMI,cAAcF,YAAa;4BACpChB,OAAOW,GAAG,CAACO;wBACb;oBACF;oBACA;gBACF;YAEA,KAAK;YACL,KAAK;YACL,KAAK;gBAAO;oBACV,MAAMT,YAAYZ,+BAA+BO,MAAMN,MAAM,EAAsBS;oBACnF,KAAK,MAAMG,YAAYD,UAAW;wBAChCT,OAAOW,GAAG,CAACD;oBACb;oBACA;gBACF;YAEA,KAAK;gBAAQ;oBACX,kFAAkF;oBAClF,yEAAyE;oBACzE,IAAI,cAAcN,SAASA,MAAMe,QAAQ,EAAE;wBACzC,MAAMC,YAAYtB,MAAM,CAACI,IAAI,EAAE;wBAC/B,IAAIkB,aAAa,UAAUA,aAAaA,UAAUZ,IAAI,KAAK,UAAU;4BACnE,MAAMa,gBAAgBtB,SAAS,GAAGA,OAAO,CAAC,EAAEqB,UAAUf,IAAI,EAAE,GAAGe,UAAUf,IAAI;4BAC7EL,OAAOW,GAAG,CAACU;wBACb;oBACF;oBACA;gBACF;YAEA,KAAK;gBAAQ;oBACX,KAAK,MAAMC,OAAOlB,MAAMmB,IAAI,IAAI,EAAE,CAAE;wBAClC,IAAIC;wBACJ,IAAIF,IAAIjB,IAAI,EAAE;4BACZmB,YAAYjB,UAAU,GAAGA,QAAQ,CAAC,EAAEe,IAAIjB,IAAI,EAAE,GAAGiB,IAAIjB,IAAI;wBAC3D,OAAO;4BACLmB,YAAYjB;wBACd;wBACA,MAAMkB,YAAY5B,+BAA+ByB,IAAIxB,MAAM,IAAI,EAAE,EAAE0B;wBACnE,KAAK,MAAME,YAAYD,UAAW;4BAChCzB,OAAOW,GAAG,CAACe;wBACb;oBACF;oBACA;gBACF;QACF;IACF;IAEA,OAAO1B;AACT,EAAC"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { collectTimezoneCompanionFields } from './collectTimezoneCompanionFields.js';
|
|
3
|
+
describe('collectTimezoneCompanionFields', ()=>{
|
|
4
|
+
it('should return empty set for fields without date timezone', ()=>{
|
|
5
|
+
const fields = [
|
|
6
|
+
{
|
|
7
|
+
name: 'title',
|
|
8
|
+
type: 'text'
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: 'description',
|
|
12
|
+
type: 'textarea'
|
|
13
|
+
}
|
|
14
|
+
];
|
|
15
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
16
|
+
expect(result.size).toBe(0);
|
|
17
|
+
});
|
|
18
|
+
it('should return empty set for date fields without timezone enabled', ()=>{
|
|
19
|
+
const fields = [
|
|
20
|
+
{
|
|
21
|
+
name: 'publishedAt',
|
|
22
|
+
type: 'date'
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'createdAt',
|
|
26
|
+
type: 'date'
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
30
|
+
expect(result.size).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
it('should collect timezone companion from the next select field after date with timezone', ()=>{
|
|
33
|
+
// Simulates sanitized fields where Payload inserts the companion right after the date
|
|
34
|
+
const fields = [
|
|
35
|
+
{
|
|
36
|
+
name: 'publishedAt',
|
|
37
|
+
type: 'date',
|
|
38
|
+
timezone: true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: 'publishedAt_tz',
|
|
42
|
+
type: 'select',
|
|
43
|
+
options: []
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
47
|
+
expect(result.size).toBe(1);
|
|
48
|
+
expect(result.has('publishedAt_tz')).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('should handle overridden timezone field names', ()=>{
|
|
51
|
+
// User overrode the timezone field name via timezone.override
|
|
52
|
+
const fields = [
|
|
53
|
+
{
|
|
54
|
+
name: 'publishedAt',
|
|
55
|
+
type: 'date',
|
|
56
|
+
timezone: true
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'pub_timezone',
|
|
60
|
+
type: 'select',
|
|
61
|
+
options: []
|
|
62
|
+
}
|
|
63
|
+
];
|
|
64
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
65
|
+
expect(result.size).toBe(1);
|
|
66
|
+
expect(result.has('pub_timezone')).toBe(true);
|
|
67
|
+
expect(result.has('publishedAt_tz')).toBe(false);
|
|
68
|
+
});
|
|
69
|
+
it('should collect multiple timezone companions', ()=>{
|
|
70
|
+
const fields = [
|
|
71
|
+
{
|
|
72
|
+
name: 'publishedAt',
|
|
73
|
+
type: 'date',
|
|
74
|
+
timezone: true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'publishedAt_tz',
|
|
78
|
+
type: 'select',
|
|
79
|
+
options: []
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: 'title',
|
|
83
|
+
type: 'text'
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'scheduledAt',
|
|
87
|
+
type: 'date',
|
|
88
|
+
timezone: true
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'scheduledAt_tz',
|
|
92
|
+
type: 'select',
|
|
93
|
+
options: []
|
|
94
|
+
}
|
|
95
|
+
];
|
|
96
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
97
|
+
expect(result.size).toBe(2);
|
|
98
|
+
expect(result.has('publishedAt_tz')).toBe(true);
|
|
99
|
+
expect(result.has('scheduledAt_tz')).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it('should handle date fields in groups', ()=>{
|
|
102
|
+
const fields = [
|
|
103
|
+
{
|
|
104
|
+
name: 'meta',
|
|
105
|
+
type: 'group',
|
|
106
|
+
fields: [
|
|
107
|
+
{
|
|
108
|
+
name: 'publishedAt',
|
|
109
|
+
type: 'date',
|
|
110
|
+
timezone: true
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: 'publishedAt_tz',
|
|
114
|
+
type: 'select',
|
|
115
|
+
options: []
|
|
116
|
+
}
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
];
|
|
120
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
121
|
+
expect(result.size).toBe(1);
|
|
122
|
+
expect(result.has('meta_publishedAt_tz')).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('should handle date fields in arrays', ()=>{
|
|
125
|
+
const fields = [
|
|
126
|
+
{
|
|
127
|
+
name: 'events',
|
|
128
|
+
type: 'array',
|
|
129
|
+
fields: [
|
|
130
|
+
{
|
|
131
|
+
name: 'startTime',
|
|
132
|
+
type: 'date',
|
|
133
|
+
timezone: true
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: 'startTime_tz',
|
|
137
|
+
type: 'select',
|
|
138
|
+
options: []
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
}
|
|
142
|
+
];
|
|
143
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
144
|
+
expect(result.size).toBe(1);
|
|
145
|
+
expect(result.has('events_startTime_tz')).toBe(true);
|
|
146
|
+
});
|
|
147
|
+
it('should handle date fields in blocks', ()=>{
|
|
148
|
+
const fields = [
|
|
149
|
+
{
|
|
150
|
+
name: 'layout',
|
|
151
|
+
type: 'blocks',
|
|
152
|
+
blocks: [
|
|
153
|
+
{
|
|
154
|
+
slug: 'event',
|
|
155
|
+
fields: [
|
|
156
|
+
{
|
|
157
|
+
name: 'eventDate',
|
|
158
|
+
type: 'date',
|
|
159
|
+
timezone: true
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
name: 'eventDate_tz',
|
|
163
|
+
type: 'select',
|
|
164
|
+
options: []
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
];
|
|
171
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
172
|
+
expect(result.size).toBe(1);
|
|
173
|
+
expect(result.has('layout_event_eventDate_tz')).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
it('should handle deeply nested date fields', ()=>{
|
|
176
|
+
const fields = [
|
|
177
|
+
{
|
|
178
|
+
name: 'content',
|
|
179
|
+
type: 'group',
|
|
180
|
+
fields: [
|
|
181
|
+
{
|
|
182
|
+
name: 'schedule',
|
|
183
|
+
type: 'array',
|
|
184
|
+
fields: [
|
|
185
|
+
{
|
|
186
|
+
name: 'time',
|
|
187
|
+
type: 'date',
|
|
188
|
+
timezone: true
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
name: 'time_tz',
|
|
192
|
+
type: 'select',
|
|
193
|
+
options: []
|
|
194
|
+
}
|
|
195
|
+
]
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
];
|
|
200
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
201
|
+
expect(result.size).toBe(1);
|
|
202
|
+
expect(result.has('content_schedule_time_tz')).toBe(true);
|
|
203
|
+
});
|
|
204
|
+
it('should handle tabs', ()=>{
|
|
205
|
+
const fields = [
|
|
206
|
+
{
|
|
207
|
+
type: 'tabs',
|
|
208
|
+
tabs: [
|
|
209
|
+
{
|
|
210
|
+
name: 'scheduling',
|
|
211
|
+
fields: [
|
|
212
|
+
{
|
|
213
|
+
name: 'publishAt',
|
|
214
|
+
type: 'date',
|
|
215
|
+
timezone: true
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: 'publishAt_tz',
|
|
219
|
+
type: 'select',
|
|
220
|
+
options: []
|
|
221
|
+
}
|
|
222
|
+
]
|
|
223
|
+
}
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
];
|
|
227
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
228
|
+
expect(result.size).toBe(1);
|
|
229
|
+
expect(result.has('scheduling_publishAt_tz')).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it('should handle unnamed tabs (no prefix added)', ()=>{
|
|
232
|
+
const fields = [
|
|
233
|
+
{
|
|
234
|
+
type: 'tabs',
|
|
235
|
+
tabs: [
|
|
236
|
+
{
|
|
237
|
+
fields: [
|
|
238
|
+
{
|
|
239
|
+
name: 'publishAt',
|
|
240
|
+
type: 'date',
|
|
241
|
+
timezone: true
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: 'publishAt_tz',
|
|
245
|
+
type: 'select',
|
|
246
|
+
options: []
|
|
247
|
+
}
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
];
|
|
253
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
254
|
+
expect(result.size).toBe(1);
|
|
255
|
+
expect(result.has('publishAt_tz')).toBe(true);
|
|
256
|
+
});
|
|
257
|
+
it('should not include user-defined fields ending with _tz', ()=>{
|
|
258
|
+
const fields = [
|
|
259
|
+
{
|
|
260
|
+
name: 'my_tz',
|
|
261
|
+
type: 'text'
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
name: 'timezone_tz',
|
|
265
|
+
type: 'select',
|
|
266
|
+
options: []
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
name: 'publishedAt',
|
|
270
|
+
type: 'date',
|
|
271
|
+
timezone: true
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: 'publishedAt_tz',
|
|
275
|
+
type: 'select',
|
|
276
|
+
options: []
|
|
277
|
+
}
|
|
278
|
+
];
|
|
279
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
280
|
+
// Only the auto-generated timezone companion should be included
|
|
281
|
+
expect(result.size).toBe(1);
|
|
282
|
+
expect(result.has('publishedAt_tz')).toBe(true);
|
|
283
|
+
expect(result.has('my_tz')).toBe(false);
|
|
284
|
+
expect(result.has('timezone_tz')).toBe(false);
|
|
285
|
+
});
|
|
286
|
+
it('should not collect companion if next field is not a select', ()=>{
|
|
287
|
+
// Edge case: date with timezone but next field is not a select
|
|
288
|
+
const fields = [
|
|
289
|
+
{
|
|
290
|
+
name: 'publishedAt',
|
|
291
|
+
type: 'date',
|
|
292
|
+
timezone: true
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'title',
|
|
296
|
+
type: 'text'
|
|
297
|
+
}
|
|
298
|
+
];
|
|
299
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
300
|
+
expect(result.size).toBe(0);
|
|
301
|
+
});
|
|
302
|
+
it('should not collect companion if date is last field', ()=>{
|
|
303
|
+
const fields = [
|
|
304
|
+
{
|
|
305
|
+
name: 'title',
|
|
306
|
+
type: 'text'
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
name: 'publishedAt',
|
|
310
|
+
type: 'date',
|
|
311
|
+
timezone: true
|
|
312
|
+
}
|
|
313
|
+
];
|
|
314
|
+
const result = collectTimezoneCompanionFields(fields);
|
|
315
|
+
expect(result.size).toBe(0);
|
|
316
|
+
});
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
//# sourceMappingURL=collectTimezoneCompanionFields.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/collectTimezoneCompanionFields.spec.ts"],"sourcesContent":["import type { FlattenedField } from 'payload'\n\nimport { describe, expect, it } from 'vitest'\n\nimport { collectTimezoneCompanionFields } from './collectTimezoneCompanionFields.js'\n\ndescribe('collectTimezoneCompanionFields', () => {\n it('should return empty set for fields without date timezone', () => {\n const fields: FlattenedField[] = [\n { name: 'title', type: 'text' },\n { name: 'description', type: 'textarea' },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should return empty set for date fields without timezone enabled', () => {\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date' },\n { name: 'createdAt', type: 'date' },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should collect timezone companion from the next select field after date with timezone', () => {\n // Simulates sanitized fields where Payload inserts the companion right after the date\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] }, // auto-generated companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('publishedAt_tz')).toBe(true)\n })\n\n it('should handle overridden timezone field names', () => {\n // User overrode the timezone field name via timezone.override\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'pub_timezone', type: 'select', options: [] }, // overridden name\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('pub_timezone')).toBe(true)\n expect(result.has('publishedAt_tz')).toBe(false)\n })\n\n it('should collect multiple timezone companions', () => {\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] },\n { name: 'title', type: 'text' },\n { name: 'scheduledAt', type: 'date', timezone: true },\n { name: 'scheduledAt_tz', type: 'select', options: [] },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(2)\n expect(result.has('publishedAt_tz')).toBe(true)\n expect(result.has('scheduledAt_tz')).toBe(true)\n })\n\n it('should handle date fields in groups', () => {\n const fields: FlattenedField[] = [\n {\n name: 'meta',\n type: 'group',\n fields: [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('meta_publishedAt_tz')).toBe(true)\n })\n\n it('should handle date fields in arrays', () => {\n const fields: FlattenedField[] = [\n {\n name: 'events',\n type: 'array',\n fields: [\n { name: 'startTime', type: 'date', timezone: true },\n { name: 'startTime_tz', type: 'select', options: [] },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('events_startTime_tz')).toBe(true)\n })\n\n it('should handle date fields in blocks', () => {\n const fields: FlattenedField[] = [\n {\n name: 'layout',\n type: 'blocks',\n blocks: [\n {\n slug: 'event',\n fields: [\n { name: 'eventDate', type: 'date', timezone: true },\n { name: 'eventDate_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('layout_event_eventDate_tz')).toBe(true)\n })\n\n it('should handle deeply nested date fields', () => {\n const fields: FlattenedField[] = [\n {\n name: 'content',\n type: 'group',\n fields: [\n {\n name: 'schedule',\n type: 'array',\n fields: [\n { name: 'time', type: 'date', timezone: true },\n { name: 'time_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('content_schedule_time_tz')).toBe(true)\n })\n\n it('should handle tabs', () => {\n const fields: FlattenedField[] = [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'scheduling',\n fields: [\n { name: 'publishAt', type: 'date', timezone: true },\n { name: 'publishAt_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('scheduling_publishAt_tz')).toBe(true)\n })\n\n it('should handle unnamed tabs (no prefix added)', () => {\n const fields: FlattenedField[] = [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n { name: 'publishAt', type: 'date', timezone: true },\n { name: 'publishAt_tz', type: 'select', options: [] },\n ],\n },\n ],\n },\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(1)\n expect(result.has('publishAt_tz')).toBe(true)\n })\n\n it('should not include user-defined fields ending with _tz', () => {\n const fields: FlattenedField[] = [\n { name: 'my_tz', type: 'text' },\n { name: 'timezone_tz', type: 'select', options: [] },\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'publishedAt_tz', type: 'select', options: [] }, // actual companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n // Only the auto-generated timezone companion should be included\n expect(result.size).toBe(1)\n expect(result.has('publishedAt_tz')).toBe(true)\n expect(result.has('my_tz')).toBe(false)\n expect(result.has('timezone_tz')).toBe(false)\n })\n\n it('should not collect companion if next field is not a select', () => {\n // Edge case: date with timezone but next field is not a select\n const fields: FlattenedField[] = [\n { name: 'publishedAt', type: 'date', timezone: true },\n { name: 'title', type: 'text' }, // not a select, so not a companion\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n\n it('should not collect companion if date is last field', () => {\n const fields: FlattenedField[] = [\n { name: 'title', type: 'text' },\n { name: 'publishedAt', type: 'date', timezone: true },\n // no next field\n ]\n\n const result = collectTimezoneCompanionFields(fields)\n\n expect(result.size).toBe(0)\n })\n})\n"],"names":["describe","expect","it","collectTimezoneCompanionFields","fields","name","type","result","size","toBe","timezone","options","has","blocks","slug","tabs"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a regex that checks if a flattened CSV key matches a dotted field path.
|
|
3
|
+
*
|
|
4
|
+
* For example, `blocks.content.richText` would match:
|
|
5
|
+
* - `blocks_0_content_richText`
|
|
6
|
+
* - `blocks_1_content_0_richText`
|
|
7
|
+
* - `blocks_content_richText` (no indices)
|
|
8
|
+
*
|
|
9
|
+
* The regex handles the underscore-separated flattened format where array indices
|
|
10
|
+
* are inserted between field names. Field names themselves may contain underscores
|
|
11
|
+
* (e.g., `_status`, `my_field`).
|
|
12
|
+
*/
|
|
13
|
+
export declare const fieldToRegex: (fieldPath: string) => RegExp;
|
|
14
|
+
//# sourceMappingURL=fieldToRegex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fieldToRegex.d.ts","sourceRoot":"","sources":["../../src/utilities/fieldToRegex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,YAAY,cAAe,MAAM,KAAG,MAoBhD,CAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a regex that checks if a flattened CSV key matches a dotted field path.
|
|
3
|
+
*
|
|
4
|
+
* For example, `blocks.content.richText` would match:
|
|
5
|
+
* - `blocks_0_content_richText`
|
|
6
|
+
* - `blocks_1_content_0_richText`
|
|
7
|
+
* - `blocks_content_richText` (no indices)
|
|
8
|
+
*
|
|
9
|
+
* The regex handles the underscore-separated flattened format where array indices
|
|
10
|
+
* are inserted between field names. Field names themselves may contain underscores
|
|
11
|
+
* (e.g., `_status`, `my_field`).
|
|
12
|
+
*/ export const fieldToRegex = (fieldPath)=>{
|
|
13
|
+
const fieldSegments = fieldPath.split('.');
|
|
14
|
+
// Anchor first segment at string start
|
|
15
|
+
let pattern = `^${escapeRegex(fieldSegments[0])}`;
|
|
16
|
+
for(let i = 1; i < fieldSegments.length; i++){
|
|
17
|
+
const segment = escapeRegex(fieldSegments[i]);
|
|
18
|
+
// (?:_\d+)* - Zero or more array indices (e.g., "_0", "_0_1" for nested arrays)
|
|
19
|
+
pattern += `(?:_\\d+)*`;
|
|
20
|
+
// _segment - Required underscore followed by the field segment
|
|
21
|
+
pattern += `_${segment}`;
|
|
22
|
+
}
|
|
23
|
+
// (?:_.*)?$ - Allow any trailing content (nested fields, additional indices)
|
|
24
|
+
pattern += `(?:_.*)?$`;
|
|
25
|
+
return new RegExp(pattern);
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Escapes special regex metacharacters so they match literally.
|
|
29
|
+
* Characters escaped: . * + ? ^ $ { } ( ) | [ ] \
|
|
30
|
+
*/ const escapeRegex = (str)=>{
|
|
31
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=fieldToRegex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/fieldToRegex.ts"],"sourcesContent":["/**\n * Creates a regex that checks if a flattened CSV key matches a dotted field path.\n *\n * For example, `blocks.content.richText` would match:\n * - `blocks_0_content_richText`\n * - `blocks_1_content_0_richText`\n * - `blocks_content_richText` (no indices)\n *\n * The regex handles the underscore-separated flattened format where array indices\n * are inserted between field names. Field names themselves may contain underscores\n * (e.g., `_status`, `my_field`).\n */\nexport const fieldToRegex = (fieldPath: string): RegExp => {\n const fieldSegments = fieldPath.split('.')\n\n // Anchor first segment at string start\n let pattern = `^${escapeRegex(fieldSegments[0]!)}`\n\n for (let i = 1; i < fieldSegments.length; i++) {\n const segment = escapeRegex(fieldSegments[i]!)\n\n // (?:_\\d+)* - Zero or more array indices (e.g., \"_0\", \"_0_1\" for nested arrays)\n pattern += `(?:_\\\\d+)*`\n\n // _segment - Required underscore followed by the field segment\n pattern += `_${segment}`\n }\n\n // (?:_.*)?$ - Allow any trailing content (nested fields, additional indices)\n pattern += `(?:_.*)?$`\n\n return new RegExp(pattern)\n}\n\n/**\n * Escapes special regex metacharacters so they match literally.\n * Characters escaped: . * + ? ^ $ { } ( ) | [ ] \\\n */\nconst escapeRegex = (str: string): string => {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n"],"names":["fieldToRegex","fieldPath","fieldSegments","split","pattern","escapeRegex","i","length","segment","RegExp","str","replace"],"mappings":"AAAA;;;;;;;;;;;CAWC,GACD,OAAO,MAAMA,eAAe,CAACC;IAC3B,MAAMC,gBAAgBD,UAAUE,KAAK,CAAC;IAEtC,uCAAuC;IACvC,IAAIC,UAAU,CAAC,CAAC,EAAEC,YAAYH,aAAa,CAAC,EAAE,GAAI;IAElD,IAAK,IAAII,IAAI,GAAGA,IAAIJ,cAAcK,MAAM,EAAED,IAAK;QAC7C,MAAME,UAAUH,YAAYH,aAAa,CAACI,EAAE;QAE5C,gFAAgF;QAChFF,WAAW,CAAC,UAAU,CAAC;QAEvB,+DAA+D;QAC/DA,WAAW,CAAC,CAAC,EAAEI,SAAS;IAC1B;IAEA,6EAA6E;IAC7EJ,WAAW,CAAC,SAAS,CAAC;IAEtB,OAAO,IAAIK,OAAOL;AACpB,EAAC;AAED;;;CAGC,GACD,MAAMC,cAAc,CAACK;IACnB,OAAOA,IAAIC,OAAO,CAAC,uBAAuB;AAC5C"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { fieldToRegex } from './fieldToRegex.js';
|
|
3
|
+
describe('fieldToRegex', ()=>{
|
|
4
|
+
describe('simple field paths', ()=>{
|
|
5
|
+
it('should match exact field name', ()=>{
|
|
6
|
+
const regex = fieldToRegex('title');
|
|
7
|
+
expect(regex.test('title')).toBe(true);
|
|
8
|
+
});
|
|
9
|
+
it('should match field with array index', ()=>{
|
|
10
|
+
const regex = fieldToRegex('items');
|
|
11
|
+
expect(regex.test('items_0')).toBe(true);
|
|
12
|
+
expect(regex.test('items_1')).toBe(true);
|
|
13
|
+
expect(regex.test('items_99')).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
it('should match nested fields under array items', ()=>{
|
|
16
|
+
const regex = fieldToRegex('items');
|
|
17
|
+
expect(regex.test('items_0_title')).toBe(true);
|
|
18
|
+
expect(regex.test('items_1_description')).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it('should not match unrelated fields', ()=>{
|
|
21
|
+
const regex = fieldToRegex('title');
|
|
22
|
+
expect(regex.test('otherField')).toBe(false);
|
|
23
|
+
expect(regex.test('titleExtra')).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('dotted field paths', ()=>{
|
|
27
|
+
it('should match nested field path without indices', ()=>{
|
|
28
|
+
const regex = fieldToRegex('blocks.content');
|
|
29
|
+
expect(regex.test('blocks_content')).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it('should match nested field path with array index in middle', ()=>{
|
|
32
|
+
const regex = fieldToRegex('blocks.content');
|
|
33
|
+
expect(regex.test('blocks_0_content')).toBe(true);
|
|
34
|
+
expect(regex.test('blocks_1_content')).toBe(true);
|
|
35
|
+
expect(regex.test('blocks_42_content')).toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('should match deeply nested paths with multiple indices', ()=>{
|
|
38
|
+
const regex = fieldToRegex('blocks.content.items');
|
|
39
|
+
expect(regex.test('blocks_0_content_items')).toBe(true);
|
|
40
|
+
expect(regex.test('blocks_0_content_0_items')).toBe(true);
|
|
41
|
+
expect(regex.test('blocks_1_content_2_items')).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
it('should match nested fields under the matched path', ()=>{
|
|
44
|
+
const regex = fieldToRegex('blocks.content');
|
|
45
|
+
expect(regex.test('blocks_0_content_title')).toBe(true);
|
|
46
|
+
expect(regex.test('blocks_0_content_richText')).toBe(true);
|
|
47
|
+
expect(regex.test('blocks_1_content_0_value')).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('complex nested structures', ()=>{
|
|
51
|
+
it('should handle three-level nesting', ()=>{
|
|
52
|
+
const regex = fieldToRegex('layout.sections.items');
|
|
53
|
+
expect(regex.test('layout_sections_items')).toBe(true);
|
|
54
|
+
expect(regex.test('layout_0_sections_items')).toBe(true);
|
|
55
|
+
expect(regex.test('layout_0_sections_1_items')).toBe(true);
|
|
56
|
+
expect(regex.test('layout_0_sections_1_items_2')).toBe(true);
|
|
57
|
+
expect(regex.test('layout_0_sections_1_items_2_title')).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it('should not match partial field name matches', ()=>{
|
|
60
|
+
const regex = fieldToRegex('block');
|
|
61
|
+
expect(regex.test('blocks')).toBe(false);
|
|
62
|
+
expect(regex.test('blocks_0_content')).toBe(false);
|
|
63
|
+
expect(regex.test('blockType')).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
it('should handle field names that look like array indices', ()=>{
|
|
66
|
+
const regex = fieldToRegex('data.row');
|
|
67
|
+
expect(regex.test('data_row')).toBe(true);
|
|
68
|
+
expect(regex.test('data_0_row')).toBe(true);
|
|
69
|
+
expect(regex.test('data_0_row_1')).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('edge cases', ()=>{
|
|
73
|
+
it('should handle single character field names', ()=>{
|
|
74
|
+
const regex = fieldToRegex('a.b.c');
|
|
75
|
+
expect(regex.test('a_b_c')).toBe(true);
|
|
76
|
+
expect(regex.test('a_0_b_c')).toBe(true);
|
|
77
|
+
expect(regex.test('a_0_b_1_c')).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
it('should handle field names with numbers', ()=>{
|
|
80
|
+
const regex = fieldToRegex('field1.field2');
|
|
81
|
+
expect(regex.test('field1_field2')).toBe(true);
|
|
82
|
+
expect(regex.test('field1_0_field2')).toBe(true);
|
|
83
|
+
});
|
|
84
|
+
it('should match field at end of key exactly', ()=>{
|
|
85
|
+
const regex = fieldToRegex('meta.title');
|
|
86
|
+
expect(regex.test('meta_title')).toBe(true);
|
|
87
|
+
expect(regex.test('meta_0_title')).toBe(true);
|
|
88
|
+
// Should not match if title is a prefix of another word
|
|
89
|
+
expect(regex.test('meta_titleExtra')).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it('should handle field names starting with underscore', ()=>{
|
|
92
|
+
const regex = fieldToRegex('_status');
|
|
93
|
+
expect(regex.test('_status')).toBe(true);
|
|
94
|
+
expect(regex.test('_status_0')).toBe(true);
|
|
95
|
+
expect(regex.test('_statusExtra')).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('should handle field names containing underscores', ()=>{
|
|
98
|
+
const regex = fieldToRegex('my_field');
|
|
99
|
+
expect(regex.test('my_field')).toBe(true);
|
|
100
|
+
expect(regex.test('my_field_0')).toBe(true);
|
|
101
|
+
expect(regex.test('my_fieldExtra')).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
it('should handle nested paths with underscore fields', ()=>{
|
|
104
|
+
const regex = fieldToRegex('group._status');
|
|
105
|
+
expect(regex.test('group__status')).toBe(true);
|
|
106
|
+
expect(regex.test('group_0__status')).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('date fields with timezone companions', ()=>{
|
|
110
|
+
it('should match date field and its _tz companion', ()=>{
|
|
111
|
+
const regex = fieldToRegex('publishedDate');
|
|
112
|
+
expect(regex.test('publishedDate')).toBe(true);
|
|
113
|
+
expect(regex.test('publishedDate_tz')).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('should match nested date field and its _tz companion', ()=>{
|
|
116
|
+
const regex = fieldToRegex('meta.publishedDate');
|
|
117
|
+
expect(regex.test('meta_publishedDate')).toBe(true);
|
|
118
|
+
expect(regex.test('meta_publishedDate_tz')).toBe(true);
|
|
119
|
+
expect(regex.test('meta_0_publishedDate')).toBe(true);
|
|
120
|
+
expect(regex.test('meta_0_publishedDate_tz')).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
it('should match date fields in arrays with _tz companions', ()=>{
|
|
123
|
+
const regex = fieldToRegex('events.startDate');
|
|
124
|
+
expect(regex.test('events_0_startDate')).toBe(true);
|
|
125
|
+
expect(regex.test('events_0_startDate_tz')).toBe(true);
|
|
126
|
+
expect(regex.test('events_1_startDate')).toBe(true);
|
|
127
|
+
expect(regex.test('events_1_startDate_tz')).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
it('should match deeply nested date fields with _tz companions', ()=>{
|
|
130
|
+
const regex = fieldToRegex('blocks.content.scheduledAt');
|
|
131
|
+
expect(regex.test('blocks_0_content_scheduledAt')).toBe(true);
|
|
132
|
+
expect(regex.test('blocks_0_content_scheduledAt_tz')).toBe(true);
|
|
133
|
+
expect(regex.test('blocks_0_content_0_scheduledAt')).toBe(true);
|
|
134
|
+
expect(regex.test('blocks_0_content_0_scheduledAt_tz')).toBe(true);
|
|
135
|
+
});
|
|
136
|
+
it('should not match _tz suffix on unrelated fields', ()=>{
|
|
137
|
+
const regex = fieldToRegex('title');
|
|
138
|
+
expect(regex.test('title')).toBe(true);
|
|
139
|
+
expect(regex.test('title_tz')).toBe(true); // _tz is treated as a nested field suffix
|
|
140
|
+
expect(regex.test('publishedDate_tz')).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('should handle date fields with underscores in name', ()=>{
|
|
143
|
+
const regex = fieldToRegex('start_date');
|
|
144
|
+
expect(regex.test('start_date')).toBe(true);
|
|
145
|
+
expect(regex.test('start_date_tz')).toBe(true);
|
|
146
|
+
expect(regex.test('start_date_0')).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
//# sourceMappingURL=fieldToRegex.spec.js.map
|