@strapi/core 5.45.1 → 5.46.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 (50) hide show
  1. package/dist/core-api/routes/validation/attributes.d.ts +4 -4
  2. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -1
  3. package/dist/core-api/routes/validation/attributes.js +6 -6
  4. package/dist/core-api/routes/validation/attributes.js.map +1 -1
  5. package/dist/core-api/routes/validation/attributes.mjs +6 -6
  6. package/dist/core-api/routes/validation/attributes.mjs.map +1 -1
  7. package/dist/core-api/routes/validation/component.js +1 -1
  8. package/dist/core-api/routes/validation/component.js.map +1 -1
  9. package/dist/core-api/routes/validation/component.mjs +1 -1
  10. package/dist/core-api/routes/validation/component.mjs.map +1 -1
  11. package/dist/core-api/routes/validation/content-type.js +2 -2
  12. package/dist/core-api/routes/validation/content-type.js.map +1 -1
  13. package/dist/core-api/routes/validation/content-type.mjs +2 -2
  14. package/dist/core-api/routes/validation/content-type.mjs.map +1 -1
  15. package/dist/core-api/routes/validation/mappers.d.ts +5 -5
  16. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -1
  17. package/dist/core-api/routes/validation/mappers.js +13 -21
  18. package/dist/core-api/routes/validation/mappers.js.map +1 -1
  19. package/dist/core-api/routes/validation/mappers.mjs +13 -21
  20. package/dist/core-api/routes/validation/mappers.mjs.map +1 -1
  21. package/dist/core-api/routes/validation/utils.d.ts +3 -3
  22. package/dist/core-api/routes/validation/utils.d.ts.map +1 -1
  23. package/dist/core-api/routes/validation/utils.js +4 -7
  24. package/dist/core-api/routes/validation/utils.js.map +1 -1
  25. package/dist/core-api/routes/validation/utils.mjs +4 -7
  26. package/dist/core-api/routes/validation/utils.mjs.map +1 -1
  27. package/dist/package.json.js +12 -12
  28. package/dist/package.json.mjs +12 -12
  29. package/dist/services/content-source-maps.d.ts.map +1 -1
  30. package/dist/services/content-source-maps.js +12 -4
  31. package/dist/services/content-source-maps.js.map +1 -1
  32. package/dist/services/content-source-maps.mjs +12 -4
  33. package/dist/services/content-source-maps.mjs.map +1 -1
  34. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  35. package/dist/services/document-service/transform/relations/extract/data-ids.js +4 -1
  36. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  37. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +4 -1
  38. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  39. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  40. package/dist/services/document-service/transform/relations/transform/data-ids.js +4 -1
  41. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  42. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +4 -1
  43. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  44. package/dist/services/document-service/transform/relations/utils/xto-one.d.ts +8 -0
  45. package/dist/services/document-service/transform/relations/utils/xto-one.d.ts.map +1 -0
  46. package/dist/services/document-service/transform/relations/utils/xto-one.js +41 -0
  47. package/dist/services/document-service/transform/relations/utils/xto-one.js.map +1 -0
  48. package/dist/services/document-service/transform/relations/utils/xto-one.mjs +39 -0
  49. package/dist/services/document-service/transform/relations/utils/xto-one.mjs.map +1 -0
  50. package/package.json +12 -12
@@ -5,6 +5,7 @@ var strapiUtils = require('@strapi/utils');
5
5
  var i18n = require('../utils/i18n.js');
6
6
  var dp = require('../utils/dp.js');
7
7
  var mapRelation = require('../utils/map-relation.js');
8
+ var xtoOne = require('../utils/xto-one.js');
8
9
 
9
10
  const { isPolymorphic } = strapiUtils.relations;
