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.
Files changed (72) hide show
  1. package/dist/collections/operations/count.d.ts.map +1 -1
  2. package/dist/collections/operations/count.js +1 -0
  3. package/dist/collections/operations/count.js.map +1 -1
  4. package/dist/collections/operations/updateByID.d.ts.map +1 -1
  5. package/dist/collections/operations/updateByID.js +1 -0
  6. package/dist/collections/operations/updateByID.js.map +1 -1
  7. package/dist/fields/config/types.js +1 -1
  8. package/dist/fields/config/types.js.map +1 -1
  9. package/dist/fields/hooks/beforeValidate/promise.d.ts.map +1 -1
  10. package/dist/fields/hooks/beforeValidate/promise.js +5 -3
  11. package/dist/fields/hooks/beforeValidate/promise.js.map +1 -1
  12. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts +10 -0
  13. package/dist/fields/hooks/beforeValidate/stripNullRows.d.ts.map +1 -0
  14. package/dist/fields/hooks/beforeValidate/stripNullRows.js +18 -0
  15. package/dist/fields/hooks/beforeValidate/stripNullRows.js.map +1 -0
  16. package/dist/fields/hooks/beforeValidate/traverseFields.d.ts.map +1 -1
  17. package/dist/fields/hooks/beforeValidate/traverseFields.js +2 -0
  18. package/dist/fields/hooks/beforeValidate/traverseFields.js.map +1 -1
  19. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.d.ts.map +1 -1
  20. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js +1 -0
  21. package/dist/folders/utils/getFoldersAndDocumentsFromJoin.js.map +1 -1
  22. package/dist/globals/operations/countGlobalVersions.d.ts.map +1 -1
  23. package/dist/globals/operations/countGlobalVersions.js +1 -0
  24. package/dist/globals/operations/countGlobalVersions.js.map +1 -1
  25. package/dist/index.bundled.d.ts +71 -15
  26. package/dist/index.d.ts +4 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -7
  29. package/dist/index.js.map +1 -1
  30. package/dist/uploads/generateFileData.js +4 -1
  31. package/dist/uploads/generateFileData.js.map +1 -1
  32. package/dist/uploads/getImageSize.d.ts +12 -1
  33. package/dist/uploads/getImageSize.d.ts.map +1 -1
  34. package/dist/uploads/getImageSize.js +20 -18
  35. package/dist/uploads/getImageSize.js.map +1 -1
  36. package/dist/uploads/getImageSize.spec.js +298 -0
  37. package/dist/uploads/getImageSize.spec.js.map +1 -0
  38. package/dist/uploads/probeImageSize.d.ts +39 -0
  39. package/dist/uploads/probeImageSize.d.ts.map +1 -0
  40. package/dist/uploads/probeImageSize.js +374 -0
  41. package/dist/uploads/probeImageSize.js.map +1 -0
  42. package/dist/uploads/probeImageSize.spec.js +366 -0
  43. package/dist/uploads/probeImageSize.spec.js.map +1 -0
  44. package/dist/utilities/getNextJsHMRURL.d.ts +6 -0
  45. package/dist/utilities/getNextJsHMRURL.d.ts.map +1 -0
  46. package/dist/utilities/getNextJsHMRURL.js +33 -0
  47. package/dist/utilities/getNextJsHMRURL.js.map +1 -0
  48. package/dist/utilities/getNextJsHMRURL.spec.js +60 -0
  49. package/dist/utilities/getNextJsHMRURL.spec.js.map +1 -0
  50. package/dist/utilities/getNextVersion.d.ts +7 -0
  51. package/dist/utilities/getNextVersion.d.ts.map +1 -0
  52. package/dist/utilities/getNextVersion.js +20 -0
  53. package/dist/utilities/getNextVersion.js.map +1 -0
  54. package/dist/utilities/getNextVersion.spec.js +16 -0
  55. package/dist/utilities/getNextVersion.spec.js.map +1 -0
  56. package/dist/utilities/parseParams/index.d.ts +2 -3
  57. package/dist/utilities/parseParams/index.d.ts.map +1 -1
  58. package/dist/utilities/parseParams/index.js.map +1 -1
  59. package/dist/utilities/traverseFields.d.ts.map +1 -1
  60. package/dist/utilities/traverseFields.js +20 -22
  61. package/dist/utilities/traverseFields.js.map +1 -1
  62. package/dist/utilities/traverseFields.spec.js +112 -0
  63. package/dist/utilities/traverseFields.spec.js.map +1 -1
  64. package/dist/utilities/unflattenData.d.ts +3 -0
  65. package/dist/utilities/unflattenData.d.ts.map +1 -0
  66. package/dist/utilities/unflattenData.js +14 -0
  67. package/dist/utilities/unflattenData.js.map +1 -0
  68. package/package.json +4 -4
  69. package/dist/uploads/tempFile.d.ts +0 -7
  70. package/dist/uploads/tempFile.d.ts.map +0 -1
  71. package/dist/uploads/tempFile.js +0 -39
  72. 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\ntype 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\ntype 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
+ {"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,IA0WvB,CAAA"}
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: 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: 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 (tab.localized) {
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: 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: 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 (tab.localized) {
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: 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: parentIsLocalized,
201
+ parentIsLocalized,
198
202
  parentPath,
199
203
  parentRef: currentParentRef,
200
204
  ref: tabRef
201
205
  }));
202
206
  }
203
207
  }
204
- if (!tab.localized) {
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: false,
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: 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: 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: 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: parentIsLocalized ?? false
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: 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,3 @@
1
+ import type { JsonObject } from '../types/index.js';
2
+ export declare const unflattenData: <T extends JsonObject>(data: T) => T;
3
+ //# sourceMappingURL=unflattenData.d.ts.map
@@ -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.86.0",
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-size": "2.0.2",
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.28.0",
115
+ "undici": "7.29.0",
116
116
  "uuid": "13.0.2",
117
117
  "ws": "^8.16.0",
118
- "@payloadcms/translations": "3.86.0"
118
+ "@payloadcms/translations": "3.87.1"
119
119
  },
120
120
  "devDependencies": {
121
121
  "@hyrious/esbuild-plugin-commonjs": "0.2.6",
@@ -1,7 +0,0 @@
1
- type Options = {
2
- extension?: string;
3
- name?: string;
4
- };
5
- export declare const temporaryFileTask: (callback: (temporaryPath: string) => Promise<any>, options?: Options) => Promise<any>;
6
- export {};
7
- //# sourceMappingURL=tempFile.d.ts.map
@@ -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"}
@@ -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"}