@strapi/core 5.52.3 → 5.54.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 (116) hide show
  1. package/dist/container.d.ts +1 -0
  2. package/dist/container.d.ts.map +1 -1
  3. package/dist/container.js +3 -0
  4. package/dist/container.js.map +1 -1
  5. package/dist/container.mjs +3 -0
  6. package/dist/container.mjs.map +1 -1
  7. package/dist/core-api/controller/single-type.d.ts.map +1 -1
  8. package/dist/core-api/controller/single-type.js +7 -4
  9. package/dist/core-api/controller/single-type.js.map +1 -1
  10. package/dist/core-api/controller/single-type.mjs +7 -4
  11. package/dist/core-api/controller/single-type.mjs.map +1 -1
  12. package/dist/domain/content-type/index.d.ts.map +1 -1
  13. package/dist/domain/content-type/index.js +3 -1
  14. package/dist/domain/content-type/index.js.map +1 -1
  15. package/dist/domain/content-type/index.mjs +3 -1
  16. package/dist/domain/content-type/index.mjs.map +1 -1
  17. package/dist/package.json.js +20 -17
  18. package/dist/package.json.js.map +1 -1
  19. package/dist/package.json.mjs +20 -17
  20. package/dist/package.json.mjs.map +1 -1
  21. package/dist/services/content-source-maps.d.ts +14 -2
  22. package/dist/services/content-source-maps.d.ts.map +1 -1
  23. package/dist/services/content-source-maps.js +134 -1
  24. package/dist/services/content-source-maps.js.map +1 -1
  25. package/dist/services/content-source-maps.mjs +134 -2
  26. package/dist/services/content-source-maps.mjs.map +1 -1
  27. package/dist/services/cron.d.ts +3 -18
  28. package/dist/services/cron.d.ts.map +1 -1
  29. package/dist/services/cron.js +241 -33
  30. package/dist/services/cron.js.map +1 -1
  31. package/dist/services/cron.mjs +241 -33
  32. package/dist/services/cron.mjs.map +1 -1
  33. package/dist/services/document-service/transform/query.d.ts.map +1 -1
  34. package/dist/services/document-service/transform/query.js +4 -2
  35. package/dist/services/document-service/transform/query.js.map +1 -1
  36. package/dist/services/document-service/transform/query.mjs +4 -2
  37. package/dist/services/document-service/transform/query.mjs.map +1 -1
  38. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
  39. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  40. package/dist/services/document-service/transform/relations/extract/data-ids.js +12 -3
  41. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  42. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +12 -3
  43. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  44. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +1 -1
  45. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  46. package/dist/services/document-service/transform/relations/transform/data-ids.js +12 -3
  47. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  48. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +12 -3
  49. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  50. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts +6 -1
  51. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  52. package/dist/services/document-service/transform/relations/utils/map-relation.js +13 -10
  53. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  54. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +13 -10
  55. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  56. package/dist/services/entity-validator/blocks-validator.d.ts.map +1 -1
  57. package/dist/services/entity-validator/blocks-validator.js +9 -3
  58. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  59. package/dist/services/entity-validator/blocks-validator.mjs +9 -3
  60. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  61. package/dist/services/features.d.ts.map +1 -1
  62. package/dist/services/features.js +3 -0
  63. package/dist/services/features.js.map +1 -1
  64. package/dist/services/features.mjs +3 -0
  65. package/dist/services/features.mjs.map +1 -1
  66. package/dist/services/mcp/handlers/handlePost.d.ts.map +1 -1
  67. package/dist/services/mcp/handlers/handlePost.js +2 -3
  68. package/dist/services/mcp/handlers/handlePost.js.map +1 -1
  69. package/dist/services/mcp/handlers/handlePost.mjs +2 -3
  70. package/dist/services/mcp/handlers/handlePost.mjs.map +1 -1
  71. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts +1 -1
  72. package/dist/services/mcp/internal/McpCapabilityRegistry.d.ts.map +1 -1
  73. package/dist/services/mcp/internal/McpCapabilityRegistry.js.map +1 -1
  74. package/dist/services/mcp/internal/McpCapabilityRegistry.mjs.map +1 -1
  75. package/dist/services/mcp/internal/McpServerFactory.d.ts +1 -1
  76. package/dist/services/mcp/internal/McpServerFactory.d.ts.map +1 -1
  77. package/dist/services/mcp/internal/McpServerFactory.js +2 -3
  78. package/dist/services/mcp/internal/McpServerFactory.js.map +1 -1
  79. package/dist/services/mcp/internal/McpServerFactory.mjs +1 -2
  80. package/dist/services/mcp/internal/McpServerFactory.mjs.map +1 -1
  81. package/dist/services/mcp/prompt-registry.d.ts +1 -1
  82. package/dist/services/mcp/prompt-registry.d.ts.map +1 -1
  83. package/dist/services/mcp/prompt-registry.js +18 -4
  84. package/dist/services/mcp/prompt-registry.js.map +1 -1
  85. package/dist/services/mcp/prompt-registry.mjs +18 -4
  86. package/dist/services/mcp/prompt-registry.mjs.map +1 -1
  87. package/dist/services/mcp/resource-registry.d.ts +1 -1
  88. package/dist/services/mcp/resource-registry.d.ts.map +1 -1
  89. package/dist/services/mcp/resource-registry.js +4 -2
  90. package/dist/services/mcp/resource-registry.js.map +1 -1
  91. package/dist/services/mcp/resource-registry.mjs +4 -2
  92. package/dist/services/mcp/resource-registry.mjs.map +1 -1
  93. package/dist/services/mcp/tool-registry.d.ts +1 -1
  94. package/dist/services/mcp/tool-registry.d.ts.map +1 -1
  95. package/dist/services/mcp/tool-registry.js +18 -11
  96. package/dist/services/mcp/tool-registry.js.map +1 -1
  97. package/dist/services/mcp/tool-registry.mjs +18 -11
  98. package/dist/services/mcp/tool-registry.mjs.map +1 -1
  99. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts +7 -0
  100. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.d.ts.map +1 -0
  101. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js +29 -0
  102. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.js.map +1 -0
  103. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs +27 -0
  104. package/dist/services/mcp/utils/createMcpCapabilityHandlerContext.mjs.map +1 -0
  105. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts +18 -0
  106. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.d.ts.map +1 -0
  107. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js +137 -0
  108. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.js.map +1 -0
  109. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs +131 -0
  110. package/dist/services/mcp/utils/toSdkMcpCapabilityResult.mjs.map +1 -0
  111. package/dist/services/session-manager.d.ts.map +1 -1
  112. package/dist/services/session-manager.js +5 -0
  113. package/dist/services/session-manager.js.map +1 -1
  114. package/dist/services/session-manager.mjs +5 -0
  115. package/dist/services/session-manager.mjs.map +1 -1
  116. package/package.json +20 -17
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { relations } from '@strapi/utils';\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';\nimport { LongHandDocument } from '../utils/types';\n\nconst { isPolymorphic } = relations;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n}\n\n/**\n * Load a relation documentId into the idMap.\n */\nconst addRelationDocId = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n targetStatus.forEach((status) => {\n idMap.add({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status,\n });\n });\n }\n);\n\n/**\n * Iterate over all relations of a data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ attribute, value }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const addDocId = addRelationDocId(idMap, source);\n\n // Skip looking up entries we're about to discard.\n const normalizedValue = normalizeXToOneRelationValue(attribute, value as any);\n\n return mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Regular relations will always target the same target\n // if its a polymorphic relation we need to get it from the data itself\n const targetUid = isPolymorphicRelation ? relation.__type : attribute.target;\n\n addDocId(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 = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position?.before) {\n addDocId(positionTargetUid, { ...relation, ...position, documentId: position.before });\n }\n\n if (position?.after) {\n addDocId(positionTargetUid, { ...relation, ...position, documentId: position.after });\n }\n\n return relation;\n }, normalizedValue as any);\n },\n { schema: strapi.getModel(source.uid), getModel: strapi.getModel.bind(strapi) },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["isPolymorphic","relations","addRelationDocId","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","forEach","add","documentId","extractDataIds","data","traverseEntityRelations","attribute","value","isPolymorphicRelation","addDocId","normalizedValue","normalizeXToOneRelationValue","mapRelation","__type","target","position","positionTargetUid","before","after","schema","strapi","getModel","bind"],"mappings":"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"}
1
+ {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport type { UID } from '@strapi/types';\nimport { relations } from '@strapi/utils';\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';\nimport { LongHandDocument } from '../utils/types';\n\nconst { isPolymorphic } = relations;\nconst MEDIA_UID = 'plugin::upload.file' as UID.ContentType;\n\ninterface Options {\n uid: UID.Schema;\n locale?: string | null;\n status?: 'draft' | 'published';\n}\n\n/**\n * Load a relation documentId into the idMap.\n */\nconst addRelationDocId = curry(\n (idMap: IdMap, source: Options, targetUid: UID.Schema, relation: LongHandDocument) => {\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceLocale: source.locale,\n });\n\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid,\n sourceUid: source.uid,\n sourceStatus: source.status,\n });\n\n targetStatus.forEach((status) => {\n idMap.add({\n uid: targetUid,\n documentId: relation.documentId,\n locale: targetLocale,\n status,\n });\n });\n }\n);\n\n/**\n * Iterate over all relations and media of a data object and extract their document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (idMap: IdMap, data: Record<string, any>, source: Options) => {\n return traverseEntityRelations(\n async ({ attribute, value }) => {\n if (!attribute) {\n return;\n }\n const isPolymorphicRelation = isPolymorphic(attribute);\n const addDocId = addRelationDocId(idMap, source);\n\n // Skip looking up entries we're about to discard.\n const normalizedValue = normalizeXToOneRelationValue(attribute, value as any);\n\n return mapRelation((relation) => {\n if (!relation || !relation.documentId) {\n return relation;\n }\n\n // Regular relations will always target the same target\n // if its a polymorphic relation we need to get it from the data itself\n let targetUid: UID.Schema;\n if (attribute.type === 'media') {\n targetUid = MEDIA_UID;\n } else if (isPolymorphicRelation) {\n targetUid = relation.__type;\n } else {\n targetUid = attribute.target;\n }\n\n addDocId(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 = targetUid;\n if (isPolymorphicRelation && position?.__type) {\n positionTargetUid = position.__type;\n }\n\n if (position?.before) {\n addDocId(positionTargetUid, { ...relation, ...position, documentId: position.before });\n }\n\n if (position?.after) {\n addDocId(positionTargetUid, { ...relation, ...position, documentId: position.after });\n }\n\n return relation;\n }, normalizedValue as any);\n },\n {\n schema: strapi.getModel(source.uid),\n getModel: strapi.getModel.bind(strapi),\n includeMedia: true,\n },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["isPolymorphic","relations","MEDIA_UID","addRelationDocId","curry","idMap","source","targetUid","relation","targetLocale","getRelationTargetLocale","sourceUid","uid","sourceLocale","locale","targetStatus","getRelationTargetStatus","sourceStatus","status","forEach","add","documentId","extractDataIds","data","traverseEntityRelations","attribute","value","isPolymorphicRelation","addDocId","normalizedValue","normalizeXToOneRelationValue","mapRelation","type","__type","target","position","positionTargetUid","before","after","schema","strapi","getModel","bind","includeMedia"],"mappings":"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"}
@@ -7,7 +7,7 @@ interface Options {
7
7
  allowMissingId?: boolean;
8
8
  }
9
9
  /**
10
- * Iterate over all relations of a data object and transform all relational document ids to entity ids.
10
+ * Iterate over all relations and media of a data object and transform document ids to entity ids.
11
11
  */
12
12
  declare const transformDataIdsVisitor: (idMap: IdMap, data: Record<string, any>, source: Options) => Promise<import("@strapi/utils/dist/types").Data>;
13
13
  export { transformDataIdsVisitor };
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIzC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAQrC,UAAU,OAAO;IACf,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA+CD;;GAEG;AACH,QAAA,MAAM,uBAAuB,GAAI,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,OAAO,qDAiExF,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
1
+ {"version":3,"file":"data-ids.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAIzC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AASrC,UAAU,OAAO;IACf,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA+CD;;GAEG;AACH,QAAA,MAAM,uBAAuB,GAAI,OAAO,KAAK,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,OAAO,qDA4ExF,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -8,6 +8,7 @@ var mapRelation = require('../utils/map-relation.js');
8
8
  var xtoOne = require('../utils/xto-one.js');
9
9
 
10
10
  const { isPolymorphic } = strapiUtils.relations;
11
+ const MEDIA_UID = 'plugin::upload.file';
11
12
  /**
12
13
  * Get the entry ids for a given documentId.
13
14
  */ const getRelationIds = fp.curry((idMap, source, targetUid, relation)=>{
@@ -42,7 +43,7 @@ const { isPolymorphic } = strapiUtils.relations;
42
43
  return ids;
43
44
  });
44
45
  /**
45
- * Iterate over all relations of a data object and transform all relational document ids to entity ids.
46
+ * Iterate over all relations and media of a data object and transform document ids to entity ids.
46
47
  */ const transformDataIdsVisitor = (idMap, data, source)=>{
47
48
  return mapRelation.traverseEntityRelations(async ({ key, value, attribute }, { set })=>{
48
49
  if (!attribute) {
@@ -59,7 +60,14 @@ const { isPolymorphic } = strapiUtils.relations;
59
60
  }
60
61
  // Find relational attributes, and return the document ids
61
62
  // if its a polymorphic relation we need to get it from the data itself
62
- const targetUid = isPolymorphicRelation ? relation.__type : attribute.target;
63
+ let targetUid;
64
+ if (attribute.type === 'media') {
65
+ targetUid = MEDIA_UID;
66
+ } else if (isPolymorphicRelation) {
67
+ targetUid = relation.__type;
68
+ } else {
69
+ targetUid = attribute.target;
70
+ }
63
71
  const ids = getIds(targetUid, relation);
64
72
  // Handle positional arguments
65
73
  const position = {
@@ -105,7 +113,8 @@ const { isPolymorphic } = strapiUtils.relations;
105
113
  set(key, newRelation);
106
114
  }, {
107
115
  schema: strapi.getModel(source.uid),
108
- getModel: strapi.getModel.bind(strapi)
116
+ getModel: strapi.getModel.bind(strapi),
117
+ includeMedia: true
109
118
  }, data);
110
119
  };
111
120
 
@@ -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';\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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"}
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;\nconst MEDIA_UID = 'plugin::upload.file' as UID.ContentType;\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 and media of a data object and transform 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 let targetUid: UID.Schema;\n if (attribute.type === 'media') {\n targetUid = MEDIA_UID;\n } else if (isPolymorphicRelation) {\n targetUid = relation.__type;\n } else {\n targetUid = attribute.target;\n }\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 {\n schema: strapi.getModel(source.uid),\n getModel: strapi.getModel.bind(strapi),\n includeMedia: true,\n },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","MEDIA_UID","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","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind","includeMedia"],"mappings":";;;;;;;;;AAYA,MAAM,EAAEA,aAAa,EAAE,GAAGC,qBAAAA;AAC1B,MAAMC,SAAAA,GAAY,qBAAA;AASlB;;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,wBAAwBpC,aAAAA,CAAckC,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;;;YAIA,IAAID,SAAAA;YACJ,IAAI2B,SAAAA,CAAUQ,IAAI,KAAK,OAAA,EAAS;gBAC9BnC,SAAAA,GAAYL,SAAAA;AACd,YAAA,CAAA,MAAO,IAAIkC,qBAAAA,EAAuB;AAChC7B,gBAAAA,SAAAA,GAAYC,SAASmC,MAAM;YAC7B,CAAA,MAAO;AACLpC,gBAAAA,SAAAA,GAAY2B,UAAUU,MAAM;AAC9B,YAAA;YACA,MAAMzB,GAAAA,GAAYkB,OAAO9B,SAAAA,EAAWC,QAAAA,CAAAA;;AAGpC,YAAA,MAAMqC,QAAAA,GAAW;AAAE,gBAAA,GAAGrC,SAASqC;AAAS,aAAA;;AAGxC,YAAA,IAAIC,iBAAAA,GAAgCvC,SAAAA;YACpC,IAAI6B,qBAAAA,IAAyBS,UAAUF,MAAAA,EAAQ;AAC7CG,gBAAAA,iBAAAA,GAAoBD,SAASF,MAAM;AACrC,YAAA;YAEA,IAAIE,QAAAA,CAASE,MAAM,EAAE;AACnB,gBAAA,MAAMC,cAAAA,GAAiB;AAAE,oBAAA,GAAGxC,QAAQ;AAAE,oBAAA,GAAGqC,QAAQ;AAAEtB,oBAAAA,UAAAA,EAAYsB,SAASE;AAAO,iBAAA;gBAC/E,MAAME,SAAAA,GAAkBZ,OAAOS,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,GAAG5C,QAAQ;AAAE,oBAAA,GAAGqC,QAAQ;AAAEtB,oBAAAA,UAAAA,EAAYsB,SAASM;AAAM,iBAAA;AAC7EN,gBAAAA,QAAAA,CAASM,KAAK,GAAGd,MAAAA,CAAOS,iBAAAA,EAAmBM,aAAAA,CAAAA,CAAeF,EAAE,CAAC,CAAA,CAAA;AAC/D,YAAA;;YAGA,OAAO/B,GAAAA,EAAKkC,IAAI,CAACC,EAAAA,GAAAA;AACf,gBAAA,MAAMd,WAAAA,GAAc;AAAEc,oBAAAA;AAAG,iBAAA;gBAEzB,IAAI9C,QAAAA,CAASqC,QAAQ,EAAE;AACrBL,oBAAAA,WAAAA,CAAYK,QAAQ,GAAGA,QAAAA;AACzB,gBAAA;;AAGA,gBAAA,IAAIT,qBAAAA,EAAuB;AACzBI,oBAAAA,WAAAA,CAAYG,MAAM,GAAGpC,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;AACEe,QAAAA,MAAAA,EAAQC,MAAAA,CAAOC,QAAQ,CAACnD,MAAAA,CAAOM,GAAG,CAAA;AAClC6C,QAAAA,QAAAA,EAAUD,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAACF,MAAAA,CAAAA;QAC/BG,YAAAA,EAAc;KAChB,EACA7B,IAAAA,CAAAA;AAEJ;;;;"}
@@ -6,6 +6,7 @@ import { traverseEntityRelations as traverseEntityRelationsCurried, mapRelation
6
6
  import { normalizeXToOneRelationValue } from '../utils/xto-one.mjs';
7
7
 
8
8
  const { isPolymorphic } = relations;
9
+ const MEDIA_UID = 'plugin::upload.file';
9
10
  /**
10
11
  * Get the entry ids for a given documentId.
11
12
  */ const getRelationIds = curry((idMap, source, targetUid, relation)=>{
@@ -40,7 +41,7 @@ const { isPolymorphic } = relations;
40
41
  return ids;
41
42
  });
42
43
  /**
43
- * Iterate over all relations of a data object and transform all relational document ids to entity ids.
44
+ * Iterate over all relations and media of a data object and transform document ids to entity ids.
44
45
  */ const transformDataIdsVisitor = (idMap, data, source)=>{
45
46
  return traverseEntityRelationsCurried(async ({ key, value, attribute }, { set })=>{
46
47
  if (!attribute) {
@@ -57,7 +58,14 @@ const { isPolymorphic } = relations;
57
58
  }
58
59
  // Find relational attributes, and return the document ids
59
60
  // if its a polymorphic relation we need to get it from the data itself
60
- const targetUid = isPolymorphicRelation ? relation.__type : attribute.target;
61
+ let targetUid;
62
+ if (attribute.type === 'media') {
63
+ targetUid = MEDIA_UID;
64
+ } else if (isPolymorphicRelation) {
65
+ targetUid = relation.__type;
66
+ } else {
67
+ targetUid = attribute.target;
68
+ }
61
69
  const ids = getIds(targetUid, relation);
62
70
  // Handle positional arguments
63
71
  const position = {
@@ -103,7 +111,8 @@ const { isPolymorphic } = relations;
103
111
  set(key, newRelation);
104
112
  }, {
105
113
  schema: strapi.getModel(source.uid),
106
- getModel: strapi.getModel.bind(strapi)
114
+ getModel: strapi.getModel.bind(strapi),
115
+ includeMedia: true
107
116
  }, data);
108
117
  };
109
118
 
@@ -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';\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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"}
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;\nconst MEDIA_UID = 'plugin::upload.file' as UID.ContentType;\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 and media of a data object and transform 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 let targetUid: UID.Schema;\n if (attribute.type === 'media') {\n targetUid = MEDIA_UID;\n } else if (isPolymorphicRelation) {\n targetUid = relation.__type;\n } else {\n targetUid = attribute.target;\n }\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 {\n schema: strapi.getModel(source.uid),\n getModel: strapi.getModel.bind(strapi),\n includeMedia: true,\n },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isPolymorphic","relations","MEDIA_UID","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","__type","target","position","positionTargetUid","before","beforeRelation","beforeIds","at","after","afterRelation","map","id","schema","strapi","getModel","bind","includeMedia"],"mappings":"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"}
@@ -1,5 +1,10 @@
1
+ import { traverseEntity } from '@strapi/utils';
1
2
  import { Relation } from './types';
3
+ type TraverseEntity = Parameters<typeof traverseEntity>;
4
+ type TraverseEntityRelationsOptions = TraverseEntity[1] & {
5
+ includeMedia?: boolean;
6
+ };
2
7
  declare const mapRelationCurried: import("lodash").CurriedFunction2<(relation: any) => any, Relation, Promise<Relation>>;
3
- declare const traverseEntityRelationsCurried: import("lodash").CurriedFunction3<import("@strapi/utils/dist/traverse-entity").Visitor, import("@strapi/utils/dist/traverse-entity").TraverseOptions, import("@strapi/utils/dist/types").Data, Promise<import("@strapi/utils/dist/types").Data>>;
8
+ declare const traverseEntityRelationsCurried: import("lodash").CurriedFunction3<import("@strapi/utils/dist/traverse-entity").Visitor, TraverseEntityRelationsOptions, import("@strapi/utils/dist/types").Data, Promise<import("@strapi/utils/dist/types").Data>>;
4
9
  export { mapRelationCurried as mapRelation, traverseEntityRelationsCurried as traverseEntityRelations, };
5
10
  //# sourceMappingURL=map-relation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAqJnC,QAAA,MAAM,kBAAkB,+CApHD,GAAG,KAAK,GAAG,8BAoHW,CAAC;AAC9C,QAAA,MAAM,8BAA8B,kPAAiC,CAAC;AAEtE,OAAO,EACL,kBAAkB,IAAI,WAAW,EACjC,8BAA8B,IAAI,uBAAuB,GAC1D,CAAC"}
1
+ {"version":3,"file":"map-relation.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAS,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AA8GnC,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,KAAK,8BAA8B,GAAG,cAAc,CAAC,CAAC,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA2CrF,QAAA,MAAM,kBAAkB,+CAzHD,GAAG,KAAK,GAAG,8BAyHW,CAAC;AAC9C,QAAA,MAAM,8BAA8B,oNAAiC,CAAC;AAEtE,OAAO,EACL,kBAAkB,IAAI,WAAW,EACjC,8BAA8B,IAAI,uBAAuB,GAC1D,CAAC"}
@@ -105,26 +105,29 @@ const toArray = (value)=>{
105
105
  return callback(relation);
106
106
  };
107
107
  /**
108
- * Utility function, same as `traverseEntity` but only for relations.
108
+ * Utility function, same as `traverseEntity` but only for relations and, when requested, media.
109
109
  */ const traverseEntityRelations = async (visitor, options, data)=>{
110
+ const { includeMedia = false, ...traverseOptions } = options;
110
111
  return strapiUtils.traverseEntity(async (options, utils)=>{
111
112
  const { attribute } = options;
112
113
  if (!attribute) {
113
114
  return;
114
115
  }
115
- if (attribute.type !== 'relation') {
116
+ if (attribute.type !== 'relation' && !(includeMedia && attribute.type === 'media')) {
116
117
  return;
117
118
  }
118
- // TODO: Handle join columns
119
- if (attribute.useJoinTable === false) {
120
- return;
121
- }
122
- // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
123
- if (attribute.relation === 'morphToOne') {
124
- return;
119
+ if (attribute.type === 'relation') {
120
+ // TODO: Handle join columns
121
+ if (attribute.useJoinTable === false) {
122
+ return;
123
+ }
124
+ // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
125
+ if (attribute.relation === 'morphToOne') {
126
+ return;
127
+ }
125
128
  }
126
129
  return visitor(options, utils);
127
- }, options, data);
130
+ }, traverseOptions, data);
128
131
  };
129
132
  const mapRelationCurried = fp.curry(mapRelation);
130
133
  const traverseEntityRelationsCurried = fp.curry(traverseEntityRelations);
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.js","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
1
+ {"version":3,"file":"map-relation.js","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\ntype TraverseEntityRelationsOptions = TraverseEntity[1] & { includeMedia?: boolean };\n\n/**\n * Utility function, same as `traverseEntity` but only for relations and, when requested, media.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntityRelationsOptions,\n data: TraverseEntity[2]\n) => {\n const { includeMedia = false, ...traverseOptions } = options;\n\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation' && !(includeMedia && attribute.type === 'media')) {\n return;\n }\n\n if (attribute.type === 'relation') {\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n }\n\n return visitor(options, utils);\n },\n traverseOptions,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","includeMedia","traverseOptions","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
@@ -103,26 +103,29 @@ const toArray = (value)=>{
103
103
  return callback(relation);
104
104
  };
105
105
  /**
106
- * Utility function, same as `traverseEntity` but only for relations.
106
+ * Utility function, same as `traverseEntity` but only for relations and, when requested, media.
107
107
  */ const traverseEntityRelations = async (visitor, options, data)=>{
108
+ const { includeMedia = false, ...traverseOptions } = options;
108
109
  return traverseEntity(async (options, utils)=>{
109
110
  const { attribute } = options;
110
111
  if (!attribute) {
111
112
  return;
112
113
  }
113
- if (attribute.type !== 'relation') {
114
+ if (attribute.type !== 'relation' && !(includeMedia && attribute.type === 'media')) {
114
115
  return;
115
116
  }
116
- // TODO: Handle join columns
117
- if (attribute.useJoinTable === false) {
118
- return;
119
- }
120
- // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
121
- if (attribute.relation === 'morphToOne') {
122
- return;
117
+ if (attribute.type === 'relation') {
118
+ // TODO: Handle join columns
119
+ if (attribute.useJoinTable === false) {
120
+ return;
121
+ }
122
+ // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData
123
+ if (attribute.relation === 'morphToOne') {
124
+ return;
125
+ }
123
126
  }
124
127
  return visitor(options, utils);
125
- }, options, data);
128
+ }, traverseOptions, data);
126
129
  };
127
130
  const mapRelationCurried = curry(mapRelation);
128
131
  const traverseEntityRelationsCurried = curry(traverseEntityRelations);
@@ -1 +1 @@
1
- {"version":3,"file":"map-relation.mjs","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\n\n/**\n * Utility function, same as `traverseEntity` but only for relations.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntity[1],\n data: TraverseEntity[2]\n) => {\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation') {\n return;\n }\n\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n\n return visitor(options, utils);\n },\n options,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
1
+ {"version":3,"file":"map-relation.mjs","sources":["../../../../../../src/services/document-service/transform/relations/utils/map-relation.ts"],"sourcesContent":["/* eslint-disable node/no-callback-literal */\nimport { isObject, curry, isNil } from 'lodash/fp';\n\nimport { traverseEntity, async } from '@strapi/utils';\n\nimport { Relation } from './types';\n\nconst isNumeric = (value: any): value is number => {\n if (Array.isArray(value)) return false; // Handle [1, 'docId'] case\n const parsed = parseInt(value, 10);\n return !Number.isNaN(parsed);\n};\n\nconst toArray = (value: any) => {\n // Keep value as it is if it's a nullish value\n if (isNil(value)) return value;\n if (Array.isArray(value)) return value;\n\n return [value];\n};\n\n/**\n * There are multiple ways to create Strapi relations.\n * This is a utility to traverse and transform relation data\n *\n *\n * For consistency and ease of use, the response will always be an object with the following shape:\n * { set: [{...}], connect: [{...}], disconnect: [{...}] }\n *\n * @example\n * transformRelationData({\n * onLongHand: (relation) => {\n * // Change the id of the relation\n * return { id: 'other' };\n * },\n * }, relation)\n */\nconst mapRelation = async (\n callback: (relation: any) => any,\n rel: Relation,\n isRecursive = false\n): Promise<Relation> => {\n let relation: Relation = rel;\n\n const wrapInSet = (value: any) => {\n // Ignore wrapping if it's a recursive call\n if (isRecursive) {\n return value;\n }\n return { set: toArray(value) };\n };\n\n // undefined | null\n if (isNil(relation)) {\n return callback(relation);\n }\n\n // LongHand[] | ShortHand[]\n if (Array.isArray(relation)) {\n return async\n .map(relation, (r: Relation) => mapRelation(callback, r, true))\n .then((result: any) => result.flat().filter(Boolean))\n .then(wrapInSet);\n }\n\n // LongHand\n if (isObject(relation)) {\n // { id: 1 } || { documentId: 1 }\n if ('id' in relation || 'documentId' in relation) {\n const result = await callback(relation);\n return wrapInSet(result);\n }\n\n // If not connecting anything, return default visitor\n if (!relation.set && !relation.disconnect && !relation.connect) {\n return callback(relation);\n }\n\n // { set }\n if (relation.set) {\n const set: any = await mapRelation(callback, relation.set, true);\n relation = { ...relation, set: toArray(set) };\n }\n\n // { disconnect}\n if (relation.disconnect) {\n const disconnect: any = await mapRelation(callback, relation.disconnect, true);\n relation = { ...relation, disconnect: toArray(disconnect) };\n }\n\n // { connect }\n if (relation.connect) {\n // Transform the relation to connect\n const connect: any = await mapRelation(callback, relation.connect, true);\n relation = { ...relation, connect: toArray(connect) };\n }\n\n return relation;\n }\n\n // ShortHand\n if (isNumeric(relation)) {\n const result = await callback({ id: relation });\n return wrapInSet(result);\n }\n\n if (typeof relation === 'string') {\n const result = await callback({ documentId: relation });\n return wrapInSet(result);\n }\n\n // Anything else\n return callback(relation);\n};\n\ntype TraverseEntity = Parameters<typeof traverseEntity>;\ntype TraverseEntityRelationsOptions = TraverseEntity[1] & { includeMedia?: boolean };\n\n/**\n * Utility function, same as `traverseEntity` but only for relations and, when requested, media.\n */\nconst traverseEntityRelations = async (\n visitor: TraverseEntity[0],\n options: TraverseEntityRelationsOptions,\n data: TraverseEntity[2]\n) => {\n const { includeMedia = false, ...traverseOptions } = options;\n\n return traverseEntity(\n async (options, utils) => {\n const { attribute } = options;\n\n if (!attribute) {\n return;\n }\n\n if (attribute.type !== 'relation' && !(includeMedia && attribute.type === 'media')) {\n return;\n }\n\n if (attribute.type === 'relation') {\n // TODO: Handle join columns\n if (attribute.useJoinTable === false) {\n return;\n }\n\n // morphToOne uses morphColumn (inline columns on the entity), handled directly in processData\n if (attribute.relation === 'morphToOne') {\n return;\n }\n }\n\n return visitor(options, utils);\n },\n traverseOptions,\n data\n );\n};\n\nconst mapRelationCurried = curry(mapRelation);\nconst traverseEntityRelationsCurried = curry(traverseEntityRelations);\n\nexport {\n mapRelationCurried as mapRelation,\n traverseEntityRelationsCurried as traverseEntityRelations,\n};\n"],"names":["isNumeric","value","Array","isArray","parsed","parseInt","Number","isNaN","toArray","isNil","mapRelation","callback","rel","isRecursive","relation","wrapInSet","set","async","map","r","then","result","flat","filter","Boolean","isObject","disconnect","connect","id","documentId","traverseEntityRelations","visitor","options","data","includeMedia","traverseOptions","traverseEntity","utils","attribute","type","useJoinTable","mapRelationCurried","curry","traverseEntityRelationsCurried"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAwKpC,eAAO,MAAM,eAAe,qGAA8B,CAAC"}
1
+ {"version":3,"file":"blocks-validator.d.ts","sourceRoot":"","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AA0KpC,eAAO,MAAM,eAAe,qGAA8B,CAAC"}
@@ -15,14 +15,20 @@ const textNodeValidator = strapiUtils.yup.object().shape({
15
15
  strikethrough: strapiUtils.yup.boolean(),
16
16
  code: strapiUtils.yup.boolean()
17
17
  });
18
+ const ALLOWED_LINK_PROTOCOLS = new Set([
19
+ 'http:',
20
+ 'https:',
21
+ 'ftp:',
22
+ 'mailto:',
23
+ 'tel:'
24
+ ]);
18
25
  const checkValidLink = (link)=>{
19
26
  try {
20
- // eslint-disable-next-line no-new
21
- new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
27
+ const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
28
+ return ALLOWED_LINK_PROTOCOLS.has(url.protocol);
22
29
  } catch {
23
30
  return false;
24
31
  }
25
- return true;
26
32
  };
27
33
  const linkNodeValidator = strapiUtils.yup.object().shape({
28
34
  type: strapiUtils.yup.string().equals([
@@ -1 +1 @@
1
- {"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst checkValidLink = (link: string) => {\n try {\n // eslint-disable-next-line no-new\n new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n } catch {\n return false;\n }\n return true;\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","checkValidLink","link","URL","startsWith","linkNodeValidator","url","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
1
+ {"version":3,"file":"blocks-validator.js","sources":["../../../src/services/entity-validator/blocks-validator.ts"],"sourcesContent":["import { yup } from '@strapi/utils';\n\nconst textNodeValidator = yup.object().shape({\n type: yup.string().equals(['text']).required(),\n text: yup\n .string()\n .test(\n 'is-valid-text',\n 'Text must be defined with at least an empty string',\n (text: unknown) => {\n return typeof text === 'string' || text === '';\n }\n ),\n bold: yup.boolean(),\n italic: yup.boolean(),\n underline: yup.boolean(),\n strikethrough: yup.boolean(),\n code: yup.boolean(),\n});\n\nconst ALLOWED_LINK_PROTOCOLS = new Set(['http:', 'https:', 'ftp:', 'mailto:', 'tel:']);\n\nconst checkValidLink = (link: string) => {\n try {\n const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);\n\n return ALLOWED_LINK_PROTOCOLS.has(url.protocol);\n } catch {\n return false;\n }\n};\n\nconst linkNodeValidator = yup.object().shape({\n type: yup.string().equals(['link']).required(),\n url: yup\n .string()\n .test('invalid-url', 'Please specify a valid link.', (value) => checkValidLink(value ?? '')),\n children: yup.array().of(textNodeValidator).required(),\n});\n\n// TODO: remove any with a correct Type\nconst inlineNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'text':\n return textNodeValidator;\n case 'link':\n return linkNodeValidator;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be Text or Link', () => {\n return false;\n });\n }\n});\n\nconst paragraphNodeValidator = yup.object().shape({\n type: yup.string().equals(['paragraph']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Paragraph node children must have at least one Text or Link node')\n .required(),\n});\n\nconst headingNodeValidator = yup.object().shape({\n type: yup.string().equals(['heading']).required(),\n level: yup.number().oneOf([1, 2, 3, 4, 5, 6]).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Heading node children must have at least one Text or Link node')\n .required(),\n});\n\nconst quoteNodeValidator = yup.object().shape({\n type: yup.string().equals(['quote']).required(),\n children: yup\n .array()\n .of(inlineNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst codeBlockValidator = yup.object().shape({\n type: yup.string().equals(['code']).required(),\n language: yup.string().nullable(),\n children: yup\n .array()\n .of(textNodeValidator)\n .min(1, 'Quote node children must have at least one Text or Link node')\n .required(),\n});\n\nconst listItemNode = yup.object().shape({\n type: yup.string().equals(['list-item']).required(),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// Allow children to be either a listItemNode or a listNode itself\n// @ts-expect-error - listChildrenValidator needs a type\nconst listChildrenValidator = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'list':\n return listNodeValidator;\n case 'list-item':\n return listItemNode;\n default:\n return yup.mixed().test('invalid-type', 'Inline node must be list-item or list', () => {\n return false;\n });\n }\n});\n\n// @ts-expect-error - listNodeValidator needs a type\nconst listNodeValidator = yup.object().shape({\n type: yup.string().equals(['list']).required(),\n format: yup.string().equals(['ordered', 'unordered']).required(),\n children: yup\n .array()\n .of(listChildrenValidator)\n .min(1, 'List node children must have at least one ListItem or ListNode')\n .required(),\n});\n\nconst imageNodeValidator = yup.object().shape({\n type: yup.string().equals(['image']).required(),\n image: yup.object().shape({\n name: yup.string().required(),\n alternativeText: yup.string().nullable(),\n url: yup.string().required(),\n caption: yup.string().nullable(),\n width: yup.number().required(),\n height: yup.number().required(),\n formats: yup.object().nullable(),\n hash: yup.string().required(),\n ext: yup.string().required(),\n mime: yup.string().required(),\n size: yup.number().required(),\n previewUrl: yup.string().nullable(),\n provider: yup.string().required(),\n provider_metadata: yup.mixed().nullable(),\n createdAt: yup.string().required(),\n updatedAt: yup.string().required(),\n }),\n children: yup.array().of(inlineNodeValidator).required(),\n});\n\n// TODO: remove the any and replace with a correct Type\nconst blockNodeValidator: any = yup.lazy((value: { type: string }) => {\n switch (value.type) {\n case 'paragraph':\n return paragraphNodeValidator;\n case 'heading':\n return headingNodeValidator;\n case 'quote':\n return quoteNodeValidator;\n case 'list':\n return listNodeValidator;\n case 'image':\n return imageNodeValidator;\n case 'code':\n return codeBlockValidator;\n default:\n return yup.mixed().test('invalid-type', 'Block node is of invalid type', () => {\n return false;\n });\n }\n});\n\nconst blocksValidatorSchema = yup.array().of(blockNodeValidator);\n\nexport const blocksValidator = () => blocksValidatorSchema;\n"],"names":["textNodeValidator","yup","object","shape","type","string","equals","required","text","test","bold","boolean","italic","underline","strikethrough","code","ALLOWED_LINK_PROTOCOLS","Set","checkValidLink","link","url","URL","startsWith","has","protocol","linkNodeValidator","value","children","array","of","inlineNodeValidator","lazy","mixed","paragraphNodeValidator","min","headingNodeValidator","level","number","oneOf","quoteNodeValidator","codeBlockValidator","language","nullable","listItemNode","listChildrenValidator","listNodeValidator","format","imageNodeValidator","image","name","alternativeText","caption","width","height","formats","hash","ext","mime","size","previewUrl","provider","provider_metadata","createdAt","updatedAt","blockNodeValidator","blocksValidatorSchema","blocksValidator"],"mappings":"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"}
@@ -13,14 +13,20 @@ const textNodeValidator = yup.object().shape({
13
13
  strikethrough: yup.boolean(),
14
14
  code: yup.boolean()
15
15
  });
16
+ const ALLOWED_LINK_PROTOCOLS = new Set([
17
+ 'http:',
18
+ 'https:',
19
+ 'ftp:',
20
+ 'mailto:',
21
+ 'tel:'
22
+ ]);
16
23
  const checkValidLink = (link)=>{
17
24
  try {
18
- // eslint-disable-next-line no-new
19
- new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
25
+ const url = new URL(link.startsWith('/') ? `https://strapi.io${link}` : link);
26
+ return ALLOWED_LINK_PROTOCOLS.has(url.protocol);
20
27
  } catch {
21
28
  return false;
22
29
  }
23
- return true;
24
30
  };
25
31
  const linkNodeValidator = yup.object().shape({
26
32
  type: yup.string().equals([