10
11
  /**
@@ -49,6 +50,8 @@ const { isPolymorphic } = strapiUtils.relations;
49
50
  }
50
51
  const isPolymorphicRelation = isPolymorphic(attribute);
51
52
  const getIds = getRelationIds(idMap, source);
53
+ // Collapse a "relates to one" payload to a single entry first.
54
+ const normalizedValue = xtoOne.normalizeXToOneRelationValue(attribute, value);
52
55
  // Transform the relation documentId to entity id
53
56
  const newRelation = await mapRelation.mapRelation((relation)=>{
54
57
  if (!relation || !relation.documentId) {
@@ -98,7 +101,7 @@ const { isPolymorphic } = strapiUtils.relations;
98
101
  }
99
102
  return newRelation;
100
103
  });
101
- }, value);
104
+ }, normalizedValue);
102
105
  set(key, newRelation);
103
106
  }, {
104
107
  schema: strapi.getModel(source.uid),
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.js","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { errors, relations } from '@strapi/utils';\n\nimport { ID, LongHandDocument } from '../utils/types';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\nimport { mapRelation, traverseEntityRelations } from '../utils/map-relation';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n allowMissingId?: boolean; // Whether to ignore missing ids and not throw any error\n}\n\n/**\n * Get the entry ids for a given documentId.\n */\nconst getRelationIds = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n // locale to connect to\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n // status(es) to connect to\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n const ids: ID[] = [];\n\n // Find mapping between documentID -> id(s).\n // There are scenarios where a single documentID can map to multiple ids.\n // e.g when connecting Non DP -> DP and connecting to both the draft and publish version at the same time\n for (const tStatus of targetStatus) {\n const entryId = idMap.get({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status: tStatus,\n });\n\n if (entryId) ids.push(entryId);\n }\n\n if (!ids.length && !source.allowMissingId) {\n throw new errors.ValidationError(\n `Document with id \"${relation.documentId}\", locale \"${targetLocale}\" not found`\n );\n }\n\n return ids;\n }\n);\n\n/**\n * Iterate over all relations of a data object and transform all relational document ids to entity ids.\n */\nconst transformDataIdsVisitor = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ key, value, attribute }, { set }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const getIds = getRelationIds(idMap, source);\n\n // Transform the relation documentId to entity id\n const newRelation = await mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Find relational attributes, and return the document ids\n // if its a polymorphic relation we need to get it from the data itself\n const targetUid: UID.Schema = isPolymorphicRelation ? relation.__type : attribute.target;\n const ids: ID[] = getIds(targetUid, relation);\n\n // Handle positional arguments\n const position = { ...relation.position };\n\n // The positional relation target uid can be different for polymorphic relations\n let positionTargetUid: UID.Schema = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position.before) {\n const beforeRelation = { ...relation, ...position, documentId: position.before };\n const beforeIds: ID[] = getIds(positionTargetUid, beforeRelation);\n position.before = beforeIds.at(0);\n }\n\n if (position.after) {\n const afterRelation = { ...relation, ...position, documentId: position.after };\n position.after = getIds(positionTargetUid, afterRelation).at(0);\n }\n\n // Transform all ids to new relations\n return ids?.map((id) => {\n const newRelation = { id } as typeof relation;\n\n if (relation.position) {\n newRelation.position = position;\n }\n\n // Insert type if its a polymorphic relation\n if (isPolymorphicRelation) {\n newRelation.__type = targetUid;\n }\n\n return newRelation;\n });\n }, value as any);\n\n set(key, newRelation as any);\n },\n { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","getRelationIds","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","ids","tStatus","entryId","get","documentId","push","length","allowMissingId","errors","ValidationError","transformDataIdsVisitor","data","traverseEntityRelations","key","value","attribute","set","isPolymorphicRelation","getIds","newRelation","mapRelation","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind"],"mappings":"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"}
1
+ {"version":3,"file":"data-ids.js","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { errors, relations } from '@strapi/utils';\n\nimport { ID, LongHandDocument } from '../utils/types';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\nimport { mapRelation, traverseEntityRelations } from '../utils/map-relation';\nimport { normalizeXToOneRelationValue } from '../utils/xto-one';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n allowMissingId?: boolean; // Whether to ignore missing ids and not throw any error\n}\n\n/**\n * Get the entry ids for a given documentId.\n */\nconst getRelationIds = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n // locale to connect to\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n // status(es) to connect to\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n const ids: ID[] = [];\n\n // Find mapping between documentID -> id(s).\n // There are scenarios where a single documentID can map to multiple ids.\n // e.g when connecting Non DP -> DP and connecting to both the draft and publish version at the same time\n for (const tStatus of targetStatus) {\n const entryId = idMap.get({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status: tStatus,\n });\n\n if (entryId) ids.push(entryId);\n }\n\n if (!ids.length && !source.allowMissingId) {\n throw new errors.ValidationError(\n `Document with id \"${relation.documentId}\", locale \"${targetLocale}\" not found`\n );\n }\n\n return ids;\n }\n);\n\n/**\n * Iterate over all relations of a data object and transform all relational document ids to entity ids.\n */\nconst transformDataIdsVisitor = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ key, value, attribute }, { set }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const getIds = getRelationIds(idMap, source);\n\n // Collapse a \"relates to one\" payload to a single entry first.\n const normalizedValue = normalizeXToOneRelationValue(attribute, value as any);\n\n // Transform the relation documentId to entity id\n const newRelation = await mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Find relational attributes, and return the document ids\n // if its a polymorphic relation we need to get it from the data itself\n const targetUid: UID.Schema = isPolymorphicRelation ? relation.__type : attribute.target;\n const ids: ID[] = getIds(targetUid, relation);\n\n // Handle positional arguments\n const position = { ...relation.position };\n\n // The positional relation target uid can be different for polymorphic relations\n let positionTargetUid: UID.Schema = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position.before) {\n const beforeRelation = { ...relation, ...position, documentId: position.before };\n const beforeIds: ID[] = getIds(positionTargetUid, beforeRelation);\n position.before = beforeIds.at(0);\n }\n\n if (position.after) {\n const afterRelation = { ...relation, ...position, documentId: position.after };\n position.after = getIds(positionTargetUid, afterRelation).at(0);\n }\n\n // Transform all ids to new relations\n return ids?.map((id) => {\n const newRelation = { id } as typeof relation;\n\n if (relation.position) {\n newRelation.position = position;\n }\n\n // Insert type if its a polymorphic relation\n if (isPolymorphicRelation) {\n newRelation.__type = targetUid;\n }\n\n return newRelation;\n });\n }, normalizedValue as any);\n\n set(key, newRelation as any);\n },\n { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","getRelationIds","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","ids","tStatus","entryId","get","documentId","push","length","allowMissingId","errors","ValidationError","transformDataIdsVisitor","data","traverseEntityRelations","key","value","attribute","set","isPolymorphicRelation","getIds","normalizedValue","normalizeXToOneRelationValue","newRelation","mapRelation","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind"],"mappings":";;;;;;;;;AAYA,MAAM,EAAEA,aAAa,EAAE,GAAGC,qBAAAA;AAS1B;;AAEC,IACD,MAAMC,cAAAA,GAAiBC,QAAAA,CACrB,CAACC,KAAAA,EAAcC,QAAiBC,SAAAA,EAAuBC,QAAAA,GAAAA;;IAErD,MAAMC,YAAAA,GAAeC,6BAAwBF,QAAAA,EAAU;AACrDD,QAAAA,SAAAA;AACAI,QAAAA,SAAAA,EAAWL,OAAOM,GAAG;AACrBC,QAAAA,YAAAA,EAAcP,OAAOQ;AACvB,KAAA,CAAA;;IAGA,MAAMC,YAAAA,GAAeC,2BAAwBR,QAAAA,EAAU;AACrDD,QAAAA,SAAAA;AACAI,QAAAA,SAAAA,EAAWL,OAAOM,GAAG;AACrBK,QAAAA,YAAAA,EAAcX,OAAOY;AACvB,KAAA,CAAA;AAEA,IAAA,MAAMC,MAAY,EAAE;;;;IAKpB,KAAK,MAAMC,WAAWL,YAAAA,CAAc;QAClC,MAAMM,OAAAA,GAAUhB,KAAAA,CAAMiB,GAAG,CAAC;YACxBV,GAAAA,EAAKL,SAAAA;AACLgB,YAAAA,UAAAA,EAAYf,SAASe,UAAU;YAC/BT,MAAAA,EAAQL,YAAAA;YACRS,MAAAA,EAAQE;AACV,SAAA,CAAA;QAEA,IAAIC,OAAAA,EAASF,GAAAA,CAAIK,IAAI,CAACH,OAAAA,CAAAA;AACxB,IAAA;AAEA,IAAA,IAAI,CAACF,GAAAA,CAAIM,MAAM,IAAI,CAACnB,MAAAA,CAAOoB,cAAc,EAAE;AACzC,QAAA,MAAM,IAAIC,kBAAAA,CAAOC,eAAe,CAC9B,CAAC,kBAAkB,EAAEpB,QAAAA,CAASe,UAAU,CAAC,WAAW,EAAEd,YAAAA,CAAa,WAAW,CAAC,CAAA;AAEnF,IAAA;IAEA,OAAOU,GAAAA;AACT,CAAA,CAAA;AAGF;;AAEC,IACD,MAAMU,uBAAAA,GAA0B,CAACxB,KAAAA,EAAcyB,IAAAA,EAA2BxB,MAAAA,GAAAA;AACxE,IAAA,OAAOyB,mCAAAA,CACL,OAAO,EAAEC,GAAG,EAAEC,KAAK,EAAEC,SAAS,EAAE,EAAE,EAAEC,GAAG,EAAE,GAAA;AACvC,QAAA,IAAI,CAACD,SAAAA,EAAW;AACd,YAAA;AACF,QAAA;AACA,QAAA,MAAME,wBAAwBnC,aAAAA,CAAciC,SAAAA,CAAAA;QAC5C,MAAMG,MAAAA,GAASlC,eAAeE,KAAAA,EAAOC,MAAAA,CAAAA;;QAGrC,MAAMgC,eAAAA,GAAkBC,oCAA6BL,SAAAA,EAAWD,KAAAA,CAAAA;;QAGhE,MAAMO,WAAAA,GAAc,MAAMC,uBAAAA,CAAY,CAACjC,QAAAA,GAAAA;AACrC,YAAA,IAAI,CAACA,QAAAA,IAAY,CAACA,QAAAA,CAASe,UAAU,EAAE;gBACrC,OAAOf,QAAAA;AACT,YAAA;;;AAIA,YAAA,MAAMD,YAAwB6B,qBAAAA,GAAwB5B,QAAAA,CAASkC,MAAM,GAAGR,UAAUS,MAAM;YACxF,MAAMxB,GAAAA,GAAYkB,OAAO9B,SAAAA,EAAWC,QAAAA,CAAAA;;AAGpC,YAAA,MAAMoC,QAAAA,GAAW;AAAE,gBAAA,GAAGpC,SAASoC;AAAS,aAAA;;AAGxC,YAAA,IAAIC,iBAAAA,GAAgCtC,SAAAA;YACpC,IAAI6B,qBAAAA,IAAyBQ,UAAUF,MAAAA,EAAQ;AAC7CG,gBAAAA,iBAAAA,GAAoBD,SAASF,MAAM;AACrC,YAAA;YAEA,IAAIE,QAAAA,CAASE,MAAM,EAAE;AACnB,gBAAA,MAAMC,cAAAA,GAAiB;AAAE,oBAAA,GAAGvC,QAAQ;AAAE,oBAAA,GAAGoC,QAAQ;AAAErB,oBAAAA,UAAAA,EAAYqB,SAASE;AAAO,iBAAA;gBAC/E,MAAME,SAAAA,GAAkBX,OAAOQ,iBAAAA,EAAmBE,cAAAA,CAAAA;AAClDH,gBAAAA,QAAAA,CAASE,MAAM,GAAGE,SAAAA,CAAUC,EAAE,CAAC,CAAA,CAAA;AACjC,YAAA;YAEA,IAAIL,QAAAA,CAASM,KAAK,EAAE;AAClB,gBAAA,MAAMC,aAAAA,GAAgB;AAAE,oBAAA,GAAG3C,QAAQ;AAAE,oBAAA,GAAGoC,QAAQ;AAAErB,oBAAAA,UAAAA,EAAYqB,SAASM;AAAM,iBAAA;AAC7EN,gBAAAA,QAAAA,CAASM,KAAK,GAAGb,MAAAA,CAAOQ,iBAAAA,EAAmBM,aAAAA,CAAAA,CAAeF,EAAE,CAAC,CAAA,CAAA;AAC/D,YAAA;;YAGA,OAAO9B,GAAAA,EAAKiC,IAAI,CAACC,EAAAA,GAAAA;AACf,gBAAA,MAAMb,WAAAA,GAAc;AAAEa,oBAAAA;AAAG,iBAAA;gBAEzB,IAAI7C,QAAAA,CAASoC,QAAQ,EAAE;AACrBJ,oBAAAA,WAAAA,CAAYI,QAAQ,GAAGA,QAAAA;AACzB,gBAAA;;AAGA,gBAAA,IAAIR,qBAAAA,EAAuB;AACzBI,oBAAAA,WAAAA,CAAYE,MAAM,GAAGnC,SAAAA;AACvB,gBAAA;gBAEA,OAAOiC,WAAAA;AACT,YAAA,CAAA,CAAA;QACF,CAAA,EAAGF,eAAAA,CAAAA;AAEHH,QAAAA,GAAAA,CAAIH,GAAAA,EAAKQ,WAAAA,CAAAA;IACX,CAAA,EACA;AAAEc,QAAAA,MAAAA,EAAQC,MAAAA,CAAOC,QAAQ,CAAClD,MAAAA,CAAOM,GAAG,CAAA;AAAG4C,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAACF,MAAAA;KAAQ,EAC9EzB,IAAAA,CAAAA;AAEJ;;;;"}
@@ -3,6 +3,7 @@ import { relations, errors } from '@strapi/utils';
3
3
  import { getRelationTargetLocale } from '../utils/i18n.mjs';
