@payloadcms/db-mongodb 3.24.0-canary.72057b1 → 3.24.0-canary.80e034e

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 (132) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +5 -2
  3. package/dist/count.js.map +1 -1
  4. package/dist/countGlobalVersions.d.ts.map +1 -1
  5. package/dist/countGlobalVersions.js +5 -3
  6. package/dist/countGlobalVersions.js.map +1 -1
  7. package/dist/countVersions.d.ts.map +1 -1
  8. package/dist/countVersions.js +5 -3
  9. package/dist/countVersions.js.map +1 -1
  10. package/dist/create.js +15 -15
  11. package/dist/create.js.map +1 -1
  12. package/dist/createGlobal.d.ts.map +1 -1
  13. package/dist/createGlobal.js +15 -14
  14. package/dist/createGlobal.js.map +1 -1
  15. package/dist/createGlobalVersion.d.ts.map +1 -1
  16. package/dist/createGlobalVersion.js +26 -23
  17. package/dist/createGlobalVersion.js.map +1 -1
  18. package/dist/createVersion.d.ts.map +1 -1
  19. package/dist/createVersion.js +26 -31
  20. package/dist/createVersion.js.map +1 -1
  21. package/dist/deleteMany.d.ts.map +1 -1
  22. package/dist/deleteMany.js +5 -2
  23. package/dist/deleteMany.js.map +1 -1
  24. package/dist/deleteOne.d.ts.map +1 -1
  25. package/dist/deleteOne.js +17 -9
  26. package/dist/deleteOne.js.map +1 -1
  27. package/dist/deleteVersions.d.ts +1 -1
  28. package/dist/deleteVersions.d.ts.map +1 -1
  29. package/dist/deleteVersions.js +5 -2
  30. package/dist/deleteVersions.js.map +1 -1
  31. package/dist/find.d.ts.map +1 -1
  32. package/dist/find.js +13 -11
  33. package/dist/find.js.map +1 -1
  34. package/dist/findGlobal.d.ts.map +1 -1
  35. package/dist/findGlobal.js +15 -11
  36. package/dist/findGlobal.js.map +1 -1
  37. package/dist/findGlobalVersions.d.ts.map +1 -1
  38. package/dist/findGlobalVersions.js +14 -13
  39. package/dist/findGlobalVersions.js.map +1 -1
  40. package/dist/findOne.d.ts.map +1 -1
  41. package/dist/findOne.js +13 -8
  42. package/dist/findOne.js.map +1 -1
  43. package/dist/findVersions.d.ts.map +1 -1
  44. package/dist/findVersions.js +14 -12
  45. package/dist/findVersions.js.map +1 -1
  46. package/dist/init.d.ts.map +1 -1
  47. package/dist/init.js +25 -17
  48. package/dist/init.js.map +1 -1
  49. package/dist/models/buildCollectionSchema.d.ts.map +1 -1
  50. package/dist/models/buildCollectionSchema.js +14 -18
  51. package/dist/models/buildCollectionSchema.js.map +1 -1
  52. package/dist/models/buildGlobalModel.d.ts.map +1 -1
  53. package/dist/models/buildGlobalModel.js +9 -5
  54. package/dist/models/buildGlobalModel.js.map +1 -1
  55. package/dist/models/buildSchema.d.ts +6 -1
  56. package/dist/models/buildSchema.d.ts.map +1 -1
  57. package/dist/models/buildSchema.js +227 -103
  58. package/dist/models/buildSchema.js.map +1 -1
  59. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.d.ts.map +1 -1
  60. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js +20 -8
  61. package/dist/predefinedMigrations/migrateRelationshipsV2_V3.js.map +1 -1
  62. package/dist/queries/buildAndOrConditions.d.ts +2 -1
  63. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  64. package/dist/queries/buildAndOrConditions.js +2 -1
  65. package/dist/queries/buildAndOrConditions.js.map +1 -1
  66. package/dist/queries/buildQuery.d.ts +6 -9
  67. package/dist/queries/buildQuery.d.ts.map +1 -1
  68. package/dist/queries/buildQuery.js +11 -34
  69. package/dist/queries/buildQuery.js.map +1 -1
  70. package/dist/queries/buildSearchParams.d.ts +2 -1
  71. package/dist/queries/buildSearchParams.d.ts.map +1 -1
  72. package/dist/queries/buildSearchParams.js +4 -1
  73. package/dist/queries/buildSearchParams.js.map +1 -1
  74. package/dist/queries/buildSortParam.d.ts +2 -1
  75. package/dist/queries/buildSortParam.d.ts.map +1 -1
  76. package/dist/queries/buildSortParam.js +2 -1
  77. package/dist/queries/buildSortParam.js.map +1 -1
  78. package/dist/queries/getBuildQueryPlugin.d.ts +14 -0
  79. package/dist/queries/getBuildQueryPlugin.d.ts.map +1 -0
  80. package/dist/queries/getBuildQueryPlugin.js +40 -0
  81. package/dist/queries/getBuildQueryPlugin.js.map +1 -0
  82. package/dist/queries/getLocalizedSortProperty.d.ts +2 -1
  83. package/dist/queries/getLocalizedSortProperty.d.ts.map +1 -1
  84. package/dist/queries/getLocalizedSortProperty.js +14 -4
  85. package/dist/queries/getLocalizedSortProperty.js.map +1 -1
  86. package/dist/queries/parseParams.d.ts +2 -1
  87. package/dist/queries/parseParams.d.ts.map +1 -1
  88. package/dist/queries/parseParams.js +3 -1
  89. package/dist/queries/parseParams.js.map +1 -1
  90. package/dist/queries/sanitizeQueryValue.d.ts +2 -1
  91. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  92. package/dist/queries/sanitizeQueryValue.js +14 -5
  93. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  94. package/dist/queryDrafts.d.ts.map +1 -1
  95. package/dist/queryDrafts.js +19 -16
  96. package/dist/queryDrafts.js.map +1 -1
  97. package/dist/types.d.ts +1 -1
  98. package/dist/types.d.ts.map +1 -1
  99. package/dist/types.js.map +1 -1
  100. package/dist/updateGlobal.d.ts.map +1 -1
  101. package/dist/updateGlobal.js +15 -12
  102. package/dist/updateGlobal.js.map +1 -1
  103. package/dist/updateGlobalVersion.d.ts.map +1 -1
  104. package/dist/updateGlobalVersion.js +21 -15
  105. package/dist/updateGlobalVersion.js.map +1 -1
  106. package/dist/updateOne.js +20 -11
  107. package/dist/updateOne.js.map +1 -1
  108. package/dist/updateVersion.d.ts.map +1 -1
  109. package/dist/updateVersion.js +21 -15
  110. package/dist/updateVersion.js.map +1 -1
  111. package/dist/utilities/buildJoinAggregation.d.ts.map +1 -1
  112. package/dist/utilities/buildJoinAggregation.js +155 -4
  113. package/dist/utilities/buildJoinAggregation.js.map +1 -1
  114. package/dist/utilities/buildProjectionFromSelect.d.ts.map +1 -1
  115. package/dist/utilities/buildProjectionFromSelect.js +20 -18
  116. package/dist/utilities/buildProjectionFromSelect.js.map +1 -1
  117. package/dist/utilities/transform.d.ts +27 -0
  118. package/dist/utilities/transform.d.ts.map +1 -0
  119. package/dist/utilities/transform.js +224 -0
  120. package/dist/utilities/transform.js.map +1 -0
  121. package/dist/utilities/{sanitizeRelationshipIDs.spec.js → transform.spec.js} +55 -5
  122. package/dist/utilities/transform.spec.js.map +1 -0
  123. package/package.json +3 -3
  124. package/dist/utilities/sanitizeInternalFields.d.ts +0 -2
  125. package/dist/utilities/sanitizeInternalFields.d.ts.map +0 -1
  126. package/dist/utilities/sanitizeInternalFields.js +0 -20
  127. package/dist/utilities/sanitizeInternalFields.js.map +0 -1
  128. package/dist/utilities/sanitizeRelationshipIDs.d.ts +0 -9
  129. package/dist/utilities/sanitizeRelationshipIDs.d.ts.map +0 -1
  130. package/dist/utilities/sanitizeRelationshipIDs.js +0 -125
  131. package/dist/utilities/sanitizeRelationshipIDs.js.map +0 -1
  132. package/dist/utilities/sanitizeRelationshipIDs.spec.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { getLocalizedSortProperty } from './getLocalizedSortProperty.js';
