payload 3.86.0 → 3.87.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/collections/operations/count.d.ts.map +1 -1
- package/dist/collections/operations/count.js +1 -0
- package/dist/collections/operations/count.js.map +1 -1
- package/dist/collections/operations/updateByID.d.ts.map +1 -1
- package/dist/collections/operations/updateByID.js +1 -0
- package/dist/collections/operations/updateByID.js.map +1 -1
- package/dist/fields/config/types.js +1 -1
- package/dist/fields/config/types.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/promise.js +5 -3
- package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
- package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts +10 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts.map +1 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.js +18 -0
- package/dist/fields/hooks/beforeValidate/stripNullRows.js.map +1 -0
- package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
- package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -0
- package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +1 -1
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +1 -0
- package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +1 -1
- package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
- package/dist/globals/operations/countGlobalVersions.js +1 -0
- package/dist/globals/operations/countGlobalVersions.js.map +1 -1
- package/dist/index.bundled.d.ts +71 -15
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -7
- package/dist/index.js.map +1 -1
- package/dist/uploads/generateFileData.js +4 -1
- package/dist/uploads/generateFileData.js.map +1 -1
- package/dist/uploads/getImageSize.d.ts +12 -1
- package/dist/uploads/getImageSize.d.ts.map +1 -1
- package/dist/uploads/getImageSize.js +20 -18
- package/dist/uploads/getImageSize.js.map +1 -1
- package/dist/uploads/getImageSize.spec.js +298 -0
- package/dist/uploads/getImageSize.spec.js.map +1 -0
- package/dist/uploads/probeImageSize.d.ts +39 -0
- package/dist/uploads/probeImageSize.d.ts.map +1 -0
- package/dist/uploads/probeImageSize.js +374 -0
- package/dist/uploads/probeImageSize.js.map +1 -0
- package/dist/uploads/probeImageSize.spec.js +366 -0
- package/dist/uploads/probeImageSize.spec.js.map +1 -0
- package/dist/utilities/getNextJsHMRURL.d.ts +6 -0
- package/dist/utilities/getNextJsHMRURL.d.ts.map +1 -0
- package/dist/utilities/getNextJsHMRURL.js +33 -0
- package/dist/utilities/getNextJsHMRURL.js.map +1 -0
- package/dist/utilities/getNextJsHMRURL.spec.js +60 -0
- package/dist/utilities/getNextJsHMRURL.spec.js.map +1 -0
- package/dist/utilities/getNextVersion.d.ts +7 -0
- package/dist/utilities/getNextVersion.d.ts.map +1 -0
- package/dist/utilities/getNextVersion.js +20 -0
- package/dist/utilities/getNextVersion.js.map +1 -0
- package/dist/utilities/getNextVersion.spec.js +16 -0
- package/dist/utilities/getNextVersion.spec.js.map +1 -0
- package/dist/utilities/parseParams/index.d.ts +2 -3
- package/dist/utilities/parseParams/index.d.ts.map +1 -1
- package/dist/utilities/parseParams/index.js.map +1 -1
- package/dist/utilities/traverseFields.d.ts.map +1 -1
- package/dist/utilities/traverseFields.js +20 -22
- package/dist/utilities/traverseFields.js.map +1 -1
- package/dist/utilities/traverseFields.spec.js +112 -0
- package/dist/utilities/traverseFields.spec.js.map +1 -1
- package/dist/utilities/unflattenData.d.ts +3 -0
- package/dist/utilities/unflattenData.d.ts.map +1 -0
- package/dist/utilities/unflattenData.js +14 -0
- package/dist/utilities/unflattenData.js.map +1 -0
- package/package.json +4 -4
- package/dist/uploads/tempFile.d.ts +0 -7
- package/dist/uploads/tempFile.d.ts.map +0 -1
- package/dist/uploads/tempFile.js +0 -39
- package/dist/uploads/tempFile.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utilities/parseParams/index.ts"],"sourcesContent":["import type { JoinQuery, PopulateType, SelectType, Where } from '../../types/index.js'\nimport type { JoinParams } from '../sanitizeJoinParams.js'\n\nimport { isNumber } from '../isNumber.js'\nimport { parseBooleanString } from '../parseBooleanString.js'\nimport { sanitizeJoinParams } from '../sanitizeJoinParams.js'\nimport { sanitizePopulateParam } from '../sanitizePopulateParam.js'\nimport { sanitizeSelectParam } from '../sanitizeSelectParam.js'\nimport { sanitizeSortParams } from '../sanitizeSortParams.js'\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/utilities/parseParams/index.ts"],"sourcesContent":["import type { JoinQuery, PopulateType, SelectType, Where } from '../../types/index.js'\nimport type { JoinParams } from '../sanitizeJoinParams.js'\n\nimport { isNumber } from '../isNumber.js'\nimport { parseBooleanString } from '../parseBooleanString.js'\nimport { sanitizeJoinParams } from '../sanitizeJoinParams.js'\nimport { sanitizePopulateParam } from '../sanitizePopulateParam.js'\nimport { sanitizeSelectParam } from '../sanitizeSelectParam.js'\nimport { sanitizeSortParams } from '../sanitizeSortParams.js'\n\nexport type RawParams = {\n [key: string]: unknown\n autosave?: string\n data?: string\n depth?: string\n draft?: string\n field?: string\n flattenLocales?: string\n joins?: JoinParams\n limit?: string\n overrideLock?: string\n page?: string\n pagination?: string\n populate?: unknown\n publishAllLocales?: string\n publishSpecificLocale?: string\n select?: unknown\n selectedLocales?: string\n sort?: string | string[]\n trash?: string\n unpublishAllLocales?: string\n where?: string | Where\n}\n\nexport type ParsedParams = {\n autosave?: boolean\n data?: Record<string, unknown>\n depth?: number\n draft?: boolean\n field?: string\n flattenLocales?: boolean\n joins?: JoinQuery\n limit?: number\n overrideLock?: boolean\n page?: number\n pagination?: boolean\n populate?: PopulateType\n publishAllLocales?: boolean\n publishSpecificLocale?: string\n select?: SelectType\n selectedLocales?: string[]\n sort?: string[]\n trash?: boolean\n unpublishAllLocales?: boolean\n where?: Where\n} & Record<string, unknown>\n\nexport const booleanParams = [\n 'autosave',\n 'draft',\n 'trash',\n 'overrideLock',\n 'pagination',\n 'flattenLocales',\n]\n\nexport const numberParams = ['depth', 'limit', 'page']\n\n/**\n * Takes raw query parameters and parses them into the correct types that Payload expects.\n * Examples:\n * a. `draft` provided as a string of \"true\" is converted to a boolean\n * b. `depth` provided as a string of \"0\" is converted to a number\n * c. `sort` provided as a comma-separated string or array is converted to an array of strings\n */\nexport const parseParams = (params: RawParams): ParsedParams => {\n const parsedParams = (params || {}) as ParsedParams\n\n // iterate through known params to make this very fast\n for (const key of booleanParams) {\n if (key in params) {\n parsedParams[key] = parseBooleanString(params[key] as boolean | string)\n }\n }\n\n for (const key of numberParams) {\n if (key in params) {\n if (isNumber(params[key])) {\n parsedParams[key] = Number(params[key])\n }\n }\n }\n\n if ('populate' in params) {\n parsedParams.populate = sanitizePopulateParam(params.populate)\n }\n\n if ('select' in params) {\n parsedParams.select = sanitizeSelectParam(params.select)\n }\n\n if ('joins' in params) {\n parsedParams.joins = sanitizeJoinParams(params.joins as JoinParams)\n }\n\n if ('sort' in params) {\n parsedParams.sort = sanitizeSortParams(params.sort)\n }\n\n if ('data' in params && typeof params.data === 'string' && params.data.length > 0) {\n parsedParams.data = JSON.parse(params.data)\n }\n\n if ('where' in params && typeof params.where === 'string' && params.where.length > 0) {\n parsedParams.where = JSON.parse(params.where) as Where\n }\n\n return parsedParams\n}\n"],"names":["isNumber","parseBooleanString","sanitizeJoinParams","sanitizePopulateParam","sanitizeSelectParam","sanitizeSortParams","booleanParams","numberParams","parseParams","params","parsedParams","key","Number","populate","select","joins","sort","data","length","JSON","parse","where"],"mappings":"AAGA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,kBAAkB,QAAQ,2BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,8BAA6B;AACnE,SAASC,mBAAmB,QAAQ,4BAA2B;AAC/D,SAASC,kBAAkB,QAAQ,2BAA0B;AAiD7D,OAAO,MAAMC,gBAAgB;IAC3B;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,OAAO,MAAMC,eAAe;IAAC;IAAS;IAAS;CAAO,CAAA;AAEtD;;;;;;CAMC,GACD,OAAO,MAAMC,cAAc,CAACC;IAC1B,MAAMC,eAAgBD,UAAU,CAAC;IAEjC,sDAAsD;IACtD,KAAK,MAAME,OAAOL,cAAe;QAC/B,IAAIK,OAAOF,QAAQ;YACjBC,YAAY,CAACC,IAAI,GAAGV,mBAAmBQ,MAAM,CAACE,IAAI;QACpD;IACF;IAEA,KAAK,MAAMA,OAAOJ,aAAc;QAC9B,IAAII,OAAOF,QAAQ;YACjB,IAAIT,SAASS,MAAM,CAACE,IAAI,GAAG;gBACzBD,YAAY,CAACC,IAAI,GAAGC,OAAOH,MAAM,CAACE,IAAI;YACxC;QACF;IACF;IAEA,IAAI,cAAcF,QAAQ;QACxBC,aAAaG,QAAQ,GAAGV,sBAAsBM,OAAOI,QAAQ;IAC/D;IAEA,IAAI,YAAYJ,QAAQ;QACtBC,aAAaI,MAAM,GAAGV,oBAAoBK,OAAOK,MAAM;IACzD;IAEA,IAAI,WAAWL,QAAQ;QACrBC,aAAaK,KAAK,GAAGb,mBAAmBO,OAAOM,KAAK;IACtD;IAEA,IAAI,UAAUN,QAAQ;QACpBC,aAAaM,IAAI,GAAGX,mBAAmBI,OAAOO,IAAI;IACpD;IAEA,IAAI,UAAUP,UAAU,OAAOA,OAAOQ,IAAI,KAAK,YAAYR,OAAOQ,IAAI,CAACC,MAAM,GAAG,GAAG;QACjFR,aAAaO,IAAI,GAAGE,KAAKC,KAAK,CAACX,OAAOQ,IAAI;IAC5C;IAEA,IAAI,WAAWR,UAAU,OAAOA,OAAOY,KAAK,KAAK,YAAYZ,OAAOY,KAAK,CAACH,MAAM,GAAG,GAAG;QACpFR,aAAaW,KAAK,GAAGF,KAAKC,KAAK,CAACX,OAAOY,KAAK;IAC9C;IAEA,OAAOX;AACT,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAsGlG,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,oJAYxB,kBAAkB,KAAG,
|
|
1
|
+
{"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/utilities/traverseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACjE,OAAO,KAAK,EAAkC,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAsGlG,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE;IAC1C;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,IAAI,CAAA;IACjB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,KAAK,OAAO,GAAG,IAAI,CAAA;AAEpB,KAAK,kBAAkB,GAAG;IACxB,QAAQ,EAAE,sBAAsB,CAAA;IAChC,aAAa,CAAC,EAAE,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAA;IAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAAA;IACjC,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;CACxC,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,oJAYxB,kBAAkB,KAAG,IAgWvB,CAAA"}
|
|
@@ -69,7 +69,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
69
69
|
* @param fillEmpty fill empty properties to use this without data
|
|
70
70
|
* @param ref the data or any artifacts assigned in the callback during field recursion
|
|
71
71
|
* @param parentRef the data or any artifacts assigned in the callback during field recursion one level up
|
|
72
|
-
*/ export const traverseFields = ({ callback, callbackStack: _callbackStack = [], config, fields, fillEmpty = true, isTopLevel = true, leavesFirst = false, parentIsLocalized, parentPath = '', parentRef = {}, ref = {} })=>{
|
|
72
|
+
*/ export const traverseFields = ({ callback, callbackStack: _callbackStack = [], config, fields, fillEmpty = true, isTopLevel = true, leavesFirst = false, parentIsLocalized = false, parentPath = '', parentRef = {}, ref = {} })=>{
|
|
73
73
|
const fieldsMatched = fields.some((field)=>{
|
|
74
74
|
let callbackStack = [];
|
|
75
75
|
if (!isTopLevel) {
|
|
@@ -85,7 +85,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
85
85
|
if (!leavesFirst && callback && callback({
|
|
86
86
|
field,
|
|
87
87
|
next,
|
|
88
|
-
parentIsLocalized
|
|
88
|
+
parentIsLocalized,
|
|
89
89
|
parentPath,
|
|
90
90
|
parentRef,
|
|
91
91
|
ref
|
|
@@ -95,7 +95,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
95
95
|
callbackStack.push(()=>callback({
|
|
96
96
|
field,
|
|
97
97
|
next,
|
|
98
|
-
parentIsLocalized
|
|
98
|
+
parentIsLocalized,
|
|
99
99
|
parentPath,
|
|
100
100
|
parentRef,
|
|
101
101
|
ref
|
|
@@ -109,6 +109,10 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
109
109
|
let currentParentRef = parentRef;
|
|
110
110
|
if (field.type === 'tabs' && 'tabs' in field) {
|
|
111
111
|
for (const tab of field.tabs){
|
|
112
|
+
const tabIsLocalized = fieldShouldBeLocalized({
|
|
113
|
+
field: tab,
|
|
114
|
+
parentIsLocalized
|
|
115
|
+
});
|
|
112
116
|
let tabRef = ref;
|
|
113
117
|
if (skip) {
|
|
114
118
|
return false;
|
|
@@ -116,7 +120,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
116
120
|
if ('name' in tab && tab.name) {
|
|
117
121
|
if (!ref[tab.name] || typeof ref[tab.name] !== 'object') {
|
|
118
122
|
if (fillEmpty) {
|
|
119
|
-
if (
|
|
123
|
+
if (tabIsLocalized) {
|
|
120
124
|
;
|
|
121
125
|
ref[tab.name] = {
|
|
122
126
|
en: {}
|
|
@@ -135,7 +139,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
135
139
|
type: 'tab'
|
|
136
140
|
},
|
|
137
141
|
next,
|
|
138
|
-
parentIsLocalized
|
|
142
|
+
parentIsLocalized,
|
|
139
143
|
parentPath,
|
|
140
144
|
parentRef: currentParentRef,
|
|
141
145
|
ref: tabRef
|
|
@@ -148,14 +152,14 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
148
152
|
type: 'tab'
|
|
149
153
|
},
|
|
150
154
|
next,
|
|
151
|
-
parentIsLocalized
|
|
155
|
+
parentIsLocalized,
|
|
152
156
|
parentPath,
|
|
153
157
|
parentRef: currentParentRef,
|
|
154
158
|
ref: tabRef
|
|
155
159
|
}));
|
|
156
160
|
}
|
|
157
161
|
tabRef = tabRef[tab.name];
|
|
158
|
-
if (
|
|
162
|
+
if (tabIsLocalized) {
|
|
159
163
|
for(const key in tabRef){
|
|
160
164
|
if (tabRef[key] && typeof tabRef[key] === 'object') {
|
|
161
165
|
traverseFields({
|
|
@@ -181,7 +185,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
181
185
|
type: 'tab'
|
|
182
186
|
},
|
|
183
187
|
next,
|
|
184
|
-
parentIsLocalized
|
|
188
|
+
parentIsLocalized,
|
|
185
189
|
parentPath,
|
|
186
190
|
parentRef: currentParentRef,
|
|
187
191
|
ref: tabRef
|
|
@@ -194,14 +198,14 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
194
198
|
type: 'tab'
|
|
195
199
|
},
|
|
196
200
|
next,
|
|
197
|
-
parentIsLocalized
|
|
201
|
+
parentIsLocalized,
|
|
198
202
|
parentPath,
|
|
199
203
|
parentRef: currentParentRef,
|
|
200
204
|
ref: tabRef
|
|
201
205
|
}));
|
|
202
206
|
}
|
|
203
207
|
}
|
|
204
|
-
if (!
|
|
208
|
+
if (!tabIsLocalized) {
|
|
205
209
|
traverseFields({
|
|
206
210
|
callback,
|
|
207
211
|
callbackStack,
|
|
@@ -210,7 +214,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
210
214
|
fillEmpty,
|
|
211
215
|
isTopLevel: false,
|
|
212
216
|
leavesFirst,
|
|
213
|
-
parentIsLocalized
|
|
217
|
+
parentIsLocalized,
|
|
214
218
|
parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,
|
|
215
219
|
parentRef: currentParentRef,
|
|
216
220
|
ref: tabRef
|
|
@@ -230,7 +234,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
230
234
|
if (field.type === 'group' || field.type === 'tab') {
|
|
231
235
|
if (fieldShouldBeLocalized({
|
|
232
236
|
field,
|
|
233
|
-
parentIsLocalized
|
|
237
|
+
parentIsLocalized
|
|
234
238
|
})) {
|
|
235
239
|
;
|
|
236
240
|
ref[field.name] = {
|
|
@@ -243,7 +247,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
243
247
|
} else if (field.type === 'array' || field.type === 'blocks') {
|
|
244
248
|
if (fieldShouldBeLocalized({
|
|
245
249
|
field,
|
|
246
|
-
parentIsLocalized
|
|
250
|
+
parentIsLocalized
|
|
247
251
|
})) {
|
|
248
252
|
;
|
|
249
253
|
ref[field.name] = {
|
|
@@ -262,7 +266,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
262
266
|
}
|
|
263
267
|
if ((field.type === 'tab' || field.type === 'group') && fieldShouldBeLocalized({
|
|
264
268
|
field,
|
|
265
|
-
parentIsLocalized
|
|
269
|
+
parentIsLocalized
|
|
266
270
|
}) && currentRef && typeof currentRef === 'object') {
|
|
267
271
|
if (fieldAffectsData(field)) {
|
|
268
272
|
for(const key in currentRef){
|
|
@@ -299,15 +303,9 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
299
303
|
return;
|
|
300
304
|
}
|
|
301
305
|
if ((field.type === 'blocks' || field.type === 'array') && currentRef && typeof currentRef === 'object') {
|
|
302
|
-
// TODO: `?? field.localized ?? false` shouldn't be necessary, but right now it
|
|
303
|
-
// is so that all fields are correctly traversed in copyToLocale and
|
|
304
|
-
// therefore pass the localization integration tests.
|
|
305
|
-
// I tried replacing the `!parentIsLocalized` condition with `parentIsLocalized === false`
|
|
306
|
-
// in `fieldShouldBeLocalized`, but several tests failed. We must be calling it with incorrect
|
|
307
|
-
// parameters somewhere.
|
|
308
306
|
if (fieldShouldBeLocalized({
|
|
309
307
|
field,
|
|
310
|
-
parentIsLocalized
|
|
308
|
+
parentIsLocalized
|
|
311
309
|
})) {
|
|
312
310
|
if (Array.isArray(currentRef)) {
|
|
313
311
|
traverseArrayOrBlocksField({
|
|
@@ -351,7 +349,7 @@ const traverseArrayOrBlocksField = ({ callback, callbackStack, config, data, fie
|
|
|
351
349
|
field,
|
|
352
350
|
fillEmpty,
|
|
353
351
|
leavesFirst,
|
|
354
|
-
parentIsLocalized
|
|
352
|
+
parentIsLocalized,
|
|
355
353
|
parentPath,
|
|
356
354
|
parentRef: currentParentRef
|
|
357
355
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blockReferences ?? field.blocks) {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block = field.blockReferences\n ? ((config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blockReferences.find(\n (b) => typeof b !== 'string' && b.slug === ref.blockType,\n )) as Block)\n : field.blocks.find((b) => b.slug === ref.blockType)\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized: parentIsLocalized!, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tab.localized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tab.localized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tab.localized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: false,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized: parentIsLocalized! }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n // TODO: `?? field.localized ?? false` shouldn't be necessary, but right now it\n // is so that all fields are correctly traversed in copyToLocale and\n // therefore pass the localization integration tests.\n // I tried replacing the `!parentIsLocalized` condition with `parentIsLocalized === false`\n // in `fieldShouldBeLocalized`, but several tests failed. We must be calling it with incorrect\n // parameters somewhere.\n if (\n fieldShouldBeLocalized({\n field,\n parentIsLocalized: parentIsLocalized ?? false,\n })\n ) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: parentIsLocalized!,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!ref[fieldName as keyof typeof ref]) {\n ;(ref as Record<string, unknown>)[fieldName] = {}\n }\n\n const nestedRef = ref[fieldName as keyof typeof ref] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedRef[remainingPath] = (ref as Record<string, unknown>)[key]\n delete (ref as Record<string, unknown>)[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blockReferences","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","includes","firstDotIndex","indexOf","fieldName","substring","remainingPath","nestedRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/traverseFields.ts"],"sourcesContent":["import type { Config, SanitizedConfig } from '../config/types.js'\nimport type { ArrayField, Block, BlocksField, Field, TabAsField } from '../fields/config/types.js'\n\nimport {\n fieldAffectsData,\n fieldHasSubFields,\n fieldShouldBeLocalized,\n tabHasName,\n} from '../fields/config/types.js'\n\nconst traverseArrayOrBlocksField = ({\n callback,\n callbackStack,\n config,\n data,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n}: {\n callback: TraverseFieldsCallback\n callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n data: Record<string, unknown>[]\n field: ArrayField | BlocksField\n fillEmpty: boolean\n leavesFirst: boolean\n parentIsLocalized: boolean\n parentPath: string\n parentRef?: unknown\n}) => {\n if (fillEmpty) {\n if (field.type === 'array') {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n if (field.type === 'blocks') {\n for (const _block of field.blockReferences ?? field.blocks) {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block =\n typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block\n if (block) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: block.fields,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n })\n }\n }\n }\n return\n }\n for (const ref of data) {\n let fields!: Field[]\n if (field.type === 'blocks' && typeof ref?.blockType === 'string') {\n // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks\n const block = field.blockReferences\n ? ((config?.blocks?.find((b) => b.slug === ref.blockType) ??\n field.blockReferences.find(\n (b) => typeof b !== 'string' && b.slug === ref.blockType,\n )) as Block)\n : field.blocks.find((b) => b.slug === ref.blockType)\n\n fields = block?.fields as Field[]\n } else if (field.type === 'array') {\n fields = field.fields\n }\n\n if (fields) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: parentIsLocalized || field.localized,\n parentPath: `${parentPath}${field.name}.`,\n parentRef,\n ref,\n })\n }\n }\n}\n\nexport type TraverseFieldsCallback = (args: {\n /**\n * The current field\n */\n field: Field | TabAsField\n /**\n * Function that when called will skip the current field and continue to the next\n */\n next?: () => void\n parentIsLocalized: boolean\n parentPath: string\n /**\n * The parent reference object\n */\n parentRef?: Record<string, unknown> | unknown\n /**\n * The current reference object\n */\n ref?: Record<string, unknown> | unknown\n}) => boolean | void\n\ntype TraverseFieldsArgs = {\n callback: TraverseFieldsCallback\n callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]\n config?: Config | SanitizedConfig\n fields: (Field | TabAsField)[]\n fillEmpty?: boolean\n isTopLevel?: boolean\n /**\n * @default false\n *\n * if this is `true`, the callback functions of the leaf fields will be called before the parent fields.\n * The return value of the callback function will be ignored.\n */\n leavesFirst?: boolean\n parentIsLocalized?: boolean\n parentPath?: string\n parentRef?: Record<string, unknown> | unknown\n ref?: Record<string, unknown> | unknown\n}\n\n/**\n * Iterate a recurse an array of fields, calling a callback for each field\n *\n * @param fields\n * @param callback callback called for each field, discontinue looping if callback returns truthy\n * @param fillEmpty fill empty properties to use this without data\n * @param ref the data or any artifacts assigned in the callback during field recursion\n * @param parentRef the data or any artifacts assigned in the callback during field recursion one level up\n */\nexport const traverseFields = ({\n callback,\n callbackStack: _callbackStack = [],\n config,\n fields,\n fillEmpty = true,\n isTopLevel = true,\n leavesFirst = false,\n parentIsLocalized = false,\n parentPath = '',\n parentRef = {},\n ref = {},\n}: TraverseFieldsArgs): void => {\n const fieldsMatched = fields.some((field) => {\n let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []\n if (!isTopLevel) {\n callbackStack = _callbackStack\n }\n let skip = false\n const next = () => {\n skip = true\n }\n\n if (!ref || typeof ref !== 'object') {\n return\n }\n\n if (\n !leavesFirst &&\n callback &&\n callback({ field, next, parentIsLocalized, parentPath, parentRef, ref })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field,\n next,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n }),\n )\n }\n\n if (skip) {\n return false\n }\n\n // avoid mutation of ref for all fields\n let currentRef = ref\n let currentParentRef = parentRef\n\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const tabIsLocalized = fieldShouldBeLocalized({ field: tab, parentIsLocalized })\n let tabRef = ref\n\n if (skip) {\n return false\n }\n\n if ('name' in tab && tab.name) {\n if (\n !ref[tab.name as keyof typeof ref] ||\n typeof ref[tab.name as keyof typeof ref] !== 'object'\n ) {\n if (fillEmpty) {\n if (tabIsLocalized) {\n ;(ref as Record<string, any>)[tab.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[tab.name] = {}\n }\n } else {\n continue\n }\n }\n\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n\n tabRef = tabRef[tab.name as keyof typeof tabRef]\n\n if (tabIsLocalized) {\n for (const key in tabRef as Record<string, unknown>) {\n if (\n tabRef[key as keyof typeof tabRef] &&\n typeof tabRef[key as keyof typeof tabRef] === 'object'\n ) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: `${parentPath}${tab.name}.`,\n parentRef: currentParentRef,\n ref: tabRef[key as keyof typeof tabRef],\n })\n }\n }\n }\n } else {\n if (\n callback &&\n !leavesFirst &&\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n ) {\n return true\n } else if (leavesFirst) {\n callbackStack.push(() =>\n callback({\n field: { ...tab, type: 'tab' },\n next,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n }),\n )\n }\n }\n\n if (!tabIsLocalized) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: tab.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: tabHasName(tab) ? `${parentPath}${tab.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: tabRef,\n })\n }\n\n if (skip) {\n return false\n }\n }\n\n return\n }\n\n if (field.type === 'tab' || fieldHasSubFields(field) || field.type === 'blocks') {\n if ('name' in field && field.name) {\n currentParentRef = currentRef\n if (!ref[field.name as keyof typeof ref]) {\n if (fillEmpty) {\n if (field.type === 'group' || field.type === 'tab') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: {} }\n } else {\n ;(ref as Record<string, any>)[field.name] = {}\n }\n } else if (field.type === 'array' || field.type === 'blocks') {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n ;(ref as Record<string, any>)[field.name] = { en: [] }\n } else {\n ;(ref as Record<string, any>)[field.name] = []\n }\n }\n } else {\n return\n }\n }\n currentRef = ref[field.name as keyof typeof ref]\n }\n\n if (\n (field.type === 'tab' || field.type === 'group') &&\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldAffectsData(field)) {\n for (const key in currentRef as Record<string, unknown>) {\n if (currentRef[key as keyof typeof currentRef]) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized: true,\n parentPath: field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef[key as keyof typeof currentRef],\n })\n }\n }\n } else {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n\n return\n }\n\n if (\n (field.type === 'blocks' || field.type === 'array') &&\n currentRef &&\n typeof currentRef === 'object'\n ) {\n if (fieldShouldBeLocalized({ field, parentIsLocalized })) {\n if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n } else {\n for (const key in currentRef as Record<string, unknown>) {\n const localeData = currentRef[key as keyof typeof currentRef]\n if (!Array.isArray(localeData)) {\n continue\n }\n\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: localeData,\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized: true,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n }\n } else if (Array.isArray(currentRef)) {\n traverseArrayOrBlocksField({\n callback,\n callbackStack,\n config,\n data: currentRef as Record<string, unknown>[],\n field,\n fillEmpty,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef: currentParentRef,\n })\n }\n } else if (currentRef && typeof currentRef === 'object' && 'fields' in field) {\n traverseFields({\n callback,\n callbackStack,\n config,\n fields: field.fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath: 'name' in field && field.name ? `${parentPath}${field.name}.` : parentPath,\n parentRef: currentParentRef,\n ref: currentRef,\n })\n }\n }\n\n if (isTopLevel) {\n callbackStack.reverse().forEach((cb) => {\n cb()\n })\n }\n })\n\n // Fallback: Handle dot-notation paths when no fields matched\n if (!fieldsMatched && ref && typeof ref === 'object') {\n Object.keys(ref).forEach((key) => {\n if (key.includes('.')) {\n // Split on first dot only\n const firstDotIndex = key.indexOf('.')\n const fieldName = key.substring(0, firstDotIndex)\n const remainingPath = key.substring(firstDotIndex + 1)\n\n // Create nested structure for this field\n if (!ref[fieldName as keyof typeof ref]) {\n ;(ref as Record<string, unknown>)[fieldName] = {}\n }\n\n const nestedRef = ref[fieldName as keyof typeof ref] as Record<string, unknown>\n\n // Move the value to the nested structure\n nestedRef[remainingPath] = (ref as Record<string, unknown>)[key]\n delete (ref as Record<string, unknown>)[key]\n\n // Recursively process the newly created nested structure\n // The field traversal will naturally handle it if the field exists in the schema\n traverseFields({\n callback,\n callbackStack: _callbackStack,\n config,\n fields,\n fillEmpty,\n isTopLevel: false,\n leavesFirst,\n parentIsLocalized,\n parentPath,\n parentRef,\n ref,\n })\n }\n })\n }\n}\n"],"names":["fieldAffectsData","fieldHasSubFields","fieldShouldBeLocalized","tabHasName","traverseArrayOrBlocksField","callback","callbackStack","config","data","field","fillEmpty","leavesFirst","parentIsLocalized","parentPath","parentRef","type","traverseFields","fields","isTopLevel","localized","name","_block","blockReferences","blocks","block","find","b","slug","ref","blockType","_callbackStack","fieldsMatched","some","skip","next","push","currentRef","currentParentRef","tab","tabs","tabIsLocalized","tabRef","en","key","Array","isArray","localeData","reverse","forEach","cb","Object","keys","includes","firstDotIndex","indexOf","fieldName","substring","remainingPath","nestedRef"],"mappings":"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"}
|
|
@@ -48,6 +48,118 @@ describe('traverseFields', ()=>{
|
|
|
48
48
|
});
|
|
49
49
|
});
|
|
50
50
|
});
|
|
51
|
+
describe('parent localization', ()=>{
|
|
52
|
+
it('should preserve parent localization through tabs', ()=>{
|
|
53
|
+
const fields = [
|
|
54
|
+
{
|
|
55
|
+
name: 'group',
|
|
56
|
+
type: 'group',
|
|
57
|
+
localized: true,
|
|
58
|
+
fields: [
|
|
59
|
+
{
|
|
60
|
+
type: 'tabs',
|
|
61
|
+
tabs: [
|
|
62
|
+
{
|
|
63
|
+
label: 'Tab',
|
|
64
|
+
fields: [
|
|
65
|
+
{
|
|
66
|
+
name: 'text',
|
|
67
|
+
type: 'text'
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
];
|
|
76
|
+
let textParentIsLocalized;
|
|
77
|
+
traverseFields({
|
|
78
|
+
fields,
|
|
79
|
+
callback: ({ field, parentIsLocalized })=>{
|
|
80
|
+
if (field.type === 'text') {
|
|
81
|
+
textParentIsLocalized = parentIsLocalized;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
expect(textParentIsLocalized).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('should traverse localized tabs within localized parents', ()=>{
|
|
88
|
+
let textParentIsLocalized;
|
|
89
|
+
traverseFields({
|
|
90
|
+
callback: ({ field, parentIsLocalized })=>{
|
|
91
|
+
if (field.type === 'text') {
|
|
92
|
+
textParentIsLocalized = parentIsLocalized;
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
fields: [
|
|
96
|
+
{
|
|
97
|
+
name: 'group',
|
|
98
|
+
type: 'group',
|
|
99
|
+
localized: true,
|
|
100
|
+
fields: [
|
|
101
|
+
{
|
|
102
|
+
type: 'tabs',
|
|
103
|
+
tabs: [
|
|
104
|
+
{
|
|
105
|
+
name: 'tab',
|
|
106
|
+
localized: true,
|
|
107
|
+
fields: [
|
|
108
|
+
{
|
|
109
|
+
name: 'text',
|
|
110
|
+
type: 'text'
|
|
111
|
+
}
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
],
|
|
119
|
+
ref: {
|
|
120
|
+
group: {
|
|
121
|
+
en: {
|
|
122
|
+
tab: {
|
|
123
|
+
text: 'value'
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
expect(textParentIsLocalized).toBe(true);
|
|
130
|
+
});
|
|
131
|
+
it('should preserve parent localization through collapsibles', ()=>{
|
|
132
|
+
const fields = [
|
|
133
|
+
{
|
|
134
|
+
name: 'group',
|
|
135
|
+
type: 'group',
|
|
136
|
+
localized: true,
|
|
137
|
+
fields: [
|
|
138
|
+
{
|
|
139
|
+
type: 'collapsible',
|
|
140
|
+
label: 'Collapsible',
|
|
141
|
+
fields: [
|
|
142
|
+
{
|
|
143
|
+
name: 'text',
|
|
144
|
+
type: 'text'
|
|
145
|
+
}
|
|
146
|
+
]
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
150
|
+
];
|
|
151
|
+
let textParentIsLocalized;
|
|
152
|
+
traverseFields({
|
|
153
|
+
fields,
|
|
154
|
+
callback: ({ field, parentIsLocalized })=>{
|
|
155
|
+
if (field.type === 'text') {
|
|
156
|
+
textParentIsLocalized = parentIsLocalized;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
expect(textParentIsLocalized).toBe(true);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
51
163
|
});
|
|
52
164
|
|
|
53
165
|
//# sourceMappingURL=traverseFields.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utilities/traverseFields.spec.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest'\nimport { traverseFields } from './traverseFields.js'\nimport { Field } from '../fields/config/types.js'\n\ndescribe('traverseFields', () => {\n const tabsField: Field = {\n type: 'tabs',\n tabs: [\n {\n label: 'Tab 1',\n name: 'tab1',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Ui Only Tab',\n fields: [\n {\n type: 'group',\n name: 'group1',\n label: 'Group 1',\n fields: [\n {\n type: 'text',\n name: 'text1',\n label: 'Text 1',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n }\n\n describe('tabs traversal', () => {\n it('should return correct dot notation in parentPath', () => {\n traverseFields({\n fields: [tabsField],\n callback: ({ field, parentPath }) => {\n if (field.type === 'text' && field.name === 'text1') {\n expect(parentPath).toEqual('tab1.group1.')\n }\n },\n })\n })\n })\n})\n"],"names":["describe","it","expect","traverseFields","tabsField","type","tabs","label","name","fields","callback","field","parentPath","toEqual"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAC7C,SAASC,cAAc,QAAQ,sBAAqB;AAGpDH,SAAS,kBAAkB;IACzB,MAAMI,YAAmB;QACvBC,MAAM;QACNC,MAAM;YACJ;gBACEC,OAAO;gBACPC,MAAM;gBACNC,QAAQ;oBACN;wBACEJ,MAAM;wBACNC,MAAM;4BACJ;gCACEC,OAAO;gCACPE,QAAQ;oCACN;wCACEJ,MAAM;wCACNG,MAAM;wCACND,OAAO;wCACPE,QAAQ;4CACN;gDACEJ,MAAM;gDACNG,MAAM;gDACND,OAAO;4CACT;yCACD;oCACH;iCACD;4BACH;yBACD;oBACH;iBACD;YACH;SACD;IACH;IAEAP,SAAS,kBAAkB;QACzBC,GAAG,oDAAoD;YACrDE,eAAe;gBACbM,QAAQ;oBAACL;iBAAU;gBACnBM,UAAU,CAAC,EAAEC,KAAK,EAAEC,UAAU,EAAE;oBAC9B,IAAID,MAAMN,IAAI,KAAK,UAAUM,MAAMH,IAAI,KAAK,SAAS;wBACnDN,OAAOU,YAAYC,OAAO,CAAC;oBAC7B;gBACF;YACF;QACF;IACF;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/traverseFields.spec.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest'\nimport { traverseFields } from './traverseFields.js'\nimport type { Field } from '../fields/config/types.js'\n\ndescribe('traverseFields', () => {\n const tabsField: Field = {\n type: 'tabs',\n tabs: [\n {\n label: 'Tab 1',\n name: 'tab1',\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Ui Only Tab',\n fields: [\n {\n type: 'group',\n name: 'group1',\n label: 'Group 1',\n fields: [\n {\n type: 'text',\n name: 'text1',\n label: 'Text 1',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n }\n\n describe('tabs traversal', () => {\n it('should return correct dot notation in parentPath', () => {\n traverseFields({\n fields: [tabsField],\n callback: ({ field, parentPath }) => {\n if (field.type === 'text' && field.name === 'text1') {\n expect(parentPath).toEqual('tab1.group1.')\n }\n },\n })\n })\n })\n\n describe('parent localization', () => {\n it('should preserve parent localization through tabs', () => {\n const fields: Field[] = [\n {\n name: 'group',\n type: 'group',\n localized: true,\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n label: 'Tab',\n fields: [\n {\n name: 'text',\n type: 'text',\n },\n ],\n },\n ],\n },\n ],\n },\n ]\n let textParentIsLocalized: boolean | undefined\n\n traverseFields({\n fields,\n callback: ({ field, parentIsLocalized }) => {\n if (field.type === 'text') {\n textParentIsLocalized = parentIsLocalized\n }\n },\n })\n\n expect(textParentIsLocalized).toBe(true)\n })\n\n it('should traverse localized tabs within localized parents', () => {\n let textParentIsLocalized: boolean | undefined\n\n traverseFields({\n callback: ({ field, parentIsLocalized }) => {\n if (field.type === 'text') {\n textParentIsLocalized = parentIsLocalized\n }\n },\n fields: [\n {\n name: 'group',\n type: 'group',\n localized: true,\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n name: 'tab',\n localized: true,\n fields: [\n {\n name: 'text',\n type: 'text',\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n ref: {\n group: {\n en: {\n tab: {\n text: 'value',\n },\n },\n },\n },\n })\n\n expect(textParentIsLocalized).toBe(true)\n })\n\n it('should preserve parent localization through collapsibles', () => {\n const fields: Field[] = [\n {\n name: 'group',\n type: 'group',\n localized: true,\n fields: [\n {\n type: 'collapsible',\n label: 'Collapsible',\n fields: [\n {\n name: 'text',\n type: 'text',\n },\n ],\n },\n ],\n },\n ]\n let textParentIsLocalized: boolean | undefined\n\n traverseFields({\n fields,\n callback: ({ field, parentIsLocalized }) => {\n if (field.type === 'text') {\n textParentIsLocalized = parentIsLocalized\n }\n },\n })\n\n expect(textParentIsLocalized).toBe(true)\n })\n })\n})\n"],"names":["describe","it","expect","traverseFields","tabsField","type","tabs","label","name","fields","callback","field","parentPath","toEqual","localized","textParentIsLocalized","parentIsLocalized","toBe","ref","group","en","tab","text"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,EAAE,EAAEC,MAAM,QAAQ,SAAQ;AAC7C,SAASC,cAAc,QAAQ,sBAAqB;AAGpDH,SAAS,kBAAkB;IACzB,MAAMI,YAAmB;QACvBC,MAAM;QACNC,MAAM;YACJ;gBACEC,OAAO;gBACPC,MAAM;gBACNC,QAAQ;oBACN;wBACEJ,MAAM;wBACNC,MAAM;4BACJ;gCACEC,OAAO;gCACPE,QAAQ;oCACN;wCACEJ,MAAM;wCACNG,MAAM;wCACND,OAAO;wCACPE,QAAQ;4CACN;gDACEJ,MAAM;gDACNG,MAAM;gDACND,OAAO;4CACT;yCACD;oCACH;iCACD;4BACH;yBACD;oBACH;iBACD;YACH;SACD;IACH;IAEAP,SAAS,kBAAkB;QACzBC,GAAG,oDAAoD;YACrDE,eAAe;gBACbM,QAAQ;oBAACL;iBAAU;gBACnBM,UAAU,CAAC,EAAEC,KAAK,EAAEC,UAAU,EAAE;oBAC9B,IAAID,MAAMN,IAAI,KAAK,UAAUM,MAAMH,IAAI,KAAK,SAAS;wBACnDN,OAAOU,YAAYC,OAAO,CAAC;oBAC7B;gBACF;YACF;QACF;IACF;IAEAb,SAAS,uBAAuB;QAC9BC,GAAG,oDAAoD;YACrD,MAAMQ,SAAkB;gBACtB;oBACED,MAAM;oBACNH,MAAM;oBACNS,WAAW;oBACXL,QAAQ;wBACN;4BACEJ,MAAM;4BACNC,MAAM;gCACJ;oCACEC,OAAO;oCACPE,QAAQ;wCACN;4CACED,MAAM;4CACNH,MAAM;wCACR;qCACD;gCACH;6BACD;wBACH;qBACD;gBACH;aACD;YACD,IAAIU;YAEJZ,eAAe;gBACbM;gBACAC,UAAU,CAAC,EAAEC,KAAK,EAAEK,iBAAiB,EAAE;oBACrC,IAAIL,MAAMN,IAAI,KAAK,QAAQ;wBACzBU,wBAAwBC;oBAC1B;gBACF;YACF;YAEAd,OAAOa,uBAAuBE,IAAI,CAAC;QACrC;QAEAhB,GAAG,2DAA2D;YAC5D,IAAIc;YAEJZ,eAAe;gBACbO,UAAU,CAAC,EAAEC,KAAK,EAAEK,iBAAiB,EAAE;oBACrC,IAAIL,MAAMN,IAAI,KAAK,QAAQ;wBACzBU,wBAAwBC;oBAC1B;gBACF;gBACAP,QAAQ;oBACN;wBACED,MAAM;wBACNH,MAAM;wBACNS,WAAW;wBACXL,QAAQ;4BACN;gCACEJ,MAAM;gCACNC,MAAM;oCACJ;wCACEE,MAAM;wCACNM,WAAW;wCACXL,QAAQ;4CACN;gDACED,MAAM;gDACNH,MAAM;4CACR;yCACD;oCACH;iCACD;4BACH;yBACD;oBACH;iBACD;gBACDa,KAAK;oBACHC,OAAO;wBACLC,IAAI;4BACFC,KAAK;gCACHC,MAAM;4BACR;wBACF;oBACF;gBACF;YACF;YAEApB,OAAOa,uBAAuBE,IAAI,CAAC;QACrC;QAEAhB,GAAG,4DAA4D;YAC7D,MAAMQ,SAAkB;gBACtB;oBACED,MAAM;oBACNH,MAAM;oBACNS,WAAW;oBACXL,QAAQ;wBACN;4BACEJ,MAAM;4BACNE,OAAO;4BACPE,QAAQ;gCACN;oCACED,MAAM;oCACNH,MAAM;gCACR;6BACD;wBACH;qBACD;gBACH;aACD;YACD,IAAIU;YAEJZ,eAAe;gBACbM;gBACAC,UAAU,CAAC,EAAEC,KAAK,EAAEK,iBAAiB,EAAE;oBACrC,IAAIL,MAAMN,IAAI,KAAK,QAAQ;wBACzBU,wBAAwBC;oBAC1B;gBACF;YACF;YAEAd,OAAOa,uBAAuBE,IAAI,CAAC;QACrC;IACF;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unflattenData.d.ts","sourceRoot":"","sources":["../../src/utilities/unflattenData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAInD,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,UAAU,QAAQ,CAAC,KAAG,CAc7D,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { unflatten } from './unflatten.js';
|
|
2
|
+
export const unflattenData = (data)=>{
|
|
3
|
+
if (!data || typeof data !== 'object' || !Object.keys(data).some((key)=>key.includes('.'))) {
|
|
4
|
+
return data;
|
|
5
|
+
}
|
|
6
|
+
const unflattened = unflatten(data);
|
|
7
|
+
for (const key of Object.keys(data)){
|
|
8
|
+
delete data[key];
|
|
9
|
+
}
|
|
10
|
+
Object.assign(data, unflattened);
|
|
11
|
+
return data;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=unflattenData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utilities/unflattenData.ts"],"sourcesContent":["import type { JsonObject } from '../types/index.js'\n\nimport { unflatten } from './unflatten.js'\n\nexport const unflattenData = <T extends JsonObject>(data: T): T => {\n if (!data || typeof data !== 'object' || !Object.keys(data).some((key) => key.includes('.'))) {\n return data\n }\n\n const unflattened = unflatten(data) as JsonObject\n\n for (const key of Object.keys(data)) {\n delete data[key]\n }\n\n Object.assign(data, unflattened)\n\n return data\n}\n"],"names":["unflatten","unflattenData","data","Object","keys","some","key","includes","unflattened","assign"],"mappings":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAE1C,OAAO,MAAMC,gBAAgB,CAAuBC;IAClD,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAY,CAACC,OAAOC,IAAI,CAACF,MAAMG,IAAI,CAAC,CAACC,MAAQA,IAAIC,QAAQ,CAAC,OAAO;QAC5F,OAAOL;IACT;IAEA,MAAMM,cAAcR,UAAUE;IAE9B,KAAK,MAAMI,OAAOH,OAAOC,IAAI,CAACF,MAAO;QACnC,OAAOA,IAAI,CAACI,IAAI;IAClB;IAEAH,OAAOM,MAAM,CAACP,MAAMM;IAEpB,OAAON;AACT,EAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "payload",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.87.1",
|
|
4
4
|
"description": "Node, React, Headless CMS and Application Framework built on Next.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"admin panel",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"file-type": "21.3.4",
|
|
99
99
|
"get-tsconfig": "4.8.1",
|
|
100
100
|
"http-status": "2.1.0",
|
|
101
|
-
"image-
|
|
101
|
+
"image-dimensions": "2.5.1",
|
|
102
102
|
"ipaddr.js": "2.2.0",
|
|
103
103
|
"jose": "5.10.0",
|
|
104
104
|
"json-schema-to-typescript": "15.0.3",
|
|
@@ -112,10 +112,10 @@
|
|
|
112
112
|
"sanitize-filename": "1.6.3",
|
|
113
113
|
"ts-essentials": "10.0.3",
|
|
114
114
|
"tsx": "4.22.4",
|
|
115
|
-
"undici": "7.
|
|
115
|
+
"undici": "7.29.0",
|
|
116
116
|
"uuid": "13.0.2",
|
|
117
117
|
"ws": "^8.16.0",
|
|
118
|
-
"@payloadcms/translations": "3.
|
|
118
|
+
"@payloadcms/translations": "3.87.1"
|
|
119
119
|
},
|
|
120
120
|
"devDependencies": {
|
|
121
121
|
"@hyrious/esbuild-plugin-commonjs": "0.2.6",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tempFile.d.ts","sourceRoot":"","sources":["../../src/uploads/tempFile.ts"],"names":[],"mappings":"AAaA,KAAK,OAAO,GAAG;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,iBAAiB,aAClB,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,YACxC,OAAO,iBAIjB,CAAA"}
|
package/dist/uploads/tempFile.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { v4 as uuid } from 'uuid';
|
|
5
|
-
async function runTask(temporaryPath, callback) {
|
|
6
|
-
try {
|
|
7
|
-
return await callback(temporaryPath);
|
|
8
|
-
} finally{
|
|
9
|
-
await fs.rm(temporaryPath, {
|
|
10
|
-
force: true,
|
|
11
|
-
maxRetries: 2,
|
|
12
|
-
recursive: true
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
export const temporaryFileTask = async (callback, options = {})=>{
|
|
17
|
-
const filePath = await temporaryFile(options);
|
|
18
|
-
return runTask(filePath, callback);
|
|
19
|
-
};
|
|
20
|
-
async function temporaryFile(options) {
|
|
21
|
-
if (options.name) {
|
|
22
|
-
if (options.extension !== undefined && options.extension !== null) {
|
|
23
|
-
throw new Error('The `name` and `extension` options are mutually exclusive');
|
|
24
|
-
}
|
|
25
|
-
return path.join(await temporaryDirectory(), options.name);
|
|
26
|
-
}
|
|
27
|
-
return await getPath() + (options.extension === undefined || options.extension === null ? '' : '.' + options.extension.replace(/^\./, ''));
|
|
28
|
-
}
|
|
29
|
-
async function temporaryDirectory({ prefix = '' } = {}) {
|
|
30
|
-
const directory = await getPath(prefix);
|
|
31
|
-
await fs.mkdir(directory);
|
|
32
|
-
return directory;
|
|
33
|
-
}
|
|
34
|
-
async function getPath(prefix = '') {
|
|
35
|
-
const temporaryDirectory = await fs.realpath(os.tmpdir());
|
|
36
|
-
return path.join(temporaryDirectory, prefix + uuid());
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
//# sourceMappingURL=tempFile.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/uploads/tempFile.ts"],"sourcesContent":["import fs from 'fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { v4 as uuid } from 'uuid'\n\nasync function runTask(temporaryPath: string, callback: (temporaryPath: string) => Promise<any>) {\n try {\n return await callback(temporaryPath)\n } finally {\n await fs.rm(temporaryPath, { force: true, maxRetries: 2, recursive: true })\n }\n}\n\ntype Options = {\n extension?: string\n name?: string\n}\n\nexport const temporaryFileTask = async (\n callback: (temporaryPath: string) => Promise<any>,\n options: Options = {},\n) => {\n const filePath = await temporaryFile(options)\n return runTask(filePath, callback)\n}\n\nasync function temporaryFile(options: Options) {\n if (options.name) {\n if (options.extension !== undefined && options.extension !== null) {\n throw new Error('The `name` and `extension` options are mutually exclusive')\n }\n\n return path.join(await temporaryDirectory(), options.name)\n }\n\n return (\n (await getPath()) +\n (options.extension === undefined || options.extension === null\n ? ''\n : '.' + options.extension.replace(/^\\./, ''))\n )\n}\n\nasync function temporaryDirectory({ prefix = '' } = {}) {\n const directory = await getPath(prefix)\n await fs.mkdir(directory)\n return directory\n}\n\nasync function getPath(prefix = ''): Promise<string> {\n const temporaryDirectory = await fs.realpath(os.tmpdir())\n return path.join(temporaryDirectory, prefix + uuid())\n}\n"],"names":["fs","os","path","v4","uuid","runTask","temporaryPath","callback","rm","force","maxRetries","recursive","temporaryFileTask","options","filePath","temporaryFile","name","extension","undefined","Error","join","temporaryDirectory","getPath","replace","prefix","directory","mkdir","realpath","tmpdir"],"mappings":"AAAA,OAAOA,QAAQ,cAAa;AAC5B,OAAOC,QAAQ,UAAS;AACxB,OAAOC,UAAU,YAAW;AAC5B,SAASC,MAAMC,IAAI,QAAQ,OAAM;AAEjC,eAAeC,QAAQC,aAAqB,EAAEC,QAAiD;IAC7F,IAAI;QACF,OAAO,MAAMA,SAASD;IACxB,SAAU;QACR,MAAMN,GAAGQ,EAAE,CAACF,eAAe;YAAEG,OAAO;YAAMC,YAAY;YAAGC,WAAW;QAAK;IAC3E;AACF;AAOA,OAAO,MAAMC,oBAAoB,OAC/BL,UACAM,UAAmB,CAAC,CAAC;IAErB,MAAMC,WAAW,MAAMC,cAAcF;IACrC,OAAOR,QAAQS,UAAUP;AAC3B,EAAC;AAED,eAAeQ,cAAcF,OAAgB;IAC3C,IAAIA,QAAQG,IAAI,EAAE;QAChB,IAAIH,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,MAAM;YACjE,MAAM,IAAIE,MAAM;QAClB;QAEA,OAAOjB,KAAKkB,IAAI,CAAC,MAAMC,sBAAsBR,QAAQG,IAAI;IAC3D;IAEA,OACE,AAAC,MAAMM,YACNT,CAAAA,QAAQI,SAAS,KAAKC,aAAaL,QAAQI,SAAS,KAAK,OACtD,KACA,MAAMJ,QAAQI,SAAS,CAACM,OAAO,CAAC,OAAO,GAAE;AAEjD;AAEA,eAAeF,mBAAmB,EAAEG,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;IACpD,MAAMC,YAAY,MAAMH,QAAQE;IAChC,MAAMxB,GAAG0B,KAAK,CAACD;IACf,OAAOA;AACT;AAEA,eAAeH,QAAQE,SAAS,EAAE;IAChC,MAAMH,qBAAqB,MAAMrB,GAAG2B,QAAQ,CAAC1B,GAAG2B,MAAM;IACtD,OAAO1B,KAAKkB,IAAI,CAACC,oBAAoBG,SAASpB;AAChD"}
|