@strapi/core 0.0.0-experimental.a407f3bc8fb79a53cf7975140864526b6ddbac4b → 0.0.0-experimental.e3e48deb89bd0a1b6cc69b698696566fa7854a95

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 (189) hide show
  1. package/dist/Strapi.d.ts +5 -3
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +19 -7
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +19 -7
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/index.d.ts.map +1 -1
  8. package/dist/configuration/index.js +4 -4
  9. package/dist/configuration/index.js.map +1 -1
  10. package/dist/configuration/index.mjs +1 -1
  11. package/dist/configuration/index.mjs.map +1 -1
  12. package/dist/configuration/urls.d.ts +8 -0
  13. package/dist/configuration/urls.d.ts.map +1 -0
  14. package/dist/configuration/urls.js +68 -0
  15. package/dist/configuration/urls.js.map +1 -0
  16. package/dist/configuration/urls.mjs +66 -0
  17. package/dist/configuration/urls.mjs.map +1 -0
  18. package/dist/core-api/controller/index.d.ts.map +1 -1
  19. package/dist/core-api/controller/index.js +6 -1
  20. package/dist/core-api/controller/index.js.map +1 -1
  21. package/dist/core-api/controller/index.mjs +6 -1
  22. package/dist/core-api/controller/index.mjs.map +1 -1
  23. package/dist/core-api/controller/transform.d.ts +8 -7
  24. package/dist/core-api/controller/transform.d.ts.map +1 -1
  25. package/dist/core-api/controller/transform.js +18 -9
  26. package/dist/core-api/controller/transform.js.map +1 -1
  27. package/dist/core-api/controller/transform.mjs +18 -9
  28. package/dist/core-api/controller/transform.mjs.map +1 -1
  29. package/dist/core-api/service/single-type.d.ts +1 -1
  30. package/dist/core-api/service/single-type.d.ts.map +1 -1
  31. package/dist/core-api/service/single-type.js +3 -4
  32. package/dist/core-api/service/single-type.js.map +1 -1
  33. package/dist/core-api/service/single-type.mjs +3 -4
  34. package/dist/core-api/service/single-type.mjs.map +1 -1
  35. package/dist/domain/content-type/index.d.ts.map +1 -1
  36. package/dist/domain/content-type/index.js +3 -0
  37. package/dist/domain/content-type/index.js.map +1 -1
  38. package/dist/domain/content-type/index.mjs +3 -0
  39. package/dist/domain/content-type/index.mjs.map +1 -1
  40. package/dist/domain/content-type/validator.d.ts.map +1 -1
  41. package/dist/domain/content-type/validator.js +1 -1
  42. package/dist/domain/content-type/validator.js.map +1 -1
  43. package/dist/domain/content-type/validator.mjs +2 -2
  44. package/dist/domain/content-type/validator.mjs.map +1 -1
  45. package/dist/domain/module/index.d.ts.map +1 -1
  46. package/dist/domain/module/index.js +2 -3
  47. package/dist/domain/module/index.js.map +1 -1
  48. package/dist/domain/module/index.mjs +2 -3
  49. package/dist/domain/module/index.mjs.map +1 -1
  50. package/dist/ee/index.js.map +1 -1
  51. package/dist/ee/index.mjs.map +1 -1
  52. package/dist/loaders/apis.js +1 -1
  53. package/dist/loaders/apis.js.map +1 -1
  54. package/dist/loaders/apis.mjs +2 -2
  55. package/dist/loaders/apis.mjs.map +1 -1
  56. package/dist/loaders/plugins/get-enabled-plugins.js +1 -1
  57. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  58. package/dist/loaders/plugins/get-enabled-plugins.mjs +2 -2
  59. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  60. package/dist/middlewares/security.d.ts.map +1 -1
  61. package/dist/middlewares/security.js +2 -2
  62. package/dist/middlewares/security.js.map +1 -1
  63. package/dist/middlewares/security.mjs +2 -2
  64. package/dist/middlewares/security.mjs.map +1 -1
  65. package/dist/migrations/draft-publish.d.ts +17 -0
  66. package/dist/migrations/draft-publish.d.ts.map +1 -0
  67. package/dist/migrations/draft-publish.js +59 -0
  68. package/dist/migrations/draft-publish.js.map +1 -0
  69. package/dist/migrations/draft-publish.mjs +59 -0
  70. package/dist/migrations/draft-publish.mjs.map +1 -0
  71. package/dist/registries/config.d.ts +2 -2
  72. package/dist/registries/config.d.ts.map +1 -1
  73. package/dist/registries/config.js +14 -6
  74. package/dist/registries/config.js.map +1 -1
  75. package/dist/registries/config.mjs +15 -5
  76. package/dist/registries/config.mjs.map +1 -1
  77. package/dist/services/document-service/common.d.ts +2 -2
  78. package/dist/services/document-service/common.d.ts.map +1 -1
  79. package/dist/services/document-service/common.js.map +1 -1
  80. package/dist/services/document-service/common.mjs.map +1 -1
  81. package/dist/services/document-service/draft-and-publish.d.ts +9 -23
  82. package/dist/services/document-service/draft-and-publish.d.ts.map +1 -1
  83. package/dist/services/document-service/draft-and-publish.js +37 -9
  84. package/dist/services/document-service/draft-and-publish.js.map +1 -1
  85. package/dist/services/document-service/draft-and-publish.mjs +38 -10
  86. package/dist/services/document-service/draft-and-publish.mjs.map +1 -1
  87. package/dist/services/document-service/index.js +5 -5
  88. package/dist/services/document-service/index.js.map +1 -1
  89. package/dist/services/document-service/index.mjs +1 -1
  90. package/dist/services/document-service/index.mjs.map +1 -1
  91. package/dist/services/document-service/repository.d.ts +3 -0
  92. package/dist/services/document-service/repository.d.ts.map +1 -0
  93. package/dist/services/document-service/repository.js +295 -0
  94. package/dist/services/document-service/repository.js.map +1 -0
  95. package/dist/services/document-service/repository.mjs +295 -0
  96. package/dist/services/document-service/repository.mjs.map +1 -0
  97. package/dist/services/document-service/transform/id-map.d.ts +1 -1
  98. package/dist/services/document-service/transform/id-map.d.ts.map +1 -1
  99. package/dist/services/document-service/transform/id-map.js +15 -9
  100. package/dist/services/document-service/transform/id-map.js.map +1 -1
  101. package/dist/services/document-service/transform/id-map.mjs +16 -10
  102. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  103. package/dist/services/document-service/transform/id-transform.d.ts +4 -18
  104. package/dist/services/document-service/transform/id-transform.d.ts.map +1 -1
  105. package/dist/services/document-service/transform/id-transform.js +18 -12
  106. package/dist/services/document-service/transform/id-transform.js.map +1 -1
  107. package/dist/services/document-service/transform/id-transform.mjs +18 -12
  108. package/dist/services/document-service/transform/id-transform.mjs.map +1 -1
  109. package/dist/services/document-service/transform/populate.d.ts +5 -2
  110. package/dist/services/document-service/transform/populate.d.ts.map +1 -1
  111. package/dist/services/document-service/transform/populate.js.map +1 -1
  112. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  113. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts +1 -1
  114. package/dist/services/document-service/transform/relations/extract/data-ids.d.ts.map +1 -1
  115. package/dist/services/document-service/transform/relations/extract/data-ids.js +23 -12
  116. package/dist/services/document-service/transform/relations/extract/data-ids.js.map +1 -1
  117. package/dist/services/document-service/transform/relations/extract/data-ids.mjs +23 -12
  118. package/dist/services/document-service/transform/relations/extract/data-ids.mjs.map +1 -1
  119. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts +1 -1
  120. package/dist/services/document-service/transform/relations/transform/data-ids.d.ts.map +1 -1
  121. package/dist/services/document-service/transform/relations/transform/data-ids.js +61 -37
  122. package/dist/services/document-service/transform/relations/transform/data-ids.js.map +1 -1
  123. package/dist/services/document-service/transform/relations/transform/data-ids.mjs +62 -38
  124. package/dist/services/document-service/transform/relations/transform/data-ids.mjs.map +1 -1
  125. package/dist/services/document-service/transform/relations/utils/dp.d.ts +10 -0
  126. package/dist/services/document-service/transform/relations/utils/dp.d.ts.map +1 -0
  127. package/dist/services/document-service/transform/relations/utils/dp.js +25 -0
  128. package/dist/services/document-service/transform/relations/utils/dp.js.map +1 -0
  129. package/dist/services/document-service/transform/relations/utils/dp.mjs +25 -0
  130. package/dist/services/document-service/transform/relations/utils/dp.mjs.map +1 -0
  131. package/dist/services/document-service/transform/relations/utils/types.d.ts +4 -1
  132. package/dist/services/document-service/transform/relations/utils/types.d.ts.map +1 -1
  133. package/dist/services/document-service/transform/types.d.ts +1 -1
  134. package/dist/services/document-service/transform/types.d.ts.map +1 -1
  135. package/dist/services/document-service/utils/populate.d.ts +8 -1
  136. package/dist/services/document-service/utils/populate.d.ts.map +1 -1
  137. package/dist/services/document-service/utils/populate.js +5 -5
  138. package/dist/services/document-service/utils/populate.js.map +1 -1
  139. package/dist/services/document-service/utils/populate.mjs +5 -5
  140. package/dist/services/document-service/utils/populate.mjs.map +1 -1
  141. package/dist/services/entity-service/components.d.ts +1 -4
  142. package/dist/services/entity-service/components.d.ts.map +1 -1
  143. package/dist/services/entity-service/components.js +13 -99
  144. package/dist/services/entity-service/components.js.map +1 -1
  145. package/dist/services/entity-service/components.mjs +14 -100
  146. package/dist/services/entity-service/components.mjs.map +1 -1
  147. package/dist/services/entity-service/index.d.ts +1 -3
  148. package/dist/services/entity-service/index.d.ts.map +1 -1
  149. package/dist/services/entity-service/index.js +34 -199
  150. package/dist/services/entity-service/index.js.map +1 -1
  151. package/dist/services/entity-service/index.mjs +27 -192
  152. package/dist/services/entity-service/index.mjs.map +1 -1
  153. package/dist/services/entity-service/params.d.ts +4 -4
  154. package/dist/services/entity-service/params.d.ts.map +1 -1
  155. package/dist/services/entity-service/params.js +1 -1
  156. package/dist/services/entity-service/params.js.map +1 -1
  157. package/dist/services/entity-service/params.mjs +1 -1
  158. package/dist/services/entity-service/params.mjs.map +1 -1
  159. package/dist/services/entity-validator/index.js +1 -1
  160. package/dist/services/entity-validator/index.js.map +1 -1
  161. package/dist/services/entity-validator/index.mjs +1 -1
  162. package/dist/services/entity-validator/index.mjs.map +1 -1
  163. package/dist/utils/is-initialized.js +1 -1
  164. package/dist/utils/is-initialized.js.map +1 -1
  165. package/dist/utils/is-initialized.mjs +1 -1
  166. package/dist/utils/is-initialized.mjs.map +1 -1
  167. package/dist/utils/load-config-file.js +1 -1
  168. package/dist/utils/load-config-file.js.map +1 -1
  169. package/dist/utils/load-config-file.mjs +2 -2
  170. package/dist/utils/load-config-file.mjs.map +1 -1
  171. package/package.json +14 -14
  172. package/dist/services/document-service/document-engine.d.ts +0 -8
  173. package/dist/services/document-service/document-engine.d.ts.map +0 -1
  174. package/dist/services/document-service/document-engine.js +0 -241
  175. package/dist/services/document-service/document-engine.js.map +0 -1
  176. package/dist/services/document-service/document-engine.mjs +0 -242
  177. package/dist/services/document-service/document-engine.mjs.map +0 -1
  178. package/dist/services/document-service/repositories/content-type.d.ts +0 -3
  179. package/dist/services/document-service/repositories/content-type.d.ts.map +0 -1
  180. package/dist/services/document-service/repositories/content-type.js +0 -139
  181. package/dist/services/document-service/repositories/content-type.js.map +0 -1
  182. package/dist/services/document-service/repositories/content-type.mjs +0 -139
  183. package/dist/services/document-service/repositories/content-type.mjs.map +0 -1
  184. package/dist/services/utils/upload-files.d.ts +0 -8
  185. package/dist/services/utils/upload-files.d.ts.map +0 -1
  186. package/dist/services/utils/upload-files.js +0 -64
  187. package/dist/services/utils/upload-files.js.map +0 -1
  188. package/dist/services/utils/upload-files.mjs +0 -63
  189. package/dist/services/utils/upload-files.mjs.map +0 -1
