@strapi/core 5.43.0 → 5.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/loaders/plugins/index.d.ts.map +1 -1
  2. package/dist/loaders/plugins/index.js +15 -5
  3. package/dist/loaders/plugins/index.js.map +1 -1
  4. package/dist/loaders/plugins/index.mjs +15 -5
  5. package/dist/loaders/plugins/index.mjs.map +1 -1
  6. package/dist/package.json.js +16 -16
  7. package/dist/package.json.mjs +16 -16
  8. package/dist/services/document-service/entries.d.ts +1 -1
  9. package/dist/services/document-service/entries.js +2 -1
  10. package/dist/services/document-service/entries.js.map +1 -1
  11. package/dist/services/document-service/entries.mjs +2 -1
  12. package/dist/services/document-service/entries.mjs.map +1 -1
  13. package/dist/services/document-service/internationalization.d.ts.map +1 -1
  14. package/dist/services/document-service/internationalization.js +43 -2
  15. package/dist/services/document-service/internationalization.js.map +1 -1
  16. package/dist/services/document-service/internationalization.mjs +43 -2
  17. package/dist/services/document-service/internationalization.mjs.map +1 -1
  18. package/dist/services/document-service/repository.d.ts.map +1 -1
  19. package/dist/services/document-service/repository.js +16 -7
  20. package/dist/services/document-service/repository.js.map +1 -1
  21. package/dist/services/document-service/repository.mjs +13 -4
  22. package/dist/services/document-service/repository.mjs.map +1 -1
  23. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  24. package/dist/services/document-service/transform/relations/utils/map-relation.js +4 -0
  25. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  26. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +4 -0
  27. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  28. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  29. package/dist/services/document-service/utils/populate.js +1 -7
  30. package/dist/services/document-service/utils/populate.js.map +1 -1
  31. package/dist/services/document-service/utils/populate.mjs +1 -7
  32. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  33. package/dist/services/document-service/utils/self-referential-relations.d.ts +37 -0
  34. package/dist/services/document-service/utils/self-referential-relations.d.ts.map +1 -0
  35. package/dist/services/document-service/utils/self-referential-relations.js +111 -0
  36. package/dist/services/document-service/utils/self-referential-relations.js.map +1 -0
  37. package/dist/services/document-service/utils/self-referential-relations.mjs +108 -0
  38. package/dist/services/document-service/utils/self-referential-relations.mjs.map +1 -0
  39. package/dist/services/document-service/utils/unidirectional-relations.d.ts +5 -5
  40. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  41. package/dist/services/document-service/utils/unidirectional-relations.js +5 -3
  42. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  43. package/dist/services/document-service/utils/unidirectional-relations.mjs +5 -3
  44. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  45. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"internationalization.js","sources":["../../../src/services/document-service/internationalization.ts"],"sourcesContent":["import type { Struct, Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { curry, assoc } from 'lodash/fp';\n\ntype Transform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\ntype AsyncTransform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Promise<Modules.Documents.Params.All>;\n\nconst getDefaultLocale = async (): Promise<string> => {\n return strapi.plugin('i18n').service('locales').getDefaultLocale();\n};\n\nconst defaultLocale: AsyncTransform = async (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (!params.locale) {\n return assoc('locale', await getDefaultLocale(), params);\n }\n\n return params;\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst localeToLookup: Transform = (contentType, params) => {\n if (\n !params.locale ||\n !strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)\n ) {\n return params;\n }\n\n if (typeof params.locale !== 'string') {\n // localeToLookup accepts locales of '*'. This is because the document\n // service functions that use this transform work with the '*' locale\n // to return all locales.\n throw new errors.ValidationError(\n `Invalid locale param ${String(params.locale)} provided. Document locales must be strings.`\n );\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst multiLocaleToLookup: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n if (params.locale === '*') {\n return params;\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n }\n\n return params;\n};\n\n/**\n * Translate locale status parameter into the data that will be saved\n */\nconst localeToData: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n const isValidLocale = typeof params.locale === 'string' && params.locale !== '*';\n if (isValidLocale) {\n return assoc(['data', 'locale'], params.locale, params);\n }\n\n throw new errors.ValidationError(\n `Invalid locale param ${params.locale} provided. Document locales must be strings.`\n );\n }\n\n return params;\n};\n\n/**\n * Copy non-localized fields from an existing entry to a new entry being created\n * for a different locale of the same document. Returns a new object with the merged data.\n */\nconst copyNonLocalizedFields = async (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n documentId: string,\n dataToCreate: Record<string, any>\n): Promise<Record<string, any>> => {\n // Check if this is a localized content type and if i18n plugin is available\n const i18nService = strapi.plugin('i18n')?.service('content-types');\n if (!i18nService?.isLocalizedContentType(contentType)) {\n return dataToCreate;\n }\n\n // Find an existing entry for the same document to copy unlocalized fields from\n const existingEntry = await strapi.db.query(contentType.uid).findOne({\n where: { documentId },\n // Prefer published entry, but fall back to any entry\n orderBy: { publishedAt: 'desc' },\n });\n\n // If an entry exists in another locale, copy its non-localized fields\n if (existingEntry) {\n const mergedData = { ...dataToCreate };\n i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {\n model: contentType.uid,\n });\n return mergedData;\n }\n\n return dataToCreate;\n};\n\nconst defaultLocaleCurry = curry(defaultLocale);\nconst localeToLookupCurry = curry(localeToLookup);\nconst multiLocaleToLookupCurry = curry(multiLocaleToLookup);\nconst localeToDataCurry = curry(localeToData);\n\nexport {\n defaultLocaleCurry as defaultLocale,\n localeToLookupCurry as localeToLookup,\n localeToDataCurry as localeToData,\n multiLocaleToLookupCurry as multiLocaleToLookup,\n copyNonLocalizedFields,\n};\n"],"names":["getDefaultLocale","strapi","plugin","service","defaultLocale","contentType","params","isLocalizedContentType","locale","assoc","localeToLookup","errors","ValidationError","String","multiLocaleToLookup","localeToData","isValidLocale","copyNonLocalizedFields","documentId","dataToCreate","i18nService","existingEntry","db","query","uid","findOne","where","orderBy","publishedAt","mergedData","fillNonLocalizedAttributes","model","defaultLocaleCurry","curry","localeToLookupCurry","multiLocaleToLookupCurry","localeToDataCurry"],"mappings":"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"}
1
+ {"version":3,"file":"internationalization.js","sources":["../../../src/services/document-service/internationalization.ts"],"sourcesContent":["import type { Struct, Modules, Schema } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { curry, assoc } from 'lodash/fp';\n\ntype Transform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\ntype AsyncTransform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Promise<Modules.Documents.Params.All>;\n\nconst getDefaultLocale = async (): Promise<string> => {\n return strapi.plugin('i18n').service('locales').getDefaultLocale();\n};\n\nconst defaultLocale: AsyncTransform = async (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (!params.locale) {\n return assoc('locale', await getDefaultLocale(), params);\n }\n\n return params;\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst localeToLookup: Transform = (contentType, params) => {\n if (\n !params.locale ||\n !strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)\n ) {\n return params;\n }\n\n if (typeof params.locale !== 'string') {\n // localeToLookup accepts locales of '*'. This is because the document\n // service functions that use this transform work with the '*' locale\n // to return all locales.\n throw new errors.ValidationError(\n `Invalid locale param ${String(params.locale)} provided. Document locales must be strings.`\n );\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst multiLocaleToLookup: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n if (params.locale === '*') {\n return params;\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n }\n\n return params;\n};\n\n/**\n * Translate locale status parameter into the data that will be saved\n */\nconst localeToData: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n const isValidLocale = typeof params.locale === 'string' && params.locale !== '*';\n if (isValidLocale) {\n return assoc(['data', 'locale'], params.locale, params);\n }\n\n throw new errors.ValidationError(\n `Invalid locale param ${params.locale} provided. Document locales must be strings.`\n );\n }\n\n return params;\n};\n\n/**\n * Mutates the provided data object in place and returns the same reference\n * with populated media values replaced by their upload file IDs.\n */\nconst normalizeMediaIds = (\n schema: Schema.ContentType | Schema.Component,\n data: Record<string, any>\n) => {\n if (!schema?.attributes || !data || typeof data !== 'object') {\n return data;\n }\n\n Object.entries(schema.attributes).forEach(([attributeName, attribute]) => {\n const value = data[attributeName];\n\n if (value == null) {\n return;\n }\n\n if (attribute.type === 'media') {\n if (attribute.multiple) {\n data[attributeName] = Array.isArray(value)\n ? value.map((file: unknown) =>\n file && typeof file === 'object' && 'id' in file ? file.id : file\n )\n : value;\n } else {\n data[attributeName] =\n value && typeof value === 'object' && 'id' in value ? value.id : value;\n }\n\n return;\n }\n\n if (attribute.type === 'component') {\n const componentSchema = strapi.getModel(attribute.component);\n\n if (attribute.repeatable && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) =>\n normalizeMediaIds(componentSchema, componentValue)\n );\n } else {\n normalizeMediaIds(componentSchema, value);\n }\n\n return;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) => {\n if (componentValue?.__component) {\n normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);\n }\n });\n }\n });\n\n return data;\n};\n/**\n * Copy non-localized fields from an existing entry to a new entry being created\n * for a different locale of the same document. Returns a new object with the merged data.\n */\nconst copyNonLocalizedFields = async (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n documentId: string,\n dataToCreate: Record<string, any>\n): Promise<Record<string, any>> => {\n // Check if this is a localized content type and if i18n plugin is available\n const i18nService = strapi.plugin('i18n')?.service('content-types');\n if (!i18nService?.isLocalizedContentType(contentType)) {\n return dataToCreate;\n }\n\n // Find an existing entry for the same document to copy unlocalized fields from\n const attributesToPopulate = i18nService.getNestedPopulateOfNonLocalizedAttributes(\n contentType.uid\n );\n const existingEntry = await strapi.db.query(contentType.uid).findOne({\n where: { documentId },\n // Prefer published entry, but fall back to any entry\n orderBy: { publishedAt: 'desc' },\n populate: attributesToPopulate,\n });\n\n // If an entry exists in another locale, copy its non-localized fields\n if (existingEntry) {\n const mergedData = { ...dataToCreate };\n i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {\n model: contentType.uid,\n });\n return normalizeMediaIds(contentType, mergedData);\n }\n\n return dataToCreate;\n};\n\nconst defaultLocaleCurry = curry(defaultLocale);\nconst localeToLookupCurry = curry(localeToLookup);\nconst multiLocaleToLookupCurry = curry(multiLocaleToLookup);\nconst localeToDataCurry = curry(localeToData);\n\nexport {\n defaultLocaleCurry as defaultLocale,\n localeToLookupCurry as localeToLookup,\n localeToDataCurry as localeToData,\n multiLocaleToLookupCurry as multiLocaleToLookup,\n copyNonLocalizedFields,\n};\n"],"names":["getDefaultLocale","strapi","plugin","service","defaultLocale","contentType","params","isLocalizedContentType","locale","assoc","localeToLookup","errors","ValidationError","String","multiLocaleToLookup","localeToData","isValidLocale","normalizeMediaIds","schema","data","attributes","Object","entries","forEach","attributeName","attribute","value","type","multiple","Array","isArray","map","file","id","componentSchema","getModel","component","repeatable","componentValue","__component","copyNonLocalizedFields","documentId","dataToCreate","i18nService","attributesToPopulate","getNestedPopulateOfNonLocalizedAttributes","uid","existingEntry","db","query","findOne","where","orderBy","publishedAt","populate","mergedData","fillNonLocalizedAttributes","model","defaultLocaleCurry","curry","localeToLookupCurry","multiLocaleToLookupCurry","localeToDataCurry"],"mappings":"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"}
@@ -65,6 +65,45 @@ const defaultLocale = async (contentType, params)=>{
65
65
  }