2
- export const buildSortParam = ({ config, fields, locale, sort, timestamps })=>{
2
+ export const buildSortParam = ({ config, fields, locale, parentIsLocalized, sort, timestamps })=>{
3
3
  if (!sort) {
4
4
  if (timestamps) {
5
5
  sort = '-createdAt';
@@ -30,6 +30,7 @@ export const buildSortParam = ({ config, fields, locale, sort, timestamps })=>{
30
30
  config,
31
31
  fields,
32
32
  locale,
33
+ parentIsLocalized,
33
34
  segments: sortProperty.split('.')
34
35
  });
35
36
  acc[localizedProperty] = sortDirection;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/buildSortParam.ts"],"sourcesContent":["import type { PaginateOptions } from 'mongoose'\nimport type { FlattenedField, SanitizedConfig, Sort } from 'payload'\n\nimport { getLocalizedSortProperty } from './getLocalizedSortProperty.js'\n\ntype Args = {\n config: SanitizedConfig\n fields: FlattenedField[]\n locale: string\n sort: Sort\n timestamps: boolean\n}\n\nexport type SortArgs = {\n direction: SortDirection\n property: string\n}[]\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport const buildSortParam = ({\n config,\n fields,\n locale,\n sort,\n timestamps,\n}: Args): PaginateOptions['sort'] => {\n if (!sort) {\n if (timestamps) {\n sort = '-createdAt'\n } else {\n sort = '-id'\n }\n }\n\n if (typeof sort === 'string') {\n sort = [sort]\n }\n\n const sorting = sort.reduce<PaginateOptions['sort']>((acc, item) => {\n let sortProperty: string\n let sortDirection: SortDirection\n if (item.indexOf('-') === 0) {\n sortProperty = item.substring(1)\n sortDirection = 'desc'\n } else {\n sortProperty = item\n sortDirection = 'asc'\n }\n if (sortProperty === 'id') {\n acc['_id'] = sortDirection\n return acc\n }\n const localizedProperty = getLocalizedSortProperty({\n config,\n fields,\n locale,\n segments: sortProperty.split('.'),\n })\n acc[localizedProperty] = sortDirection\n return acc\n }, {})\n\n return sorting\n}\n"],"names":["getLocalizedSortProperty","buildSortParam","config","fields","locale","sort","timestamps","sorting","reduce","acc","item","sortProperty","sortDirection","indexOf","substring","localizedProperty","segments","split"],"mappings":"AAGA,SAASA,wBAAwB,QAAQ,gCAA+B;AAiBxE,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,IAAI,EACJC,UAAU,EACL;IACL,IAAI,CAACD,MAAM;QACT,IAAIC,YAAY;YACdD,OAAO;QACT,OAAO;YACLA,OAAO;QACT;IACF;IAEA,IAAI,OAAOA,SAAS,UAAU;QAC5BA,OAAO;YAACA;SAAK;IACf;IAEA,MAAME,UAAUF,KAAKG,MAAM,CAA0B,CAACC,KAAKC;QACzD,IAAIC;QACJ,IAAIC;QACJ,IAAIF,KAAKG,OAAO,CAAC,SAAS,GAAG;YAC3BF,eAAeD,KAAKI,SAAS,CAAC;YAC9BF,gBAAgB;QAClB,OAAO;YACLD,eAAeD;YACfE,gBAAgB;QAClB;QACA,IAAID,iBAAiB,MAAM;YACzBF,GAAG,CAAC,MAAM,GAAGG;YACb,OAAOH;QACT;QACA,MAAMM,oBAAoBf,yBAAyB;YACjDE;YACAC;YACAC;YACAY,UAAUL,aAAaM,KAAK,CAAC;QAC/B;QACAR,GAAG,CAACM,kBAAkB,GAAGH;QACzB,OAAOH;IACT,GAAG,CAAC;IAEJ,OAAOF;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/queries/buildSortParam.ts"],"sourcesContent":["import type { PaginateOptions } from 'mongoose'\nimport type { FlattenedField, SanitizedConfig, Sort } from 'payload'\n\nimport { getLocalizedSortProperty } from './getLocalizedSortProperty.js'\n\ntype Args = {\n config: SanitizedConfig\n fields: FlattenedField[]\n locale: string\n parentIsLocalized?: boolean\n sort: Sort\n timestamps: boolean\n}\n\nexport type SortArgs = {\n direction: SortDirection\n property: string\n}[]\n\nexport type SortDirection = 'asc' | 'desc'\n\nexport const buildSortParam = ({\n config,\n fields,\n locale,\n parentIsLocalized,\n sort,\n timestamps,\n}: Args): PaginateOptions['sort'] => {\n if (!sort) {\n if (timestamps) {\n sort = '-createdAt'\n } else {\n sort = '-id'\n }\n }\n\n if (typeof sort === 'string') {\n sort = [sort]\n }\n\n const sorting = sort.reduce<PaginateOptions['sort']>((acc, item) => {\n let sortProperty: string\n let sortDirection: SortDirection\n if (item.indexOf('-') === 0) {\n sortProperty = item.substring(1)\n sortDirection = 'desc'\n } else {\n sortProperty = item\n sortDirection = 'asc'\n }\n if (sortProperty === 'id') {\n acc['_id'] = sortDirection\n return acc\n }\n const localizedProperty = getLocalizedSortProperty({\n config,\n fields,\n locale,\n parentIsLocalized,\n segments: sortProperty.split('.'),\n })\n acc[localizedProperty] = sortDirection\n return acc\n }, {})\n\n return sorting\n}\n"],"names":["getLocalizedSortProperty","buildSortParam","config","fields","locale","parentIsLocalized","sort","timestamps","sorting","reduce","acc","item","sortProperty","sortDirection","indexOf","substring","localizedProperty","segments","split"],"mappings":"AAGA,SAASA,wBAAwB,QAAQ,gCAA+B;AAkBxE,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,iBAAiB,EACjBC,IAAI,EACJC,UAAU,EACL;IACL,IAAI,CAACD,MAAM;QACT,IAAIC,YAAY;YACdD,OAAO;QACT,OAAO;YACLA,OAAO;QACT;IACF;IAEA,IAAI,OAAOA,SAAS,UAAU;QAC5BA,OAAO;YAACA;SAAK;IACf;IAEA,MAAME,UAAUF,KAAKG,MAAM,CAA0B,CAACC,KAAKC;QACzD,IAAIC;QACJ,IAAIC;QACJ,IAAIF,KAAKG,OAAO,CAAC,SAAS,GAAG;YAC3BF,eAAeD,KAAKI,SAAS,CAAC;YAC9BF,gBAAgB;QAClB,OAAO;YACLD,eAAeD;YACfE,gBAAgB;QAClB;QACA,IAAID,iBAAiB,MAAM;YACzBF,GAAG,CAAC,MAAM,GAAGG;YACb,OAAOH;QACT;QACA,MAAMM,oBAAoBhB,yBAAyB;YACjDE;YACAC;YACAC;YACAC;YACAY,UAAUL,aAAaM,KAAK,CAAC;QAC/B;QACAR,GAAG,CAACM,kBAAkB,GAAGH;QACzB,OAAOH;IACT,GAAG,CAAC;IAEJ,OAAOF;AACT,EAAC"}
@@ -0,0 +1,14 @@
1
+ import type { FlattenedField, Payload, Where } from 'payload';
2
+ type GetBuildQueryPluginArgs = {
3
+ collectionSlug?: string;
4
+ versionsFields?: FlattenedField[];
5
+ };
6
+ export type BuildQueryArgs = {
7
+ globalSlug?: string;
8
+ locale?: string;
9
+ payload: Payload;
10
+ where: Where;
11
+ };
12
+ export declare const getBuildQueryPlugin: ({ collectionSlug, versionsFields, }?: GetBuildQueryPluginArgs) => (schema: any) => void;
13
+ export {};
14
+ //# sourceMappingURL=getBuildQueryPlugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getBuildQueryPlugin.d.ts","sourceRoot":"","sources":["../../src/queries/getBuildQueryPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAM7D,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,EAAE,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAKD,eAAO,MAAM,mBAAmB,yCAG7B,uBAAuB,0BAwCzB,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { QueryError } from 'payload';
2
+ import { parseParams } from './parseParams.js';
3
+ // This plugin asynchronously builds a list of Mongoose query constraints
4
+ // which can then be used in subsequent Mongoose queries.
5
+ // Deprecated in favor of using simpler buildQuery directly
6
+ export const getBuildQueryPlugin = ({ collectionSlug, versionsFields } = {})=>{
7
+ return function buildQueryPlugin(schema) {
8
+ const modifiedSchema = schema;
9
+ async function schemaBuildQuery({ globalSlug, locale, payload, where }) {
10
+ let fields = versionsFields;
11
+ if (!fields) {
12
+ if (globalSlug) {
13
+ const globalConfig = payload.globals.config.find(({ slug })=>slug === globalSlug);
14
+ fields = globalConfig.flattenedFields;
15
+ }
16
+ if (collectionSlug) {
17
+ const collectionConfig = payload.collections[collectionSlug].config;
18
+ fields = collectionConfig.flattenedFields;
19
+ }
20
+ }
21
+ const errors = [];
22
+ const result = await parseParams({
23
+ collectionSlug,
24
+ fields,
25
+ globalSlug,
26
+ locale,
27
+ parentIsLocalized: false,
28
+ payload,
29
+ where
30
+ });
31
+ if (errors.length > 0) {
32
+ throw new QueryError(errors);
33
+ }
34
+ return result;
35
+ }
36
+ modifiedSchema.statics.buildQuery = schemaBuildQuery;
37
+ };
38
+ };
39
+
40
+ //# sourceMappingURL=getBuildQueryPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/getBuildQueryPlugin.ts"],"sourcesContent":["import type { FlattenedField, Payload, Where } from 'payload'\n\nimport { QueryError } from 'payload'\n\nimport { parseParams } from './parseParams.js'\n\ntype GetBuildQueryPluginArgs = {\n collectionSlug?: string\n versionsFields?: FlattenedField[]\n}\n\nexport type BuildQueryArgs = {\n globalSlug?: string\n locale?: string\n payload: Payload\n where: Where\n}\n\n// This plugin asynchronously builds a list of Mongoose query constraints\n// which can then be used in subsequent Mongoose queries.\n// Deprecated in favor of using simpler buildQuery directly\nexport const getBuildQueryPlugin = ({\n collectionSlug,\n versionsFields,\n}: GetBuildQueryPluginArgs = {}) => {\n return function buildQueryPlugin(schema) {\n const modifiedSchema = schema\n async function schemaBuildQuery({\n globalSlug,\n locale,\n payload,\n where,\n }: BuildQueryArgs): Promise<Record<string, unknown>> {\n let fields = versionsFields\n if (!fields) {\n if (globalSlug) {\n const globalConfig = payload.globals.config.find(({ slug }) => slug === globalSlug)\n fields = globalConfig.flattenedFields\n }\n if (collectionSlug) {\n const collectionConfig = payload.collections[collectionSlug].config\n fields = collectionConfig.flattenedFields\n }\n }\n\n const errors = []\n const result = await parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized: false,\n payload,\n where,\n })\n\n if (errors.length > 0) {\n throw new QueryError(errors)\n }\n\n return result\n }\n modifiedSchema.statics.buildQuery = schemaBuildQuery\n }\n}\n"],"names":["QueryError","parseParams","getBuildQueryPlugin","collectionSlug","versionsFields","buildQueryPlugin","schema","modifiedSchema","schemaBuildQuery","globalSlug","locale","payload","where","fields","globalConfig","globals","config","find","slug","flattenedFields","collectionConfig","collections","errors","result","parentIsLocalized","length","statics","buildQuery"],"mappings":"AAEA,SAASA,UAAU,QAAQ,UAAS;AAEpC,SAASC,WAAW,QAAQ,mBAAkB;AAc9C,yEAAyE;AACzE,yDAAyD;AACzD,2DAA2D;AAC3D,OAAO,MAAMC,sBAAsB,CAAC,EAClCC,cAAc,EACdC,cAAc,EACU,GAAG,CAAC,CAAC;IAC7B,OAAO,SAASC,iBAAiBC,MAAM;QACrC,MAAMC,iBAAiBD;QACvB,eAAeE,iBAAiB,EAC9BC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,KAAK,EACU;YACf,IAAIC,SAAST;YACb,IAAI,CAACS,QAAQ;gBACX,IAAIJ,YAAY;oBACd,MAAMK,eAAeH,QAAQI,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAST;oBACxEI,SAASC,aAAaK,eAAe;gBACvC;gBACA,IAAIhB,gBAAgB;oBAClB,MAAMiB,mBAAmBT,QAAQU,WAAW,CAAClB,eAAe,CAACa,MAAM;oBACnEH,SAASO,iBAAiBD,eAAe;gBAC3C;YACF;YAEA,MAAMG,SAAS,EAAE;YACjB,MAAMC,SAAS,MAAMtB,YAAY;gBAC/BE;gBACAU;gBACAJ;gBACAC;gBACAc,mBAAmB;gBACnBb;gBACAC;YACF;YAEA,IAAIU,OAAOG,MAAM,GAAG,GAAG;gBACrB,MAAM,IAAIzB,WAAWsB;YACvB;YAEA,OAAOC;QACT;QACAhB,eAAemB,OAAO,CAACC,UAAU,GAAGnB;IACtC;AACF,EAAC"}
@@ -3,9 +3,10 @@ type Args = {
3
3
  config: SanitizedConfig;
4
4
  fields: FlattenedField[];
5
5
  locale: string;
6
+ parentIsLocalized: boolean;
6
7
  result?: string;
7
8
  segments: string[];
8
9
  };
9
- export declare const getLocalizedSortProperty: ({ config, fields, locale, result: incomingResult, segments: incomingSegments, }: Args) => string;
10
+ export declare const getLocalizedSortProperty: ({ config, fields, locale, parentIsLocalized, result: incomingResult, segments: incomingSegments, }: Args) => string;
10
11
  export {};
11
12
  //# sourceMappingURL=getLocalizedSortProperty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,oFAMlC,IAAI,KAAG,MA+ET,CAAA"}
1
+ {"version":3,"file":"getLocalizedSortProperty.d.ts","sourceRoot":"","sources":["../../src/queries/getLocalizedSortProperty.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9D,KAAK,IAAI,GAAG;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,OAAO,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,wBAAwB,uGAOlC,IAAI,KAAG,MA0FT,CAAA"}
@@ -1,5 +1,5 @@
1
- import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/shared';
2
- export const getLocalizedSortProperty = ({ config, fields, locale, result: incomingResult, segments: incomingSegments })=>{
1
+ import { fieldAffectsData, fieldIsPresentationalOnly, fieldShouldBeLocalized } from 'payload/shared';
2
+ export const getLocalizedSortProperty = ({ config, fields, locale, parentIsLocalized, result: incomingResult, segments: incomingSegments })=>{
3
3
  // If localization is not enabled, accept exactly
4
4
  // what is sent in
5
5
  if (!config.localization) {
@@ -14,11 +14,15 @@ export const getLocalizedSortProperty = ({ config, fields, locale, result: incom
14
14
  const matchedField = fields.find((field)=>fieldAffectsData(field) && field.name === firstSegment);
15
15
  if (matchedField && !fieldIsPresentationalOnly(matchedField)) {
16
16
  let nextFields;
17
+ let nextParentIsLocalized = parentIsLocalized;
17
18
  const remainingSegments = [
18
19
  ...segments
19
20
  ];
20
21
  let localizedSegment = matchedField.name;
21
- if (matchedField.localized) {
22
+ if (fieldShouldBeLocalized({
23
+ field: matchedField,
24
+ parentIsLocalized
25
+ })) {
22
26
  // Check to see if next segment is a locale
23
27
  if (segments.length > 0) {
24
28
  const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0]);
@@ -36,9 +40,14 @@ export const getLocalizedSortProperty = ({ config, fields, locale, result: incom
36
40
  // If there are subfields, pass them through
37
41
  if (matchedField.type === 'tab' || matchedField.type === 'group' || matchedField.type === 'array') {
38
42
  nextFields = matchedField.flattenedFields;
43
+ if (!nextParentIsLocalized) {
44
+ nextParentIsLocalized = matchedField.localized;
45
+ }
39
46
  }
40
47
  if (matchedField.type === 'blocks') {
41
- nextFields = matchedField.blocks.reduce((flattenedBlockFields, block)=>{
48
+ nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce((flattenedBlockFields, _block)=>{
49
+ // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks
50
+ const block = typeof _block === 'string' ? config.blocks.find((b)=>b.slug === _block) : _block;
42
51
  return [
43
52
  ...flattenedBlockFields,
44
53
  ...block.flattenedFields.filter((blockField)=>fieldAffectsData(blockField) && blockField.name !== 'blockType' && blockField.name !== 'blockName' || !fieldAffectsData(blockField))
@@ -51,6 +60,7 @@ export const getLocalizedSortProperty = ({ config, fields, locale, result: incom
51
60
  config,
52
61
  fields: nextFields,
53
62
  locale,
63
+ parentIsLocalized: nextParentIsLocalized,
54
64
  result,
55
65
  segments: remainingSegments
56
66
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/getLocalizedSortProperty.ts"],"sourcesContent":["import type { FlattenedField, SanitizedConfig } from 'payload'\n\nimport { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/shared'\n\ntype Args = {\n config: SanitizedConfig\n fields: FlattenedField[]\n locale: string\n result?: string\n segments: string[]\n}\n\nexport const getLocalizedSortProperty = ({\n config,\n fields,\n locale,\n result: incomingResult,\n segments: incomingSegments,\n}: Args): string => {\n // If localization is not enabled, accept exactly\n // what is sent in\n if (!config.localization) {\n return incomingSegments.join('.')\n }\n\n const segments = [...incomingSegments]\n\n // Retrieve first segment, and remove from segments\n const firstSegment = segments.shift()\n\n // Attempt to find a matched field\n const matchedField = fields.find(\n (field) => fieldAffectsData(field) && field.name === firstSegment,\n )\n\n if (matchedField && !fieldIsPresentationalOnly(matchedField)) {\n let nextFields: FlattenedField[]\n const remainingSegments = [...segments]\n let localizedSegment = matchedField.name\n\n if (matchedField.localized) {\n // Check to see if next segment is a locale\n if (segments.length > 0) {\n const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0])\n\n // If next segment is locale, remove it from remaining segments\n // and use it to localize the current segment\n if (nextSegmentIsLocale) {\n const nextSegment = remainingSegments.shift()\n localizedSegment = `${matchedField.name}.${nextSegment}`\n }\n } else {\n // If no more segments, but field is localized, use default locale\n localizedSegment = `${matchedField.name}.${locale}`\n }\n }\n\n // If there are subfields, pass them through\n if (\n matchedField.type === 'tab' ||\n matchedField.type === 'group' ||\n matchedField.type === 'array'\n ) {\n nextFields = matchedField.flattenedFields\n }\n\n if (matchedField.type === 'blocks') {\n nextFields = matchedField.blocks.reduce((flattenedBlockFields, block) => {\n return [\n ...flattenedBlockFields,\n ...block.flattenedFields.filter(\n (blockField) =>\n (fieldAffectsData(blockField) &&\n blockField.name !== 'blockType' &&\n blockField.name !== 'blockName') ||\n !fieldAffectsData(blockField),\n ),\n ]\n }, [])\n }\n\n const result = incomingResult ? `${incomingResult}.${localizedSegment}` : localizedSegment\n\n if (nextFields) {\n return getLocalizedSortProperty({\n config,\n fields: nextFields,\n locale,\n result,\n segments: remainingSegments,\n })\n }\n\n return result\n }\n\n return incomingSegments.join('.')\n}\n"],"names":["fieldAffectsData","fieldIsPresentationalOnly","getLocalizedSortProperty","config","fields","locale","result","incomingResult","segments","incomingSegments","localization","join","firstSegment","shift","matchedField","find","field","name","nextFields","remainingSegments","localizedSegment","localized","length","nextSegmentIsLocale","localeCodes","includes","nextSegment","type","flattenedFields","blocks","reduce","flattenedBlockFields","block","filter","blockField"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,yBAAyB,QAAQ,iBAAgB;AAU5E,OAAO,MAAMC,2BAA2B,CAAC,EACvCC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,QAAQC,cAAc,EACtBC,UAAUC,gBAAgB,EACrB;IACL,iDAAiD;IACjD,kBAAkB;IAClB,IAAI,CAACN,OAAOO,YAAY,EAAE;QACxB,OAAOD,iBAAiBE,IAAI,CAAC;IAC/B;IAEA,MAAMH,WAAW;WAAIC;KAAiB;IAEtC,mDAAmD;IACnD,MAAMG,eAAeJ,SAASK,KAAK;IAEnC,kCAAkC;IAClC,MAAMC,eAAeV,OAAOW,IAAI,CAC9B,CAACC,QAAUhB,iBAAiBgB,UAAUA,MAAMC,IAAI,KAAKL;IAGvD,IAAIE,gBAAgB,CAACb,0BAA0Ba,eAAe;QAC5D,IAAII;QACJ,MAAMC,oBAAoB;eAAIX;SAAS;QACvC,IAAIY,mBAAmBN,aAAaG,IAAI;QAExC,IAAIH,aAAaO,SAAS,EAAE;YAC1B,2CAA2C;YAC3C,IAAIb,SAASc,MAAM,GAAG,GAAG;gBACvB,MAAMC,sBAAsBpB,OAAOO,YAAY,CAACc,WAAW,CAACC,QAAQ,CAACN,iBAAiB,CAAC,EAAE;gBAEzF,+DAA+D;gBAC/D,6CAA6C;gBAC7C,IAAII,qBAAqB;oBACvB,MAAMG,cAAcP,kBAAkBN,KAAK;oBAC3CO,mBAAmB,GAAGN,aAAaG,IAAI,CAAC,CAAC,EAAES,aAAa;gBAC1D;YACF,OAAO;gBACL,kEAAkE;gBAClEN,mBAAmB,GAAGN,aAAaG,IAAI,CAAC,CAAC,EAAEZ,QAAQ;YACrD;QACF;QAEA,4CAA4C;QAC5C,IACES,aAAaa,IAAI,KAAK,SACtBb,aAAaa,IAAI,KAAK,WACtBb,aAAaa,IAAI,KAAK,SACtB;YACAT,aAAaJ,aAAac,eAAe;QAC3C;QAEA,IAAId,aAAaa,IAAI,KAAK,UAAU;YAClCT,aAAaJ,aAAae,MAAM,CAACC,MAAM,CAAC,CAACC,sBAAsBC;gBAC7D,OAAO;uBACFD;uBACAC,MAAMJ,eAAe,CAACK,MAAM,CAC7B,CAACC,aACC,AAAClC,iBAAiBkC,eAChBA,WAAWjB,IAAI,KAAK,eACpBiB,WAAWjB,IAAI,KAAK,eACtB,CAACjB,iBAAiBkC;iBAEvB;YACH,GAAG,EAAE;QACP;QAEA,MAAM5B,SAASC,iBAAiB,GAAGA,eAAe,CAAC,EAAEa,kBAAkB,GAAGA;QAE1E,IAAIF,YAAY;YACd,OAAOhB,yBAAyB;gBAC9BC;gBACAC,QAAQc;gBACRb;gBACAC;gBACAE,UAAUW;YACZ;QACF;QAEA,OAAOb;IACT;IAEA,OAAOG,iBAAiBE,IAAI,CAAC;AAC/B,EAAC"}
1
+ {"version":3,"sources":["../../src/queries/getLocalizedSortProperty.ts"],"sourcesContent":["import type { FlattenedField, SanitizedConfig } from 'payload'\n\nimport { fieldAffectsData, fieldIsPresentationalOnly, fieldShouldBeLocalized } from 'payload/shared'\n\ntype Args = {\n config: SanitizedConfig\n fields: FlattenedField[]\n locale: string\n parentIsLocalized: boolean\n result?: string\n segments: string[]\n}\n\nexport const getLocalizedSortProperty = ({\n config,\n fields,\n locale,\n parentIsLocalized,\n result: incomingResult,\n segments: incomingSegments,\n}: Args): string => {\n // If localization is not enabled, accept exactly\n // what is sent in\n if (!config.localization) {\n return incomingSegments.join('.')\n }\n\n const segments = [...incomingSegments]\n\n // Retrieve first segment, and remove from segments\n const firstSegment = segments.shift()\n\n // Attempt to find a matched field\n const matchedField = fields.find(\n (field) => fieldAffectsData(field) && field.name === firstSegment,\n )\n\n if (matchedField && !fieldIsPresentationalOnly(matchedField)) {\n let nextFields: FlattenedField[]\n let nextParentIsLocalized = parentIsLocalized\n const remainingSegments = [...segments]\n let localizedSegment = matchedField.name\n\n if (fieldShouldBeLocalized({ field: matchedField, parentIsLocalized })) {\n // Check to see if next segment is a locale\n if (segments.length > 0) {\n const nextSegmentIsLocale = config.localization.localeCodes.includes(remainingSegments[0])\n\n // If next segment is locale, remove it from remaining segments\n // and use it to localize the current segment\n if (nextSegmentIsLocale) {\n const nextSegment = remainingSegments.shift()\n localizedSegment = `${matchedField.name}.${nextSegment}`\n }\n } else {\n // If no more segments, but field is localized, use default locale\n localizedSegment = `${matchedField.name}.${locale}`\n }\n }\n\n // If there are subfields, pass them through\n if (\n matchedField.type === 'tab' ||\n matchedField.type === 'group' ||\n matchedField.type === 'array'\n ) {\n nextFields = matchedField.flattenedFields\n if (!nextParentIsLocalized) {\n nextParentIsLocalized = matchedField.localized\n }\n }\n\n if (matchedField.type === 'blocks') {\n nextFields = (matchedField.blockReferences ?? matchedField.blocks).reduce(\n (flattenedBlockFields, _block) => {\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 return [\n ...flattenedBlockFields,\n ...block.flattenedFields.filter(\n (blockField) =>\n (fieldAffectsData(blockField) &&\n blockField.name !== 'blockType' &&\n blockField.name !== 'blockName') ||\n !fieldAffectsData(blockField),\n ),\n ]\n },\n [],\n )\n }\n\n const result = incomingResult ? `${incomingResult}.${localizedSegment}` : localizedSegment\n\n if (nextFields) {\n return getLocalizedSortProperty({\n config,\n fields: nextFields,\n locale,\n parentIsLocalized: nextParentIsLocalized,\n result,\n segments: remainingSegments,\n })\n }\n\n return result\n }\n\n return incomingSegments.join('.')\n}\n"],"names":["fieldAffectsData","fieldIsPresentationalOnly","fieldShouldBeLocalized","getLocalizedSortProperty","config","fields","locale","parentIsLocalized","result","incomingResult","segments","incomingSegments","localization","join","firstSegment","shift","matchedField","find","field","name","nextFields","nextParentIsLocalized","remainingSegments","localizedSegment","length","nextSegmentIsLocale","localeCodes","includes","nextSegment","type","flattenedFields","localized","blockReferences","blocks","reduce","flattenedBlockFields","_block","block","b","slug","filter","blockField"],"mappings":"AAEA,SAASA,gBAAgB,EAAEC,yBAAyB,EAAEC,sBAAsB,QAAQ,iBAAgB;AAWpG,OAAO,MAAMC,2BAA2B,CAAC,EACvCC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,iBAAiB,EACjBC,QAAQC,cAAc,EACtBC,UAAUC,gBAAgB,EACrB;IACL,iDAAiD;IACjD,kBAAkB;IAClB,IAAI,CAACP,OAAOQ,YAAY,EAAE;QACxB,OAAOD,iBAAiBE,IAAI,CAAC;IAC/B;IAEA,MAAMH,WAAW;WAAIC;KAAiB;IAEtC,mDAAmD;IACnD,MAAMG,eAAeJ,SAASK,KAAK;IAEnC,kCAAkC;IAClC,MAAMC,eAAeX,OAAOY,IAAI,CAC9B,CAACC,QAAUlB,iBAAiBkB,UAAUA,MAAMC,IAAI,KAAKL;IAGvD,IAAIE,gBAAgB,CAACf,0BAA0Be,eAAe;QAC5D,IAAII;QACJ,IAAIC,wBAAwBd;QAC5B,MAAMe,oBAAoB;eAAIZ;SAAS;QACvC,IAAIa,mBAAmBP,aAAaG,IAAI;QAExC,IAAIjB,uBAAuB;YAAEgB,OAAOF;YAAcT;QAAkB,IAAI;YACtE,2CAA2C;YAC3C,IAAIG,SAASc,MAAM,GAAG,GAAG;gBACvB,MAAMC,sBAAsBrB,OAAOQ,YAAY,CAACc,WAAW,CAACC,QAAQ,CAACL,iBAAiB,CAAC,EAAE;gBAEzF,+DAA+D;gBAC/D,6CAA6C;gBAC7C,IAAIG,qBAAqB;oBACvB,MAAMG,cAAcN,kBAAkBP,KAAK;oBAC3CQ,mBAAmB,GAAGP,aAAaG,IAAI,CAAC,CAAC,EAAES,aAAa;gBAC1D;YACF,OAAO;gBACL,kEAAkE;gBAClEL,mBAAmB,GAAGP,aAAaG,IAAI,CAAC,CAAC,EAAEb,QAAQ;YACrD;QACF;QAEA,4CAA4C;QAC5C,IACEU,aAAaa,IAAI,KAAK,SACtBb,aAAaa,IAAI,KAAK,WACtBb,aAAaa,IAAI,KAAK,SACtB;YACAT,aAAaJ,aAAac,eAAe;YACzC,IAAI,CAACT,uBAAuB;gBAC1BA,wBAAwBL,aAAae,SAAS;YAChD;QACF;QAEA,IAAIf,aAAaa,IAAI,KAAK,UAAU;YAClCT,aAAa,AAACJ,CAAAA,aAAagB,eAAe,IAAIhB,aAAaiB,MAAM,AAAD,EAAGC,MAAM,CACvE,CAACC,sBAAsBC;gBACrB,uFAAuF;gBACvF,MAAMC,QACJ,OAAOD,WAAW,WAAWhC,OAAO6B,MAAM,CAAChB,IAAI,CAAC,CAACqB,IAAMA,EAAEC,IAAI,KAAKH,UAAUA;gBAC9E,OAAO;uBACFD;uBACAE,MAAMP,eAAe,CAACU,MAAM,CAC7B,CAACC,aACC,AAACzC,iBAAiByC,eAChBA,WAAWtB,IAAI,KAAK,eACpBsB,WAAWtB,IAAI,KAAK,eACtB,CAACnB,iBAAiByC;iBAEvB;YACH,GACA,EAAE;QAEN;QAEA,MAAMjC,SAASC,iBAAiB,GAAGA,eAAe,CAAC,EAAEc,kBAAkB,GAAGA;QAE1E,IAAIH,YAAY;YACd,OAAOjB,yBAAyB;gBAC9BC;gBACAC,QAAQe;gBACRd;gBACAC,mBAAmBc;gBACnBb;gBACAE,UAAUY;YACZ;QACF;QAEA,OAAOd;IACT;IAEA,OAAOG,iBAAiBE,IAAI,CAAC;AAC/B,EAAC"}
@@ -1,9 +1,10 @@
1
1
  import type { FlattenedField, Payload, Where } from 'payload';
2
- export declare function parseParams({ collectionSlug, fields, globalSlug, locale, payload, where, }: {
2
+ export declare function parseParams({ collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, where, }: {
3
3
  collectionSlug?: string;
4
4
  fields: FlattenedField[];
5
5
  globalSlug?: string;
6
6
  locale: string;
7
+ parentIsLocalized: boolean;
7
8
  payload: Payload;
8
9
  where: Where;
9
10
  }): Promise<Record<string, unknown>>;
@@ -1 +1 @@
1
- {"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAQvE,wBAAsB,WAAW,CAAC,EAChC,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,GACN,EAAE;IACD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAsEnC"}
1
+ {"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAY,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAQvE,wBAAsB,WAAW,CAAC,EAChC,cAAc,EACd,MAAM,EACN,UAAU,EACV,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,KAAK,GACN,EAAE;IACD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,iBAAiB,EAAE,OAAO,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,CAAA;CACb,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwEnC"}
@@ -2,7 +2,7 @@ import { deepMergeWithCombinedArrays } from 'payload';
2
2
  import { validOperatorSet } from 'payload/shared';
3
3
  import { buildAndOrConditions } from './buildAndOrConditions.js';
4
4
  import { buildSearchParam } from './buildSearchParams.js';
5
- export async function parseParams({ collectionSlug, fields, globalSlug, locale, payload, where }) {
5
+ export async function parseParams({ collectionSlug, fields, globalSlug, locale, parentIsLocalized, payload, where }) {
6
6
  let result = {};
7
7
  if (typeof where === 'object') {
8
8
  // We need to determine if the whereKey is an AND, OR, or a schema path
@@ -20,6 +20,7 @@ export async function parseParams({ collectionSlug, fields, globalSlug, locale,
20
20
  fields,
21
21
  globalSlug,
22
22
  locale,
23
+ parentIsLocalized,
23
24
  payload,
24
25
  where: condition
25
26
  });
@@ -41,6 +42,7 @@ export async function parseParams({ collectionSlug, fields, globalSlug, locale,
41
42
  incomingPath: relationOrPath,
42
43
  locale,
43
44
  operator,
45
+ parentIsLocalized,
44
46
  payload,
45
47
  val: pathOperators[operator]
46
48
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { FilterQuery } from 'mongoose'\nimport type { FlattenedField, Operator, Payload, Where } from 'payload'\n\nimport { deepMergeWithCombinedArrays } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { buildSearchParam } from './buildSearchParams.js'\n\nexport async function parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n payload,\n where,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n locale: string\n payload: Payload\n where: Where\n}): Promise<Record<string, unknown>> {\n let result = {} as FilterQuery<any>\n\n if (typeof where === 'object') {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n const condition = where[relationOrPath]\n let conditionOperator: '$and' | '$or'\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = '$and'\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = '$or'\n }\n if (Array.isArray(condition)) {\n const builtConditions = await buildAndOrConditions({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n payload,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result[conditionOperator] = builtConditions\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n const validOperators = Object.keys(pathOperators).filter((operator) =>\n validOperatorSet.has(operator as Operator),\n )\n for (const operator of validOperators) {\n const searchParam = await buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: relationOrPath,\n locale,\n operator,\n payload,\n val: pathOperators[operator],\n })\n\n if (searchParam?.value && searchParam?.path) {\n if (validOperators.length > 1) {\n if (!result.$and) {\n result.$and = []\n }\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n } else {\n result[searchParam.path] = searchParam.value\n }\n } else if (typeof searchParam?.value === 'object') {\n result = deepMergeWithCombinedArrays(result, searchParam.value, {\n // dont clone Types.ObjectIDs\n clone: false,\n })\n }\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["deepMergeWithCombinedArrays","validOperatorSet","buildAndOrConditions","buildSearchParam","parseParams","collectionSlug","fields","globalSlug","locale","payload","where","result","relationOrPath","Object","keys","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","length","pathOperators","validOperators","filter","operator","has","searchParam","incomingPath","val","value","path","$and","push","clone"],"mappings":"AAGA,SAASA,2BAA2B,QAAQ,UAAS;AACrD,SAASC,gBAAgB,QAAQ,iBAAgB;AAEjD,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,gBAAgB,QAAQ,yBAAwB;AAEzD,OAAO,eAAeC,YAAY,EAChCC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,OAAO,EACPC,KAAK,EAQN;IACC,IAAIC,SAAS,CAAC;IAEd,IAAI,OAAOD,UAAU,UAAU;QAC7B,uEAAuE;QACvE,KAAK,MAAME,kBAAkBC,OAAOC,IAAI,CAACJ,OAAQ;YAC/C,MAAMK,YAAYL,KAAK,CAACE,eAAe;YACvC,IAAII;YACJ,IAAIJ,eAAeK,WAAW,OAAO,OAAO;gBAC1CD,oBAAoB;YACtB,OAAO,IAAIJ,eAAeK,WAAW,OAAO,MAAM;gBAChDD,oBAAoB;YACtB;YACA,IAAIE,MAAMC,OAAO,CAACJ,YAAY;gBAC5B,MAAMK,kBAAkB,MAAMlB,qBAAqB;oBACjDG;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC,OAAOK;gBACT;gBACA,IAAIK,gBAAgBC,MAAM,GAAG,GAAG;oBAC9BV,MAAM,CAACK,kBAAkB,GAAGI;gBAC9B;YACF,OAAO;gBACL,wEAAwE;gBACxE,kEAAkE;gBAClE,8EAA8E;gBAC9E,MAAME,gBAAgBZ,KAAK,CAACE,eAAe;gBAC3C,IAAI,OAAOU,kBAAkB,UAAU;oBACrC,MAAMC,iBAAiBV,OAAOC,IAAI,CAACQ,eAAeE,MAAM,CAAC,CAACC,WACxDxB,iBAAiByB,GAAG,CAACD;oBAEvB,KAAK,MAAMA,YAAYF,eAAgB;wBACrC,MAAMI,cAAc,MAAMxB,iBAAiB;4BACzCE;4BACAC;4BACAC;4BACAqB,cAAchB;4BACdJ;4BACAiB;4BACAhB;4BACAoB,KAAKP,aAAa,CAACG,SAAS;wBAC9B;wBAEA,IAAIE,aAAaG,SAASH,aAAaI,MAAM;4BAC3C,IAAIR,eAAeF,MAAM,GAAG,GAAG;gCAC7B,IAAI,CAACV,OAAOqB,IAAI,EAAE;oCAChBrB,OAAOqB,IAAI,GAAG,EAAE;gCAClB;gCACArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;oCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;gCACvC;4BACF,OAAO;gCACLnB,MAAM,CAACgB,YAAYI,IAAI,CAAC,GAAGJ,YAAYG,KAAK;4BAC9C;wBACF,OAAO,IAAI,OAAOH,aAAaG,UAAU,UAAU;4BACjDnB,SAASX,4BAA4BW,QAAQgB,YAAYG,KAAK,EAAE;gCAC9D,6BAA6B;gCAC7BI,OAAO;4BACT;wBACF;oBACF;gBACF;YACF;QACF;IACF;IAEA,OAAOvB;AACT"}
1
+ {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { FilterQuery } from 'mongoose'\nimport type { FlattenedField, Operator, Payload, Where } from 'payload'\n\nimport { deepMergeWithCombinedArrays } from 'payload'\nimport { validOperatorSet } from 'payload/shared'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { buildSearchParam } from './buildSearchParams.js'\n\nexport async function parseParams({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n where,\n}: {\n collectionSlug?: string\n fields: FlattenedField[]\n globalSlug?: string\n locale: string\n parentIsLocalized: boolean\n payload: Payload\n where: Where\n}): Promise<Record<string, unknown>> {\n let result = {} as FilterQuery<any>\n\n if (typeof where === 'object') {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n const condition = where[relationOrPath]\n let conditionOperator: '$and' | '$or'\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = '$and'\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = '$or'\n }\n if (Array.isArray(condition)) {\n const builtConditions = await buildAndOrConditions({\n collectionSlug,\n fields,\n globalSlug,\n locale,\n parentIsLocalized,\n payload,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result[conditionOperator] = builtConditions\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n const validOperators = Object.keys(pathOperators).filter((operator) =>\n validOperatorSet.has(operator as Operator),\n )\n for (const operator of validOperators) {\n const searchParam = await buildSearchParam({\n collectionSlug,\n fields,\n globalSlug,\n incomingPath: relationOrPath,\n locale,\n operator,\n parentIsLocalized,\n payload,\n val: pathOperators[operator],\n })\n\n if (searchParam?.value && searchParam?.path) {\n if (validOperators.length > 1) {\n if (!result.$and) {\n result.$and = []\n }\n result.$and.push({\n [searchParam.path]: searchParam.value,\n })\n } else {\n result[searchParam.path] = searchParam.value\n }\n } else if (typeof searchParam?.value === 'object') {\n result = deepMergeWithCombinedArrays(result, searchParam.value, {\n // dont clone Types.ObjectIDs\n clone: false,\n })\n }\n }\n }\n }\n }\n }\n\n return result\n}\n"],"names":["deepMergeWithCombinedArrays","validOperatorSet","buildAndOrConditions","buildSearchParam","parseParams","collectionSlug","fields","globalSlug","locale","parentIsLocalized","payload","where","result","relationOrPath","Object","keys","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","length","pathOperators","validOperators","filter","operator","has","searchParam","incomingPath","val","value","path","$and","push","clone"],"mappings":"AAGA,SAASA,2BAA2B,QAAQ,UAAS;AACrD,SAASC,gBAAgB,QAAQ,iBAAgB;AAEjD,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,gBAAgB,QAAQ,yBAAwB;AAEzD,OAAO,eAAeC,YAAY,EAChCC,cAAc,EACdC,MAAM,EACNC,UAAU,EACVC,MAAM,EACNC,iBAAiB,EACjBC,OAAO,EACPC,KAAK,EASN;IACC,IAAIC,SAAS,CAAC;IAEd,IAAI,OAAOD,UAAU,UAAU;QAC7B,uEAAuE;QACvE,KAAK,MAAME,kBAAkBC,OAAOC,IAAI,CAACJ,OAAQ;YAC/C,MAAMK,YAAYL,KAAK,CAACE,eAAe;YACvC,IAAII;YACJ,IAAIJ,eAAeK,WAAW,OAAO,OAAO;gBAC1CD,oBAAoB;YACtB,OAAO,IAAIJ,eAAeK,WAAW,OAAO,MAAM;gBAChDD,oBAAoB;YACtB;YACA,IAAIE,MAAMC,OAAO,CAACJ,YAAY;gBAC5B,MAAMK,kBAAkB,MAAMnB,qBAAqB;oBACjDG;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC;oBACAC,OAAOK;gBACT;gBACA,IAAIK,gBAAgBC,MAAM,GAAG,GAAG;oBAC9BV,MAAM,CAACK,kBAAkB,GAAGI;gBAC9B;YACF,OAAO;gBACL,wEAAwE;gBACxE,kEAAkE;gBAClE,8EAA8E;gBAC9E,MAAME,gBAAgBZ,KAAK,CAACE,eAAe;gBAC3C,IAAI,OAAOU,kBAAkB,UAAU;oBACrC,MAAMC,iBAAiBV,OAAOC,IAAI,CAACQ,eAAeE,MAAM,CAAC,CAACC,WACxDzB,iBAAiB0B,GAAG,CAACD;oBAEvB,KAAK,MAAMA,YAAYF,eAAgB;wBACrC,MAAMI,cAAc,MAAMzB,iBAAiB;4BACzCE;4BACAC;4BACAC;4BACAsB,cAAchB;4BACdL;4BACAkB;4BACAjB;4BACAC;4BACAoB,KAAKP,aAAa,CAACG,SAAS;wBAC9B;wBAEA,IAAIE,aAAaG,SAASH,aAAaI,MAAM;4BAC3C,IAAIR,eAAeF,MAAM,GAAG,GAAG;gCAC7B,IAAI,CAACV,OAAOqB,IAAI,EAAE;oCAChBrB,OAAOqB,IAAI,GAAG,EAAE;gCAClB;gCACArB,OAAOqB,IAAI,CAACC,IAAI,CAAC;oCACf,CAACN,YAAYI,IAAI,CAAC,EAAEJ,YAAYG,KAAK;gCACvC;4BACF,OAAO;gCACLnB,MAAM,CAACgB,YAAYI,IAAI,CAAC,GAAGJ,YAAYG,KAAK;4BAC9C;wBACF,OAAO,IAAI,OAAOH,aAAaG,UAAU,UAAU;4BACjDnB,SAASZ,4BAA4BY,QAAQgB,YAAYG,KAAK,EAAE;gCAC9D,6BAA6B;gCAC7BI,OAAO;4BACT;wBACF;oBACF;gBACF;YACF;QACF;IACF;IAEA,OAAOvB;AACT"}
@@ -4,11 +4,12 @@ type SanitizeQueryValueArgs = {
4
4
  hasCustomID: boolean;
5
5
  locale?: string;
6
6
  operator: string;
7
+ parentIsLocalized: boolean;
7
8
  path: string;
8
9
  payload: Payload;
9
10
  val: any;
10
11
  };
11
- export declare const sanitizeQueryValue: ({ field, hasCustomID, locale, operator, path, payload, val, }: SanitizeQueryValueArgs) => {
12
+ export declare const sanitizeQueryValue: ({ field, hasCustomID, locale, operator, parentIsLocalized, path, payload, val, }: SanitizeQueryValueArgs) => {
12
13
  operator?: string;
13
14
  rawQuery?: unknown;
14
15
  val?: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAA;AAKzF,KAAK,sBAAsB,GAAG;IAC5B,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AA6DD,eAAO,MAAM,kBAAkB,kEAQ5B,sBAAsB,KAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CA0Vd,CAAA"}
1
+ {"version":3,"file":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EACd,OAAO,EAER,MAAM,SAAS,CAAA;AAMhB,KAAK,sBAAsB,GAAG;IAC5B,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,EAAE,OAAO,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAiED,eAAO,MAAM,kBAAkB,qFAS5B,sBAAsB,KAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,OAAO,CAAA;CA6Vd,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { Types } from 'mongoose';
2
2
  import { createArrayFromCommaDelineated } from 'payload';
3
+ import { fieldShouldBeLocalized } from 'payload/shared';
3
4
  const buildExistsQuery = (formattedValue, path, treatEmptyString = true)=>{
4
5
  if (formattedValue) {
5
6
  return {
@@ -52,11 +53,14 @@ const buildExistsQuery = (formattedValue, path, treatEmptyString = true)=>{
52
53
  }
53
54
  };
54
55
  // returns nestedField Field object from blocks.nestedField path because getLocalizedPaths splits them only for relationships
55
- const getFieldFromSegments = ({ field, segments })=>{
56
- if ('blocks' in field) {
57
- for (const block of field.blocks){
56
+ const getFieldFromSegments = ({ field, payload, segments })=>{
57
+ if ('blocks' in field || 'blockReferences' in field) {
58
+ const _field = field;
59
+ for (const _block of _field.blockReferences ?? _field.blocks){
60
+ const block = typeof _block === 'string' ? payload.blocks[_block] : _block;
58
61
  const field = getFieldFromSegments({
59
62
  field: block,
63
+ payload,
60
64
  segments
61
65
  });
62
66
  if (field) {
@@ -76,12 +80,13 @@ const getFieldFromSegments = ({ field, segments })=>{
76
80
  segments.shift();
77
81
  return getFieldFromSegments({
78
82
  field: foundField,
83
+ payload,
79
84
  segments
80
85
  });
81
86
  }
82
87
  }
83
88
  };
84
- export const sanitizeQueryValue = ({ field, hasCustomID, locale, operator, path, payload, val })=>{
89
+ export const sanitizeQueryValue = ({ field, hasCustomID, locale, operator, parentIsLocalized, path, payload, val })=>{
85
90
  let formattedValue = val;
86
91
  let formattedOperator = operator;
87
92
  if ([
@@ -94,6 +99,7 @@ export const sanitizeQueryValue = ({ field, hasCustomID, locale, operator, path,
94
99
  segments.shift();
95
100
  const foundField = getFieldFromSegments({
96
101
  field,
102
+ payload,
97
103
  segments
98
104
  });
99
105
  if (foundField) {
@@ -201,7 +207,10 @@ export const sanitizeQueryValue = ({ field, hasCustomID, locale, operator, path,
201
207
  formattedValue.value = new Types.ObjectId(value);
202
208
  }
203
209
  let localizedPath = path;
204
- if (field.localized && payload.config.localization && locale) {
210
+ if (fieldShouldBeLocalized({
211
+ field,
212
+ parentIsLocalized
213
+ }) && payload.config.localization && locale) {
205
214
  localizedPath = `${path}.${locale}`;
206
215
  }
207
216
  return {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/sanitizeQueryValue.ts"],"sourcesContent":["import type { FlattenedBlock, FlattenedField, Payload, RelationshipField } from 'payload'\n\nimport { Types } from 'mongoose'\nimport { createArrayFromCommaDelineated } from 'payload'\n\ntype SanitizeQueryValueArgs = {\n field: FlattenedField\n hasCustomID: boolean\n locale?: string\n operator: string\n path: string\n payload: Payload\n val: any\n}\n\nconst buildExistsQuery = (formattedValue, path, treatEmptyString = true) => {\n if (formattedValue) {\n return {\n rawQuery: {\n $and: [\n { [path]: { $exists: true } },\n { [path]: { $ne: null } },\n ...(treatEmptyString ? [{ [path]: { $ne: '' } }] : []), // Treat empty string as null / undefined\n ],\n },\n }\n } else {\n return {\n rawQuery: {\n $or: [\n { [path]: { $exists: false } },\n { [path]: { $eq: null } },\n ...(treatEmptyString ? [{ [path]: { $eq: '' } }] : []), // Treat empty string as null / undefined\n ],\n },\n }\n }\n}\n\n// returns nestedField Field object from blocks.nestedField path because getLocalizedPaths splits them only for relationships\nconst getFieldFromSegments = ({\n field,\n segments,\n}: {\n field: FlattenedBlock | FlattenedField\n segments: string[]\n}) => {\n if ('blocks' in field) {\n for (const block of field.blocks) {\n const field = getFieldFromSegments({ field: block, segments })\n if (field) {\n return field\n }\n }\n }\n\n if ('fields' in field) {\n for (let i = 0; i < segments.length; i++) {\n const foundField = field.flattenedFields.find((each) => each.name === segments[i])\n\n if (!foundField) {\n break\n }\n\n if (foundField && segments.length - 1 === i) {\n return foundField\n }\n\n segments.shift()\n return getFieldFromSegments({ field: foundField, segments })\n }\n }\n}\n\nexport const sanitizeQueryValue = ({\n field,\n hasCustomID,\n locale,\n operator,\n path,\n payload,\n val,\n}: SanitizeQueryValueArgs): {\n operator?: string\n rawQuery?: unknown\n val?: unknown\n} => {\n let formattedValue = val\n let formattedOperator = operator\n\n if (['array', 'blocks', 'group', 'tab'].includes(field.type) && path.includes('.')) {\n const segments = path.split('.')\n segments.shift()\n const foundField = getFieldFromSegments({ field, segments })\n\n if (foundField) {\n field = foundField\n }\n }\n\n // Disregard invalid _ids\n if (path === '_id') {\n if (typeof val === 'string' && val.split(',').length === 1) {\n if (!hasCustomID) {\n const isValid = Types.ObjectId.isValid(val)\n\n if (!isValid) {\n return { operator: formattedOperator, val: undefined }\n } else {\n if (['in', 'not_in'].includes(operator)) {\n formattedValue = createArrayFromCommaDelineated(formattedValue).map(\n (id) => new Types.ObjectId(id),\n )\n } else {\n formattedValue = new Types.ObjectId(val)\n }\n }\n }\n\n if (field.type === 'number') {\n const parsedNumber = parseFloat(val)\n\n if (Number.isNaN(parsedNumber)) {\n return { operator: formattedOperator, val: undefined }\n }\n }\n } else if (Array.isArray(val) || (typeof val === 'string' && val.split(',').length > 1)) {\n if (typeof val === 'string') {\n formattedValue = createArrayFromCommaDelineated(val)\n }\n\n formattedValue = formattedValue.reduce((formattedValues, inVal) => {\n if (!hasCustomID) {\n if (Types.ObjectId.isValid(inVal)) {\n formattedValues.push(new Types.ObjectId(inVal))\n }\n }\n\n if (field.type === 'number') {\n const parsedNumber = parseFloat(inVal)\n if (!Number.isNaN(parsedNumber)) {\n formattedValues.push(parsedNumber)\n }\n } else {\n formattedValues.push(inVal)\n }\n\n return formattedValues\n }, [])\n }\n }\n\n // Cast incoming values as proper searchable types\n if (field.type === 'checkbox' && typeof val === 'string') {\n if (val.toLowerCase() === 'true') {\n formattedValue = true\n }\n if (val.toLowerCase() === 'false') {\n formattedValue = false\n }\n }\n\n if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') {\n formattedValue = createArrayFromCommaDelineated(formattedValue)\n\n if (field.type === 'number') {\n formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal))\n }\n }\n\n if (field.type === 'number') {\n if (typeof formattedValue === 'string' && operator !== 'exists') {\n formattedValue = Number(val)\n }\n\n if (operator === 'exists') {\n formattedValue = val === 'true' ? true : val === 'false' ? false : Boolean(val)\n\n return buildExistsQuery(formattedValue, path)\n }\n }\n\n if (field.type === 'date' && typeof val === 'string' && operator !== 'exists') {\n formattedValue = new Date(val)\n if (Number.isNaN(Date.parse(formattedValue))) {\n return undefined\n }\n }\n\n if (['relationship', 'upload'].includes(field.type)) {\n if (val === 'null') {\n formattedValue = null\n }\n\n // Object equality requires the value to be the first key in the object that is being queried.\n if (\n operator === 'equals' &&\n formattedValue &&\n typeof formattedValue === 'object' &&\n formattedValue.value &&\n formattedValue.relationTo\n ) {\n const { value } = formattedValue\n const isValid = Types.ObjectId.isValid(value)\n\n if (isValid) {\n formattedValue.value = new Types.ObjectId(value)\n }\n\n let localizedPath = path\n\n if (field.localized && payload.config.localization && locale) {\n localizedPath = `${path}.${locale}`\n }\n\n return {\n rawQuery: {\n $or: [\n {\n [localizedPath]: {\n $eq: {\n // disable auto sort\n /* eslint-disable */\n value: formattedValue.value,\n relationTo: formattedValue.relationTo,\n /* eslint-enable */\n },\n },\n },\n {\n [localizedPath]: {\n $eq: {\n relationTo: formattedValue.relationTo,\n value: formattedValue.value,\n },\n },\n },\n ],\n },\n }\n }\n\n const relationTo = (field as RelationshipField).relationTo\n\n if (['in', 'not_in'].includes(operator) && Array.isArray(formattedValue)) {\n formattedValue = formattedValue.reduce((formattedValues, inVal) => {\n if (!inVal) {\n return formattedValues\n }\n\n if (typeof relationTo === 'string' && payload.collections[relationTo].customIDType) {\n if (payload.collections[relationTo].customIDType === 'number') {\n const parsedNumber = parseFloat(inVal)\n if (!Number.isNaN(parsedNumber)) {\n formattedValues.push(parsedNumber)\n return formattedValues\n }\n }\n\n formattedValues.push(inVal)\n return formattedValues\n }\n\n if (\n Array.isArray(relationTo) &&\n relationTo.some((relationTo) => !!payload.collections[relationTo].customIDType)\n ) {\n if (Types.ObjectId.isValid(inVal.toString())) {\n formattedValues.push(new Types.ObjectId(inVal))\n } else {\n formattedValues.push(inVal)\n }\n return formattedValues\n }\n\n if (Types.ObjectId.isValid(inVal.toString())) {\n formattedValues.push(new Types.ObjectId(inVal))\n }\n\n return formattedValues\n }, [])\n }\n\n if (\n ['contains', 'equals', 'like', 'not_equals'].includes(operator) &&\n (!Array.isArray(relationTo) || !path.endsWith('.relationTo'))\n ) {\n if (typeof relationTo === 'string') {\n const customIDType = payload.collections[relationTo].customIDType\n\n if (customIDType) {\n if (customIDType === 'number') {\n formattedValue = parseFloat(val)\n\n if (Number.isNaN(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n }\n } else {\n if (!Types.ObjectId.isValid(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n formattedValue = new Types.ObjectId(formattedValue)\n }\n } else {\n const hasCustomIDType = relationTo.some(\n (relationTo) => !!payload.collections[relationTo].customIDType,\n )\n\n if (hasCustomIDType) {\n if (typeof val === 'string') {\n const formattedNumber = Number(val)\n formattedValue = [Types.ObjectId.isValid(val) ? new Types.ObjectId(val) : val]\n formattedOperator = operator === 'not_equals' ? 'not_in' : 'in'\n if (!Number.isNaN(formattedNumber)) {\n formattedValue.push(formattedNumber)\n }\n }\n } else {\n if (!Types.ObjectId.isValid(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n formattedValue = new Types.ObjectId(formattedValue)\n }\n }\n }\n\n if (\n operator === 'all' &&\n Array.isArray(relationTo) &&\n path.endsWith('.value') &&\n Array.isArray(formattedValue)\n ) {\n formattedValue.forEach((v, i) => {\n if (Types.ObjectId.isValid(v)) {\n formattedValue[i] = new Types.ObjectId(v)\n }\n })\n }\n }\n\n // Set up specific formatting necessary by operators\n\n if (operator === 'near') {\n let lng\n let lat\n let maxDistance\n let minDistance\n\n if (Array.isArray(formattedValue)) {\n ;[lng, lat, maxDistance, minDistance] = formattedValue\n }\n\n if (typeof formattedValue === 'string') {\n ;[lng, lat, maxDistance, minDistance] = createArrayFromCommaDelineated(formattedValue)\n }\n\n if (lng == null || lat == null || (maxDistance == null && minDistance == null)) {\n formattedValue = undefined\n } else {\n formattedValue = {\n $geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] },\n }\n\n if (maxDistance && !Number.isNaN(Number(maxDistance))) {\n formattedValue.$maxDistance = parseFloat(maxDistance)\n }\n\n if (minDistance && !Number.isNaN(Number(minDistance))) {\n formattedValue.$minDistance = parseFloat(minDistance)\n }\n }\n }\n\n if (operator === 'within' || operator === 'intersects') {\n formattedValue = {\n $geometry: formattedValue,\n }\n }\n\n if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) {\n if (operator === 'contains' && !Types.ObjectId.isValid(formattedValue)) {\n formattedValue = {\n $options: 'i',\n $regex: formattedValue.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\n }\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n\n // _id can't be empty string, will error Cast to ObjectId failed for value \"\"\n return buildExistsQuery(\n formattedValue,\n path,\n !['relationship', 'upload'].includes(field.type),\n )\n }\n }\n\n if (\n (path === '_id' || path === 'parent') &&\n operator === 'like' &&\n formattedValue.length === 24 &&\n !hasCustomID\n ) {\n formattedOperator = 'equals'\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n\n // Clearable fields\n if (['relationship', 'select', 'upload'].includes(field.type)) {\n if (formattedValue) {\n return {\n rawQuery: {\n $and: [{ [path]: { $exists: true } }, { [path]: { $ne: null } }],\n },\n }\n } else {\n return {\n rawQuery: {\n $or: [{ [path]: { $exists: false } }, { [path]: { $eq: null } }],\n },\n }\n }\n }\n }\n\n return { operator: formattedOperator, val: formattedValue }\n}\n"],"names":["Types","createArrayFromCommaDelineated","buildExistsQuery","formattedValue","path","treatEmptyString","rawQuery","$and","$exists","$ne","$or","$eq","getFieldFromSegments","field","segments","block","blocks","i","length","foundField","flattenedFields","find","each","name","shift","sanitizeQueryValue","hasCustomID","locale","operator","payload","val","formattedOperator","includes","type","split","isValid","ObjectId","undefined","map","id","parsedNumber","parseFloat","Number","isNaN","Array","isArray","reduce","formattedValues","inVal","push","toLowerCase","arrayVal","Boolean","Date","parse","value","relationTo","localizedPath","localized","config","localization","collections","customIDType","some","toString","endsWith","hasCustomIDType","formattedNumber","forEach","v","lng","lat","maxDistance","minDistance","$geometry","coordinates","$maxDistance","$minDistance","$options","$regex","replace"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/queries/sanitizeQueryValue.ts"],"sourcesContent":["import type {\n FlattenedBlock,\n FlattenedBlocksField,\n FlattenedField,\n Payload,\n RelationshipField,\n} from 'payload'\n\nimport { Types } from 'mongoose'\nimport { createArrayFromCommaDelineated } from 'payload'\nimport { fieldShouldBeLocalized } from 'payload/shared'\n\ntype SanitizeQueryValueArgs = {\n field: FlattenedField\n hasCustomID: boolean\n locale?: string\n operator: string\n parentIsLocalized: boolean\n path: string\n payload: Payload\n val: any\n}\n\nconst buildExistsQuery = (formattedValue, path, treatEmptyString = true) => {\n if (formattedValue) {\n return {\n rawQuery: {\n $and: [\n { [path]: { $exists: true } },\n { [path]: { $ne: null } },\n ...(treatEmptyString ? [{ [path]: { $ne: '' } }] : []), // Treat empty string as null / undefined\n ],\n },\n }\n } else {\n return {\n rawQuery: {\n $or: [\n { [path]: { $exists: false } },\n { [path]: { $eq: null } },\n ...(treatEmptyString ? [{ [path]: { $eq: '' } }] : []), // Treat empty string as null / undefined\n ],\n },\n }\n }\n}\n\n// returns nestedField Field object from blocks.nestedField path because getLocalizedPaths splits them only for relationships\nconst getFieldFromSegments = ({\n field,\n payload,\n segments,\n}: {\n field: FlattenedBlock | FlattenedField\n payload: Payload\n segments: string[]\n}) => {\n if ('blocks' in field || 'blockReferences' in field) {\n const _field: FlattenedBlocksField = field as FlattenedBlocksField\n for (const _block of _field.blockReferences ?? _field.blocks) {\n const block: FlattenedBlock = typeof _block === 'string' ? payload.blocks[_block] : _block\n const field = getFieldFromSegments({ field: block, payload, segments })\n if (field) {\n return field\n }\n }\n }\n\n if ('fields' in field) {\n for (let i = 0; i < segments.length; i++) {\n const foundField = field.flattenedFields.find((each) => each.name === segments[i])\n\n if (!foundField) {\n break\n }\n\n if (foundField && segments.length - 1 === i) {\n return foundField\n }\n\n segments.shift()\n return getFieldFromSegments({ field: foundField, payload, segments })\n }\n }\n}\n\nexport const sanitizeQueryValue = ({\n field,\n hasCustomID,\n locale,\n operator,\n parentIsLocalized,\n path,\n payload,\n val,\n}: SanitizeQueryValueArgs): {\n operator?: string\n rawQuery?: unknown\n val?: unknown\n} => {\n let formattedValue = val\n let formattedOperator = operator\n if (['array', 'blocks', 'group', 'tab'].includes(field.type) && path.includes('.')) {\n const segments = path.split('.')\n segments.shift()\n const foundField = getFieldFromSegments({ field, payload, segments })\n\n if (foundField) {\n field = foundField\n }\n }\n\n // Disregard invalid _ids\n if (path === '_id') {\n if (typeof val === 'string' && val.split(',').length === 1) {\n if (!hasCustomID) {\n const isValid = Types.ObjectId.isValid(val)\n\n if (!isValid) {\n return { operator: formattedOperator, val: undefined }\n } else {\n if (['in', 'not_in'].includes(operator)) {\n formattedValue = createArrayFromCommaDelineated(formattedValue).map(\n (id) => new Types.ObjectId(id),\n )\n } else {\n formattedValue = new Types.ObjectId(val)\n }\n }\n }\n\n if (field.type === 'number') {\n const parsedNumber = parseFloat(val)\n\n if (Number.isNaN(parsedNumber)) {\n return { operator: formattedOperator, val: undefined }\n }\n }\n } else if (Array.isArray(val) || (typeof val === 'string' && val.split(',').length > 1)) {\n if (typeof val === 'string') {\n formattedValue = createArrayFromCommaDelineated(val)\n }\n\n formattedValue = formattedValue.reduce((formattedValues, inVal) => {\n if (!hasCustomID) {\n if (Types.ObjectId.isValid(inVal)) {\n formattedValues.push(new Types.ObjectId(inVal))\n }\n }\n\n if (field.type === 'number') {\n const parsedNumber = parseFloat(inVal)\n if (!Number.isNaN(parsedNumber)) {\n formattedValues.push(parsedNumber)\n }\n } else {\n formattedValues.push(inVal)\n }\n\n return formattedValues\n }, [])\n }\n }\n\n // Cast incoming values as proper searchable types\n if (field.type === 'checkbox' && typeof val === 'string') {\n if (val.toLowerCase() === 'true') {\n formattedValue = true\n }\n if (val.toLowerCase() === 'false') {\n formattedValue = false\n }\n }\n\n if (['all', 'in', 'not_in'].includes(operator) && typeof formattedValue === 'string') {\n formattedValue = createArrayFromCommaDelineated(formattedValue)\n\n if (field.type === 'number') {\n formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal))\n }\n }\n\n if (field.type === 'number') {\n if (typeof formattedValue === 'string' && operator !== 'exists') {\n formattedValue = Number(val)\n }\n\n if (operator === 'exists') {\n formattedValue = val === 'true' ? true : val === 'false' ? false : Boolean(val)\n\n return buildExistsQuery(formattedValue, path)\n }\n }\n\n if (field.type === 'date' && typeof val === 'string' && operator !== 'exists') {\n formattedValue = new Date(val)\n if (Number.isNaN(Date.parse(formattedValue))) {\n return undefined\n }\n }\n\n if (['relationship', 'upload'].includes(field.type)) {\n if (val === 'null') {\n formattedValue = null\n }\n\n // Object equality requires the value to be the first key in the object that is being queried.\n if (\n operator === 'equals' &&\n formattedValue &&\n typeof formattedValue === 'object' &&\n formattedValue.value &&\n formattedValue.relationTo\n ) {\n const { value } = formattedValue\n const isValid = Types.ObjectId.isValid(value)\n\n if (isValid) {\n formattedValue.value = new Types.ObjectId(value)\n }\n\n let localizedPath = path\n\n if (\n fieldShouldBeLocalized({ field, parentIsLocalized }) &&\n payload.config.localization &&\n locale\n ) {\n localizedPath = `${path}.${locale}`\n }\n\n return {\n rawQuery: {\n $or: [\n {\n [localizedPath]: {\n $eq: {\n // disable auto sort\n /* eslint-disable */\n value: formattedValue.value,\n relationTo: formattedValue.relationTo,\n /* eslint-enable */\n },\n },\n },\n {\n [localizedPath]: {\n $eq: {\n relationTo: formattedValue.relationTo,\n value: formattedValue.value,\n },\n },\n },\n ],\n },\n }\n }\n\n const relationTo = (field as RelationshipField).relationTo\n\n if (['in', 'not_in'].includes(operator) && Array.isArray(formattedValue)) {\n formattedValue = formattedValue.reduce((formattedValues, inVal) => {\n if (!inVal) {\n return formattedValues\n }\n\n if (typeof relationTo === 'string' && payload.collections[relationTo].customIDType) {\n if (payload.collections[relationTo].customIDType === 'number') {\n const parsedNumber = parseFloat(inVal)\n if (!Number.isNaN(parsedNumber)) {\n formattedValues.push(parsedNumber)\n return formattedValues\n }\n }\n\n formattedValues.push(inVal)\n return formattedValues\n }\n\n if (\n Array.isArray(relationTo) &&\n relationTo.some((relationTo) => !!payload.collections[relationTo].customIDType)\n ) {\n if (Types.ObjectId.isValid(inVal.toString())) {\n formattedValues.push(new Types.ObjectId(inVal))\n } else {\n formattedValues.push(inVal)\n }\n return formattedValues\n }\n\n if (Types.ObjectId.isValid(inVal.toString())) {\n formattedValues.push(new Types.ObjectId(inVal))\n }\n\n return formattedValues\n }, [])\n }\n\n if (\n ['contains', 'equals', 'like', 'not_equals'].includes(operator) &&\n (!Array.isArray(relationTo) || !path.endsWith('.relationTo'))\n ) {\n if (typeof relationTo === 'string') {\n const customIDType = payload.collections[relationTo].customIDType\n\n if (customIDType) {\n if (customIDType === 'number') {\n formattedValue = parseFloat(val)\n\n if (Number.isNaN(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n }\n } else {\n if (!Types.ObjectId.isValid(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n formattedValue = new Types.ObjectId(formattedValue)\n }\n } else {\n const hasCustomIDType = relationTo.some(\n (relationTo) => !!payload.collections[relationTo].customIDType,\n )\n\n if (hasCustomIDType) {\n if (typeof val === 'string') {\n const formattedNumber = Number(val)\n formattedValue = [Types.ObjectId.isValid(val) ? new Types.ObjectId(val) : val]\n formattedOperator = operator === 'not_equals' ? 'not_in' : 'in'\n if (!Number.isNaN(formattedNumber)) {\n formattedValue.push(formattedNumber)\n }\n }\n } else {\n if (!Types.ObjectId.isValid(formattedValue)) {\n return { operator: formattedOperator, val: undefined }\n }\n formattedValue = new Types.ObjectId(formattedValue)\n }\n }\n }\n\n if (\n operator === 'all' &&\n Array.isArray(relationTo) &&\n path.endsWith('.value') &&\n Array.isArray(formattedValue)\n ) {\n formattedValue.forEach((v, i) => {\n if (Types.ObjectId.isValid(v)) {\n formattedValue[i] = new Types.ObjectId(v)\n }\n })\n }\n }\n\n // Set up specific formatting necessary by operators\n\n if (operator === 'near') {\n let lng\n let lat\n let maxDistance\n let minDistance\n\n if (Array.isArray(formattedValue)) {\n ;[lng, lat, maxDistance, minDistance] = formattedValue\n }\n\n if (typeof formattedValue === 'string') {\n ;[lng, lat, maxDistance, minDistance] = createArrayFromCommaDelineated(formattedValue)\n }\n\n if (lng == null || lat == null || (maxDistance == null && minDistance == null)) {\n formattedValue = undefined\n } else {\n formattedValue = {\n $geometry: { type: 'Point', coordinates: [parseFloat(lng), parseFloat(lat)] },\n }\n\n if (maxDistance && !Number.isNaN(Number(maxDistance))) {\n formattedValue.$maxDistance = parseFloat(maxDistance)\n }\n\n if (minDistance && !Number.isNaN(Number(minDistance))) {\n formattedValue.$minDistance = parseFloat(minDistance)\n }\n }\n }\n\n if (operator === 'within' || operator === 'intersects') {\n formattedValue = {\n $geometry: formattedValue,\n }\n }\n\n if (path !== '_id' || (path === '_id' && hasCustomID && field.type === 'text')) {\n if (operator === 'contains' && !Types.ObjectId.isValid(formattedValue)) {\n formattedValue = {\n $options: 'i',\n $regex: formattedValue.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&'),\n }\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n\n // _id can't be empty string, will error Cast to ObjectId failed for value \"\"\n return buildExistsQuery(\n formattedValue,\n path,\n !['relationship', 'upload'].includes(field.type),\n )\n }\n }\n\n if (\n (path === '_id' || path === 'parent') &&\n operator === 'like' &&\n formattedValue.length === 24 &&\n !hasCustomID\n ) {\n formattedOperator = 'equals'\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n\n // Clearable fields\n if (['relationship', 'select', 'upload'].includes(field.type)) {\n if (formattedValue) {\n return {\n rawQuery: {\n $and: [{ [path]: { $exists: true } }, { [path]: { $ne: null } }],\n },\n }\n } else {\n return {\n rawQuery: {\n $or: [{ [path]: { $exists: false } }, { [path]: { $eq: null } }],\n },\n }\n }\n }\n }\n\n return { operator: formattedOperator, val: formattedValue }\n}\n"],"names":["Types","createArrayFromCommaDelineated","fieldShouldBeLocalized","buildExistsQuery","formattedValue","path","treatEmptyString","rawQuery","$and","$exists","$ne","$or","$eq","getFieldFromSegments","field","payload","segments","_field","_block","blockReferences","blocks","block","i","length","foundField","flattenedFields","find","each","name","shift","sanitizeQueryValue","hasCustomID","locale","operator","parentIsLocalized","val","formattedOperator","includes","type","split","isValid","ObjectId","undefined","map","id","parsedNumber","parseFloat","Number","isNaN","Array","isArray","reduce","formattedValues","inVal","push","toLowerCase","arrayVal","Boolean","Date","parse","value","relationTo","localizedPath","config","localization","collections","customIDType","some","toString","endsWith","hasCustomIDType","formattedNumber","forEach","v","lng","lat","maxDistance","minDistance","$geometry","coordinates","$maxDistance","$minDistance","$options","$regex","replace"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAY1C,eAAO,MAAM,WAAW,EAAE,WA4HzB,CAAA"}
1
+ {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAa1C,eAAO,MAAM,WAAW,EAAE,WA8HzB,CAAA"}
@@ -1,9 +1,10 @@
1
1
  import { buildVersionCollectionFields, combineQueries, flattenWhereToOperators } from 'payload';
2
+ import { buildQuery } from './queries/buildQuery.js';
2
3
  import { buildSortParam } from './queries/buildSortParam.js';
3
4
  import { buildJoinAggregation } from './utilities/buildJoinAggregation.js';
4
5
  import { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js';
5
6
  import { getSession } from './utilities/getSession.js';
6
- import { sanitizeInternalFields } from './utilities/sanitizeInternalFields.js';
7
+ import { transform } from './utilities/transform.js';
7
8
  export const queryDrafts = async function queryDrafts({ collection, joins, limit, locale, page, pagination, req, select, sort: sortArg, where }) {
8
9
  const VersionModel = this.versions[collection];
9
10
  const collectionConfig = this.payload.collections[collection].config;
@@ -30,14 +31,16 @@ export const queryDrafts = async function queryDrafts({ collection, joins, limit
30
31
  equals: true
31
32
  }
32
33
  }, where);
33
- const versionQuery = await VersionModel.buildQuery({
34
+ const fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true);
35
+ const versionQuery = await buildQuery({
36
+ adapter: this,
37
+ fields,
34
38
  locale,
35
- payload: this.payload,
36
39
  where: combinedWhere
37
40
  });
38
41
  const projection = buildProjectionFromSelect({
39
42
  adapter: this,
40
- fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true),
43
+ fields,
41
44
  select
42
45
  });
43
46
  // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.
@@ -94,18 +97,18 @@ export const queryDrafts = async function queryDrafts({ collection, joins, limit
94
97
  } else {
95
98
  result = await VersionModel.paginate(versionQuery, paginationOptions);
96
99
  }
97
- const docs = JSON.parse(JSON.stringify(result.docs));
98
- return {
99
- ...result,
100
- docs: docs.map((doc)=>{
101
- doc = {
102
- _id: doc.parent,
103
- id: doc.parent,
104
- ...doc.version
105
- };
106
- return sanitizeInternalFields(doc);
107
- })
108
- };
100
+ transform({
101
+ adapter: this,
102
+ data: result.docs,
103
+ fields: buildVersionCollectionFields(this.payload.config, collectionConfig),
104
+ operation: 'read'
105
+ });
106
+ for(let i = 0; i < result.docs.length; i++){
107
+ const id = result.docs[i].parent;
108
+ result.docs[i] = result.docs[i].version;
109
+ result.docs[i].id = id;
110
+ }
111
+ return result;
109
112
  };
110
113
 
111
114
  //# sourceMappingURL=queryDrafts.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport { buildVersionCollectionFields, combineQueries, flattenWhereToOperators } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { sanitizeInternalFields } from './utilities/sanitizeInternalFields.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n { collection, joins, limit, locale, page, pagination, req, select, sort: sortArg, where },\n) {\n const VersionModel = this.versions[collection]\n const collectionConfig = this.payload.collections[collection].config\n const options: QueryOptions = {\n session: await getSession(this, req),\n }\n\n let hasNearConstraint\n let sort\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n if (!hasNearConstraint) {\n sort = buildSortParam({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n timestamps: true,\n })\n }\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, where)\n\n const versionQuery = await VersionModel.buildQuery({\n locale,\n payload: this.payload,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig, true),\n select,\n })\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount =\n hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n if (this.collation) {\n const defaultLocale = 'en'\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n VersionModel.countDocuments(versionQuery, {\n hint: { _id: 1 },\n }),\n )\n }\n }\n\n if (limit > 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n paginationOptions.options.limit = limit\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n collection,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n versions: true,\n })\n\n // build join aggregation\n if (aggregate) {\n result = await VersionModel.aggregatePaginate(\n VersionModel.aggregate(aggregate),\n paginationOptions,\n )\n } else {\n result = await VersionModel.paginate(versionQuery, paginationOptions)\n }\n\n const docs = JSON.parse(JSON.stringify(result.docs))\n\n return {\n ...result,\n docs: docs.map((doc) => {\n doc = {\n _id: doc.parent,\n id: doc.parent,\n ...doc.version,\n }\n\n return sanitizeInternalFields(doc)\n }),\n }\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","buildSortParam","buildJoinAggregation","buildProjectionFromSelect","getSession","sanitizeInternalFields","queryDrafts","collection","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","VersionModel","versions","collectionConfig","payload","collections","config","options","session","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","flattenedFields","defaultSort","timestamps","combinedWhere","latest","equals","versionQuery","buildQuery","projection","adapter","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","aggregatePaginate","paginate","docs","JSON","parse","stringify","map","doc","parent","id","version"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PaginateOptions, QueryOptions } from 'mongoose'\nimport type { QueryDrafts } from 'payload'\n\nimport { buildVersionCollectionFields, combineQueries, flattenWhereToOperators } from 'payload'\n\nimport type { MongooseAdapter } from './index.js'\n\nimport { buildQuery } from './queries/buildQuery.js'\nimport { buildSortParam } from './queries/buildSortParam.js'\nimport { buildJoinAggregation } from './utilities/buildJoinAggregation.js'\nimport { buildProjectionFromSelect } from './utilities/buildProjectionFromSelect.js'\nimport { getSession } from './utilities/getSession.js'\nimport { transform } from './utilities/transform.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: MongooseAdapter,\n { collection, joins, limit, locale, page, pagination, req, select, sort: sortArg, where },\n) {\n const VersionModel = this.versions[collection]\n const collectionConfig = this.payload.collections[collection].config\n const options: QueryOptions = {\n session: await getSession(this, req),\n }\n\n let hasNearConstraint\n let sort\n\n if (where) {\n const constraints = flattenWhereToOperators(where)\n hasNearConstraint = constraints.some((prop) => Object.keys(prop).some((key) => key === 'near'))\n }\n\n if (!hasNearConstraint) {\n sort = buildSortParam({\n config: this.payload.config,\n fields: collectionConfig.flattenedFields,\n locale,\n sort: sortArg || collectionConfig.defaultSort,\n timestamps: true,\n })\n }\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, where)\n\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig, true)\n const versionQuery = await buildQuery({\n adapter: this,\n fields,\n locale,\n where: combinedWhere,\n })\n\n const projection = buildProjectionFromSelect({\n adapter: this,\n fields,\n select,\n })\n // useEstimatedCount is faster, but not accurate, as it ignores any filters. It is thus set to true if there are no filters.\n const useEstimatedCount =\n hasNearConstraint || !versionQuery || Object.keys(versionQuery).length === 0\n const paginationOptions: PaginateOptions = {\n lean: true,\n leanWithId: true,\n options,\n page,\n pagination,\n projection,\n sort,\n useEstimatedCount,\n }\n\n if (this.collation) {\n const defaultLocale = 'en'\n paginationOptions.collation = {\n locale: locale && locale !== 'all' && locale !== '*' ? locale : defaultLocale,\n ...this.collation,\n }\n }\n\n if (\n !useEstimatedCount &&\n Object.keys(versionQuery).length === 0 &&\n this.disableIndexHints !== true\n ) {\n // Improve the performance of the countDocuments query which is used if useEstimatedCount is set to false by adding\n // a hint. By default, if no hint is provided, MongoDB does not use an indexed field to count the returned documents,\n // which makes queries very slow. This only happens when no query (filter) is provided. If one is provided, it uses\n // the correct indexed field\n paginationOptions.useCustomCountFn = () => {\n return Promise.resolve(\n VersionModel.countDocuments(versionQuery, {\n hint: { _id: 1 },\n }),\n )\n }\n }\n\n if (limit > 0) {\n paginationOptions.limit = limit\n // limit must also be set here, it's ignored when pagination is false\n paginationOptions.options.limit = limit\n }\n\n let result\n\n const aggregate = await buildJoinAggregation({\n adapter: this,\n collection,\n collectionConfig,\n joins,\n locale,\n projection,\n query: versionQuery,\n versions: true,\n })\n\n // build join aggregation\n if (aggregate) {\n result = await VersionModel.aggregatePaginate(\n VersionModel.aggregate(aggregate),\n paginationOptions,\n )\n } else {\n result = await VersionModel.paginate(versionQuery, paginationOptions)\n }\n\n transform({\n adapter: this,\n data: result.docs,\n fields: buildVersionCollectionFields(this.payload.config, collectionConfig),\n operation: 'read',\n })\n\n for (let i = 0; i < result.docs.length; i++) {\n const id = result.docs[i].parent\n result.docs[i] = result.docs[i].version\n result.docs[i].id = id\n }\n\n return result\n}\n"],"names":["buildVersionCollectionFields","combineQueries","flattenWhereToOperators","buildQuery","buildSortParam","buildJoinAggregation","buildProjectionFromSelect","getSession","transform","queryDrafts","collection","joins","limit","locale","page","pagination","req","select","sort","sortArg","where","VersionModel","versions","collectionConfig","payload","collections","config","options","session","hasNearConstraint","constraints","some","prop","Object","keys","key","fields","flattenedFields","defaultSort","timestamps","combinedWhere","latest","equals","versionQuery","adapter","projection","useEstimatedCount","length","paginationOptions","lean","leanWithId","collation","defaultLocale","disableIndexHints","useCustomCountFn","Promise","resolve","countDocuments","hint","_id","result","aggregate","query","aggregatePaginate","paginate","data","docs","operation","i","id","parent","version"],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { ClientSession } from 'mongodb';
2
2
  import type { AggregatePaginateModel, IndexDefinition, IndexOptions, Model, PaginateModel, SchemaOptions } from 'mongoose';
3
3
  import type { ArrayField, BlocksField, CheckboxField, CodeField, CollapsibleField, DateField, EmailField, Field, GroupField, JoinField, JSONField, NumberField, Payload, PayloadRequest, PointField, RadioField, RelationshipField, RichTextField, RowField, SanitizedConfig, SelectField, TabsField, TextareaField, TextField, UploadField } from 'payload';
4
- import type { BuildQueryArgs } from './queries/buildQuery.js';
4
+ import type { BuildQueryArgs } from './queries/getBuildQueryPlugin.js';
5
5
  export interface CollectionModel extends Model<any>, PaginateModel<any>, AggregatePaginateModel<any> {
6
6
  /** buildQuery is used to transform payload's where operator into what can be used by mongoose (e.g. id => _id) */
7
7
  buildQuery: (args: BuildQueryArgs) => Promise<Record<string, unknown>>;