@@ -1,27 +1,33 @@
1
+ import { curry } from "lodash/fp";
1
2
  import { transformData } from "./data.mjs";
2
3
  import { transformFields } from "./fields.mjs";
3
4
  import { transformPopulate } from "./populate.mjs";
4
- async function transformParamsDocumentId(uid, input, opts) {
5
- let data = input.data;
6
- if (input.data) {
7
- data = await transformData(input.data, { ...opts, uid });
5
+ async function transformParamsDocumentId(uid, query) {
6
+ let data = query.data;
7
+ if (query.data) {
8
+ data = await transformData(query.data, {
9
+ locale: query.locale,
10
+ status: query.status,
11
+ uid
12
+ });
8
13
  }
9
- let fields = input.fields;
10
- if (input.fields) {
11
- fields = transformFields(input.fields);
14
+ let fields = query.fields;
15
+ if (query.fields) {
16
+ fields = transformFields(query.fields);
12
17
  }
13
- let populate = input.populate;
14
- if (input.populate) {
15
- populate = await transformPopulate(input.populate, { ...opts, uid });
18
+ let populate = query.populate;
19
+ if (query.populate) {
20
+ populate = await transformPopulate(query.populate, { uid });
16
21
  }
17
22
  return {
18
- ...input,
23
+ ...query,
19
24
  data,
20
25
  fields,
21
26
  populate
22
27
  };
23
28
  }
29
+ const curriedTransformParamsDocumentId = curry(transformParamsDocumentId);
24
30
  export {
25
- transformParamsDocumentId
31
+ curriedTransformParamsDocumentId as transformParamsDocumentId
26
32
  };
27
33
  //# sourceMappingURL=id-transform.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"id-transform.mjs","sources":["../../../../src/services/document-service/transform/id-transform.ts"],"sourcesContent":["import { Common } from '@strapi/types';\nimport { transformData } from './data';\nimport { transformFields } from './fields';\nimport { transformPopulate } from './populate';\n\n/**\n * Transform input of a query to map document ids to entity ids.\n */\nasync function transformParamsDocumentId(\n uid: Common.UID.Schema,\n input: { data?: any; fields?: any; populate?: any; [key: string]: any },\n opts: {\n locale?: string | null;\n isDraft: boolean;\n }\n) {\n // Transform relational documentIds to entity ids\n let data = input.data;\n if (input.data) {\n data = await transformData(input.data, { ...opts, uid });\n }\n\n // Make sure documentId is always present in the response\n let fields = input.fields;\n if (input.fields) {\n fields = transformFields(input.fields);\n }\n\n let populate = input.populate;\n if (input.populate) {\n populate = await transformPopulate(input.populate, { ...opts, uid });\n }\n\n return {\n ...input,\n data,\n fields,\n populate,\n };\n}\n\nexport { transformParamsDocumentId };\n"],"names":[],"mappings":";;;AAQA,eAAe,0BACb,KACA,OACA,MAIA;AAEA,MAAI,OAAO,MAAM;AACjB,MAAI,MAAM,MAAM;AACP,WAAA,MAAM,cAAc,MAAM,MAAM,EAAE,GAAG,MAAM,KAAK;AAAA,EACzD;AAGA,MAAI,SAAS,MAAM;AACnB,MAAI,MAAM,QAAQ;AACP,aAAA,gBAAgB,MAAM,MAAM;AAAA,EACvC;AAEA,MAAI,WAAW,MAAM;AACrB,MAAI,MAAM,UAAU;AACP,eAAA,MAAM,kBAAkB,MAAM,UAAU,EAAE,GAAG,MAAM,KAAK;AAAA,EACrE;AAEO,SAAA;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"id-transform.mjs","sources":["../../../../src/services/document-service/transform/id-transform.ts"],"sourcesContent":["import { curry } from 'lodash/fp';\n\nimport { Common, Documents } from '@strapi/types';\n\nimport { transformData } from './data';\nimport { transformFields } from './fields';\nimport { transformPopulate } from './populate';\n\n/**\n * Transform input of a query to map document ids to entity ids.\n */\nasync function transformParamsDocumentId(\n uid: Common.UID.Schema,\n query: Documents.Params.All\n): Promise<Documents.Params.All> {\n // Transform relational documentIds to entity ids\n let data = query.data;\n if (query.data) {\n data = await transformData(query.data, {\n locale: query.locale,\n status: query.status,\n uid,\n });\n }\n\n // Make sure documentId is always present in the response\n let fields = query.fields;\n if (query.fields) {\n fields = transformFields(query.fields) as typeof query.fields;\n }\n\n let populate = query.populate;\n if (query.populate) {\n populate = (await transformPopulate(query.populate, { uid })) as typeof query.populate;\n }\n\n return {\n ...query,\n data,\n fields,\n populate,\n };\n}\n\nconst curriedTransformParamsDocumentId = curry(transformParamsDocumentId);\n\nexport { curriedTransformParamsDocumentId as transformParamsDocumentId };\n"],"names":[],"mappings":";;;;AAWA,eAAe,0BACb,KACA,OAC+B;AAE/B,MAAI,OAAO,MAAM;AACjB,MAAI,MAAM,MAAM;AACP,WAAA,MAAM,cAAc,MAAM,MAAM;AAAA,MACrC,QAAQ,MAAM;AAAA,MACd,QAAQ,MAAM;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EACH;AAGA,MAAI,SAAS,MAAM;AACnB,MAAI,MAAM,QAAQ;AACP,aAAA,gBAAgB,MAAM,MAAM;AAAA,EACvC;AAEA,MAAI,WAAW,MAAM;AACrB,MAAI,MAAM,UAAU;AAClB,eAAY,MAAM,kBAAkB,MAAM,UAAU,EAAE,KAAK;AAAA,EAC7D;AAEO,SAAA;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AAEM,MAAA,mCAAmC,MAAM,yBAAyB;"}
@@ -1,3 +1,6 @@
1
- import { type Data, type Options } from './types';
2
- export declare const transformPopulate: (data: Data, opts: Options) => Promise<unknown>;
1
+ import type { Common } from '@strapi/types';
2
+ import { type Data } from './types';
3
+ export declare const transformPopulate: (data: Data, opts: {
4
+ uid: Common.UID.Schema;
5
+ }) => Promise<unknown>;
3
6
  //# sourceMappingURL=populate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/populate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,SAAS,CAAC;AAGlD,eAAO,MAAM,iBAAiB,SAAgB,IAAI,QAAQ,OAAO,qBAqBhE,CAAC"}
1
+ {"version":3,"file":"populate.d.ts","sourceRoot":"","sources":["../../../../src/services/document-service/transform/populate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,SAAS,CAAC;AAGpC,eAAO,MAAM,iBAAiB,SAAgB,IAAI,QAAQ;IAAE,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAA;CAAE,qBAqBnF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"populate.js","sources":["../../../../src/services/document-service/transform/populate.ts"],"sourcesContent":["import { traverse } from '@strapi/utils';\nimport { type Data, type Options } from './types';\nimport { transformFields } from './fields';\n\nexport const transformPopulate = async (data: Data, opts: Options) => {\n return traverse.traverseQueryPopulate(\n async ({ attribute, key, value }, { set }) => {\n if (!value || typeof value !== 'object' || attribute?.type !== 'relation') {\n return;\n }\n\n /*\n If the attribute is a relation\n Look for fields in the value\n and apply the relevant transformation to these objects\n */\n if ('fields' in value && Array.isArray(value.fields)) {\n value.fields = transformFields(value.fields);\n }\n\n set(key, value);\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n"],"names":["traverse","transformFields"],"mappings":";;;;AAIa,MAAA,oBAAoB,OAAO,MAAY,SAAkB;AACpE,SAAOA,YAAS,SAAA;AAAA,IACd,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,UAAU;AAC5C,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,WAAW,SAAS,YAAY;AACzE;AAAA,MACF;AAOA,UAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC9C,cAAA,SAASC,OAAAA,gBAAgB,MAAM,MAAM;AAAA,MAC7C;AAEA,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;;"}
1
+ {"version":3,"file":"populate.js","sources":["../../../../src/services/document-service/transform/populate.ts"],"sourcesContent":["import { traverse } from '@strapi/utils';\nimport type { Common } from '@strapi/types';\n\nimport { type Data } from './types';\nimport { transformFields } from './fields';\n\nexport const transformPopulate = async (data: Data, opts: { uid: Common.UID.Schema }) => {\n return traverse.traverseQueryPopulate(\n async ({ attribute, key, value }, { set }) => {\n if (!value || typeof value !== 'object' || attribute?.type !== 'relation') {\n return;\n }\n\n /*\n If the attribute is a relation\n Look for fields in the value\n and apply the relevant transformation to these objects\n */\n if ('fields' in value && Array.isArray(value.fields)) {\n value.fields = transformFields(value.fields);\n }\n\n set(key, value);\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n"],"names":["traverse","transformFields"],"mappings":";;;;AAMa,MAAA,oBAAoB,OAAO,MAAY,SAAqC;AACvF,SAAOA,YAAS,SAAA;AAAA,IACd,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,UAAU;AAC5C,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,WAAW,SAAS,YAAY;AACzE;AAAA,MACF;AAOA,UAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC9C,cAAA,SAASC,OAAAA,gBAAgB,MAAM,MAAM;AAAA,MAC7C;AAEA,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"populate.mjs","sources":["../../../../src/services/document-service/transform/populate.ts"],"sourcesContent":["import { traverse } from '@strapi/utils';\nimport { type Data, type Options } from './types';\nimport { transformFields } from './fields';\n\nexport const transformPopulate = async (data: Data, opts: Options) => {\n return traverse.traverseQueryPopulate(\n async ({ attribute, key, value }, { set }) => {\n if (!value || typeof value !== 'object' || attribute?.type !== 'relation') {\n return;\n }\n\n /*\n If the attribute is a relation\n Look for fields in the value\n and apply the relevant transformation to these objects\n */\n if ('fields' in value && Array.isArray(value.fields)) {\n value.fields = transformFields(value.fields);\n }\n\n set(key, value);\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n"],"names":[],"mappings":";;AAIa,MAAA,oBAAoB,OAAO,MAAY,SAAkB;AACpE,SAAO,SAAS;AAAA,IACd,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,UAAU;AAC5C,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,WAAW,SAAS,YAAY;AACzE;AAAA,MACF;AAOA,UAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC9C,cAAA,SAAS,gBAAgB,MAAM,MAAM;AAAA,MAC7C;AAEA,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"populate.mjs","sources":["../../../../src/services/document-service/transform/populate.ts"],"sourcesContent":["import { traverse } from '@strapi/utils';\nimport type { Common } from '@strapi/types';\n\nimport { type Data } from './types';\nimport { transformFields } from './fields';\n\nexport const transformPopulate = async (data: Data, opts: { uid: Common.UID.Schema }) => {\n return traverse.traverseQueryPopulate(\n async ({ attribute, key, value }, { set }) => {\n if (!value || typeof value !== 'object' || attribute?.type !== 'relation') {\n return;\n }\n\n /*\n If the attribute is a relation\n Look for fields in the value\n and apply the relevant transformation to these objects\n */\n if ('fields' in value && Array.isArray(value.fields)) {\n value.fields = transformFields(value.fields);\n }\n\n set(key, value);\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n"],"names":[],"mappings":";;AAMa,MAAA,oBAAoB,OAAO,MAAY,SAAqC;AACvF,SAAO,SAAS;AAAA,IACd,OAAO,EAAE,WAAW,KAAK,SAAS,EAAE,UAAU;AAC5C,UAAI,CAAC,SAAS,OAAO,UAAU,YAAY,WAAW,SAAS,YAAY;AACzE;AAAA,MACF;AAOA,UAAI,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC9C,cAAA,SAAS,gBAAgB,MAAM,MAAM;AAAA,MAC7C;AAEA,UAAI,KAAK,KAAK;AAAA,IAChB;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;"}
@@ -7,7 +7,7 @@ import { IdMap } from '../../id-map';
7
7
  declare const extractDataIds: (idMap: IdMap, data: Record<string, any>, opts: {
8
8
  uid: Common.UID.Schema;
9
9
  locale?: string | null;
10
- isDraft?: boolean;
10
+ status?: 'draft' | 'published';
11
11
  }) => Promise<import("@strapi/utils/dist/types").Data>;
12
12
  export { extractDataIds };
13
13
  //# sourceMappingURL=data-ids.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,MAAM,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAyErC;;;GAGG;AACH,QAAA,MAAM,cAAc,UACX,KAAK,QACN,OAAO,MAAM,EAAE,GAAG,CAAC,QACnB;IAAE,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,qDA6B5E,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"data-ids.d.ts","sourceRoot":"","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"names":[],"mappings":"AACA,OAAO,EAA4B,MAAM,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA4ErC;;;GAGG;AACH,QAAA,MAAM,cAAc,UACX,KAAK,QACN,OAAO,MAAM,EAAE,GAAG,CAAC,QACnB;IAAE,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAA;CAAE,qDAwCzF,CAAC;AAEF,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -4,6 +4,7 @@ const _ = require("lodash/fp");
4
4
  const strapiUtils = require("@strapi/utils");
5
5
  const data = require("../utils/data.js");
6
6
  const i18n = require("../utils/i18n.js");
7
+ const dp = require("../utils/dp.js");
7
8
  const handlePrimitive = (relation) => {
8
9
  if (!relation) {
9
10
  return [];
@@ -13,7 +14,9 @@ const handlePrimitive = (relation) => {
13
14
  }
14
15
  if (data.isLongHand(relation)) {
15
16
  if ("documentId" in relation) {
16
- return [{ documentId: relation.documentId, locale: relation.locale }];
17
+ return [
18
+ { documentId: relation.documentId, locale: relation.locale, status: relation.status }
19
+ ];
17
20
  }
18
21
  return [];
19
22
  }
@@ -40,10 +43,10 @@ const extractRelationIds = (relation) => {
40
43
  return;
41
44
  const { position } = relation2;
42
45
  if (position?.before) {
43
- ids.push(...handlePrimitive({ ...position, id: position.before }));
46
+ ids.push(...handlePrimitive({ ...position, documentId: position.before }));
44
47
  }
45
48
  if (position?.after) {
46
- ids.push(...handlePrimitive({ ...position, id: position.after }));
49
+ ids.push(...handlePrimitive({ ...position, documentId: position.after }));
47
50
  }
48
51
  });
49
52
  }
@@ -58,15 +61,23 @@ const extractDataIds = (idMap, data2, opts) => {
58
61
  if (!target)
59
62
  return;
60
63
  extractedIds.forEach((relation) => {
61
- idMap.add({
62
- uid: target,
63
- documentId: relation.documentId,
64
- locale: i18n.getRelationTargetLocale(relation, {
65
- targetUid: target,
66
- sourceUid: opts.uid,
67
- sourceLocale: opts.locale
68
- }),
69
- isDraft: opts.isDraft
64
+ const targetLocale = i18n.getRelationTargetLocale(relation, {
65
+ targetUid: target,
66
+ sourceUid: opts.uid,
67
+ sourceLocale: opts.locale
68
+ });
69
+ const targetStatus = dp.getRelationTargetStatus(relation, {
70
+ targetUid: target,
71
+ sourceUid: opts.uid,
72
+ sourceStatus: opts.status
73
+ });
74
+ targetStatus.forEach((status) => {
75
+ idMap.add({
76
+ uid: target,
77
+ documentId: relation.documentId,
78
+ locale: targetLocale,
79
+ status
80
+ });
70
81
  });
71
82
  });
72
83
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.js","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport { IdMap } from '../../id-map';\nimport { ShortHand, LongHand, LongHandDocument } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { getRelationTargetLocale } from '../utils/i18n';\n\n/**\n * Get relation ids from primitive representation (id, id[], {id}, {id}[])\n */\nconst handlePrimitive = (\n relation: ShortHand | LongHand | ShortHand[] | LongHand[] | null | undefined | any\n): LongHandDocument[] => {\n if (!relation) {\n return []; // null\n }\n\n if (isShortHand(relation)) {\n return [{ documentId: relation }]; // id\n }\n\n if (isLongHand(relation)) {\n // { documentId, locale? }\n if ('documentId' in relation) {\n return [{ documentId: relation.documentId, locale: relation.locale }];\n }\n // { id }\n return [];\n }\n\n if (Array.isArray(relation)) {\n return relation.map((item) => (isShortHand(item) ? { documentId: item } : item)); // id[]\n }\n\n return [];\n};\n\n/**\n * Get all relations document ids from a relation input value\n */\nconst extractRelationIds = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>\n): LongHandDocument[] => {\n const ids = handlePrimitive(relation);\n if (!isObject(relation)) return ids;\n\n if ('set' in relation) ids.push(...handlePrimitive(relation.set)); // set: id[]\n if ('disconnect' in relation) ids.push(...handlePrimitive(relation.disconnect)); // disconnect: id[]\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n if (!relation.connect) return [];\n ids.push(...handlePrimitive(relation.connect));\n\n // handle positional arguments\n const connect = Array.isArray(relation.connect) ? relation.connect : [relation.connect];\n connect.forEach((relation) => {\n if (isShortHand(relation) || !('position' in relation)) return;\n\n const { position } = relation;\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n ids.push(...handlePrimitive({ ...position, id: position.before }));\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n ids.push(...handlePrimitive({ ...position, id: position.after }));\n }\n });\n }\n\n return ids;\n};\n\n/**\n * Iterate over all attributes of a Data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: { uid: Common.UID.Schema; locale?: string | null; isDraft?: boolean }\n) => {\n return traverseEntity(\n ({ value, attribute }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const extractedIds = extractRelationIds(value as any);\n\n // TODO: Handle morph relations (they have multiple targets)\n const target = attribute.target;\n if (!target) return;\n\n extractedIds.forEach((relation) => {\n idMap.add({\n uid: target,\n documentId: relation.documentId,\n locale: getRelationTargetLocale(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceLocale: opts.locale,\n }),\n isDraft: opts.isDraft,\n });\n });\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["isShortHand","isLongHand","isObject","relation","data","traverseEntity","getRelationTargetLocale"],"mappings":";;;;;;AAWA,MAAM,kBAAkB,CACtB,aACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AAEI,MAAAA,KAAAA,YAAY,QAAQ,GAAG;AACzB,WAAO,CAAC,EAAE,YAAY,SAAA,CAAU;AAAA,EAClC;AAEI,MAAAC,KAAAA,WAAW,QAAQ,GAAG;AAExB,QAAI,gBAAgB,UAAU;AACrB,aAAA,CAAC,EAAE,YAAY,SAAS,YAAY,QAAQ,SAAS,QAAQ;AAAA,IACtE;AAEA,WAAO;EACT;AAEI,MAAA,MAAM,QAAQ,QAAQ,GAAG;AACpB,WAAA,SAAS,IAAI,CAAC,SAAUD,KAAA,YAAY,IAAI,IAAI,EAAE,YAAY,KAAK,IAAI,IAAK;AAAA,EACjF;AAEA,SAAO;AACT;AAKA,MAAM,qBAAqB,CACzB,aACuB;AACjB,QAAA,MAAM,gBAAgB,QAAQ;AAChC,MAAA,CAACE,WAAS,QAAQ;AAAU,WAAA;AAEhC,MAAI,SAAS;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,GAAG,CAAC;AAChE,MAAI,gBAAgB;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,UAAU,CAAC;AAC9E,MAAI,aAAa,UAAU;AAEzB,QAAI,CAAC,SAAS;AAAS,aAAO;AAC9B,QAAI,KAAK,GAAG,gBAAgB,SAAS,OAAO,CAAC;AAGvC,UAAA,UAAU,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC,SAAS,OAAO;AAC9E,YAAA,QAAQ,CAACC,cAAa;AAC5B,UAAIH,KAAYG,YAAAA,SAAQ,KAAK,EAAE,cAAcA;AAAW;AAElD,YAAA,EAAE,SAAaA,IAAAA;AAGrB,UAAI,UAAU,QAAQ;AAChB,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,IAAI,SAAS,OAAQ,CAAA,CAAC;AAAA,MACnE;AAGA,UAAI,UAAU,OAAO;AACf,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,IAAI,SAAS,MAAO,CAAA,CAAC;AAAA,MAClE;AAAA,IAAA,CACD;AAAA,EACH;AAEO,SAAA;AACT;AAMA,MAAM,iBAAiB,CACrB,OACAC,OACA,SACG;AACI,SAAAC,YAAA;AAAA,IACL,CAAC,EAAE,OAAO,gBAAgB;AAEpB,UAAA,UAAU,SAAS,YAAY;AAC3B,cAAA,eAAe,mBAAmB,KAAY;AAGpD,cAAM,SAAS,UAAU;AACzB,YAAI,CAAC;AAAQ;AAEA,qBAAA,QAAQ,CAAC,aAAa;AACjC,gBAAM,IAAI;AAAA,YACR,KAAK;AAAA,YACL,YAAY,SAAS;AAAA,YACrB,QAAQC,6BAAwB,UAAU;AAAA,cACxC,WAAW;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,cAAc,KAAK;AAAA,YAAA,CACpB;AAAA,YACD,SAAS,KAAK;AAAA,UAAA,CACf;AAAA,QAAA,CACF;AAAA,MACH;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpCF;AAAA,EAAA;AAEJ;;"}
1
+ {"version":3,"file":"data-ids.js","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport { IdMap } from '../../id-map';\nimport { ShortHand, LongHand, LongHandDocument } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\n\n/**\n * Get relation ids from primitive representation (id, id[], {id}, {id}[])\n */\nconst handlePrimitive = (\n relation: ShortHand | LongHand | ShortHand[] | LongHand[] | null | undefined | any\n): LongHandDocument[] => {\n if (!relation) {\n return []; // null\n }\n\n if (isShortHand(relation)) {\n return [{ documentId: relation }]; // id\n }\n\n if (isLongHand(relation)) {\n // { documentId, locale? }\n if ('documentId' in relation) {\n return [\n { documentId: relation.documentId, locale: relation.locale, status: relation.status },\n ];\n }\n // { id }\n return [];\n }\n\n if (Array.isArray(relation)) {\n return relation.map((item) => (isShortHand(item) ? { documentId: item } : item)); // id[]\n }\n\n return [];\n};\n\n/**\n * Get all relations document ids from a relation input value\n */\nconst extractRelationIds = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>\n): LongHandDocument[] => {\n const ids = handlePrimitive(relation);\n if (!isObject(relation)) return ids;\n\n if ('set' in relation) ids.push(...handlePrimitive(relation.set)); // set: id[]\n if ('disconnect' in relation) ids.push(...handlePrimitive(relation.disconnect)); // disconnect: id[]\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n if (!relation.connect) return [];\n ids.push(...handlePrimitive(relation.connect));\n\n // handle positional arguments\n const connect = Array.isArray(relation.connect) ? relation.connect : [relation.connect];\n connect.forEach((relation) => {\n if (isShortHand(relation) || !('position' in relation)) return;\n\n const { position } = relation;\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n ids.push(...handlePrimitive({ ...position, documentId: position.before }));\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n ids.push(...handlePrimitive({ ...position, documentId: position.after }));\n }\n });\n }\n\n return ids;\n};\n\n/**\n * Iterate over all attributes of a Data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: { uid: Common.UID.Schema; locale?: string | null; status?: 'draft' | 'published' }\n) => {\n return traverseEntity(\n ({ value, attribute }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const extractedIds = extractRelationIds(value as any);\n\n // TODO: Handle morph relations (they have multiple targets)\n const target = attribute.target;\n if (!target) return;\n\n // If not connecting to any version on disabled d&p, we should connect to both draft and published relations at the same time\n extractedIds.forEach((relation) => {\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceLocale: opts.locale,\n });\n\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceStatus: opts.status,\n });\n\n targetStatus.forEach((status) => {\n idMap.add({\n uid: target,\n documentId: relation.documentId,\n locale: targetLocale,\n status,\n });\n });\n });\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["isShortHand","isLongHand","isObject","relation","data","traverseEntity","getRelationTargetLocale","getRelationTargetStatus"],"mappings":";;;;;;;AAYA,MAAM,kBAAkB,CACtB,aACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AAEI,MAAAA,KAAAA,YAAY,QAAQ,GAAG;AACzB,WAAO,CAAC,EAAE,YAAY,SAAA,CAAU;AAAA,EAClC;AAEI,MAAAC,KAAAA,WAAW,QAAQ,GAAG;AAExB,QAAI,gBAAgB,UAAU;AACrB,aAAA;AAAA,QACL,EAAE,YAAY,SAAS,YAAY,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,MAAA;AAAA,IAExF;AAEA,WAAO;EACT;AAEI,MAAA,MAAM,QAAQ,QAAQ,GAAG;AACpB,WAAA,SAAS,IAAI,CAAC,SAAUD,KAAA,YAAY,IAAI,IAAI,EAAE,YAAY,KAAK,IAAI,IAAK;AAAA,EACjF;AAEA,SAAO;AACT;AAKA,MAAM,qBAAqB,CACzB,aACuB;AACjB,QAAA,MAAM,gBAAgB,QAAQ;AAChC,MAAA,CAACE,WAAS,QAAQ;AAAU,WAAA;AAEhC,MAAI,SAAS;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,GAAG,CAAC;AAChE,MAAI,gBAAgB;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,UAAU,CAAC;AAC9E,MAAI,aAAa,UAAU;AAEzB,QAAI,CAAC,SAAS;AAAS,aAAO;AAC9B,QAAI,KAAK,GAAG,gBAAgB,SAAS,OAAO,CAAC;AAGvC,UAAA,UAAU,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC,SAAS,OAAO;AAC9E,YAAA,QAAQ,CAACC,cAAa;AAC5B,UAAIH,KAAYG,YAAAA,SAAQ,KAAK,EAAE,cAAcA;AAAW;AAElD,YAAA,EAAE,SAAaA,IAAAA;AAGrB,UAAI,UAAU,QAAQ;AAChB,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,YAAY,SAAS,OAAQ,CAAA,CAAC;AAAA,MAC3E;AAGA,UAAI,UAAU,OAAO;AACf,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,YAAY,SAAS,MAAO,CAAA,CAAC;AAAA,MAC1E;AAAA,IAAA,CACD;AAAA,EACH;AAEO,SAAA;AACT;AAMA,MAAM,iBAAiB,CACrB,OACAC,OACA,SACG;AACI,SAAAC,YAAA;AAAA,IACL,CAAC,EAAE,OAAO,gBAAgB;AAEpB,UAAA,UAAU,SAAS,YAAY;AAC3B,cAAA,eAAe,mBAAmB,KAAY;AAGpD,cAAM,SAAS,UAAU;AACzB,YAAI,CAAC;AAAQ;AAGA,qBAAA,QAAQ,CAAC,aAAa;AAC3B,gBAAA,eAAeC,6BAAwB,UAAU;AAAA,YACrD,WAAW;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,cAAc,KAAK;AAAA,UAAA,CACpB;AAEK,gBAAA,eAAeC,2BAAwB,UAAU;AAAA,YACrD,WAAW;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,cAAc,KAAK;AAAA,UAAA,CACpB;AAEY,uBAAA,QAAQ,CAAC,WAAW;AAC/B,kBAAM,IAAI;AAAA,cACR,KAAK;AAAA,cACL,YAAY,SAAS;AAAA,cACrB,QAAQ;AAAA,cACR;AAAA,YAAA,CACD;AAAA,UAAA,CACF;AAAA,QAAA,CACF;AAAA,MACH;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpCH;AAAA,EAAA;AAEJ;;"}
@@ -2,6 +2,7 @@ import { isObject } from "lodash/fp";
2
2
  import { traverseEntity } from "@strapi/utils";
3
3
  import { isShortHand, isLongHand } from "../utils/data.mjs";
4
4
  import { getRelationTargetLocale } from "../utils/i18n.mjs";
5
+ import { getRelationTargetStatus } from "../utils/dp.mjs";
5
6
  const handlePrimitive = (relation) => {
6
7
  if (!relation) {
7
8
  return [];
@@ -11,7 +12,9 @@ const handlePrimitive = (relation) => {
11
12
  }
12
13
  if (isLongHand(relation)) {
13
14
  if ("documentId" in relation) {
14
- return [{ documentId: relation.documentId, locale: relation.locale }];
15
+ return [
16
+ { documentId: relation.documentId, locale: relation.locale, status: relation.status }
17
+ ];
15
18
  }
16
19
  return [];
17
20
  }
@@ -38,10 +41,10 @@ const extractRelationIds = (relation) => {
38
41
  return;
39
42
  const { position } = relation2;
40
43
  if (position?.before) {
41
- ids.push(...handlePrimitive({ ...position, id: position.before }));
44
+ ids.push(...handlePrimitive({ ...position, documentId: position.before }));
42
45
  }
43
46
  if (position?.after) {
44
- ids.push(...handlePrimitive({ ...position, id: position.after }));
47
+ ids.push(...handlePrimitive({ ...position, documentId: position.after }));
45
48
  }
46
49
  });
47
50
  }
@@ -56,15 +59,23 @@ const extractDataIds = (idMap, data, opts) => {
56
59
  if (!target)
57
60
  return;
58
61
  extractedIds.forEach((relation) => {
59
- idMap.add({
60
- uid: target,
61
- documentId: relation.documentId,
62
- locale: getRelationTargetLocale(relation, {
63
- targetUid: target,
64
- sourceUid: opts.uid,
65
- sourceLocale: opts.locale
66
- }),
67
- isDraft: opts.isDraft
62
+ const targetLocale = getRelationTargetLocale(relation, {
63
+ targetUid: target,
64
+ sourceUid: opts.uid,
65
+ sourceLocale: opts.locale
66
+ });
67
+ const targetStatus = getRelationTargetStatus(relation, {
68
+ targetUid: target,
69
+ sourceUid: opts.uid,
70
+ sourceStatus: opts.status
71
+ });
72
+ targetStatus.forEach((status) => {
73
+ idMap.add({
74
+ uid: target,
75
+ documentId: relation.documentId,
76
+ locale: targetLocale,
77
+ status
78
+ });
68
79
  });
69
80
  });
70
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport { IdMap } from '../../id-map';\nimport { ShortHand, LongHand, LongHandDocument } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { getRelationTargetLocale } from '../utils/i18n';\n\n/**\n * Get relation ids from primitive representation (id, id[], {id}, {id}[])\n */\nconst handlePrimitive = (\n relation: ShortHand | LongHand | ShortHand[] | LongHand[] | null | undefined | any\n): LongHandDocument[] => {\n if (!relation) {\n return []; // null\n }\n\n if (isShortHand(relation)) {\n return [{ documentId: relation }]; // id\n }\n\n if (isLongHand(relation)) {\n // { documentId, locale? }\n if ('documentId' in relation) {\n return [{ documentId: relation.documentId, locale: relation.locale }];\n }\n // { id }\n return [];\n }\n\n if (Array.isArray(relation)) {\n return relation.map((item) => (isShortHand(item) ? { documentId: item } : item)); // id[]\n }\n\n return [];\n};\n\n/**\n * Get all relations document ids from a relation input value\n */\nconst extractRelationIds = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>\n): LongHandDocument[] => {\n const ids = handlePrimitive(relation);\n if (!isObject(relation)) return ids;\n\n if ('set' in relation) ids.push(...handlePrimitive(relation.set)); // set: id[]\n if ('disconnect' in relation) ids.push(...handlePrimitive(relation.disconnect)); // disconnect: id[]\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n if (!relation.connect) return [];\n ids.push(...handlePrimitive(relation.connect));\n\n // handle positional arguments\n const connect = Array.isArray(relation.connect) ? relation.connect : [relation.connect];\n connect.forEach((relation) => {\n if (isShortHand(relation) || !('position' in relation)) return;\n\n const { position } = relation;\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n ids.push(...handlePrimitive({ ...position, id: position.before }));\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n ids.push(...handlePrimitive({ ...position, id: position.after }));\n }\n });\n }\n\n return ids;\n};\n\n/**\n * Iterate over all attributes of a Data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: { uid: Common.UID.Schema; locale?: string | null; isDraft?: boolean }\n) => {\n return traverseEntity(\n ({ value, attribute }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const extractedIds = extractRelationIds(value as any);\n\n // TODO: Handle morph relations (they have multiple targets)\n const target = attribute.target;\n if (!target) return;\n\n extractedIds.forEach((relation) => {\n idMap.add({\n uid: target,\n documentId: relation.documentId,\n locale: getRelationTargetLocale(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceLocale: opts.locale,\n }),\n isDraft: opts.isDraft,\n });\n });\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["relation"],"mappings":";;;;AAWA,MAAM,kBAAkB,CACtB,aACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AAEI,MAAA,YAAY,QAAQ,GAAG;AACzB,WAAO,CAAC,EAAE,YAAY,SAAA,CAAU;AAAA,EAClC;AAEI,MAAA,WAAW,QAAQ,GAAG;AAExB,QAAI,gBAAgB,UAAU;AACrB,aAAA,CAAC,EAAE,YAAY,SAAS,YAAY,QAAQ,SAAS,QAAQ;AAAA,IACtE;AAEA,WAAO;EACT;AAEI,MAAA,MAAM,QAAQ,QAAQ,GAAG;AACpB,WAAA,SAAS,IAAI,CAAC,SAAU,YAAY,IAAI,IAAI,EAAE,YAAY,KAAK,IAAI,IAAK;AAAA,EACjF;AAEA,SAAO;AACT;AAKA,MAAM,qBAAqB,CACzB,aACuB;AACjB,QAAA,MAAM,gBAAgB,QAAQ;AAChC,MAAA,CAAC,SAAS,QAAQ;AAAU,WAAA;AAEhC,MAAI,SAAS;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,GAAG,CAAC;AAChE,MAAI,gBAAgB;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,UAAU,CAAC;AAC9E,MAAI,aAAa,UAAU;AAEzB,QAAI,CAAC,SAAS;AAAS,aAAO;AAC9B,QAAI,KAAK,GAAG,gBAAgB,SAAS,OAAO,CAAC;AAGvC,UAAA,UAAU,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC,SAAS,OAAO;AAC9E,YAAA,QAAQ,CAACA,cAAa;AAC5B,UAAI,YAAYA,SAAQ,KAAK,EAAE,cAAcA;AAAW;AAElD,YAAA,EAAE,SAAaA,IAAAA;AAGrB,UAAI,UAAU,QAAQ;AAChB,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,IAAI,SAAS,OAAQ,CAAA,CAAC;AAAA,MACnE;AAGA,UAAI,UAAU,OAAO;AACf,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,IAAI,SAAS,MAAO,CAAA,CAAC;AAAA,MAClE;AAAA,IAAA,CACD;AAAA,EACH;AAEO,SAAA;AACT;AAMA,MAAM,iBAAiB,CACrB,OACA,MACA,SACG;AACI,SAAA;AAAA,IACL,CAAC,EAAE,OAAO,gBAAgB;AAEpB,UAAA,UAAU,SAAS,YAAY;AAC3B,cAAA,eAAe,mBAAmB,KAAY;AAGpD,cAAM,SAAS,UAAU;AACzB,YAAI,CAAC;AAAQ;AAEA,qBAAA,QAAQ,CAAC,aAAa;AACjC,gBAAM,IAAI;AAAA,YACR,KAAK;AAAA,YACL,YAAY,SAAS;AAAA,YACrB,QAAQ,wBAAwB,UAAU;AAAA,cACxC,WAAW;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,cAAc,KAAK;AAAA,YAAA,CACpB;AAAA,YACD,SAAS,KAAK;AAAA,UAAA,CACf;AAAA,QAAA,CACF;AAAA,MACH;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"data-ids.mjs","sources":["../../../../../../src/services/document-service/transform/relations/extract/data-ids.ts"],"sourcesContent":["import { isObject } from 'lodash/fp';\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\nimport { IdMap } from '../../id-map';\nimport { ShortHand, LongHand, LongHandDocument } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\n\n/**\n * Get relation ids from primitive representation (id, id[], {id}, {id}[])\n */\nconst handlePrimitive = (\n relation: ShortHand | LongHand | ShortHand[] | LongHand[] | null | undefined | any\n): LongHandDocument[] => {\n if (!relation) {\n return []; // null\n }\n\n if (isShortHand(relation)) {\n return [{ documentId: relation }]; // id\n }\n\n if (isLongHand(relation)) {\n // { documentId, locale? }\n if ('documentId' in relation) {\n return [\n { documentId: relation.documentId, locale: relation.locale, status: relation.status },\n ];\n }\n // { id }\n return [];\n }\n\n if (Array.isArray(relation)) {\n return relation.map((item) => (isShortHand(item) ? { documentId: item } : item)); // id[]\n }\n\n return [];\n};\n\n/**\n * Get all relations document ids from a relation input value\n */\nconst extractRelationIds = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>\n): LongHandDocument[] => {\n const ids = handlePrimitive(relation);\n if (!isObject(relation)) return ids;\n\n if ('set' in relation) ids.push(...handlePrimitive(relation.set)); // set: id[]\n if ('disconnect' in relation) ids.push(...handlePrimitive(relation.disconnect)); // disconnect: id[]\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n if (!relation.connect) return [];\n ids.push(...handlePrimitive(relation.connect));\n\n // handle positional arguments\n const connect = Array.isArray(relation.connect) ? relation.connect : [relation.connect];\n connect.forEach((relation) => {\n if (isShortHand(relation) || !('position' in relation)) return;\n\n const { position } = relation;\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n ids.push(...handlePrimitive({ ...position, documentId: position.before }));\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n ids.push(...handlePrimitive({ ...position, documentId: position.after }));\n }\n });\n }\n\n return ids;\n};\n\n/**\n * Iterate over all attributes of a Data object and extract all relational document ids.\n * Those will later be transformed to entity ids.\n */\nconst extractDataIds = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: { uid: Common.UID.Schema; locale?: string | null; status?: 'draft' | 'published' }\n) => {\n return traverseEntity(\n ({ value, attribute }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const extractedIds = extractRelationIds(value as any);\n\n // TODO: Handle morph relations (they have multiple targets)\n const target = attribute.target;\n if (!target) return;\n\n // If not connecting to any version on disabled d&p, we should connect to both draft and published relations at the same time\n extractedIds.forEach((relation) => {\n const targetLocale = getRelationTargetLocale(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceLocale: opts.locale,\n });\n\n const targetStatus = getRelationTargetStatus(relation, {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceStatus: opts.status,\n });\n\n targetStatus.forEach((status) => {\n idMap.add({\n uid: target,\n documentId: relation.documentId,\n locale: targetLocale,\n status,\n });\n });\n });\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { extractDataIds };\n"],"names":["relation"],"mappings":";;;;;AAYA,MAAM,kBAAkB,CACtB,aACuB;AACvB,MAAI,CAAC,UAAU;AACb,WAAO;EACT;AAEI,MAAA,YAAY,QAAQ,GAAG;AACzB,WAAO,CAAC,EAAE,YAAY,SAAA,CAAU;AAAA,EAClC;AAEI,MAAA,WAAW,QAAQ,GAAG;AAExB,QAAI,gBAAgB,UAAU;AACrB,aAAA;AAAA,QACL,EAAE,YAAY,SAAS,YAAY,QAAQ,SAAS,QAAQ,QAAQ,SAAS,OAAO;AAAA,MAAA;AAAA,IAExF;AAEA,WAAO;EACT;AAEI,MAAA,MAAM,QAAQ,QAAQ,GAAG;AACpB,WAAA,SAAS,IAAI,CAAC,SAAU,YAAY,IAAI,IAAI,EAAE,YAAY,KAAK,IAAI,IAAK;AAAA,EACjF;AAEA,SAAO;AACT;AAKA,MAAM,qBAAqB,CACzB,aACuB;AACjB,QAAA,MAAM,gBAAgB,QAAQ;AAChC,MAAA,CAAC,SAAS,QAAQ;AAAU,WAAA;AAEhC,MAAI,SAAS;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,GAAG,CAAC;AAChE,MAAI,gBAAgB;AAAU,QAAI,KAAK,GAAG,gBAAgB,SAAS,UAAU,CAAC;AAC9E,MAAI,aAAa,UAAU;AAEzB,QAAI,CAAC,SAAS;AAAS,aAAO;AAC9B,QAAI,KAAK,GAAG,gBAAgB,SAAS,OAAO,CAAC;AAGvC,UAAA,UAAU,MAAM,QAAQ,SAAS,OAAO,IAAI,SAAS,UAAU,CAAC,SAAS,OAAO;AAC9E,YAAA,QAAQ,CAACA,cAAa;AAC5B,UAAI,YAAYA,SAAQ,KAAK,EAAE,cAAcA;AAAW;AAElD,YAAA,EAAE,SAAaA,IAAAA;AAGrB,UAAI,UAAU,QAAQ;AAChB,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,YAAY,SAAS,OAAQ,CAAA,CAAC;AAAA,MAC3E;AAGA,UAAI,UAAU,OAAO;AACf,YAAA,KAAK,GAAG,gBAAgB,EAAE,GAAG,UAAU,YAAY,SAAS,MAAO,CAAA,CAAC;AAAA,MAC1E;AAAA,IAAA,CACD;AAAA,EACH;AAEO,SAAA;AACT;AAMA,MAAM,iBAAiB,CACrB,OACA,MACA,SACG;AACI,SAAA;AAAA,IACL,CAAC,EAAE,OAAO,gBAAgB;AAEpB,UAAA,UAAU,SAAS,YAAY;AAC3B,cAAA,eAAe,mBAAmB,KAAY;AAGpD,cAAM,SAAS,UAAU;AACzB,YAAI,CAAC;AAAQ;AAGA,qBAAA,QAAQ,CAAC,aAAa;AAC3B,gBAAA,eAAe,wBAAwB,UAAU;AAAA,YACrD,WAAW;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,cAAc,KAAK;AAAA,UAAA,CACpB;AAEK,gBAAA,eAAe,wBAAwB,UAAU;AAAA,YACrD,WAAW;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,cAAc,KAAK;AAAA,UAAA,CACpB;AAEY,uBAAA,QAAQ,CAAC,WAAW;AAC/B,kBAAM,IAAI;AAAA,cACR,KAAK;AAAA,cACL,YAAY,SAAS;AAAA,cACrB,QAAQ;AAAA,cACR;AAAA,YAAA,CACD;AAAA,UAAA,CACF;AAAA,QAAA,CACF;AAAA,MACH;AAAA,IACF;AAAA,IACA,EAAE,QAAQ,OAAO,SAAS,KAAK,GAAG,EAAE;AAAA,IACpC;AAAA,EAAA;AAEJ;"}
@@ -3,7 +3,7 @@ import { IdMap } from '../../id-map';
3
3
  declare const transformDataIdsVisitor: (idMap: IdMap, data: Record<string, any>, opts: {
4
4
  uid: Common.UID.Schema;
5
5
  locale?: string | null;
6
- isDraft?: boolean;
6
+ status?: 'draft' | 'published';
7
7
  allowMissingId?: boolean;
8
8
  }) => Promise<import("@strapi/utils/dist/types").Data>;
9
9
  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,EAA4B,MAAM,EAAE,MAAM,eAAe,CAAC;AAKjE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA8GrC,QAAA,MAAM,uBAAuB,UACpB,KAAK,QACN,OAAO,MAAM,EAAE,GAAG,CAAC,QACnB;IACJ,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,qDAwCF,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,EAA4B,MAAM,EAAE,MAAM,eAAe,CAAC;AAKjE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AA8JrC,QAAA,MAAM,uBAAuB,UACpB,KAAK,QACN,OAAO,MAAM,EAAE,GAAG,CAAC,QACnB;IACJ,GAAG,EAAE,OAAO,GAAG,CAAC,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,qDA6DF,CAAC;AAEF,OAAO,EAAE,uBAAuB,EAAE,CAAC"}
@@ -4,13 +4,14 @@ const _ = require("lodash/fp");
4
4
  const strapiUtils = require("@strapi/utils");
5
5
  const data = require("../utils/data.js");
6
6
  const i18n = require("../utils/i18n.js");
7
+ const dp = require("../utils/dp.js");
7
8
  const isNumeric = (value) => {
8
9
  if (Array.isArray(value))
9
10
  return false;
10
11
  const parsed = parseInt(value, 10);
11
12
  return !Number.isNaN(parsed);
12
13
  };
13
- const transformPrimitive = (relation, getId) => {
14
+ const transformPrimitive = (relation, getIds) => {
14
15
  if (isNumeric(relation)) {
15
16
  return relation;
16
17
  }
@@ -18,48 +19,64 @@ const transformPrimitive = (relation, getId) => {
18
19
  return relation;
19
20
  }
20
21
  if (data.isShortHand(relation)) {
21
- return getId(relation);
22
+ const ids = getIds(relation);
23
+ if (ids?.length === 1)
24
+ return ids[0];
25
+ return ids;
22
26
  }
23
27
  if (data.isLongHand(relation)) {
24
28
  if (!("documentId" in relation))
25
29
  return relation;
26
- const entryId = getId(relation.documentId, relation.locale);
27
- if (!entryId)
30
+ const ids = getIds(relation.documentId, relation.locale, relation.status);
31
+ if (!ids?.length)
28
32
  return void 0;
29
- return { ...relation, id: entryId };
33
+ if (ids.length === 1)
34
+ return { id: ids[0], ..._.pick(["position"], relation) };
35
+ return ids.map((id) => ({ id, ..._.pick(["position"], relation) }));
30
36
  }
31
37
  if (Array.isArray(relation)) {
32
- return relation.map((item) => transformPrimitive(item, getId)).filter(Boolean);
38
+ return relation.flatMap((item) => transformPrimitive(item, getIds)).filter(Boolean);
33
39
  }
34
40
  return void 0;
35
41
  };
36
- const transformRelationIdsVisitor = (relation, getId) => {
37
- const map = transformPrimitive(relation, getId);
42
+ const transformRelationIdsVisitor = (relation, getIds) => {
43
+ const map = transformPrimitive(relation, getIds);
38
44
  if (map)
39
45
  return map;
40
46
  if (!_.isObject(relation))
41
47
  return relation;
48
+ if (!("set" in relation) && !("disconnect" in relation) && !("connect" in relation)) {
49
+ return;
50
+ }
42
51
  if ("set" in relation) {
43
- relation.set = transformPrimitive(relation.set, getId);
52
+ relation.set = transformPrimitive(relation.set, getIds);
44
53
  }
45
54
  if ("disconnect" in relation) {
46
- relation.disconnect = transformPrimitive(relation.disconnect, getId);
55
+ relation.disconnect = transformPrimitive(relation.disconnect, getIds);
47
56
  }
48
57
  if ("connect" in relation) {
49
- relation.connect = transformPrimitive(relation.connect, getId);
58
+ relation.connect = transformPrimitive(relation.connect, getIds);
50
59
  const mapPosition = (relation2) => {
51
60
  if (data.isShortHand(relation2) || !("position" in relation2))
52
61
  return relation2;
53
- const { position } = relation2;
62
+ const position = { ...relation2?.position };
54
63
  if (position?.before) {
55
- const { id } = transformPrimitive({ ...position, documentId: position.before }, getId);
56
- position.before = id;
64
+ const result = transformPrimitive({ ...position, documentId: position.before }, getIds);
65
+ if (Array.isArray(result)) {
66
+ position.before = result[0]?.id;
67
+ } else {
68
+ position.before = result?.id;
69
+ }
57
70
  }
58
71
  if (position?.after) {
59
- const { id } = transformPrimitive({ ...position, documentId: position.after }, getId);
60
- position.after = id;
72
+ const result = transformPrimitive({ ...position, documentId: position.after }, getIds);
73
+ if (Array.isArray(result)) {
74
+ position.after = result[0]?.id;
75
+ } else {
76
+ position.after = result?.id;
77
+ }
61
78
  }
62
- return relation2;
79
+ return { ...relation2, position };
63
80
  };
64
81
  if (Array.isArray(relation.connect)) {
65
82
  relation.connect = relation.connect.map(mapPosition);
@@ -85,27 +102,34 @@ const transformDataIdsVisitor = (idMap, data2, opts) => {
85
102
  return;
86
103
  if (EXCLUDED_FIELDS.includes(key))
87
104
  return;
88
- const getId = (documentId, locale) => {
89
- const entryId = idMap.get({
90
- uid: target,
91
- documentId,
92
- locale: i18n.getRelationTargetLocale(
93
- { documentId, locale },
94
- {
95
- targetUid: target,
96
- sourceUid: opts.uid,
97
- sourceLocale: opts.locale
98
- }
99
- ),
100
- isDraft: opts.isDraft
101
- });
102
- if (entryId)
103
- return entryId;
104
- if (opts.allowMissingId)
105
- return null;
106
- throw new strapiUtils.errors.ValidationError(`Document with id "${documentId}" not found`);
105
+ const getIds = (documentId, locale, status) => {
106
+ const targetLocale = i18n.getRelationTargetLocale(
107
+ { documentId, locale },
108
+ { targetUid: target, sourceUid: opts.uid, sourceLocale: opts.locale }
109
+ );
110
+ const targetStatuses = dp.getRelationTargetStatus(
111
+ { documentId, status },
112
+ { targetUid: target, sourceUid: opts.uid, sourceStatus: opts.status }
113
+ );
114
+ const ids = [];
115
+ for (const targetStatus of targetStatuses) {
116
+ const entryId = idMap.get({
117
+ uid: target,
118
+ documentId,
119
+ locale: targetLocale,
120
+ status: targetStatus
121
+ });
122
+ if (entryId)
123
+ ids.push(entryId);
124
+ }
125
+ if (!ids.length && !opts.allowMissingId) {
126
+ throw new strapiUtils.errors.ValidationError(
127
+ `Document with id "${documentId}", locale "${targetLocale}" not found`
128
+ );
129
+ }
130
+ return ids;
107
131
  };
108
- const newRelation = transformRelationIdsVisitor(value, getId);
132
+ const newRelation = transformRelationIdsVisitor(value, getIds);
109
133
  set(key, newRelation);
110
134
  }
111
135
  },
@@ -1 +1 @@
1
- {"version":3,"file":"data-ids.js","sources":["../../../../../../src/services/document-service/transform/relations/transform/data-ids.ts"],"sourcesContent":["import { isObject, isNil } from 'lodash/fp';\n\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity, errors } from '@strapi/utils';\n\nimport { ShortHand, LongHand, ID, GetId } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\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 transformPrimitive = <T extends ShortHand | LongHand>(\n relation: T | T[] | null | undefined,\n getId: GetId\n): T | T[] | undefined => {\n // TODO: Remove this, we should use the long hand version with 'id' for this case\n // If id value is a number, return it as is, it's already an entry id\n if (isNumeric(relation)) {\n return relation;\n }\n\n // null\n if (isNil(relation)) {\n return relation as T | undefined;\n }\n\n // id\n if (isShortHand(relation)) {\n return getId(relation) as T;\n }\n\n // { id }\n if (isLongHand(relation)) {\n // If the id is already an entry id, return it as is\n if (!('documentId' in relation)) return relation;\n\n // @ts-expect-error - TODO: Add relation type\n const entryId = getId(relation.documentId, relation.locale) as T;\n\n // If the id is not found, return undefined\n if (!entryId) return undefined;\n\n return { ...(relation as object), id: entryId } as T;\n }\n\n // id[]\n if (Array.isArray(relation)) {\n return relation.map((item) => transformPrimitive(item, getId)).filter(Boolean) as T[];\n }\n return undefined;\n};\n\nconst transformRelationIdsVisitor = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>,\n getId: GetId\n): EntityService.Params.Attribute.RelationInputValue<T> => {\n const map = transformPrimitive(relation as any, getId);\n if (map) return map;\n\n if (!isObject(relation)) return relation;\n\n // set: id[]\n // what if result of mapPrimitive is undefined?\n if ('set' in relation) {\n relation.set = transformPrimitive(relation.set as any, getId);\n }\n if ('disconnect' in relation) {\n relation.disconnect = transformPrimitive(relation.disconnect as any, getId);\n }\n\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n relation.connect = transformPrimitive(relation.connect as any, getId);\n\n const mapPosition = (relation: any) => {\n if (isShortHand(relation) || !('position' in relation)) return relation;\n\n const { position } = relation;\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n const { id } = transformPrimitive({ ...position, documentId: position.before }, getId);\n position.before = id;\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n const { id } = transformPrimitive({ ...position, documentId: position.after }, getId);\n position.after = id;\n }\n\n return relation;\n };\n\n if (Array.isArray(relation.connect)) {\n relation.connect = relation.connect.map(mapPosition);\n } else {\n relation.connect = mapPosition(relation.connect);\n }\n }\n\n return relation;\n};\n\nconst EXCLUDED_FIELDS = [\n 'createdBy',\n 'updatedBy',\n 'localizations',\n 'strapi_stage',\n 'strapi_assignee',\n];\n\nconst transformDataIdsVisitor = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: {\n uid: Common.UID.Schema;\n locale?: string | null;\n isDraft?: boolean;\n allowMissingId?: boolean; // Whether to ignore missing ids and not throw any error\n }\n) => {\n return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const target = attribute.target;\n // TODO: Handle polymorphic relations\n if (!target) return;\n // TODO: Handle this differently\n if (EXCLUDED_FIELDS.includes(key)) return;\n\n const getId = (documentId: ID, locale?: string): ID | null => {\n const entryId = idMap.get({\n uid: target,\n documentId,\n locale: getRelationTargetLocale(\n { documentId, locale },\n {\n targetUid: target as Common.UID.Schema,\n sourceUid: opts.uid,\n sourceLocale: opts.locale,\n }\n ),\n isDraft: opts.isDraft,\n });\n\n if (entryId) return entryId;\n if (opts.allowMissingId) return null;\n\n throw new errors.ValidationError(`Document with id \"${documentId}\" not found`);\n };\n\n const newRelation = transformRelationIdsVisitor(value as any, getId);\n set(key, newRelation as any);\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isNil","isShortHand","isLongHand","isObject","relation","data","traverseEntity","getRelationTargetLocale","errors"],"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 { isObject, isNil, pick } from 'lodash/fp';\n\nimport { EntityService, Attribute, Common } from '@strapi/types';\nimport { traverseEntity, errors } from '@strapi/utils';\n\nimport { ShortHand, LongHand, ID, GetIds } from '../utils/types';\nimport { isShortHand, isLongHand } from '../utils/data';\nimport { IdMap } from '../../id-map';\nimport { getRelationTargetLocale } from '../utils/i18n';\nimport { getRelationTargetStatus } from '../utils/dp';\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\n/**\n * Transform primitive relation representation to entry ids\n *\n * docId -> id\n * [docId] -> [id]\n * { documentID, locale, status } -> { id }\n * [{ documentID, locale, status }] -> [{ id }]\n *\n * Note: There are scenarios where a single documentID can map to multiple ids.\n * By default the returned format will match the input format.\n * Only when the docID maps to multiple ids, an array will always be returned, regardless of the input format.\n */\nconst transformPrimitive = <T extends ShortHand | LongHand>(\n relation: T | T[] | null | undefined,\n getIds: GetIds\n): T | T[] | undefined => {\n // TODO: Remove this, we should use the long hand version with 'id' for this case\n // If id value is a number, return it as is, it's already an entry id\n if (isNumeric(relation)) {\n return relation;\n }\n\n // null\n if (isNil(relation)) {\n return relation as T | undefined;\n }\n\n // id\n if (isShortHand(relation)) {\n const ids = getIds(relation) as T[];\n\n // Return it with the same format for consistency\n if (ids?.length === 1) return ids[0];\n\n // Return an array if multiple ids are found\n return ids;\n }\n\n // { id }\n if (isLongHand(relation)) {\n // If the id is already an entry id, return it as is\n if (!('documentId' in relation)) return relation;\n\n // @ts-expect-error - TODO: Add relation type\n const ids = getIds(relation.documentId, relation.locale, relation.status);\n\n // No ids to connect\n if (!ids?.length) return undefined;\n\n // Return it with the same format for consistency\n if (ids.length === 1) return { id: ids[0], ...pick(['position'], relation) } as T;\n\n // Return an array if it multiple ids are found\n return ids.map((id: ID) => ({ id, ...pick(['position'], relation) })) as T[];\n }\n\n // id[]\n if (Array.isArray(relation)) {\n return relation.flatMap((item) => transformPrimitive(item, getIds)).filter(Boolean) as T[];\n }\n\n return undefined;\n};\n\n/**\n * Transform ids in any type of relation input value\n * - set: [docId]\n * - disconnect: [docId]\n * - connect: [docId]\n * Or using any of the other primitive representations\n */\nconst transformRelationIdsVisitor = <T extends Attribute.RelationKind.Any>(\n relation: EntityService.Params.Attribute.RelationInputValue<T>,\n getIds: GetIds\n): EntityService.Params.Attribute.RelationInputValue<T> | undefined => {\n const map = transformPrimitive(relation as any, getIds);\n if (map) return map;\n\n if (!isObject(relation)) return relation;\n\n if (!('set' in relation) && !('disconnect' in relation) && !('connect' in relation)) {\n // The entry id couldn't be found and there are no connection properties in\n // the relation, therefore we want to remove the relation\n return;\n }\n\n // set: id[]\n // what if result of mapPrimitive is undefined?\n if ('set' in relation) {\n relation.set = transformPrimitive(relation.set as any, getIds);\n }\n\n if ('disconnect' in relation) {\n relation.disconnect = transformPrimitive(relation.disconnect as any, getIds);\n }\n\n if ('connect' in relation) {\n // connect: id[] | { id } | ...\n relation.connect = transformPrimitive(relation.connect as any, getIds);\n\n const mapPosition = (relation: any) => {\n if (isShortHand(relation) || !('position' in relation)) return relation;\n\n const position = { ...relation?.position };\n\n // { connect: { id: id, position: { before: id } } }\n if (position?.before) {\n const result = transformPrimitive({ ...position, documentId: position.before }, getIds);\n\n if (Array.isArray(result)) {\n position.before = result[0]?.id;\n } else {\n position.before = result?.id;\n }\n }\n\n // { connect: { id: id, position: { after: id } } }\n if (position?.after) {\n const result = transformPrimitive({ ...position, documentId: position.after }, getIds);\n\n if (Array.isArray(result)) {\n position.after = result[0]?.id;\n } else {\n position.after = result?.id;\n }\n }\n\n return { ...relation, position };\n };\n\n if (Array.isArray(relation.connect)) {\n relation.connect = relation.connect.map(mapPosition);\n } else {\n relation.connect = mapPosition(relation.connect);\n }\n }\n\n return relation;\n};\n\nconst EXCLUDED_FIELDS = [\n 'createdBy',\n 'updatedBy',\n 'localizations',\n 'strapi_stage',\n 'strapi_assignee',\n];\n\nconst transformDataIdsVisitor = (\n idMap: IdMap,\n data: Record<string, any>,\n opts: {\n uid: Common.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 return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n // Find relational attributes, and return the document ids\n if (attribute.type === 'relation') {\n const target = attribute.target as Common.UID.Schema | undefined;\n // TODO: Handle polymorphic relations\n if (!target) return;\n // TODO: V5 remove excluded fields and use { id: } syntax for those relations\n if (EXCLUDED_FIELDS.includes(key)) return;\n\n const getIds = (\n documentId: ID,\n locale?: string,\n status?: 'draft' | 'published'\n ): ID[] | null => {\n // locale to connect to\n const targetLocale = getRelationTargetLocale(\n { documentId, locale },\n { targetUid: target, sourceUid: opts.uid, sourceLocale: opts.locale }\n );\n\n // status(es) to connect to\n const targetStatuses = getRelationTargetStatus(\n { documentId, status },\n { targetUid: target, sourceUid: opts.uid, sourceStatus: opts.status }\n );\n\n const ids = [];\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 targetStatus of targetStatuses) {\n const entryId = idMap.get({\n uid: target,\n documentId,\n locale: targetLocale,\n status: targetStatus,\n });\n\n if (entryId) ids.push(entryId);\n }\n\n if (!ids.length && !opts.allowMissingId) {\n throw new errors.ValidationError(\n `Document with id \"${documentId}\", locale \"${targetLocale}\" not found`\n );\n }\n\n return ids;\n };\n\n const newRelation = transformRelationIdsVisitor(value as any, getIds);\n set(key, newRelation as any);\n }\n },\n { schema: strapi.getModel(opts.uid) },\n data\n );\n};\n\nexport { transformDataIdsVisitor };\n"],"names":["isNil","isShortHand","isLongHand","pick","isObject","relation","data","traverseEntity","getRelationTargetLocale","getRelationTargetStatus","errors"],"mappings":"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"}