66
66
  return params;
67
67
  };
68
+ /**
69
+ * Mutates the provided data object in place and returns the same reference
70
+ * with populated media values replaced by their upload file IDs.
71
+ */ const normalizeMediaIds = (schema, data)=>{
72
+ if (!schema?.attributes || !data || typeof data !== 'object') {
73
+ return data;
74
+ }
75
+ Object.entries(schema.attributes).forEach(([attributeName, attribute])=>{
76
+ const value = data[attributeName];
77
+ if (value == null) {
78
+ return;
79
+ }
80
+ if (attribute.type === 'media') {
81
+ if (attribute.multiple) {
82
+ data[attributeName] = Array.isArray(value) ? value.map((file)=>file && typeof file === 'object' && 'id' in file ? file.id : file) : value;
83
+ } else {
84
+ data[attributeName] = value && typeof value === 'object' && 'id' in value ? value.id : value;
85
+ }
86
+ return;
87
+ }
88
+ if (attribute.type === 'component') {
89
+ const componentSchema = strapi.getModel(attribute.component);
90
+ if (attribute.repeatable && Array.isArray(value)) {
91
+ value.forEach((componentValue)=>normalizeMediaIds(componentSchema, componentValue));
92
+ } else {
93
+ normalizeMediaIds(componentSchema, value);
94
+ }
95
+ return;
96
+ }
97
+ if (attribute.type === 'dynamiczone' && Array.isArray(value)) {
98
+ value.forEach((componentValue)=>{
99
+ if (componentValue?.__component) {
100
+ normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);
101
+ }
102
+ });
103
+ }
104
+ });
105
+ return data;
106
+ };
68
107
  /**
69
108
  * Copy non-localized fields from an existing entry to a new entry being created
70
109
  * for a different locale of the same document. Returns a new object with the merged data.
@@ -75,6 +114,7 @@ const defaultLocale = async (contentType, params)=>{
75
114
  return dataToCreate;
76
115
  }
77
116
  // Find an existing entry for the same document to copy unlocalized fields from
117
+ const attributesToPopulate = i18nService.getNestedPopulateOfNonLocalizedAttributes(contentType.uid);
78
118
  const existingEntry = await strapi.db.query(contentType.uid).findOne({
79
119
  where: {
80
120
  documentId
@@ -82,7 +122,8 @@ const defaultLocale = async (contentType, params)=>{
82
122
  // Prefer published entry, but fall back to any entry
83
123
  orderBy: {
84
124
  publishedAt: 'desc'
85
- }
125
+ },
126
+ populate: attributesToPopulate
86
127
  });
87
128
  // If an entry exists in another locale, copy its non-localized fields
88
129
  if (existingEntry) {
@@ -92,7 +133,7 @@ const defaultLocale = async (contentType, params)=>{
92
133
  i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {
93
134
  model: contentType.uid
94
135
  });
95
- return mergedData;
136
+ return normalizeMediaIds(contentType, mergedData);
96
137
  }
97
138
  return dataToCreate;
98
139
  };
@@ -1 +1 @@
1
- {"version":3,"file":"internationalization.mjs","sources":["../../../src/services/document-service/internationalization.ts"],"sourcesContent":["import type { Struct, Modules } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { curry, assoc } from 'lodash/fp';\n\ntype Transform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\ntype AsyncTransform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Promise<Modules.Documents.Params.All>;\n\nconst getDefaultLocale = async (): Promise<string> => {\n return strapi.plugin('i18n').service('locales').getDefaultLocale();\n};\n\nconst defaultLocale: AsyncTransform = async (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (!params.locale) {\n return assoc('locale', await getDefaultLocale(), params);\n }\n\n return params;\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst localeToLookup: Transform = (contentType, params) => {\n if (\n !params.locale ||\n !strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)\n ) {\n return params;\n }\n\n if (typeof params.locale !== 'string') {\n // localeToLookup accepts locales of '*'. This is because the document\n // service functions that use this transform work with the '*' locale\n // to return all locales.\n throw new errors.ValidationError(\n `Invalid locale param ${String(params.locale)} provided. Document locales must be strings.`\n );\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst multiLocaleToLookup: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n if (params.locale === '*') {\n return params;\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n }\n\n return params;\n};\n\n/**\n * Translate locale status parameter into the data that will be saved\n */\nconst localeToData: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n const isValidLocale = typeof params.locale === 'string' && params.locale !== '*';\n if (isValidLocale) {\n return assoc(['data', 'locale'], params.locale, params);\n }\n\n throw new errors.ValidationError(\n `Invalid locale param ${params.locale} provided. Document locales must be strings.`\n );\n }\n\n return params;\n};\n\n/**\n * Copy non-localized fields from an existing entry to a new entry being created\n * for a different locale of the same document. Returns a new object with the merged data.\n */\nconst copyNonLocalizedFields = async (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n documentId: string,\n dataToCreate: Record<string, any>\n): Promise<Record<string, any>> => {\n // Check if this is a localized content type and if i18n plugin is available\n const i18nService = strapi.plugin('i18n')?.service('content-types');\n if (!i18nService?.isLocalizedContentType(contentType)) {\n return dataToCreate;\n }\n\n // Find an existing entry for the same document to copy unlocalized fields from\n const existingEntry = await strapi.db.query(contentType.uid).findOne({\n where: { documentId },\n // Prefer published entry, but fall back to any entry\n orderBy: { publishedAt: 'desc' },\n });\n\n // If an entry exists in another locale, copy its non-localized fields\n if (existingEntry) {\n const mergedData = { ...dataToCreate };\n i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {\n model: contentType.uid,\n });\n return mergedData;\n }\n\n return dataToCreate;\n};\n\nconst defaultLocaleCurry = curry(defaultLocale);\nconst localeToLookupCurry = curry(localeToLookup);\nconst multiLocaleToLookupCurry = curry(multiLocaleToLookup);\nconst localeToDataCurry = curry(localeToData);\n\nexport {\n defaultLocaleCurry as defaultLocale,\n localeToLookupCurry as localeToLookup,\n localeToDataCurry as localeToData,\n multiLocaleToLookupCurry as multiLocaleToLookup,\n copyNonLocalizedFields,\n};\n"],"names":["getDefaultLocale","strapi","plugin","service","defaultLocale","contentType","params","isLocalizedContentType","locale","assoc","localeToLookup","errors","ValidationError","String","multiLocaleToLookup","localeToData","isValidLocale","copyNonLocalizedFields","documentId","dataToCreate","i18nService","existingEntry","db","query","uid","findOne","where","orderBy","publishedAt","mergedData","fillNonLocalizedAttributes","model","defaultLocaleCurry","curry","localeToLookupCurry","multiLocaleToLookupCurry","localeToDataCurry"],"mappings":";;;AAcA,MAAMA,gBAAAA,GAAmB,UAAA;AACvB,IAAA,OAAOC,OAAOC,MAAM,CAAC,QAAQC,OAAO,CAAC,WAAWH,gBAAgB,EAAA;AAClE,CAAA;AAEA,MAAMI,aAAAA,GAAgC,OAAOC,WAAAA,EAAaC,MAAAA,GAAAA;IACxD,IAAI,CAACL,MAAAA,CAAOC,MAAM,CAAC,MAAA,CAAA,CAAQC,OAAO,CAAC,eAAA,CAAA,CAAiBI,sBAAsB,CAACF,WAAAA,CAAAA,EAAc;QACvF,OAAOC,MAAAA;AACT,IAAA;IAEA,IAAI,CAACA,MAAAA,CAAOE,MAAM,EAAE;QAClB,OAAOC,KAAAA,CAAM,QAAA,EAAU,MAAMT,gBAAAA,EAAAA,EAAoBM,MAAAA,CAAAA;AACnD,IAAA;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;IAGA,MAAMI,cAAAA,GAA4B,CAACL,WAAAA,EAAaC,MAAAA,GAAAA;AAC9C,IAAA,IACE,CAACA,MAAAA,CAAOE,MAAM,IACd,CAACP,MAAAA,CAAOC,MAAM,CAAC,MAAA,CAAA,CAAQC,OAAO,CAAC,eAAA,CAAA,CAAiBI,sBAAsB,CAACF,WAAAA,CAAAA,EACvE;QACA,OAAOC,MAAAA;AACT,IAAA;AAEA,IAAA,IAAI,OAAOA,MAAAA,CAAOE,MAAM,KAAK,QAAA,EAAU;;;;AAIrC,QAAA,MAAM,IAAIG,MAAAA,CAAOC,eAAe,CAC9B,CAAC,qBAAqB,EAAEC,MAAAA,CAAOP,MAAAA,CAAOE,MAAM,CAAA,CAAE,4CAA4C,CAAC,CAAA;AAE/F,IAAA;AAEA,IAAA,OAAOC,KAAAA,CAAM;AAAC,QAAA,QAAA;AAAU,QAAA;KAAS,EAAEH,MAAAA,CAAOE,MAAM,EAAEF,MAAAA,CAAAA;AACpD,CAAA;AAEA;;IAGA,MAAMQ,mBAAAA,GAAiC,CAACT,WAAAA,EAAaC,MAAAA,GAAAA;IACnD,IAAI,CAACL,MAAAA,CAAOC,MAAM,CAAC,MAAA,CAAA,CAAQC,OAAO,CAAC,eAAA,CAAA,CAAiBI,sBAAsB,CAACF,WAAAA,CAAAA,EAAc;QACvF,OAAOC,MAAAA;AACT,IAAA;IAEA,IAAIA,MAAAA,CAAOE,MAAM,EAAE;QACjB,IAAIF,MAAAA,CAAOE,MAAM,KAAK,GAAA,EAAK;YACzB,OAAOF,MAAAA;AACT,QAAA;AAEA,QAAA,OAAOG,KAAAA,CAAM;AAAC,YAAA,QAAA;AAAU,YAAA;SAAS,EAAEH,MAAAA,CAAOE,MAAM,EAAEF,MAAAA,CAAAA;AACpD,IAAA;IAEA,OAAOA,MAAAA;AACT,CAAA;AAEA;;IAGA,MAAMS,YAAAA,GAA0B,CAACV,WAAAA,EAAaC,MAAAA,GAAAA;IAC5C,IAAI,CAACL,MAAAA,CAAOC,MAAM,CAAC,MAAA,CAAA,CAAQC,OAAO,CAAC,eAAA,CAAA,CAAiBI,sBAAsB,CAACF,WAAAA,CAAAA,EAAc;QACvF,OAAOC,MAAAA;AACT,IAAA;IAEA,IAAIA,MAAAA,CAAOE,MAAM,EAAE;QACjB,MAAMQ,aAAAA,GAAgB,OAAOV,MAAAA,CAAOE,MAAM,KAAK,QAAA,IAAYF,MAAAA,CAAOE,MAAM,KAAK,GAAA;AAC7E,QAAA,IAAIQ,aAAAA,EAAe;AACjB,YAAA,OAAOP,KAAAA,CAAM;AAAC,gBAAA,MAAA;AAAQ,gBAAA;aAAS,EAAEH,MAAAA,CAAOE,MAAM,EAAEF,MAAAA,CAAAA;AAClD,QAAA;QAEA,MAAM,IAAIK,MAAAA,CAAOC,eAAe,CAC9B,CAAC,qBAAqB,EAAEN,MAAAA,CAAOE,MAAM,CAAC,4CAA4C,CAAC,CAAA;AAEvF,IAAA;IAEA,OAAOF,MAAAA;AACT,CAAA;AAEA;;;AAGC,IACD,MAAMW,sBAAAA,GAAyB,OAC7BZ,WAAAA,EACAa,UAAAA,EACAC,YAAAA,GAAAA;;AAGA,IAAA,MAAMC,WAAAA,GAAcnB,MAAAA,CAAOC,MAAM,CAAC,SAASC,OAAAA,CAAQ,eAAA,CAAA;IACnD,IAAI,CAACiB,WAAAA,EAAab,sBAAAA,CAAuBF,WAAAA,CAAAA,EAAc;QACrD,OAAOc,YAAAA;AACT,IAAA;;IAGA,MAAME,aAAAA,GAAgB,MAAMpB,MAAAA,CAAOqB,EAAE,CAACC,KAAK,CAAClB,WAAAA,CAAYmB,GAAG,CAAA,CAAEC,OAAO,CAAC;QACnEC,KAAAA,EAAO;AAAER,YAAAA;AAAW,SAAA;;QAEpBS,OAAAA,EAAS;YAAEC,WAAAA,EAAa;AAAO;AACjC,KAAA,CAAA;;AAGA,IAAA,IAAIP,aAAAA,EAAe;AACjB,QAAA,MAAMQ,UAAAA,GAAa;AAAE,YAAA,GAAGV;AAAa,SAAA;QACrCC,WAAAA,CAAYU,0BAA0B,CAACD,UAAAA,EAAYR,aAAAA,EAAe;AAChEU,YAAAA,KAAAA,EAAO1B,YAAYmB;AACrB,SAAA,CAAA;QACA,OAAOK,UAAAA;AACT,IAAA;IAEA,OAAOV,YAAAA;AACT;AAEA,MAAMa,qBAAqBC,KAAAA,CAAM7B,aAAAA;AACjC,MAAM8B,sBAAsBD,KAAAA,CAAMvB,cAAAA;AAClC,MAAMyB,2BAA2BF,KAAAA,CAAMnB,mBAAAA;AACvC,MAAMsB,oBAAoBH,KAAAA,CAAMlB,YAAAA;;;;"}
1
+ {"version":3,"file":"internationalization.mjs","sources":["../../../src/services/document-service/internationalization.ts"],"sourcesContent":["import type { Struct, Modules, Schema } from '@strapi/types';\nimport { errors } from '@strapi/utils';\nimport { curry, assoc } from 'lodash/fp';\n\ntype Transform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Modules.Documents.Params.All;\n\ntype AsyncTransform = (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n params: Modules.Documents.Params.All\n) => Promise<Modules.Documents.Params.All>;\n\nconst getDefaultLocale = async (): Promise<string> => {\n return strapi.plugin('i18n').service('locales').getDefaultLocale();\n};\n\nconst defaultLocale: AsyncTransform = async (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (!params.locale) {\n return assoc('locale', await getDefaultLocale(), params);\n }\n\n return params;\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst localeToLookup: Transform = (contentType, params) => {\n if (\n !params.locale ||\n !strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)\n ) {\n return params;\n }\n\n if (typeof params.locale !== 'string') {\n // localeToLookup accepts locales of '*'. This is because the document\n // service functions that use this transform work with the '*' locale\n // to return all locales.\n throw new errors.ValidationError(\n `Invalid locale param ${String(params.locale)} provided. Document locales must be strings.`\n );\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n};\n\n/**\n * Add locale lookup query to the params\n */\nconst multiLocaleToLookup: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n if (params.locale === '*') {\n return params;\n }\n\n return assoc(['lookup', 'locale'], params.locale, params);\n }\n\n return params;\n};\n\n/**\n * Translate locale status parameter into the data that will be saved\n */\nconst localeToData: Transform = (contentType, params) => {\n if (!strapi.plugin('i18n').service('content-types').isLocalizedContentType(contentType)) {\n return params;\n }\n\n if (params.locale) {\n const isValidLocale = typeof params.locale === 'string' && params.locale !== '*';\n if (isValidLocale) {\n return assoc(['data', 'locale'], params.locale, params);\n }\n\n throw new errors.ValidationError(\n `Invalid locale param ${params.locale} provided. Document locales must be strings.`\n );\n }\n\n return params;\n};\n\n/**\n * Mutates the provided data object in place and returns the same reference\n * with populated media values replaced by their upload file IDs.\n */\nconst normalizeMediaIds = (\n schema: Schema.ContentType | Schema.Component,\n data: Record<string, any>\n) => {\n if (!schema?.attributes || !data || typeof data !== 'object') {\n return data;\n }\n\n Object.entries(schema.attributes).forEach(([attributeName, attribute]) => {\n const value = data[attributeName];\n\n if (value == null) {\n return;\n }\n\n if (attribute.type === 'media') {\n if (attribute.multiple) {\n data[attributeName] = Array.isArray(value)\n ? value.map((file: unknown) =>\n file && typeof file === 'object' && 'id' in file ? file.id : file\n )\n : value;\n } else {\n data[attributeName] =\n value && typeof value === 'object' && 'id' in value ? value.id : value;\n }\n\n return;\n }\n\n if (attribute.type === 'component') {\n const componentSchema = strapi.getModel(attribute.component);\n\n if (attribute.repeatable && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) =>\n normalizeMediaIds(componentSchema, componentValue)\n );\n } else {\n normalizeMediaIds(componentSchema, value);\n }\n\n return;\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(value)) {\n value.forEach((componentValue: Record<string, any>) => {\n if (componentValue?.__component) {\n normalizeMediaIds(strapi.getModel(componentValue.__component), componentValue);\n }\n });\n }\n });\n\n return data;\n};\n/**\n * Copy non-localized fields from an existing entry to a new entry being created\n * for a different locale of the same document. Returns a new object with the merged data.\n */\nconst copyNonLocalizedFields = async (\n contentType: Struct.SingleTypeSchema | Struct.CollectionTypeSchema,\n documentId: string,\n dataToCreate: Record<string, any>\n): Promise<Record<string, any>> => {\n // Check if this is a localized content type and if i18n plugin is available\n const i18nService = strapi.plugin('i18n')?.service('content-types');\n if (!i18nService?.isLocalizedContentType(contentType)) {\n return dataToCreate;\n }\n\n // Find an existing entry for the same document to copy unlocalized fields from\n const attributesToPopulate = i18nService.getNestedPopulateOfNonLocalizedAttributes(\n contentType.uid\n );\n const existingEntry = await strapi.db.query(contentType.uid).findOne({\n where: { documentId },\n // Prefer published entry, but fall back to any entry\n orderBy: { publishedAt: 'desc' },\n populate: attributesToPopulate,\n });\n\n // If an entry exists in another locale, copy its non-localized fields\n if (existingEntry) {\n const mergedData = { ...dataToCreate };\n i18nService.fillNonLocalizedAttributes(mergedData, existingEntry, {\n model: contentType.uid,\n });\n return normalizeMediaIds(contentType, mergedData);\n }\n\n return dataToCreate;\n};\n\nconst defaultLocaleCurry = curry(defaultLocale);\nconst localeToLookupCurry = curry(localeToLookup);\nconst multiLocaleToLookupCurry = curry(multiLocaleToLookup);\nconst localeToDataCurry = curry(localeToData);\n\nexport {\n defaultLocaleCurry as defaultLocale,\n localeToLookupCurry as localeToLookup,\n localeToDataCurry as localeToData,\n multiLocaleToLookupCurry as multiLocaleToLookup,\n copyNonLocalizedFields,\n};\n"],"names":["getDefaultLocale","strapi","plugin","service","defaultLocale","contentType","params","isLocalizedContentType","locale","assoc","localeToLookup","errors","ValidationError","String","multiLocaleToLookup","localeToData","isValidLocale","normalizeMediaIds","schema","data","attributes","Object","entries","forEach","attributeName","attribute","value","type","multiple","Array","isArray","map","file","id","componentSchema","getModel","component","repeatable","componentValue","__component","copyNonLocalizedFields","documentId","dataToCreate","i18nService","attributesToPopulate","getNestedPopulateOfNonLocalizedAttributes","uid","existingEntry","db","query","findOne","where","orderBy","publishedAt","populate","mergedData","fillNonLocalizedAttributes","model","defaultLocaleCurry","curry","localeToLookupCurry","multiLocaleToLookupCurry","localeToDataCurry"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAiC3E,eAAO,MAAM,2BAA2B,EAAE,uBAwqBzC,CAAC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/repository.ts"],"names":[],"mappings":"AAWA,OAAO,EAAqB,KAAK,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAkC3E,eAAO,MAAM,2BAA2B,EAAE,uBA0rBzC,CAAC"}
@@ -15,6 +15,7 @@ var idTransform = require('./transform/id-transform.js');
15
15
  var events = require('./events.js');
16
16
  var unidirectionalRelations = require('./utils/unidirectional-relations.js');
17
17
  var bidirectionalRelations = require('./utils/bidirectional-relations.js');
18
+ var selfReferentialRelations = require('./utils/self-referential-relations.js');
18
19
  var index = require('../entity-validator/index.js');
19
20
  var firstPublishedAt = require('./first-published-at.js');
20
21
  var orderedParallel = require('./utils/ordered-parallel.js');
@@ -261,17 +262,17 @@ const createContentTypeRepository = (uid, validator = index)=>{
261
262
  return strapi.db.query(uid).findOne(query$1);
262
263
  }
263
264
  async function deleteDocument(opts = {}) {
264
- const { documentId, ...params } = opts;
265
- const query$1 = await strapiUtils.async.pipe(validateParams, fp.omit('status'), internationalization.defaultLocale(contentType), internationalization.multiLocaleToLookup(contentType), query.transformParamsToQuery(uid), (query)=>fp.assoc('where', {
265
+ const { documentId, ...params$1 } = opts;
266
+ const lookupQuery = await strapiUtils.async.pipe(validateParams, fp.omit('status'), internationalization.defaultLocale(contentType), internationalization.multiLocaleToLookup(contentType), query.transformParamsToQuery(uid), (query)=>fp.assoc('where', {
266
267
  ...query.where,
267
268
  documentId
268
- }, query))(params);
269
- if (hasDraftAndPublish && params.status === 'draft') {
269
+ }, query))(params$1);
270
+ const selectionQuery = await strapiUtils.async.pipe(validateParams, fp.omit('status'), params.pickSelectionParams, query.transformParamsToQuery(uid))(params$1);
271
+ if (hasDraftAndPublish && params$1.status === 'draft') {
270
272
  throw new Error('Cannot delete a draft document');
271
273
  }
272
- const entriesToDelete = await strapi.db.query(uid).findMany(query$1);
273
- // Delete all matched entries and its components
274
- const deletedEntries = await strapiUtils.async.map(entriesToDelete, (entryToDelete)=>entries$1.delete(entryToDelete.id));
274
+ const entriesToDelete = await strapi.db.query(uid).findMany(lookupQuery);
275
+ const deletedEntries = await strapiUtils.async.map(entriesToDelete, (entryToDelete)=>entries$1.delete(entryToDelete.id, selectionQuery));
275
276
  entriesToDelete.forEach(emitEvent('entry.delete'));
276
277
  return {
277
278
  documentId,
@@ -422,6 +423,8 @@ const createContentTypeRepository = (uid, validator = index)=>{
422
423
  newVersions: draftsToPublish,
423
424
  oldVersions: oldPublishedVersions
424
425
  });
426
+ // Load self-referential relations from draft entries before publishing
427
+ const selfRelationsToSync = await selfReferentialRelations.load(uid, draftsToPublish);
425
428
  // Delete old published versions
426
429
  await strapiUtils.async.map(oldPublishedVersions, (entry)=>entries$1.delete(entry.id));
427
430
  // Add firstPublishedAt to draft if it doesn't exist
@@ -437,6 +440,8 @@ const createContentTypeRepository = (uid, validator = index)=>{
437
440
  ...oldPublishedVersions,
438
441
  ...updatedDraft
439
442
  ], publishedEntries, bidirectionalRelationsToSync);
443
+ // Sync self-referential relations with the new published entries
444
+ await selfReferentialRelations.sync(draftsToPublish, publishedEntries, selfRelationsToSync);
440
445
  publishedEntries.forEach(emitEvent('entry.publish'));
441
446
  return {
442
447
  documentId,
@@ -504,6 +509,8 @@ const createContentTypeRepository = (uid, validator = index)=>{
504
509
  newVersions: versionsToDraft,
505
510
  oldVersions: oldDrafts
506
511
  });
512
+ // Load self-referential relations from published entries before discarding
513
+ const selfRelationsToSync = await selfReferentialRelations.load(uid, versionsToDraft);
507
514
  // Delete old drafts
508
515
  await strapiUtils.async.map(oldDrafts, (entry)=>entries$1.delete(entry.id));
509
516
  // Transform published entry data and create draft versions
@@ -517,6 +524,8 @@ const createContentTypeRepository = (uid, validator = index)=>{
517
524
  ...oldDrafts,
518
525
  ...versionsToDraft
519
526
  ], draftEntries, bidirectionalRelationsToSync);
527
+ // Sync self-referential relations with the new draft entries
528
+ await selfReferentialRelations.sync(versionsToDraft, draftEntries, selfRelationsToSync);
520
529
  draftEntries.forEach(emitEvent('entry.draft-discard'));
521
530
  return {
522
531
  documentId,
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry, isEmpty, pick } from 'lodash/fp';\n\nimport {\n async,\n contentTypes as contentTypesUtils,\n validate,\n errors,\n createModelCache,\n} from '@strapi/utils';\n\nimport type { UID, Modules } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport { copyNonLocalizedFields } from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { ALLOWED_DOCUMENT_ROOT_PARAM_KEYS, pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\nimport * as unidirectionalRelations from './utils/unidirectional-relations';\nimport * as bidirectionalRelations from './utils/bidirectional-relations';\nimport entityValidator from '../entity-validator';\nimport { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at';\nimport { runParallelWithOrderedErrors } from './utils/ordered-parallel';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\n// config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n\n// BCP 47–style locale format: 2–3 letter language code (any case), optional subtags (-XX or -XXX...), max 35 chars\nconst LOCALE_FORMAT = /^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$/;\nconst MAX_LOCALE_LENGTH = 35;\n\n/** Treat as \"param not provided\": null, undefined, or empty string (e.g. from query/JSON). */\nconst isParamEmpty = (v: unknown): boolean => v === undefined || v === null || v === '';\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (\n uid,\n validator = entityValidator\n) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n /**\n * Checks status parameter. When strict is true, throws on invalid status.\n * Valid values are 'published' and 'draft'; for types without D&P they are currently ignored but may throw in the future\n */\n const checkStatus = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.status)) {\n delete params.status;\n return params;\n }\n\n if (params.status !== 'published' && params.status !== 'draft') {\n throw new errors.ValidationError(\n `Invalid parameter at 'status'. Expected 'published' or 'draft', received: ${params.status}`\n );\n }\n\n return params;\n };\n\n /**\n * Checks locale parameter. When strict is true, throws on invalid locale value.\n * Accepts only: string (single locale or '*'), array of locale strings (e.g. bulk publish),\n * empty string, null, or undefined (removed but allowed)\n */\n const checkLocale = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.locale)) {\n delete params.locale;\n return params;\n }\n\n // Reject objects (we only accept string, array of strings, empty string, null, undefined)\n if (typeof params.locale === 'object' && !Array.isArray(params.locale)) {\n throw new errors.ValidationError(\n `Invalid parameter at 'locale'. Expected a string, array of strings, empty string, null, or undefined; received: object`,\n { received: params.locale }\n );\n }\n\n const validateAndNormalizeOne = (value: unknown, path: string): string => {\n if (typeof value !== 'string') {\n throw new errors.ValidationError(\n `Invalid parameter at '${path}'. Expected a string, received: ${typeof value}`,\n { received: value }\n );\n }\n if (value === '*') return value;\n const isEmpty = value.length === 0;\n const tooLong = value.length > MAX_LOCALE_LENGTH;\n const invalidFormat = !LOCALE_FORMAT.test(value);\n if (isEmpty || tooLong || invalidFormat) {\n let reason: string;\n if (isEmpty) {\n reason = 'Locale cannot be empty';\n } else if (tooLong) {\n reason = `Locale exceeds maximum length of ${MAX_LOCALE_LENGTH} characters`;\n } else {\n reason = 'Locale must be a valid BCP 47 format (e.g. en, en-US, zh-Hans)';\n }\n throw new errors.ValidationError(`Invalid parameter at '${path}'. ${reason}.`);\n }\n return value;\n };\n\n if (Array.isArray(params.locale)) {\n const filtered = (params.locale as unknown[]).filter(\n (item): item is string => typeof item === 'string' && !isParamEmpty(item)\n );\n if (filtered.length === 0) {\n delete params.locale;\n return params;\n }\n params.locale = filtered.map((item, i) => validateAndNormalizeOne(item, `locale[${i}]`));\n return params;\n }\n\n params.locale = validateAndNormalizeOne(params.locale, 'locale');\n return params;\n };\n\n /**\n * Pagination param parsing (used only when strict).\n * Contract: empty (null/undefined/'') → undefined (omit from result).\n * present but invalid → throw ValidationError.\n * present and valid → return normalized value.\n */\n const parsePaginationInt = (\n name: string,\n value: unknown,\n strict: boolean,\n spec: { min: number; allowMinusOne?: boolean }\n ): number | undefined => {\n if (isParamEmpty(value)) return undefined;\n const num = Number(value);\n const valid =\n Number.isInteger(num) && (num >= spec.min || (spec.allowMinusOne === true && num === -1));\n if (!valid && strict) {\n const expected = spec.allowMinusOne\n ? `integer >= ${spec.min} or -1`\n : `integer >= ${spec.min}`;\n throw new errors.ValidationError(\n `Invalid parameter at '${name}'. Expected ${expected}, received: ${value}`\n );\n }\n return valid ? num : undefined;\n };\n\n const parseWithCount = (value: unknown): boolean | undefined => {\n if (isParamEmpty(value)) return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string' && (value === 'true' || value === 'false'))\n return value === 'true';\n throw new errors.ValidationError(\n `Invalid parameter at 'withCount'. Expected a boolean, received: ${typeof value}`\n );\n };\n\n const PAGINATION_KEYS = ['page', 'pageSize', 'start', 'limit', 'withCount'] as const;\n\n /**\n * When strict: empty → omit, invalid → throw, valid → include.\n * When not strict: return params unchanged.\n */\n const checkPagination = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) return params;\n\n const hasPage = !isParamEmpty(params.page) || !isParamEmpty(params.pageSize);\n const hasOffset = !isParamEmpty(params.start) || !isParamEmpty(params.limit);\n if (hasPage && hasOffset) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Cannot use both page-based (page, pageSize) and offset-based (start, limit) pagination in the same query.'\n );\n }\n\n const page = parsePaginationInt('page', params.page, strict, { min: 1 });\n const pageSize = parsePaginationInt('pageSize', params.pageSize, strict, { min: 1 });\n const start = parsePaginationInt('start', params.start, strict, { min: 0 });\n const limit = parsePaginationInt('limit', params.limit, strict, {\n min: 1,\n allowMinusOne: true,\n });\n const withCount = parseWithCount(params.withCount);\n\n const result = { ...omit(PAGINATION_KEYS, params) };\n if (page !== undefined) result.page = page;\n if (pageSize !== undefined) result.pageSize = pageSize;\n if (start !== undefined) result.start = start;\n if (limit !== undefined) result.limit = limit;\n if (withCount !== undefined) result.withCount = withCount;\n return result;\n };\n\n /**\n * When strict is true, strip to allowed root-level keys so only those reach the query.\n * Extra params (e.g. from content API addQueryParams) are allowed in so middlewares see them,\n * but are stripped here before the query pipeline; they never affect the document query.\n */\n const checkUnrecognizedRootParams = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n return pick(ALLOWED_DOCUMENT_ROOT_PARAM_KEYS as unknown as string[], params) as Record<\n string,\n unknown\n >;\n };\n\n const validateParams = async (\n params: Modules.Documents.Params.All\n ): Promise<Modules.Documents.Params.All> => {\n // Cache model lookups for this request to avoid repeating the same work\n const modelCache = createModelCache(getModel);\n\n const ctx = { schema: contentType, getModel: modelCache.getModel };\n\n // Only validate what is actually provided\n const validations: Promise<unknown>[] = [];\n\n if (params.filters && !isEmpty(params.filters)) {\n validations.push(validators.validateFilters(ctx, params.filters, filtersValidations));\n }\n\n if (params.sort && !isEmpty(params.sort)) {\n validations.push(validators.validateSort(ctx, params.sort, sortValidations));\n }\n\n if (params.fields && !isEmpty(params.fields)) {\n validations.push(validators.validateFields(ctx, params.fields, fieldValidations));\n }\n\n if (params.populate && !isEmpty(params.populate)) {\n validations.push(validators.validatePopulate(ctx, params.populate, populateValidations));\n }\n\n // Run validations together but keep the same error order as before\n await runParallelWithOrderedErrors(validations);\n\n // Clean up cache after validation\n modelCache.clear();\n\n // Strip lookup from params, it's only used internally\n if (params.lookup) {\n throw new errors.ValidationError(\"Invalid params: 'lookup'\");\n }\n\n // Validate status, locale, and pagination based on config\n // config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n const rawStrictParams: unknown = strapi.config.get('api.documents.strictParams', undefined);\n\n if (rawStrictParams !== undefined && rawStrictParams !== false && rawStrictParams !== true) {\n throw new errors.ValidationError(\n `Invalid config.api.documents.strictParams value: \"${rawStrictParams}\". Expected boolean (true or false).`\n );\n }\n\n const strict = rawStrictParams === true;\n\n let processedParams: Record<string, unknown>;\n if (strict) {\n processedParams = checkUnrecognizedRootParams(params as Record<string, unknown>, strict);\n processedParams = checkStatus(processedParams, strict);\n processedParams = checkLocale(processedParams, strict);\n processedParams = checkPagination(processedParams, strict);\n } else {\n processedParams = params as Record<string, unknown>;\n }\n\n return processedParams as Modules.Documents.Params.All;\n };\n\n const entries = createEntriesService(uid, validator);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n if (hasDraftAndPublish && params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(query);\n\n // Delete all matched entries and its components\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n omit(['id', 'createdAt', 'updatedAt']),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\n )\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n filterDataFirstPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n const mergedData = await copyNonLocalizedFields(contentType, documentId, {\n ...queryParams.data,\n documentId,\n });\n\n updatedDraft = await entries.create({\n ...queryParams,\n data: mergedData,\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, oldPublishedVersions] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targetting the old published entries\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Add firstPublishedAt to draft if it doesn't exist\n const updatedDraft = await async.map(draftsToPublish, (draft: any) =>\n addFirstPublishedAtToDraft(draft, entries.update, contentType)\n );\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(updatedDraft, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n bidirectionalRelationsToSync\n );\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, oldDrafts] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targeting the old drafts\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n // Delete old drafts\n await async.map(oldDrafts, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n // Sync unidirectional relations with the new draft entries\n await unidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n bidirectionalRelationsToSync\n );\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validators","validate","getModel","schema","strapi","LOCALE_FORMAT","MAX_LOCALE_LENGTH","isParamEmpty","v","undefined","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","checkStatus","params","strict","status","errors","ValidationError","checkLocale","locale","Array","isArray","received","validateAndNormalizeOne","value","path","isEmpty","length","tooLong","invalidFormat","test","reason","filtered","filter","item","map","i","parsePaginationInt","name","spec","num","Number","valid","isInteger","min","allowMinusOne","expected","parseWithCount","PAGINATION_KEYS","checkPagination","hasPage","page","pageSize","hasOffset","start","limit","withCount","result","omit","checkUnrecognizedRootParams","pick","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","validateParams","modelCache","createModelCache","ctx","validations","push","validateFilters","validateSort","fields","validateFields","validatePopulate","runParallelWithOrderedErrors","clear","lookup","rawStrictParams","config","get","processedParams","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","Error","entriesToDelete","deletedEntries","entryToDelete","delete","id","forEach","create","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","clonedEntries","createDocumentId","data","merge","at","update","filterDataFirstPublishedAt","restParams","pickSelectionParams","entryToUpdate","updatedDraft","documentExists","mergedData","copyNonLocalizedFields","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","shouldPropagateRelation","components","bidirectionalRelationsToSync","bidirectionalRelations","entry","draft","addFirstPublishedAtToDraft","publishedEntries","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","omitComponentData","wrapInTransaction"],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sources":["../../../src/services/document-service/repository.ts"],"sourcesContent":["import { omit, assoc, merge, curry, isEmpty, pick } from 'lodash/fp';\n\nimport {\n async,\n contentTypes as contentTypesUtils,\n validate,\n errors,\n createModelCache,\n} from '@strapi/utils';\n\nimport type { UID, Modules } from '@strapi/types';\nimport { wrapInTransaction, type RepositoryFactoryMethod } from './common';\nimport * as DP from './draft-and-publish';\nimport * as i18n from './internationalization';\nimport { copyNonLocalizedFields } from './internationalization';\nimport * as components from './components';\n\nimport { createEntriesService } from './entries';\nimport { ALLOWED_DOCUMENT_ROOT_PARAM_KEYS, pickSelectionParams } from './params';\nimport { createDocumentId } from '../../utils/transform-content-types-to-models';\nimport { getDeepPopulate } from './utils/populate';\nimport { transformParamsToQuery } from './transform/query';\nimport { transformParamsDocumentId } from './transform/id-transform';\nimport { createEventManager } from './events';\nimport * as unidirectionalRelations from './utils/unidirectional-relations';\nimport * as bidirectionalRelations from './utils/bidirectional-relations';\nimport * as selfReferentialRelations from './utils/self-referential-relations';\nimport entityValidator from '../entity-validator';\nimport { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at';\nimport { runParallelWithOrderedErrors } from './utils/ordered-parallel';\n\nconst { validators } = validate;\n\n// we have to typecast to reconcile the differences between validator and database getModel\nconst getModel = ((schema: UID.Schema) => strapi.getModel(schema)) as (schema: string) => any;\n\n// config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n\n// BCP 47–style locale format: 2–3 letter language code (any case), optional subtags (-XX or -XXX...), max 35 chars\nconst LOCALE_FORMAT = /^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})*$/;\nconst MAX_LOCALE_LENGTH = 35;\n\n/** Treat as \"param not provided\": null, undefined, or empty string (e.g. from query/JSON). */\nconst isParamEmpty = (v: unknown): boolean => v === undefined || v === null || v === '';\n\nexport const createContentTypeRepository: RepositoryFactoryMethod = (\n uid,\n validator = entityValidator\n) => {\n const contentType = strapi.contentType(uid);\n const hasDraftAndPublish = contentTypesUtils.hasDraftAndPublish(contentType);\n\n // Define the validations that should be performed\n const sortValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const fieldValidations = ['scalarAttributes'];\n const filtersValidations = ['nonAttributesOperators', 'dynamicZones', 'morphRelations'];\n const populateValidations = {\n sort: sortValidations,\n field: fieldValidations,\n filters: filtersValidations,\n populate: ['nonAttributesOperators'],\n };\n\n /**\n * Checks status parameter. When strict is true, throws on invalid status.\n * Valid values are 'published' and 'draft'; for types without D&P they are currently ignored but may throw in the future\n */\n const checkStatus = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.status)) {\n delete params.status;\n return params;\n }\n\n if (params.status !== 'published' && params.status !== 'draft') {\n throw new errors.ValidationError(\n `Invalid parameter at 'status'. Expected 'published' or 'draft', received: ${params.status}`\n );\n }\n\n return params;\n };\n\n /**\n * Checks locale parameter. When strict is true, throws on invalid locale value.\n * Accepts only: string (single locale or '*'), array of locale strings (e.g. bulk publish),\n * empty string, null, or undefined (removed but allowed)\n */\n const checkLocale = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n if (isParamEmpty(params.locale)) {\n delete params.locale;\n return params;\n }\n\n // Reject objects (we only accept string, array of strings, empty string, null, undefined)\n if (typeof params.locale === 'object' && !Array.isArray(params.locale)) {\n throw new errors.ValidationError(\n `Invalid parameter at 'locale'. Expected a string, array of strings, empty string, null, or undefined; received: object`,\n { received: params.locale }\n );\n }\n\n const validateAndNormalizeOne = (value: unknown, path: string): string => {\n if (typeof value !== 'string') {\n throw new errors.ValidationError(\n `Invalid parameter at '${path}'. Expected a string, received: ${typeof value}`,\n { received: value }\n );\n }\n if (value === '*') return value;\n const isEmpty = value.length === 0;\n const tooLong = value.length > MAX_LOCALE_LENGTH;\n const invalidFormat = !LOCALE_FORMAT.test(value);\n if (isEmpty || tooLong || invalidFormat) {\n let reason: string;\n if (isEmpty) {\n reason = 'Locale cannot be empty';\n } else if (tooLong) {\n reason = `Locale exceeds maximum length of ${MAX_LOCALE_LENGTH} characters`;\n } else {\n reason = 'Locale must be a valid BCP 47 format (e.g. en, en-US, zh-Hans)';\n }\n throw new errors.ValidationError(`Invalid parameter at '${path}'. ${reason}.`);\n }\n return value;\n };\n\n if (Array.isArray(params.locale)) {\n const filtered = (params.locale as unknown[]).filter(\n (item): item is string => typeof item === 'string' && !isParamEmpty(item)\n );\n if (filtered.length === 0) {\n delete params.locale;\n return params;\n }\n params.locale = filtered.map((item, i) => validateAndNormalizeOne(item, `locale[${i}]`));\n return params;\n }\n\n params.locale = validateAndNormalizeOne(params.locale, 'locale');\n return params;\n };\n\n /**\n * Pagination param parsing (used only when strict).\n * Contract: empty (null/undefined/'') → undefined (omit from result).\n * present but invalid → throw ValidationError.\n * present and valid → return normalized value.\n */\n const parsePaginationInt = (\n name: string,\n value: unknown,\n strict: boolean,\n spec: { min: number; allowMinusOne?: boolean }\n ): number | undefined => {\n if (isParamEmpty(value)) return undefined;\n const num = Number(value);\n const valid =\n Number.isInteger(num) && (num >= spec.min || (spec.allowMinusOne === true && num === -1));\n if (!valid && strict) {\n const expected = spec.allowMinusOne\n ? `integer >= ${spec.min} or -1`\n : `integer >= ${spec.min}`;\n throw new errors.ValidationError(\n `Invalid parameter at '${name}'. Expected ${expected}, received: ${value}`\n );\n }\n return valid ? num : undefined;\n };\n\n const parseWithCount = (value: unknown): boolean | undefined => {\n if (isParamEmpty(value)) return undefined;\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string' && (value === 'true' || value === 'false'))\n return value === 'true';\n throw new errors.ValidationError(\n `Invalid parameter at 'withCount'. Expected a boolean, received: ${typeof value}`\n );\n };\n\n const PAGINATION_KEYS = ['page', 'pageSize', 'start', 'limit', 'withCount'] as const;\n\n /**\n * When strict: empty → omit, invalid → throw, valid → include.\n * When not strict: return params unchanged.\n */\n const checkPagination = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) return params;\n\n const hasPage = !isParamEmpty(params.page) || !isParamEmpty(params.pageSize);\n const hasOffset = !isParamEmpty(params.start) || !isParamEmpty(params.limit);\n if (hasPage && hasOffset) {\n throw new errors.ValidationError(\n 'Invalid pagination parameters. Cannot use both page-based (page, pageSize) and offset-based (start, limit) pagination in the same query.'\n );\n }\n\n const page = parsePaginationInt('page', params.page, strict, { min: 1 });\n const pageSize = parsePaginationInt('pageSize', params.pageSize, strict, { min: 1 });\n const start = parsePaginationInt('start', params.start, strict, { min: 0 });\n const limit = parsePaginationInt('limit', params.limit, strict, {\n min: 1,\n allowMinusOne: true,\n });\n const withCount = parseWithCount(params.withCount);\n\n const result = { ...omit(PAGINATION_KEYS, params) };\n if (page !== undefined) result.page = page;\n if (pageSize !== undefined) result.pageSize = pageSize;\n if (start !== undefined) result.start = start;\n if (limit !== undefined) result.limit = limit;\n if (withCount !== undefined) result.withCount = withCount;\n return result;\n };\n\n /**\n * When strict is true, strip to allowed root-level keys so only those reach the query.\n * Extra params (e.g. from content API addQueryParams) are allowed in so middlewares see them,\n * but are stripped here before the query pipeline; they never affect the document query.\n */\n const checkUnrecognizedRootParams = (\n params: Record<string, unknown>,\n strict: boolean\n ): Record<string, unknown> => {\n if (!strict) {\n return params;\n }\n\n return pick(ALLOWED_DOCUMENT_ROOT_PARAM_KEYS as unknown as string[], params) as Record<\n string,\n unknown\n >;\n };\n\n const validateParams = async (\n params: Modules.Documents.Params.All\n ): Promise<Modules.Documents.Params.All> => {\n // Cache model lookups for this request to avoid repeating the same work\n const modelCache = createModelCache(getModel);\n\n const ctx = { schema: contentType, getModel: modelCache.getModel };\n\n // Only validate what is actually provided\n const validations: Promise<unknown>[] = [];\n\n if (params.filters && !isEmpty(params.filters)) {\n validations.push(validators.validateFilters(ctx, params.filters, filtersValidations));\n }\n\n if (params.sort && !isEmpty(params.sort)) {\n validations.push(validators.validateSort(ctx, params.sort, sortValidations));\n }\n\n if (params.fields && !isEmpty(params.fields)) {\n validations.push(validators.validateFields(ctx, params.fields, fieldValidations));\n }\n\n if (params.populate && !isEmpty(params.populate)) {\n validations.push(validators.validatePopulate(ctx, params.populate, populateValidations));\n }\n\n // Run validations together but keep the same error order as before\n await runParallelWithOrderedErrors(validations);\n\n // Clean up cache after validation\n modelCache.clear();\n\n // Strip lookup from params, it's only used internally\n if (params.lookup) {\n throw new errors.ValidationError(\"Invalid params: 'lookup'\");\n }\n\n // Validate status, locale, and pagination based on config\n // config.api.documents.strictParams: false/undefined (pass through), true (throw on invalid)\n const rawStrictParams: unknown = strapi.config.get('api.documents.strictParams', undefined);\n\n if (rawStrictParams !== undefined && rawStrictParams !== false && rawStrictParams !== true) {\n throw new errors.ValidationError(\n `Invalid config.api.documents.strictParams value: \"${rawStrictParams}\". Expected boolean (true or false).`\n );\n }\n\n const strict = rawStrictParams === true;\n\n let processedParams: Record<string, unknown>;\n if (strict) {\n processedParams = checkUnrecognizedRootParams(params as Record<string, unknown>, strict);\n processedParams = checkStatus(processedParams, strict);\n processedParams = checkLocale(processedParams, strict);\n processedParams = checkPagination(processedParams, strict);\n } else {\n processedParams = params as Record<string, unknown>;\n }\n\n return processedParams as Modules.Documents.Params.All;\n };\n\n const entries = createEntriesService(uid, validator);\n\n const eventManager = createEventManager(strapi, uid);\n const emitEvent = curry(eventManager.emitEvent);\n\n async function findMany(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params || {});\n\n return strapi.db.query(uid).findMany(query);\n }\n\n async function findFirst(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n // TODO: do we really want to add filters on the findOne now that we have findFirst ?\n async function findOne(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n DP.defaultToDraft,\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n transformParamsDocumentId(uid),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n return strapi.db.query(uid).findOne(query);\n }\n\n async function deleteDocument(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const lookupQuery = await async.pipe(\n validateParams,\n omit('status'),\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId }, query)\n )(params);\n\n const selectionQuery = await async.pipe(\n validateParams,\n omit('status'),\n pickSelectionParams,\n transformParamsToQuery(uid)\n )(params);\n\n if (hasDraftAndPublish && params.status === 'draft') {\n throw new Error('Cannot delete a draft document');\n }\n\n const entriesToDelete = await strapi.db.query(uid).findMany(lookupQuery);\n\n const deletedEntries = await async.map(entriesToDelete, (entryToDelete: any) =>\n entries.delete(entryToDelete.id, selectionQuery)\n );\n\n entriesToDelete.forEach(emitEvent('entry.delete'));\n\n return { documentId, entries: deletedEntries };\n }\n\n async function create(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToData(contentType),\n i18n.defaultLocale(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const doc = await entries.create(queryParams);\n\n emitEvent('entry.create', doc);\n\n if (hasDraftAndPublish && params.status === 'published') {\n return publish({\n ...params,\n documentId: doc.documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return doc;\n }\n\n async function clone(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n // Get deep populate\n const entriesToClone = await strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n // DP Enabled: Clone drafts\n // DP Disabled: Clone only the existing version (published)\n publishedAt: { $null: hasDraftAndPublish },\n },\n populate: getDeepPopulate(uid, { relationalFields: ['id'] }),\n });\n\n const clonedEntries = await async.map(\n entriesToClone,\n async.pipe(\n omit(['id', 'createdAt', 'updatedAt']),\n // assign new documentId\n assoc('documentId', createDocumentId()),\n // Merge new data into it\n (data) => merge(data, queryParams.data),\n (data) => entries.create({ ...queryParams, data, status: 'draft' })\n )\n );\n\n clonedEntries.forEach(emitEvent('entry.create'));\n\n return { documentId: clonedEntries.at(0)?.documentId, entries: clonedEntries };\n }\n\n async function update(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n DP.filterDataPublishedAt,\n filterDataFirstPublishedAt,\n DP.setStatusToDraft(contentType),\n DP.statusToLookup(contentType),\n DP.statusToData(contentType),\n // Default locale will be set if not provided\n i18n.defaultLocale(contentType),\n i18n.localeToLookup(contentType),\n i18n.localeToData(contentType)\n )(params);\n\n const { data, ...restParams } = await transformParamsDocumentId(uid, queryParams || {});\n const query = transformParamsToQuery(uid, pickSelectionParams(restParams || {}) as any);\n\n // Validation\n // Find if document exists\n const entryToUpdate = await strapi.db\n .query(uid)\n .findOne({ ...query, where: { ...queryParams?.lookup, ...query?.where, documentId } });\n\n let updatedDraft = null;\n if (entryToUpdate) {\n updatedDraft = await entries.update(entryToUpdate, queryParams);\n emitEvent('entry.update', updatedDraft);\n }\n\n if (!updatedDraft) {\n const documentExists = await strapi.db\n .query(contentType.uid)\n .findOne({ where: { documentId } });\n\n if (documentExists) {\n const mergedData = await copyNonLocalizedFields(contentType, documentId, {\n ...queryParams.data,\n documentId,\n });\n\n updatedDraft = await entries.create({\n ...queryParams,\n data: mergedData,\n });\n emitEvent('entry.create', updatedDraft);\n }\n }\n\n if (hasDraftAndPublish && updatedDraft && params.status === 'published') {\n return publish({\n ...params,\n documentId,\n }).then((doc) => doc.entries[0]);\n }\n\n return updatedDraft;\n }\n\n async function count(params = {} as any) {\n const query = await async.pipe(\n validateParams,\n DP.defaultStatus(contentType),\n DP.statusToLookup(contentType),\n\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid)\n )(params);\n\n return strapi.db.query(uid).count(query);\n }\n\n async function publish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [draftsToPublish, oldPublishedVersions] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null, // Ignore lookup\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targetting the old published entries\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: draftsToPublish,\n oldVersions: oldPublishedVersions,\n });\n\n // Load self-referential relations from draft entries before publishing\n const selfRelationsToSync = await selfReferentialRelations.load(uid, draftsToPublish);\n\n // Delete old published versions\n await async.map(oldPublishedVersions, (entry: any) => entries.delete(entry.id));\n\n // Add firstPublishedAt to draft if it doesn't exist\n const updatedDraft = await async.map(draftsToPublish, (draft: any) =>\n addFirstPublishedAtToDraft(draft, entries.update, contentType)\n );\n\n // Transform draft entry data and create published versions\n const publishedEntries = await async.map(updatedDraft, (draft: any) =>\n entries.publish(draft, queryParams)\n );\n\n // Sync unidirectional relations with the new published entries\n await unidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldPublishedVersions, ...updatedDraft],\n publishedEntries,\n bidirectionalRelationsToSync\n );\n\n // Sync self-referential relations with the new published entries\n await selfReferentialRelations.sync(draftsToPublish, publishedEntries, selfRelationsToSync);\n\n publishedEntries.forEach(emitEvent('entry.publish'));\n\n return { documentId, entries: publishedEntries };\n }\n\n async function unpublish(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const query = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType),\n transformParamsToQuery(uid),\n (query) => assoc('where', { ...query.where, documentId, publishedAt: { $ne: null } }, query)\n )(params);\n\n // Delete all published versions\n const versionsToDelete = await strapi.db.query(uid).findMany(query);\n await async.map(versionsToDelete, (entry: any) => entries.delete(entry.id));\n\n versionsToDelete.forEach(emitEvent('entry.unpublish'));\n return { documentId, entries: versionsToDelete };\n }\n\n async function discardDraft(opts = {} as any) {\n const { documentId, ...params } = opts;\n\n const queryParams = await async.pipe(\n validateParams,\n i18n.defaultLocale(contentType),\n i18n.multiLocaleToLookup(contentType)\n )(params);\n\n const [versionsToDraft, oldDrafts] = await Promise.all([\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: { $ne: null },\n },\n // Populate relations, media, compos and dz\n populate: getDeepPopulate(uid, { relationalFields: ['documentId', 'locale'] }),\n }),\n strapi.db.query(uid).findMany({\n where: {\n ...queryParams?.lookup,\n documentId,\n publishedAt: null,\n },\n select: ['id', 'locale'],\n }),\n ]);\n\n // Load any unidirectional relation targeting the old drafts\n const relationsToSync = await unidirectionalRelations.load(\n uid,\n {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n },\n {\n shouldPropagateRelation: components.createComponentRelationFilter(),\n }\n );\n\n const bidirectionalRelationsToSync = await bidirectionalRelations.load(uid, {\n newVersions: versionsToDraft,\n oldVersions: oldDrafts,\n });\n\n // Load self-referential relations from published entries before discarding\n const selfRelationsToSync = await selfReferentialRelations.load(uid, versionsToDraft);\n\n // Delete old drafts\n await async.map(oldDrafts, (entry: any) => entries.delete(entry.id));\n\n // Transform published entry data and create draft versions\n const draftEntries = await async.map(versionsToDraft, (entry: any) =>\n entries.discardDraft(entry, queryParams)\n );\n\n // Sync unidirectional relations with the new draft entries\n await unidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n relationsToSync\n );\n\n await bidirectionalRelations.sync(\n [...oldDrafts, ...versionsToDraft],\n draftEntries,\n bidirectionalRelationsToSync\n );\n\n // Sync self-referential relations with the new draft entries\n await selfReferentialRelations.sync(versionsToDraft, draftEntries, selfRelationsToSync);\n\n draftEntries.forEach(emitEvent('entry.draft-discard'));\n return { documentId, entries: draftEntries };\n }\n\n async function updateComponents(entry: any, data: any) {\n return components.updateComponents(uid, entry, data);\n }\n\n function omitComponentData(data: any) {\n return components.omitComponentData(contentType, data);\n }\n\n return {\n findMany: wrapInTransaction(findMany),\n findFirst: wrapInTransaction(findFirst),\n findOne: wrapInTransaction(findOne),\n delete: wrapInTransaction(deleteDocument),\n create: wrapInTransaction(create),\n clone: wrapInTransaction(clone),\n update: wrapInTransaction(update),\n count: wrapInTransaction(count),\n publish: hasDraftAndPublish ? wrapInTransaction(publish) : (undefined as any),\n unpublish: hasDraftAndPublish ? wrapInTransaction(unpublish) : (undefined as any),\n discardDraft: hasDraftAndPublish ? wrapInTransaction(discardDraft) : (undefined as any),\n\n updateComponents,\n omitComponentData,\n };\n};\n"],"names":["validators","validate","getModel","schema","strapi","LOCALE_FORMAT","MAX_LOCALE_LENGTH","isParamEmpty","v","undefined","createContentTypeRepository","uid","validator","entityValidator","contentType","hasDraftAndPublish","contentTypesUtils","sortValidations","fieldValidations","filtersValidations","populateValidations","sort","field","filters","populate","checkStatus","params","strict","status","errors","ValidationError","checkLocale","locale","Array","isArray","received","validateAndNormalizeOne","value","path","isEmpty","length","tooLong","invalidFormat","test","reason","filtered","filter","item","map","i","parsePaginationInt","name","spec","num","Number","valid","isInteger","min","allowMinusOne","expected","parseWithCount","PAGINATION_KEYS","checkPagination","hasPage","page","pageSize","hasOffset","start","limit","withCount","result","omit","checkUnrecognizedRootParams","pick","ALLOWED_DOCUMENT_ROOT_PARAM_KEYS","validateParams","modelCache","createModelCache","ctx","validations","push","validateFilters","validateSort","fields","validateFields","validatePopulate","runParallelWithOrderedErrors","clear","lookup","rawStrictParams","config","get","processedParams","entries","createEntriesService","eventManager","createEventManager","emitEvent","curry","findMany","query","async","pipe","DP","i18n","transformParamsDocumentId","transformParamsToQuery","db","findFirst","findOne","opts","documentId","assoc","where","deleteDocument","lookupQuery","selectionQuery","pickSelectionParams","Error","entriesToDelete","deletedEntries","entryToDelete","delete","id","forEach","create","queryParams","doc","publish","then","clone","entriesToClone","publishedAt","$null","getDeepPopulate","relationalFields","clonedEntries","createDocumentId","data","merge","at","update","filterDataFirstPublishedAt","restParams","entryToUpdate","updatedDraft","documentExists","mergedData","copyNonLocalizedFields","count","draftsToPublish","oldPublishedVersions","Promise","all","$ne","select","relationsToSync","unidirectionalRelations","newVersions","oldVersions","shouldPropagateRelation","components","bidirectionalRelationsToSync","bidirectionalRelations","selfRelationsToSync","selfReferentialRelations","entry","draft","addFirstPublishedAtToDraft","publishedEntries","unpublish","versionsToDelete","discardDraft","versionsToDraft","oldDrafts","draftEntries","updateComponents","omitComponentData","wrapInTransaction"],"mappings":"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"}
@@ -13,6 +13,7 @@ import { transformParamsDocumentId as curriedTransformParamsDocumentId } from '.
13
13
  import { createEventManager } from './events.mjs';
14
14
  import { load, sync } from './utils/unidirectional-relations.mjs';
15
15
  import { load as load$1, sync as sync$1 } from './utils/bidirectional-relations.mjs';
16
+ import { load as load$2, sync as sync$2 } from './utils/self-referential-relations.mjs';
16
17
  import entityValidator from '../entity-validator/index.mjs';
17
18
  import { addFirstPublishedAtToDraft, filterDataFirstPublishedAt } from './first-published-at.mjs';
18
19
  import { runParallelWithOrderedErrors } from './utils/ordered-parallel.mjs';
@@ -260,16 +261,16 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
260
261
  }