4
4
  import { getRelationTargetStatus } from '../utils/dp.mjs';
5
5
  import { traverseEntityRelations as traverseEntityRelationsCurried, mapRelation as mapRelationCurried } from '../utils/map-relation.mjs';
6
+ import { normalizeXToOneRelationValue } from '../utils/xto-one.mjs';
6
7
 
7
8
  const { isPolymorphic } = relations;
8
9
  /**
@@ -47,6 +48,8 @@ const { isPolymorphic } = relations;
47
48
  }
48
49
  const isPolymorphicRelation = isPolymorphic(attribute);
49
50
  const getIds = getRelationIds(idMap, source);
51
+ // Collapse a "relates to one" payload to a single entry first.
52
+ const normalizedValue = normalizeXToOneRelationValue(attribute, value);
50
53
  // Transform the relation documentId to entity id
51
54
  const newRelation = await mapRelationCurried((relation)=>{
52
55
  if (!relation || !relation.documentId) {
@@ -96,7 +99,7 @@ const { isPolymorphic } = relations;
96
99
  }
97
100
  return newRelation;
98
101
  });
99
- }, value);
102
+ }, normalizedValue);
100
103
  set(key, newRelation);
101
104
  }, {
102
105
  schema: strapi.getModel(source.uid),
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { errors, relations } from '@strapi/utils';\n\nimport { ID, LongHandDocument } from '../utils/types';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\nimport { mapRelation, traverseEntityRelations } from '../utils/map-relation';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n allowMissingId?: boolean; // Whether to ignore missing ids and not throw any error\n}\n\n/**\n * Get the entry ids for a given documentId.\n */\nconst getRelationIds = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n // locale to connect to\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n // status(es) to connect to\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n const ids: ID[] = [];\n\n // Find mapping between documentID -> id(s).\n // There are scenarios where a single documentID can map to multiple ids.\n // e.g when connecting Non DP -> DP and connecting to both the draft and publish version at the same time\n for (const tStatus of targetStatus) {\n const entryId = idMap.get({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status: tStatus,\n });\n\n if (entryId) ids.push(entryId);\n }\n\n if (!ids.length && !source.allowMissingId) {\n throw new errors.ValidationError(\n `Document with id \"${relation.documentId}\", locale \"${targetLocale}\" not found`\n );\n }\n\n return ids;\n }\n);\n\n/**\n * Iterate over all relations of a data object and transform all relational document ids to entity ids.\n */\nconst transformDataIdsVisitor = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ key, value, attribute }, { set }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const getIds = getRelationIds(idMap, source);\n\n // Transform the relation documentId to entity id\n const newRelation = await mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Find relational attributes, and return the document ids\n // if its a polymorphic relation we need to get it from the data itself\n const targetUid: UID.Schema = isPolymorphicRelation ? relation.__type : attribute.target;\n const ids: ID[] = getIds(targetUid, relation);\n\n // Handle positional arguments\n const position = { ...relation.position };\n\n // The positional relation target uid can be different for polymorphic relations\n let positionTargetUid: UID.Schema = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position.before) {\n const beforeRelation = { ...relation, ...position, documentId: position.before };\n const beforeIds: ID[] = getIds(positionTargetUid, beforeRelation);\n position.before = beforeIds.at(0);\n }\n\n if (position.after) {\n const afterRelation = { ...relation, ...position, documentId: position.after };\n position.after = getIds(positionTargetUid, afterRelation).at(0);\n }\n\n // Transform all ids to new relations\n return ids?.map((id) => {\n const newRelation = { id } as typeof relation;\n\n if (relation.position) {\n newRelation.position = position;\n }\n\n // Insert type if its a polymorphic relation\n if (isPolymorphicRelation) {\n newRelation.__type = targetUid;\n }\n\n return newRelation;\n });\n }, value as any);\n\n set(key, newRelation as any);\n },\n { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","getRelationIds","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","ids","tStatus","entryId","get","documentId","push","length","allowMissingId","errors","ValidationError","transformDataIdsVisitor","data","traverseEntityRelations","key","value","attribute","set","isPolymorphicRelation","getIds","newRelation","mapRelation","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind"],"mappings":"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"}
1
+ {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { errors, relations } from '@strapi/utils';\n\nimport { ID, LongHandDocument } from '../utils/types';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\nimport { mapRelation, traverseEntityRelations } from '../utils/map-relation';\nimport { normalizeXToOneRelationValue } from '../utils/xto-one';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n allowMissingId?: boolean; // Whether to ignore missing ids and not throw any error\n}\n\n/**\n * Get the entry ids for a given documentId.\n */\nconst getRelationIds = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n // locale to connect to\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n // status(es) to connect to\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n const ids: ID[] = [];\n\n // Find mapping between documentID -> id(s).\n // There are scenarios where a single documentID can map to multiple ids.\n // e.g when connecting Non DP -> DP and connecting to both the draft and publish version at the same time\n for (const tStatus of targetStatus) {\n const entryId = idMap.get({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status: tStatus,\n });\n\n if (entryId) ids.push(entryId);\n }\n\n if (!ids.length && !source.allowMissingId) {\n throw new errors.ValidationError(\n `Document with id \"${relation.documentId}\", locale \"${targetLocale}\" not found`\n );\n }\n\n return ids;\n }\n);\n\n/**\n * Iterate over all relations of a data object and transform all relational document ids to entity ids.\n */\nconst transformDataIdsVisitor = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ key, value, attribute }, { set }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const getIds = getRelationIds(idMap, source);\n\n // Collapse a \"relates to one\" payload to a single entry first.\n const normalizedValue = normalizeXToOneRelationValue(attribute, value as any);\n\n // Transform the relation documentId to entity id\n const newRelation = await mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Find relational attributes, and return the document ids\n // if its a polymorphic relation we need to get it from the data itself\n const targetUid: UID.Schema = isPolymorphicRelation ? relation.__type : attribute.target;\n const ids: ID[] = getIds(targetUid, relation);\n\n // Handle positional arguments\n const position = { ...relation.position };\n\n // The positional relation target uid can be different for polymorphic relations\n let positionTargetUid: UID.Schema = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position.before) {\n const beforeRelation = { ...relation, ...position, documentId: position.before };\n const beforeIds: ID[] = getIds(positionTargetUid, beforeRelation);\n position.before = beforeIds.at(0);\n }\n\n if (position.after) {\n const afterRelation = { ...relation, ...position, documentId: position.after };\n position.after = getIds(positionTargetUid, afterRelation).at(0);\n }\n\n // Transform all ids to new relations\n return ids?.map((id) => {\n const newRelation = { id } as typeof relation;\n\n if (relation.position) {\n newRelation.position = position;\n }\n\n // Insert type if its a polymorphic relation\n if (isPolymorphicRelation) {\n newRelation.__type = targetUid;\n }\n\n return newRelation;\n });\n }, normalizedValue as any);\n\n set(key, newRelation as any);\n },\n { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","getRelationIds","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","ids","tStatus","entryId","get","documentId","push","length","allowMissingId","errors","ValidationError","transformDataIdsVisitor","data","traverseEntityRelations","key","value","attribute","set","isPolymorphicRelation","getIds","normalizedValue","normalizeXToOneRelationValue","newRelation","mapRelation","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Relation } from './types';
2
+ /**
3
+ * "Relates to one" fields hold a single entry. If a caller passes more
4
+ * than one, keep the last. Runs on the user-provided payload only — never
5
+ * on the internal draft/published expansion that happens later.
6
+ */
7
+ export declare const normalizeXToOneRelationValue: (attribute: any, value: Relation) => Relation;
8
+ //# sourceMappingURL=xto-one.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xto-one.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/utils/xto-one.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAInC;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,cAAe,GAAG,SAAS,QAAQ,KAAG,QA2B9E,CAAC"}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ var fp = require('lodash/fp');
4
+ var strapiUtils = require('@strapi/utils');
5
+
6
+ const { isAnyToOne } = strapiUtils.relations;
7
+ /**
8
+ * "Relates to one" fields hold a single entry. If a caller passes more
9
+ * than one, keep the last. Runs on the user-provided payload only — never
10
+ * on the internal draft/published expansion that happens later.
11
+ */ const normalizeXToOneRelationValue = (attribute, value)=>{
12
+ if (!isAnyToOne(attribute)) {
13
+ return value;
14
+ }
15
+ if (fp.isNil(value)) {
16
+ return value;
17
+ }
18
+ if (Array.isArray(value)) {
19
+ if (value.length > 1) {
20
+ return [
21
+ value[value.length - 1]
22
+ ];
23
+ }
24
+ return value;
25
+ }
26
+ if (fp.isObject(value) && !Array.isArray(value)) {
27
+ const objValue = value;
28
+ if (Array.isArray(objValue.set) && objValue.set.length > 1) {
29
+ return {
30
+ ...objValue,
31
+ set: [
32
+ objValue.set[objValue.set.length - 1]
33
+ ]
34
+ };
35
+ }
36
+ }
37
+ return value;
38
+ };
39
+
40
+ exports.normalizeXToOneRelationValue = normalizeXToOneRelationValue;
41
+ //# sourceMappingURL=xto-one.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xto-one.js","sources":["../../../../../../src/services/document-service/transform/relations/utils/xto-one.ts"],"sourcesContent":["import { isNil, isObject } from 'lodash/fp';\n\nimport { relations } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst { isAnyToOne } = relations;\n\n/**\n * \"Relates to one\" fields hold a single entry. If a caller passes more\n * than one, keep the last. Runs on the user-provided payload only — never\n * on the internal draft/published expansion that happens later.\n */\nexport const normalizeXToOneRelationValue = (attribute: any, value: Relation): Relation => {\n if (!isAnyToOne(attribute)) {\n return value;\n }\n\n if (isNil(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 1) {\n return [value[value.length - 1]] as Relation;\n }\n return value;\n }\n\n if (isObject(value) && !Array.isArray(value)) {\n const objValue = value as { set?: any; connect?: any; disconnect?: any };\n if (Array.isArray(objValue.set) && objValue.set.length > 1) {\n return {\n ...objValue,\n set: [objValue.set[objValue.set.length - 1]],\n } as Relation;\n }\n }\n\n return value;\n};\n"],"names":["isAnyToOne","relations","normalizeXToOneRelationValue","attribute","value","isNil","Array","isArray","length","isObject","objValue","set"],"mappings":";;;;;AAMA,MAAM,EAAEA,UAAU,EAAE,GAAGC,qBAAAA;AAEvB;;;;AAIC,IACM,MAAMC,4BAAAA,GAA+B,CAACC,SAAAA,EAAgBC,KAAAA,GAAAA;IAC3D,IAAI,CAACJ,WAAWG,SAAAA,CAAAA,EAAY;QAC1B,OAAOC,KAAAA;AACT,IAAA;AAEA,IAAA,IAAIC,SAAMD,KAAAA,CAAAA,EAAQ;QAChB,OAAOA,KAAAA;AACT,IAAA;IAEA,IAAIE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;QACxB,IAAIA,KAAAA,CAAMI,MAAM,GAAG,CAAA,EAAG;YACpB,OAAO;AAACJ,gBAAAA,KAAK,CAACA,KAAAA,CAAMI,MAAM,GAAG,CAAA;AAAG,aAAA;AAClC,QAAA;QACA,OAAOJ,KAAAA;AACT,IAAA;AAEA,IAAA,IAAIK,YAASL,KAAAA,CAAAA,IAAU,CAACE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;AAC5C,QAAA,MAAMM,QAAAA,GAAWN,KAAAA;QACjB,IAAIE,KAAAA,CAAMC,OAAO,CAACG,QAAAA,CAASC,GAAG,CAAA,IAAKD,QAAAA,CAASC,GAAG,CAACH,MAAM,GAAG,CAAA,EAAG;YAC1D,OAAO;AACL,gBAAA,GAAGE,QAAQ;gBACXC,GAAAA,EAAK;AAACD,oBAAAA,QAAAA,CAASC,GAAG,CAACD,QAAAA,CAASC,GAAG,CAACH,MAAM,GAAG,CAAA;AAAG;AAC9C,aAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAOJ,KAAAA;AACT;;;;"}
@@ -0,0 +1,39 @@
1
+ import { isNil, isObject } from 'lodash/fp';
2
+ import { relations } from '@strapi/utils';
3
+
4
+ const { isAnyToOne } = relations;
5
+ /**
6
+ * "Relates to one" fields hold a single entry. If a caller passes more
7
+ * than one, keep the last. Runs on the user-provided payload only — never
8
+ * on the internal draft/published expansion that happens later.
9
+ */ const normalizeXToOneRelationValue = (attribute, value)=>{
10
+ if (!isAnyToOne(attribute)) {
11
+ return value;
12
+ }
13
+ if (isNil(value)) {
14
+ return value;
15
+ }
16
+ if (Array.isArray(value)) {
17
+ if (value.length > 1) {
18
+ return [
19
+ value[value.length - 1]
20
+ ];
21
+ }
22
+ return value;
23
+ }
24
+ if (isObject(value) && !Array.isArray(value)) {
25
+ const objValue = value;
26
+ if (Array.isArray(objValue.set) && objValue.set.length > 1) {
27
+ return {
28
+ ...objValue,
29
+ set: [
30
+ objValue.set[objValue.set.length - 1]
31
+ ]
32
+ };
33
+ }
34
+ }
35
+ return value;
36
+ };
37
+
38
+ export { normalizeXToOneRelationValue };
39
+ //# sourceMappingURL=xto-one.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xto-one.mjs","sources":["../../../../../../src/services/document-service/transform/relations/utils/xto-one.ts"],"sourcesContent":["import { isNil, isObject } from 'lodash/fp';\n\nimport { relations } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst { isAnyToOne } = relations;\n\n/**\n * \"Relates to one\" fields hold a single entry. If a caller passes more\n * than one, keep the last. Runs on the user-provided payload only — never\n * on the internal draft/published expansion that happens later.\n */\nexport const normalizeXToOneRelationValue = (attribute: any, value: Relation): Relation => {\n if (!isAnyToOne(attribute)) {\n return value;\n }\n\n if (isNil(value)) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (value.length > 1) {\n return [value[value.length - 1]] as Relation;\n }\n return value;\n }\n\n if (isObject(value) && !Array.isArray(value)) {\n const objValue = value as { set?: any; connect?: any; disconnect?: any };\n if (Array.isArray(objValue.set) && objValue.set.length > 1) {\n return {\n ...objValue,\n set: [objValue.set[objValue.set.length - 1]],\n } as Relation;\n }\n }\n\n return value;\n};\n"],"names":["isAnyToOne","relations","normalizeXToOneRelationValue","attribute","value","isNil","Array","isArray","length","isObject","objValue","set"],"mappings":";;;AAMA,MAAM,EAAEA,UAAU,EAAE,GAAGC,SAAAA;AAEvB;;;;AAIC,IACM,MAAMC,4BAAAA,GAA+B,CAACC,SAAAA,EAAgBC,KAAAA,GAAAA;IAC3D,IAAI,CAACJ,WAAWG,SAAAA,CAAAA,EAAY;QAC1B,OAAOC,KAAAA;AACT,IAAA;AAEA,IAAA,IAAIC,MAAMD,KAAAA,CAAAA,EAAQ;QAChB,OAAOA,KAAAA;AACT,IAAA;IAEA,IAAIE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;QACxB,IAAIA,KAAAA,CAAMI,MAAM,GAAG,CAAA,EAAG;YACpB,OAAO;AAACJ,gBAAAA,KAAK,CAACA,KAAAA,CAAMI,MAAM,GAAG,CAAA;AAAG,aAAA;AAClC,QAAA;QACA,OAAOJ,KAAAA;AACT,IAAA;AAEA,IAAA,IAAIK,SAASL,KAAAA,CAAAA,IAAU,CAACE,KAAAA,CAAMC,OAAO,CAACH,KAAAA,CAAAA,EAAQ;AAC5C,QAAA,MAAMM,QAAAA,GAAWN,KAAAA;QACjB,IAAIE,KAAAA,CAAMC,OAAO,CAACG,QAAAA,CAASC,GAAG,CAAA,IAAKD,QAAAA,CAASC,GAAG,CAACH,MAAM,GAAG,CAAA,EAAG;YAC1D,OAAO;AACL,gBAAA,GAAGE,QAAQ;gBACXC,GAAAA,EAAK;AAACD,oBAAAA,QAAAA,CAASC,GAAG,CAACD,QAAAA,CAASC,GAAG,CAACH,MAAM,GAAG,CAAA;AAAG;AAC9C,aAAA;AACF,QAAA;AACF,IAAA;IAEA,OAAOJ,KAAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/core",
3
- "version": "5.45.1",
3
+ "version": "5.46.0",
4
4
  "description": "Core of Strapi",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -59,14 +59,14 @@
59
59
  "@koa/cors": "5.0.0",
60
60
  "@koa/router": "12.0.2",
61
61
  "@paralleldrive/cuid2": "2.2.2",
62
- "@strapi/admin": "5.45.1",
63
- "@strapi/database": "5.45.1",
64
- "@strapi/generators": "5.45.1",
65
- "@strapi/logger": "5.45.1",
66
- "@strapi/permissions": "5.45.1",
67
- "@strapi/types": "5.45.1",
68
- "@strapi/typescript-utils": "5.45.1",
69
- "@strapi/utils": "5.45.1",
62
+ "@strapi/admin": "5.46.0",
63
+ "@strapi/database": "5.46.0",
64
+ "@strapi/generators": "5.46.0",
65
+ "@strapi/logger": "5.46.0",
66
+ "@strapi/permissions": "5.46.0",
67
+ "@strapi/types": "5.46.0",
68
+ "@strapi/typescript-utils": "5.46.0",
69
+ "@strapi/utils": "5.46.0",
70
70
  "@vercel/stega": "0.1.2",
71
71
  "bcryptjs": "2.4.3",
72
72
  "boxen": "5.1.2",
@@ -133,11 +133,11 @@
133
133
  "@types/node": "24.10.0",
134
134
  "@types/node-schedule": "2.1.7",
135
135
  "@types/statuses": "2.0.1",
136
- "eslint-config-custom": "5.45.1",
136
+ "eslint-config-custom": "5.46.0",
137
137
  "supertest": "7.2.2",
138
- "tsconfig": "5.45.1",
138
+ "tsconfig": "5.46.0",
139
139
  "vitest": "catalog:",
140
- "vitest-config": "5.45.1"
140
+ "vitest-config": "5.46.0"
141
141
  },
142
142
  "engines": {
143
143
  "node": ">=20.0.0 <=24.x.x",