261
262
  async function deleteDocument(opts = {}) {
262
263
  const { documentId, ...params } = opts;
263
- const query = await async.pipe(validateParams, omit('status'), defaultLocaleCurry(contentType), multiLocaleToLookupCurry(contentType), transformParamsToQuery(uid), (query)=>assoc('where', {
264
+ const lookupQuery = await async.pipe(validateParams, omit('status'), defaultLocaleCurry(contentType), multiLocaleToLookupCurry(contentType), transformParamsToQuery(uid), (query)=>assoc('where', {
264
265
  ...query.where,
265
266
  documentId
266
267
  }, query))(params);
268
+ const selectionQuery = await async.pipe(validateParams, omit('status'), pickSelectionParams, transformParamsToQuery(uid))(params);
267
269
  if (hasDraftAndPublish && params.status === 'draft') {
268
270
  throw new Error('Cannot delete a draft document');
269
271
  }
270
- const entriesToDelete = await strapi.db.query(uid).findMany(query);
271
- // Delete all matched entries and its components
272
- const deletedEntries = await async.map(entriesToDelete, (entryToDelete)=>entries.delete(entryToDelete.id));
272
+ const entriesToDelete = await strapi.db.query(uid).findMany(lookupQuery);
273
+ const deletedEntries = await async.map(entriesToDelete, (entryToDelete)=>entries.delete(entryToDelete.id, selectionQuery));
273
274
  entriesToDelete.forEach(emitEvent('entry.delete'));
274
275
  return {
275
276
  documentId,
@@ -420,6 +421,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
420
421
  newVersions: draftsToPublish,
421
422
  oldVersions: oldPublishedVersions
422
423
  });
424
+ // Load self-referential relations from draft entries before publishing
425
+ const selfRelationsToSync = await load$2(uid, draftsToPublish);
423
426
  // Delete old published versions
424
427
  await async.map(oldPublishedVersions, (entry)=>entries.delete(entry.id));
425
428
  // Add firstPublishedAt to draft if it doesn't exist
@@ -435,6 +438,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
435
438
  ...oldPublishedVersions,
436
439
  ...updatedDraft
437
440
  ], publishedEntries, bidirectionalRelationsToSync);
441
+ // Sync self-referential relations with the new published entries
442
+ await sync$2(draftsToPublish, publishedEntries, selfRelationsToSync);
438
443
  publishedEntries.forEach(emitEvent('entry.publish'));
439
444
  return {
440
445
  documentId,
@@ -502,6 +507,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
502
507
  newVersions: versionsToDraft,
503
508
  oldVersions: oldDrafts
504
509
  });
510
+ // Load self-referential relations from published entries before discarding
511
+ const selfRelationsToSync = await load$2(uid, versionsToDraft);
505
512
  // Delete old drafts
506
513
  await async.map(oldDrafts, (entry)=>entries.delete(entry.id));
507
514
  // Transform published entry data and create draft versions
@@ -515,6 +522,8 @@ const createContentTypeRepository = (uid, validator = entityValidator)=>{
515
522
  ...oldDrafts,
516
523
  ...versionsToDraft
517
524
  ], draftEntries, bidirectionalRelationsToSync);
525
+ // Sync self-referential relations with the new draft entries
526
+ await sync$2(versionsToDraft, draftEntries, selfRelationsToSync);
518
527
  draftEntries.forEach(emitEvent('entry.draft-discard'));
519
528
  return {
520
529
  documentId,