@strapi/core 0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8 → 0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207

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.

Potentially problematic release.


This version of @strapi/core might be problematic. Click here for more details.

Files changed (160) hide show
  1. package/dist/Strapi.d.ts.map +1 -1
  2. package/dist/Strapi.js +2 -1
  3. package/dist/Strapi.js.map +1 -1
  4. package/dist/Strapi.mjs +2 -1
  5. package/dist/Strapi.mjs.map +1 -1
  6. package/dist/core-api/controller/index.d.ts.map +1 -1
  7. package/dist/core-api/controller/index.js +2 -1
  8. package/dist/core-api/controller/index.js.map +1 -1
  9. package/dist/core-api/controller/index.mjs +2 -1
  10. package/dist/core-api/controller/index.mjs.map +1 -1
  11. package/dist/core-api/controller/transform.d.ts +3 -2
  12. package/dist/core-api/controller/transform.d.ts.map +1 -1
  13. package/dist/core-api/controller/transform.js +13 -3
  14. package/dist/core-api/controller/transform.js.map +1 -1
  15. package/dist/core-api/controller/transform.mjs +13 -3
  16. package/dist/core-api/controller/transform.mjs.map +1 -1
  17. package/dist/core-api/routes/index.d.ts +4 -22
  18. package/dist/core-api/routes/index.d.ts.map +1 -1
  19. package/dist/core-api/routes/index.js +150 -8
  20. package/dist/core-api/routes/index.js.map +1 -1
  21. package/dist/core-api/routes/index.mjs +131 -8
  22. package/dist/core-api/routes/index.mjs.map +1 -1
  23. package/dist/core-api/routes/validation/attributes.d.ts +244 -0
  24. package/dist/core-api/routes/validation/attributes.d.ts.map +1 -0
  25. package/dist/core-api/routes/validation/attributes.js +560 -0
  26. package/dist/core-api/routes/validation/attributes.js.map +1 -0
  27. package/dist/core-api/routes/validation/attributes.mjs +521 -0
  28. package/dist/core-api/routes/validation/attributes.mjs.map +1 -0
  29. package/dist/core-api/routes/validation/common.d.ts +105 -0
  30. package/dist/core-api/routes/validation/common.d.ts.map +1 -0
  31. package/dist/core-api/routes/validation/common.js +116 -0
  32. package/dist/core-api/routes/validation/common.js.map +1 -0
  33. package/dist/core-api/routes/validation/common.mjs +95 -0
  34. package/dist/core-api/routes/validation/common.mjs.map +1 -0
  35. package/dist/core-api/routes/validation/component.d.ts +34 -0
  36. package/dist/core-api/routes/validation/component.d.ts.map +1 -0
  37. package/dist/core-api/routes/validation/component.js +45 -0
  38. package/dist/core-api/routes/validation/component.js.map +1 -0
  39. package/dist/core-api/routes/validation/component.mjs +43 -0
  40. package/dist/core-api/routes/validation/component.mjs.map +1 -0
  41. package/dist/core-api/routes/validation/constants.d.ts +8 -0
  42. package/dist/core-api/routes/validation/constants.d.ts.map +1 -0
  43. package/dist/core-api/routes/validation/constants.js +18 -0
  44. package/dist/core-api/routes/validation/constants.js.map +1 -0
  45. package/dist/core-api/routes/validation/constants.mjs +16 -0
  46. package/dist/core-api/routes/validation/constants.mjs.map +1 -0
  47. package/dist/core-api/routes/validation/content-type.d.ts +128 -0
  48. package/dist/core-api/routes/validation/content-type.d.ts.map +1 -0
  49. package/dist/core-api/routes/validation/content-type.js +201 -0
  50. package/dist/core-api/routes/validation/content-type.js.map +1 -0
  51. package/dist/core-api/routes/validation/content-type.mjs +180 -0
  52. package/dist/core-api/routes/validation/content-type.mjs.map +1 -0
  53. package/dist/core-api/routes/validation/index.d.ts +5 -0
  54. package/dist/core-api/routes/validation/index.d.ts.map +1 -0
  55. package/dist/core-api/routes/validation/mappers.d.ts +105 -0
  56. package/dist/core-api/routes/validation/mappers.d.ts.map +1 -0
  57. package/dist/core-api/routes/validation/mappers.js +238 -0
  58. package/dist/core-api/routes/validation/mappers.js.map +1 -0
  59. package/dist/core-api/routes/validation/mappers.mjs +214 -0
  60. package/dist/core-api/routes/validation/mappers.mjs.map +1 -0
  61. package/dist/core-api/routes/validation/utils.d.ts +47 -0
  62. package/dist/core-api/routes/validation/utils.d.ts.map +1 -0
  63. package/dist/core-api/routes/validation/utils.js +128 -0
  64. package/dist/core-api/routes/validation/utils.js.map +1 -0
  65. package/dist/core-api/routes/validation/utils.mjs +106 -0
  66. package/dist/core-api/routes/validation/utils.mjs.map +1 -0
  67. package/dist/domain/content-type/index.d.ts.map +1 -1
  68. package/dist/domain/content-type/index.js +17 -1
  69. package/dist/domain/content-type/index.js.map +1 -1
  70. package/dist/domain/content-type/index.mjs +17 -1
  71. package/dist/domain/content-type/index.mjs.map +1 -1
  72. package/dist/domain/module/index.d.ts.map +1 -1
  73. package/dist/domain/module/index.js +3 -0
  74. package/dist/domain/module/index.js.map +1 -1
  75. package/dist/domain/module/index.mjs +3 -0
  76. package/dist/domain/module/index.mjs.map +1 -1
  77. package/dist/factories.d.ts +3 -1
  78. package/dist/factories.d.ts.map +1 -1
  79. package/dist/factories.js +10 -2
  80. package/dist/factories.js.map +1 -1
  81. package/dist/factories.mjs +10 -3
  82. package/dist/factories.mjs.map +1 -1
  83. package/dist/middlewares/cors.d.ts +9 -1
  84. package/dist/middlewares/cors.d.ts.map +1 -1
  85. package/dist/middlewares/cors.js +39 -17
  86. package/dist/middlewares/cors.js.map +1 -1
  87. package/dist/middlewares/cors.mjs +39 -18
  88. package/dist/middlewares/cors.mjs.map +1 -1
  89. package/dist/migrations/first-published-at.d.ts +4 -0
  90. package/dist/migrations/first-published-at.d.ts.map +1 -0
  91. package/dist/migrations/first-published-at.js +51 -0
  92. package/dist/migrations/first-published-at.js.map +1 -0
  93. package/dist/migrations/first-published-at.mjs +49 -0
  94. package/dist/migrations/first-published-at.mjs.map +1 -0
  95. package/dist/migrations/index.d.ts.map +1 -1
  96. package/dist/migrations/index.js +5 -0
  97. package/dist/migrations/index.js.map +1 -1
  98. package/dist/migrations/index.mjs +5 -0
  99. package/dist/migrations/index.mjs.map +1 -1
  100. package/dist/package.json.js +14 -12
  101. package/dist/package.json.js.map +1 -1
  102. package/dist/package.json.mjs +14 -12
  103. package/dist/package.json.mjs.map +1 -1
  104. package/dist/services/content-api/index.d.ts +1 -1
  105. package/dist/services/content-api/index.d.ts.map +1 -1
  106. package/dist/services/content-api/index.js +1 -1
  107. package/dist/services/content-api/index.js.map +1 -1
  108. package/dist/services/content-api/index.mjs +2 -2
  109. package/dist/services/content-api/index.mjs.map +1 -1
  110. package/dist/services/content-source-maps.d.ts +12 -0
  111. package/dist/services/content-source-maps.d.ts.map +1 -0
  112. package/dist/services/content-source-maps.js +86 -0
  113. package/dist/services/content-source-maps.js.map +1 -0
  114. package/dist/services/content-source-maps.mjs +84 -0
  115. package/dist/services/content-source-maps.mjs.map +1 -0
  116. package/dist/services/document-service/components.d.ts +6 -1
  117. package/dist/services/document-service/components.d.ts.map +1 -1
  118. package/dist/services/document-service/components.js +97 -0
  119. package/dist/services/document-service/components.js.map +1 -1
  120. package/dist/services/document-service/components.mjs +97 -1
  121. package/dist/services/document-service/components.mjs.map +1 -1
  122. package/dist/services/document-service/first-published-at.d.ts +7 -0
  123. package/dist/services/document-service/first-published-at.d.ts.map +1 -0
  124. package/dist/services/document-service/first-published-at.js +31 -0
  125. package/dist/services/document-service/first-published-at.js.map +1 -0
  126. package/dist/services/document-service/first-published-at.mjs +28 -0
  127. package/dist/services/document-service/first-published-at.mjs.map +1 -0
  128. package/dist/services/document-service/repository.d.ts.map +1 -1
  129. package/dist/services/document-service/repository.js +11 -4
  130. package/dist/services/document-service/repository.js.map +1 -1
  131. package/dist/services/document-service/repository.mjs +12 -5
  132. package/dist/services/document-service/repository.mjs.map +1 -1
  133. package/dist/services/document-service/utils/unidirectional-relations.d.ts +19 -2
  134. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  135. package/dist/services/document-service/utils/unidirectional-relations.js +21 -6
  136. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  137. package/dist/services/document-service/utils/unidirectional-relations.mjs +21 -6
  138. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  139. package/dist/services/metrics/index.d.ts +1 -1
  140. package/dist/services/metrics/index.d.ts.map +1 -1
  141. package/dist/services/metrics/index.js +9 -8
  142. package/dist/services/metrics/index.js.map +1 -1
  143. package/dist/services/metrics/index.mjs +9 -8
  144. package/dist/services/metrics/index.mjs.map +1 -1
  145. package/dist/services/metrics/sender.d.ts.map +1 -1
  146. package/dist/services/metrics/sender.js +2 -2
  147. package/dist/services/metrics/sender.js.map +1 -1
  148. package/dist/services/metrics/sender.mjs +2 -2
  149. package/dist/services/metrics/sender.mjs.map +1 -1
  150. package/dist/services/server/register-routes.js +22 -2
  151. package/dist/services/server/register-routes.js.map +1 -1
  152. package/dist/services/server/register-routes.mjs +22 -2
  153. package/dist/services/server/register-routes.mjs.map +1 -1
  154. package/dist/services/server/routing.d.ts +10 -0
  155. package/dist/services/server/routing.d.ts.map +1 -1
  156. package/dist/services/server/routing.js +7 -1
  157. package/dist/services/server/routing.js.map +1 -1
  158. package/dist/services/server/routing.mjs +7 -1
  159. package/dist/services/server/routing.mjs.map +1 -1
  160. package/package.json +14 -12
@@ -1,4 +1,5 @@
1
1
  import { enable as enableDraftAndPublish, disable as disableDraftAndPublish } from './draft-publish.mjs';
2
+ import { enable as enableFirstPublishedAt } from './first-published-at.mjs';
2
3
  import { enable as enableI18n, disable as disableI18n } from './i18n.mjs';
3
4
 
4
5
  const enable = async ({ oldContentTypes, contentTypes })=>{
@@ -10,6 +11,10 @@ const enable = async ({ oldContentTypes, contentTypes })=>{
10
11
  oldContentTypes,
11
12
  contentTypes
12
13
  });
14
+ await enableFirstPublishedAt({
15
+ oldContentTypes,
16
+ contentTypes
17
+ });
13
18
  };
14
19
  const disable = async ({ oldContentTypes, contentTypes })=>{
15
20
  await disableI18n({
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/migrations/index.ts"],"sourcesContent":["import * as draftPublishMigrations from './draft-publish';\nimport * as i18nMigrations from './i18n';\nimport type { Input } from './draft-publish';\n\nconst enable = async ({ oldContentTypes, contentTypes }: Input) => {\n await i18nMigrations.enable({ oldContentTypes, contentTypes });\n await draftPublishMigrations.enable({ oldContentTypes, contentTypes });\n};\n\nconst disable = async ({ oldContentTypes, contentTypes }: Input) => {\n await i18nMigrations.disable({ oldContentTypes, contentTypes });\n await draftPublishMigrations.disable({ oldContentTypes, contentTypes });\n};\n\nexport { enable, disable };\n"],"names":["enable","oldContentTypes","contentTypes","i18nMigrations","draftPublishMigrations","disable"],"mappings":";;;AAIA,MAAMA,SAAS,OAAO,EAAEC,eAAe,EAAEC,YAAY,EAAS,GAAA;IAC5D,MAAMC,UAAqB,CAAC;AAAEF,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;IAC5D,MAAME,qBAA6B,CAAC;AAAEH,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;AACtE;AAEA,MAAMG,UAAU,OAAO,EAAEJ,eAAe,EAAEC,YAAY,EAAS,GAAA;IAC7D,MAAMC,WAAsB,CAAC;AAAEF,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;IAC7D,MAAME,sBAA8B,CAAC;AAAEH,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;AACvE;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/migrations/index.ts"],"sourcesContent":["import * as draftPublishMigrations from './draft-publish';\nimport * as firstPublishedAt from './first-published-at';\nimport * as i18nMigrations from './i18n';\nimport type { Input } from './draft-publish';\n\nconst enable = async ({ oldContentTypes, contentTypes }: Input) => {\n await i18nMigrations.enable({ oldContentTypes, contentTypes });\n await draftPublishMigrations.enable({ oldContentTypes, contentTypes });\n await firstPublishedAt.enable({ oldContentTypes, contentTypes });\n};\n\nconst disable = async ({ oldContentTypes, contentTypes }: Input) => {\n await i18nMigrations.disable({ oldContentTypes, contentTypes });\n await draftPublishMigrations.disable({ oldContentTypes, contentTypes });\n};\n\nexport { enable, disable };\n"],"names":["enable","oldContentTypes","contentTypes","i18nMigrations","draftPublishMigrations","firstPublishedAt","disable"],"mappings":";;;;AAKA,MAAMA,SAAS,OAAO,EAAEC,eAAe,EAAEC,YAAY,EAAS,GAAA;IAC5D,MAAMC,UAAqB,CAAC;AAAEF,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;IAC5D,MAAME,qBAA6B,CAAC;AAAEH,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;IACpE,MAAMG,sBAAuB,CAAC;AAAEJ,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;AAChE;AAEA,MAAMI,UAAU,OAAO,EAAEL,eAAe,EAAEC,YAAY,EAAS,GAAA;IAC7D,MAAMC,WAAsB,CAAC;AAAEF,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;IAC7D,MAAME,sBAA8B,CAAC;AAAEH,QAAAA,eAAAA;AAAiBC,QAAAA;AAAa,KAAA,CAAA;AACvE;;;;"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/core";
6
- var version = "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8";
6
+ var version = "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -59,14 +59,15 @@ var dependencies = {
59
59
  "@koa/cors": "5.0.0",
60
60
  "@koa/router": "12.0.2",
61
61
  "@paralleldrive/cuid2": "2.2.2",
62
- "@strapi/admin": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
63
- "@strapi/database": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
64
- "@strapi/generators": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
65
- "@strapi/logger": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
66
- "@strapi/permissions": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
67
- "@strapi/types": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
68
- "@strapi/typescript-utils": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
69
- "@strapi/utils": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
62
+ "@strapi/admin": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
63
+ "@strapi/database": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
64
+ "@strapi/generators": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
65
+ "@strapi/logger": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
66
+ "@strapi/permissions": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
67
+ "@strapi/types": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
68
+ "@strapi/typescript-utils": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
69
+ "@strapi/utils": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
70
+ "@vercel/stega": "0.1.2",
70
71
  bcryptjs: "2.4.3",
71
72
  boxen: "5.1.2",
72
73
  chalk: "4.1.2",
@@ -108,7 +109,8 @@ var dependencies = {
108
109
  statuses: "2.0.1",
109
110
  typescript: "5.4.4",
110
111
  undici: "6.21.2",
111
- yup: "0.32.9"
112
+ yup: "0.32.9",
113
+ zod: "3.25.67"
112
114
  };
113
115
  var devDependencies = {
114
116
  "@strapi/ts-zen": "^0.2.0",
@@ -131,9 +133,9 @@ var devDependencies = {
131
133
  "@types/node": "18.19.24",
132
134
  "@types/node-schedule": "2.1.7",
133
135
  "@types/statuses": "2.0.1",
134
- "eslint-config-custom": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
136
+ "eslint-config-custom": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
135
137
  supertest: "6.3.3",
136
- tsconfig: "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8"
138
+ tsconfig: "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207"
137
139
  };
138
140
  var engines = {
139
141
  node: ">=18.0.0 <=22.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@strapi/core";
2
- var version = "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8";
2
+ var version = "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -55,14 +55,15 @@ var dependencies = {
55
55
  "@koa/cors": "5.0.0",
56
56
  "@koa/router": "12.0.2",
57
57
  "@paralleldrive/cuid2": "2.2.2",
58
- "@strapi/admin": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
59
- "@strapi/database": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
60
- "@strapi/generators": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
61
- "@strapi/logger": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
62
- "@strapi/permissions": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
63
- "@strapi/types": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
64
- "@strapi/typescript-utils": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
65
- "@strapi/utils": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
58
+ "@strapi/admin": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
59
+ "@strapi/database": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
60
+ "@strapi/generators": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
61
+ "@strapi/logger": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
62
+ "@strapi/permissions": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
63
+ "@strapi/types": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
64
+ "@strapi/typescript-utils": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
65
+ "@strapi/utils": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
66
+ "@vercel/stega": "0.1.2",
66
67
  bcryptjs: "2.4.3",
67
68
  boxen: "5.1.2",
68
69
  chalk: "4.1.2",
@@ -104,7 +105,8 @@ var dependencies = {
104
105
  statuses: "2.0.1",
105
106
  typescript: "5.4.4",
106
107
  undici: "6.21.2",
107
- yup: "0.32.9"
108
+ yup: "0.32.9",
109
+ zod: "3.25.67"
108
110
  };
109
111
  var devDependencies = {
110
112
  "@strapi/ts-zen": "^0.2.0",
@@ -127,9 +129,9 @@ var devDependencies = {
127
129
  "@types/node": "18.19.24",
128
130
  "@types/node-schedule": "2.1.7",
129
131
  "@types/statuses": "2.0.1",
130
- "eslint-config-custom": "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8",
132
+ "eslint-config-custom": "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207",
131
133
  supertest: "6.3.3",
132
- tsconfig: "0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8"
134
+ tsconfig: "0.0.0-next.9c8de92874cc9e5ffb105e4f613c1d2fff7b3207"
133
135
  };
134
136
  var engines = {
135
137
  node: ">=18.0.0 <=22.x.x",
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -47,7 +47,7 @@ declare const createContentAPI: (strapi: Core.Strapi) => {
47
47
  controllers: Record<string, string[]>;
48
48
  }>;
49
49
  };
50
- getRoutesMap: () => Promise<Record<string, Core.Route[]>>;
50
+ getRoutesMap: () => Promise<Record<string, unknown>>;
51
51
  sanitize: {
52
52
  input: sanitize.SanitizeFunc;
53
53
  output: sanitize.SanitizeFunc;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/content-api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEnD,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAgB/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,WAAY,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF5C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/content-api/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAqC,MAAM,eAAe,CAAC;AAEtF,OAAO,KAAK,EAAE,IAAI,EAAO,MAAM,eAAe,CAAC;AAgB/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,WAAY,KAAK,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgF5C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -49,7 +49,7 @@ const filterContentAPI = (route)=>route.info.type === 'content-api';
49
49
  path: `${apiPrefix}${route.path}`
50
50
  }));
51
51
  });
52
- return routesMap;
52
+ return strapiUtils.sanitizeRoutesMapForSerialization(routesMap);
53
53
  };
54
54
  const sanitizer = strapiUtils.sanitize.createAPISanitizers({
55
55
  getModel (uid) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return routesMap;\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizeRoutesMapForSerialization","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import _ from 'lodash';
2
- import { sanitize, validate } from '@strapi/utils';
2
+ import { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';
3
3
  import instantiatePermissionsUtilities from './permissions/index.mjs';
4
4
 
5
5
  const transformRoutePrefixFor = (pluginName)=>(route)=>{
@@ -47,7 +47,7 @@ const filterContentAPI = (route)=>route.info.type === 'content-api';
47
47
  path: `${apiPrefix}${route.path}`
48
48
  }));
49
49
  });
50
- return routesMap;
50
+ return sanitizeRoutesMapForSerialization(routesMap);
51
51
  };
52
52
  const sanitizer = sanitize.createAPISanitizers({
53
53
  getModel (uid) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return routesMap;\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":";;;;AAOA,MAAMA,uBAAAA,GAA0B,CAACC,UAAAA,GAAuB,CAACC,KAAAA,GAAAA;AACvD,QAAA,MAAMC,SAASD,KAAME,CAAAA,MAAM,IAAIF,KAAME,CAAAA,MAAM,CAACD,MAAM;QAClD,MAAME,IAAAA,GAAOF,WAAWG,SAAY,GAAA,CAAC,EAAEH,MAAO,CAAA,EAAED,MAAMG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAEJ,UAAAA,CAAW,EAAEC,KAAMG,CAAAA,IAAI,CAAC,CAAC;QAE5F,OAAO;AACL,YAAA,GAAGH,KAAK;AACRG,YAAAA;AACF,SAAA;AACF,KAAA;AAEA,MAAME,mBAAmB,CAACL,KAAAA,GAAsBA,MAAMM,IAAI,CAACC,IAAI,KAAK,aAAA;AAEpE;;IAGA,MAAMC,mBAAmB,CAACC,MAAAA,GAAAA;AACxB,IAAA,MAAMC,YAAe,GAAA,UAAA;AACnB,QAAA,MAAMC,YAA0C,EAAC;AAEjDC,QAAAA,CAAAA,CAAEC,OAAO,CAACJ,MAAAA,CAAOK,IAAI,EAAE,CAACC,GAAKC,EAAAA,OAAAA,GAAAA;AAC3B,YAAA,MAAMC,SAASL,CAAEM,CAAAA,OAAO,CAACH,GAAIE,CAAAA,MAAM,EAAE,CAACjB,KAAAA,GAAAA;AACpC,gBAAA,IAAI,YAAYA,KAAO,EAAA;AACrB,oBAAA,OAAOA,MAAMiB,MAAM;AACrB;gBAEA,OAAOjB,KAAAA;AACT,aAAA,CAAA,CAAGmB,MAAM,CAACd,gBAAAA,CAAAA;YAEV,IAAIY,MAAAA,CAAOG,MAAM,KAAK,CAAG,EAAA;AACvB,gBAAA;AACF;AAEA,YAAA,MAAMC,SAAYZ,GAAAA,MAAAA,CAAOP,MAAM,CAACoB,GAAG,CAAC,iBAAA,CAAA;AACpCX,YAAAA,SAAS,CAAC,CAAC,KAAK,EAAEK,OAAQ,CAAA,CAAC,CAAC,GAAGC,MAAOM,CAAAA,GAAG,CAAC,CAACvB,SAAW;AACpD,oBAAA,GAAGA,KAAK;AACRG,oBAAAA,IAAAA,EAAM,CAAC,EAAEkB,SAAAA,CAAU,EAAErB,KAAMG,CAAAA,IAAI,CAAC;iBAClC,CAAA,CAAA;AACF,SAAA,CAAA;AAEAS,QAAAA,CAAAA,CAAEC,OAAO,CAACJ,MAAAA,CAAOe,OAAO,EAAE,CAACC,MAAQ1B,EAAAA,UAAAA,GAAAA;AACjC,YAAA,MAAM2B,kBAAkB5B,uBAAwBC,CAAAA,UAAAA,CAAAA;AAEhD,YAAA,IAAI4B,KAAMC,CAAAA,OAAO,CAACH,MAAAA,CAAOR,MAAM,CAAG,EAAA;AAChC,gBAAA,OAAOQ,OAAOR,MAAM,CAACM,GAAG,CAACG,eAAAA,CAAAA,CAAiBP,MAAM,CAACd,gBAAAA,CAAAA;AACnD;AAEA,YAAA,MAAMY,SAASL,CAAEM,CAAAA,OAAO,CAACO,MAAAA,CAAOR,MAAM,EAAE,CAACjB,KAAUA,GAAAA,KAAAA,CAAMiB,MAAM,CAACM,GAAG,CAACG,eAAAA,CAAAA,CAAAA,CAAkBP,MAAM,CAC1Fd,gBAAAA,CAAAA;YAGF,IAAIY,MAAAA,CAAOG,MAAM,KAAK,CAAG,EAAA;AACvB,gBAAA;AACF;AAEA,YAAA,MAAMC,SAAYZ,GAAAA,MAAAA,CAAOP,MAAM,CAACoB,GAAG,CAAC,iBAAA,CAAA;AACpCX,YAAAA,SAAS,CAAC,CAAC,QAAQ,EAAEZ,UAAW,CAAA,CAAC,CAAC,GAAGkB,MAAOM,CAAAA,GAAG,CAAC,CAACvB,SAAW;AAC1D,oBAAA,GAAGA,KAAK;AACRG,oBAAAA,IAAAA,EAAM,CAAC,EAAEkB,SAAAA,CAAU,EAAErB,KAAMG,CAAAA,IAAI,CAAC;iBAClC,CAAA,CAAA;AACF,SAAA,CAAA;QAEA,OAAOQ,SAAAA;AACT,KAAA;IAEA,MAAMkB,SAAAA,GAAYC,QAASC,CAAAA,mBAAmB,CAAC;AAC7CC,QAAAA,QAAAA,CAAAA,CAASC,GAAW,EAAA;YAClB,OAAOxB,MAAAA,CAAOuB,QAAQ,CAACC,GAAAA,CAAAA;AACzB,SAAA;;AAEA,QAAA,IAAIC,UAAa,CAAA,GAAA;YACf,OAAO;AACLC,gBAAAA,KAAAA,EAAO1B,MAAOyB,CAAAA,UAAU,CAACZ,GAAG,CAAC,mBAAA,CAAA;AAC7Bc,gBAAAA,MAAAA,EAAQ3B,MAAOyB,CAAAA,UAAU,CAACZ,GAAG,CAAC,oBAAA;AAChC,aAAA;AACF;AACF,KAAA,CAAA;IAEA,MAAMe,SAAAA,GAAYC,QAASC,CAAAA,mBAAmB,CAAC;AAC7CP,QAAAA,QAAAA,CAAAA,CAASC,GAAW,EAAA;YAClB,OAAOxB,MAAAA,CAAOuB,QAAQ,CAACC,GAAAA,CAAAA;AACzB,SAAA;;AAEA,QAAA,IAAIO,UAAa,CAAA,GAAA;YACf,OAAO;AACLL,gBAAAA,KAAAA,EAAO1B,MAAO+B,CAAAA,UAAU,CAAClB,GAAG,CAAC,mBAAA;AAC/B,aAAA;AACF;AACF,KAAA,CAAA;IAEA,OAAO;AACLmB,QAAAA,WAAAA,EAAaC,+BAAgCjC,CAAAA,MAAAA,CAAAA;AAC7CC,QAAAA,YAAAA;QACAoB,QAAUD,EAAAA,SAAAA;QACVS,QAAUD,EAAAA;AACZ,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/services/content-api/index.ts"],"sourcesContent":["import _ from 'lodash';\nimport { sanitize, validate, sanitizeRoutesMapForSerialization } from '@strapi/utils';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport instantiatePermissionsUtilities from './permissions';\n\nconst transformRoutePrefixFor = (pluginName: string) => (route: Core.Route) => {\n const prefix = route.config && route.config.prefix;\n const path = prefix !== undefined ? `${prefix}${route.path}` : `/${pluginName}${route.path}`;\n\n return {\n ...route,\n path,\n };\n};\n\nconst filterContentAPI = (route: Core.Route) => route.info.type === 'content-api';\n\n/**\n * Create a content API container that holds logic, tools and utils. (eg: permissions, ...)\n */\nconst createContentAPI = (strapi: Core.Strapi) => {\n const getRoutesMap = async () => {\n const routesMap: Record<string, Core.Route[]> = {};\n\n _.forEach(strapi.apis, (api, apiName) => {\n const routes = _.flatMap(api.routes, (route) => {\n if ('routes' in route) {\n return route.routes;\n }\n\n return route;\n }).filter(filterContentAPI);\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`api::${apiName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n _.forEach(strapi.plugins, (plugin, pluginName) => {\n const transformPrefix = transformRoutePrefixFor(pluginName);\n\n if (Array.isArray(plugin.routes)) {\n return plugin.routes.map(transformPrefix).filter(filterContentAPI);\n }\n\n const routes = _.flatMap(plugin.routes, (route) => route.routes.map(transformPrefix)).filter(\n filterContentAPI\n );\n\n if (routes.length === 0) {\n return;\n }\n\n const apiPrefix = strapi.config.get('api.rest.prefix');\n routesMap[`plugin::${pluginName}`] = routes.map((route) => ({\n ...route,\n path: `${apiPrefix}${route.path}`,\n }));\n });\n\n return sanitizeRoutesMapForSerialization(routesMap);\n };\n\n const sanitizer = sanitize.createAPISanitizers({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of sanitizers after the creation of the container\n get sanitizers() {\n return {\n input: strapi.sanitizers.get('content-api.input'),\n output: strapi.sanitizers.get('content-api.output'),\n };\n },\n });\n\n const validator = validate.createAPIValidators({\n getModel(uid: string) {\n return strapi.getModel(uid as UID.Schema);\n },\n // NOTE: use lazy access to allow registration of validators after the creation of the container\n get validators() {\n return {\n input: strapi.validators.get('content-api.input'),\n };\n },\n });\n\n return {\n permissions: instantiatePermissionsUtilities(strapi),\n getRoutesMap,\n sanitize: sanitizer,\n validate: validator,\n };\n};\n\nexport default createContentAPI;\n"],"names":["transformRoutePrefixFor","pluginName","route","prefix","config","path","undefined","filterContentAPI","info","type","createContentAPI","strapi","getRoutesMap","routesMap","_","forEach","apis","api","apiName","routes","flatMap","filter","length","apiPrefix","get","map","plugins","plugin","transformPrefix","Array","isArray","sanitizeRoutesMapForSerialization","sanitizer","sanitize","createAPISanitizers","getModel","uid","sanitizers","input","output","validator","validate","createAPIValidators","validators","permissions","instantiatePermissionsUtilities"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Core, Struct } from '@strapi/types';
2
+ interface EncodingInfo {
3
+ data: any;
4
+ schema: Struct.Schema;
5
+ }
6
+ declare const createContentSourceMapsService: (strapi: Core.Strapi) => {
7
+ encodeField(text: string, key: string): string;
8
+ encodeEntry({ data, schema }: EncodingInfo): Promise<any>;
9
+ encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any>;
10
+ };
11
+ export { createContentSourceMapsService };
12
+ //# sourceMappingURL=content-source-maps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-source-maps.d.ts","sourceRoot":"","sources":["../../src/services/content-source-maps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAO,MAAM,eAAe,CAAC;AAyCvD,UAAU,YAAY;IACpB,IAAI,EAAE,GAAG,CAAC;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;CACvB;AAMD,QAAA,MAAM,8BAA8B,WAAY,KAAK,MAAM;sBAErC,MAAM,OAAO,MAAM,GAAG,MAAM;kCAQV,YAAY,GAAG,QAAQ,GAAG,CAAC;uCAuBtB,YAAY,GAAG,QAAQ,GAAG,CAAC;CAmBvE,CAAC;AAEF,OAAO,EAAE,8BAA8B,EAAE,CAAC"}
@@ -0,0 +1,86 @@
1
+ 'use strict';
2
+
3
+ var stega = require('@vercel/stega');
4
+ var strapiUtils = require('@strapi/utils');
5
+
6
+ const ENCODABLE_TYPES = [
7
+ 'string',
8
+ 'text',
9
+ 'richtext',
10
+ 'biginteger',
11
+ 'date',
12
+ 'time',
13
+ 'datetime',
14
+ 'timestamp',
15
+ 'boolean',
16
+ 'enumeration',
17
+ 'json',
18
+ 'media',
19
+ 'email',
20
+ 'password'
21
+ ];
22
+ // TODO: use a centralized store for these fields that would be shared with the CM and CTB
23
+ const EXCLUDED_FIELDS = [
24
+ 'id',
25
+ 'documentId',
26
+ 'locale',
27
+ 'localizations',
28
+ 'created_by',
29
+ 'updated_by',
30
+ 'created_at',
31
+ 'updated_at',
32
+ 'publishedAt'
33
+ ];
34
+ const isObject = (value)=>{
35
+ return typeof value === 'object' && value !== null;
36
+ };
37
+ const createContentSourceMapsService = (strapi)=>{
38
+ return {
39
+ encodeField (text, key) {
40
+ const res = stega.vercelStegaCombine(text, {
41
+ // TODO: smarter metadata than just the key
42
+ key
43
+ });
44
+ return res;
45
+ },
46
+ async encodeEntry ({ data, schema }) {
47
+ if (!isObject(data) || data === undefined) {
48
+ return data;
49
+ }
50
+ return strapiUtils.traverseEntity(({ key, value, attribute }, { set })=>{
51
+ if (!attribute || EXCLUDED_FIELDS.includes(key)) {
52
+ return;
53
+ }
54
+ if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
55
+ set(key, this.encodeField(value, key));
56
+ }
57
+ }, {
58
+ schema,
59
+ getModel: (uid)=>strapi.getModel(uid)
60
+ }, data);
61
+ },
62
+ async encodeSourceMaps ({ data, schema }) {
63
+ try {
64
+ if (Array.isArray(data)) {
65
+ return await Promise.all(data.map((item)=>this.encodeSourceMaps({
66
+ data: item,
67
+ schema
68
+ })));
69
+ }
70
+ if (!isObject(data)) {
71
+ return data;
72
+ }
73
+ return await this.encodeEntry({
74
+ data,
75
+ schema
76
+ });
77
+ } catch (error) {
78
+ strapi.log.error('Error encoding source maps:', error);
79
+ return data;
80
+ }
81
+ }
82
+ };
83
+ };
84
+
85
+ exports.createContentSourceMapsService = createContentSourceMapsService;
86
+ //# sourceMappingURL=content-source-maps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-source-maps.js","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - blocks: object, will require a custom implementation in a dedicated PR\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n set(key, this.encodeField(value, key) as any);\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (!isObject(data)) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","data","schema","undefined","traverseEntity","attribute","set","includes","type","getModel","uid","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":";;;;;AAIA,MAAMA,eAAkB,GAAA;AACtB,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,YAAA;AACA,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA;AASD,CAAA;AAED;AACA,MAAMC,eAAkB,GAAA;AACtB,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;AACD,CAAA;AAOD,MAAMC,WAAW,CAACC,KAAAA,GAAAA;IAChB,OAAO,OAAOA,KAAU,KAAA,QAAA,IAAYA,KAAU,KAAA,IAAA;AAChD,CAAA;AAEA,MAAMC,iCAAiC,CAACC,MAAAA,GAAAA;IACtC,OAAO;QACLC,WAAYC,CAAAA,CAAAA,IAAY,EAAEC,GAAW,EAAA;YACnC,MAAMC,GAAAA,GAAMC,yBAAmBH,IAAM,EAAA;;AAEnCC,gBAAAA;AACF,aAAA,CAAA;YACA,OAAOC,GAAAA;AACT,SAAA;AAEA,QAAA,MAAME,WAAY,CAAA,CAAA,EAAEC,IAAI,EAAEC,MAAM,EAAgB,EAAA;AAC9C,YAAA,IAAI,CAACX,QAAAA,CAASU,IAASA,CAAAA,IAAAA,IAAAA,KAASE,SAAW,EAAA;gBACzC,OAAOF,IAAAA;AACT;AAEA,YAAA,OAAOG,0BACL,CAAA,CAAC,EAAEP,GAAG,EAAEL,KAAK,EAAEa,SAAS,EAAE,EAAE,EAAEC,GAAG,EAAE,GAAA;AACjC,gBAAA,IAAI,CAACD,SAAAA,IAAaf,eAAgBiB,CAAAA,QAAQ,CAACV,GAAM,CAAA,EAAA;AAC/C,oBAAA;AACF;gBAEA,IAAIR,eAAAA,CAAgBkB,QAAQ,CAACF,SAAAA,CAAUG,IAAI,CAAK,IAAA,OAAOhB,UAAU,QAAU,EAAA;AACzEc,oBAAAA,GAAAA,CAAIT,GAAK,EAAA,IAAI,CAACF,WAAW,CAACH,KAAOK,EAAAA,GAAAA,CAAAA,CAAAA;AACnC;aAEF,EAAA;AACEK,gBAAAA,MAAAA;AACAO,gBAAAA,QAAAA,EAAU,CAACC,GAAAA,GAAQhB,MAAOe,CAAAA,QAAQ,CAACC,GAAAA;aAErCT,EAAAA,IAAAA,CAAAA;AAEJ,SAAA;AAEA,QAAA,MAAMU,gBAAiB,CAAA,CAAA,EAAEV,IAAI,EAAEC,MAAM,EAAgB,EAAA;YACnD,IAAI;gBACF,IAAIU,KAAAA,CAAMC,OAAO,CAACZ,IAAO,CAAA,EAAA;AACvB,oBAAA,OAAO,MAAMa,OAAAA,CAAQC,GAAG,CACtBd,IAAKe,CAAAA,GAAG,CAAC,CAACC,IAAS,GAAA,IAAI,CAACN,gBAAgB,CAAC;4BAAEV,IAAMgB,EAAAA,IAAAA;AAAMf,4BAAAA;AAAO,yBAAA,CAAA,CAAA,CAAA;AAElE;gBAEA,IAAI,CAACX,SAASU,IAAO,CAAA,EAAA;oBACnB,OAAOA,IAAAA;AACT;AAEA,gBAAA,OAAO,MAAM,IAAI,CAACD,WAAW,CAAC;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA;AAAO,iBAAA,CAAA;AAC/C,aAAA,CAAE,OAAOgB,KAAO,EAAA;AACdxB,gBAAAA,MAAAA,CAAOyB,GAAG,CAACD,KAAK,CAAC,6BAA+BA,EAAAA,KAAAA,CAAAA;gBAChD,OAAOjB,IAAAA;AACT;AACF;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,84 @@
1
+ import { vercelStegaCombine } from '@vercel/stega';
2
+ import { traverseEntity } from '@strapi/utils';
3
+
4
+ const ENCODABLE_TYPES = [
5
+ 'string',
6
+ 'text',
7
+ 'richtext',
8
+ 'biginteger',
9
+ 'date',
10
+ 'time',
11
+ 'datetime',
12
+ 'timestamp',
13
+ 'boolean',
14
+ 'enumeration',
15
+ 'json',
16
+ 'media',
17
+ 'email',
18
+ 'password'
19
+ ];
20
+ // TODO: use a centralized store for these fields that would be shared with the CM and CTB
21
+ const EXCLUDED_FIELDS = [
22
+ 'id',
23
+ 'documentId',
24
+ 'locale',
25
+ 'localizations',
26
+ 'created_by',
27
+ 'updated_by',
28
+ 'created_at',
29
+ 'updated_at',
30
+ 'publishedAt'
31
+ ];
32
+ const isObject = (value)=>{
33
+ return typeof value === 'object' && value !== null;
34
+ };
35
+ const createContentSourceMapsService = (strapi)=>{
36
+ return {
37
+ encodeField (text, key) {
38
+ const res = vercelStegaCombine(text, {
39
+ // TODO: smarter metadata than just the key
40
+ key
41
+ });
42
+ return res;
43
+ },
44
+ async encodeEntry ({ data, schema }) {
45
+ if (!isObject(data) || data === undefined) {
46
+ return data;
47
+ }
48
+ return traverseEntity(({ key, value, attribute }, { set })=>{
49
+ if (!attribute || EXCLUDED_FIELDS.includes(key)) {
50
+ return;
51
+ }
52
+ if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
53
+ set(key, this.encodeField(value, key));
54
+ }
55
+ }, {
56
+ schema,
57
+ getModel: (uid)=>strapi.getModel(uid)
58
+ }, data);
59
+ },
60
+ async encodeSourceMaps ({ data, schema }) {
61
+ try {
62
+ if (Array.isArray(data)) {
63
+ return await Promise.all(data.map((item)=>this.encodeSourceMaps({
64
+ data: item,
65
+ schema
66
+ })));
67
+ }
68
+ if (!isObject(data)) {
69
+ return data;
70
+ }
71
+ return await this.encodeEntry({
72
+ data,
73
+ schema
74
+ });
75
+ } catch (error) {
76
+ strapi.log.error('Error encoding source maps:', error);
77
+ return data;
78
+ }
79
+ }
80
+ };
81
+ };
82
+
83
+ export { createContentSourceMapsService };
84
+ //# sourceMappingURL=content-source-maps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-source-maps.mjs","sources":["../../src/services/content-source-maps.ts"],"sourcesContent":["import { vercelStegaCombine } from '@vercel/stega';\nimport type { Core, Struct, UID } from '@strapi/types';\nimport { traverseEntity } from '@strapi/utils';\n\nconst ENCODABLE_TYPES = [\n 'string',\n 'text',\n 'richtext',\n 'biginteger',\n 'date',\n 'time',\n 'datetime',\n 'timestamp',\n 'boolean',\n 'enumeration',\n 'json',\n 'media',\n 'email',\n 'password',\n /**\n * We cannot modify the response shape, so types that aren't based on string cannot be encoded:\n * - json: object\n * - blocks: object, will require a custom implementation in a dedicated PR\n * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n */\n];\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = [\n 'id',\n 'documentId',\n 'locale',\n 'localizations',\n 'created_by',\n 'updated_by',\n 'created_at',\n 'updated_at',\n 'publishedAt',\n];\n\ninterface EncodingInfo {\n data: any;\n schema: Struct.Schema;\n}\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(text: string, key: string): string {\n const res = vercelStegaCombine(text, {\n // TODO: smarter metadata than just the key\n key,\n });\n return res;\n },\n\n async encodeEntry({ data, schema }: EncodingInfo): Promise<any> {\n if (!isObject(data) || data === undefined) {\n return data;\n }\n\n return traverseEntity(\n ({ key, value, attribute }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n set(key, this.encodeField(value, key) as any);\n }\n },\n {\n schema,\n getModel: (uid) => strapi.getModel(uid as UID.Schema),\n },\n data\n );\n },\n\n async encodeSourceMaps({ data, schema }: EncodingInfo): Promise<any> {\n try {\n if (Array.isArray(data)) {\n return await Promise.all(\n data.map((item) => this.encodeSourceMaps({ data: item, schema }))\n );\n }\n\n if (!isObject(data)) {\n return data;\n }\n\n return await this.encodeEntry({ data, schema });\n } catch (error) {\n strapi.log.error('Error encoding source maps:', error);\n return data;\n }\n },\n };\n};\n\nexport { createContentSourceMapsService };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","createContentSourceMapsService","strapi","encodeField","text","key","res","vercelStegaCombine","encodeEntry","data","schema","undefined","traverseEntity","attribute","set","includes","type","getModel","uid","encodeSourceMaps","Array","isArray","Promise","all","map","item","error","log"],"mappings":";;;AAIA,MAAMA,eAAkB,GAAA;AACtB,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,YAAA;AACA,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;AACA,IAAA,aAAA;AACA,IAAA,MAAA;AACA,IAAA,OAAA;AACA,IAAA,OAAA;AACA,IAAA;AASD,CAAA;AAED;AACA,MAAMC,eAAkB,GAAA;AACtB,IAAA,IAAA;AACA,IAAA,YAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA;AACD,CAAA;AAOD,MAAMC,WAAW,CAACC,KAAAA,GAAAA;IAChB,OAAO,OAAOA,KAAU,KAAA,QAAA,IAAYA,KAAU,KAAA,IAAA;AAChD,CAAA;AAEA,MAAMC,iCAAiC,CAACC,MAAAA,GAAAA;IACtC,OAAO;QACLC,WAAYC,CAAAA,CAAAA,IAAY,EAAEC,GAAW,EAAA;YACnC,MAAMC,GAAAA,GAAMC,mBAAmBH,IAAM,EAAA;;AAEnCC,gBAAAA;AACF,aAAA,CAAA;YACA,OAAOC,GAAAA;AACT,SAAA;AAEA,QAAA,MAAME,WAAY,CAAA,CAAA,EAAEC,IAAI,EAAEC,MAAM,EAAgB,EAAA;AAC9C,YAAA,IAAI,CAACX,QAAAA,CAASU,IAASA,CAAAA,IAAAA,IAAAA,KAASE,SAAW,EAAA;gBACzC,OAAOF,IAAAA;AACT;AAEA,YAAA,OAAOG,cACL,CAAA,CAAC,EAAEP,GAAG,EAAEL,KAAK,EAAEa,SAAS,EAAE,EAAE,EAAEC,GAAG,EAAE,GAAA;AACjC,gBAAA,IAAI,CAACD,SAAAA,IAAaf,eAAgBiB,CAAAA,QAAQ,CAACV,GAAM,CAAA,EAAA;AAC/C,oBAAA;AACF;gBAEA,IAAIR,eAAAA,CAAgBkB,QAAQ,CAACF,SAAAA,CAAUG,IAAI,CAAK,IAAA,OAAOhB,UAAU,QAAU,EAAA;AACzEc,oBAAAA,GAAAA,CAAIT,GAAK,EAAA,IAAI,CAACF,WAAW,CAACH,KAAOK,EAAAA,GAAAA,CAAAA,CAAAA;AACnC;aAEF,EAAA;AACEK,gBAAAA,MAAAA;AACAO,gBAAAA,QAAAA,EAAU,CAACC,GAAAA,GAAQhB,MAAOe,CAAAA,QAAQ,CAACC,GAAAA;aAErCT,EAAAA,IAAAA,CAAAA;AAEJ,SAAA;AAEA,QAAA,MAAMU,gBAAiB,CAAA,CAAA,EAAEV,IAAI,EAAEC,MAAM,EAAgB,EAAA;YACnD,IAAI;gBACF,IAAIU,KAAAA,CAAMC,OAAO,CAACZ,IAAO,CAAA,EAAA;AACvB,oBAAA,OAAO,MAAMa,OAAAA,CAAQC,GAAG,CACtBd,IAAKe,CAAAA,GAAG,CAAC,CAACC,IAAS,GAAA,IAAI,CAACN,gBAAgB,CAAC;4BAAEV,IAAMgB,EAAAA,IAAAA;AAAMf,4BAAAA;AAAO,yBAAA,CAAA,CAAA,CAAA;AAElE;gBAEA,IAAI,CAACX,SAASU,IAAO,CAAA,EAAA;oBACnB,OAAOA,IAAAA;AACT;AAEA,gBAAA,OAAO,MAAM,IAAI,CAACD,WAAW,CAAC;AAAEC,oBAAAA,IAAAA;AAAMC,oBAAAA;AAAO,iBAAA,CAAA;AAC/C,aAAA,CAAE,OAAOgB,KAAO,EAAA;AACdxB,gBAAAA,MAAAA,CAAOyB,GAAG,CAACD,KAAK,CAAC,6BAA+BA,EAAAA,KAAAA,CAAAA;gBAChD,OAAOjB,IAAAA;AACT;AACF;AACF,KAAA;AACF;;;;"}
@@ -22,5 +22,10 @@ declare const deleteComponents: <TUID extends UID.Schema, TEntity extends Data.E
22
22
  }) => Promise<void>;
23
23
  declare const deleteComponent: <TUID extends `${string}.${string}`>(uid: TUID, componentToDelete: Data.Component<TUID>) => Promise<void>;
24
24
  declare const assignComponentData: _.CurriedFunction3<import("@strapi/types/dist/struct").ComponentSchema | import("@strapi/types/dist/struct").ContentTypeSchema, ComponentBody, Input<UID.Schema>, ComponentBody & Partial<Input<UID.Schema>>>;
25
- export { omitComponentData, assignComponentData, getComponents, createComponents, updateComponents, deleteComponents, deleteComponent, };
25
+ /**
26
+ * Creates a filter function for component relations that can be passed to the generic
27
+ * unidirectional relations utility
28
+ */
29
+ declare const createComponentRelationFilter: () => (relation: Record<string, any>, model: Schema.Component | Schema.ContentType, trx: any) => Promise<boolean>;
30
+ export { omitComponentData, assignComponentData, getComponents, createComponents, updateComponents, deleteComponents, deleteComponent, createComponentRelationFilter, };
26
31
  //# sourceMappingURL=components.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/components.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,KAAK,EAAS,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIvE,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1E,KAAK,gBAAgB,CAAC,IAAI,SAAS,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAC1D,IAAI,EACJ,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAC,CAC/D,CAAC;AAEF,KAAK,oBAAoB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAClF,KAAK,wBAAwB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAErF,KAAK,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;AAEtE,KAAK,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AAE3E,KAAK,aAAa,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,gBAAgB,CAAC;CAClD,CAAC;AAEF,QAAA,MAAM,iBAAiB,gLAStB,CAAC;AAGF,QAAA,MAAM,gBAAgB,4DACf,IAAI,QACH,KAAK,2BA6FZ,CAAC;AAEF,QAAA,MAAM,aAAa,iCACZ,IAAI,UACD;IAAE,EAAE,EAAE,QAAQ,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;CAAE,KACxD,QAAQ,iBAAiB,IAAI,CAAC,CAQhC,CAAC;AAMF,QAAA,MAAM,gBAAgB,qEACf,IAAI,kBACO;IAAE,EAAE,EAAE,QAAQ,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;CAAE,QAC3D,KAAK,2BAyEZ,CAAC;AAiGF,QAAA,MAAM,gBAAgB,oHACf,IAAI,kBACO,OAAO;;mBAqCxB,CAAC;AAyDF,QAAA,MAAM,eAAe,4CACd,IAAI,qBACU,KAAK,SAAS,CAAC,IAAI,CAAC,kBAIxC,CAAC;AAEF,QAAA,MAAM,mBAAmB,+MAIxB,CAAC;AAEF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,CAAC"}
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../../src/services/document-service/components.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,QAAQ,CAAC;AAEvB,OAAO,KAAK,EAAS,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAUvE,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE1E,KAAK,gBAAgB,CAAC,IAAI,SAAS,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAC1D,IAAI,EACJ,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,aAAa,CAAC,CAC/D,CAAC;AAEF,KAAK,oBAAoB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAClF,KAAK,wBAAwB,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAErF,KAAK,cAAc,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;AAEtE,KAAK,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;AAE3E,KAAK,aAAa,GAAG;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,gBAAgB,CAAC;CAClD,CAAC;AAEF,QAAA,MAAM,iBAAiB,gLAStB,CAAC;AAGF,QAAA,MAAM,gBAAgB,4DACf,IAAI,QACH,KAAK,2BA6FZ,CAAC;AAEF,QAAA,MAAM,aAAa,iCACZ,IAAI,UACD;IAAE,EAAE,EAAE,QAAQ,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;CAAE,KACxD,QAAQ,iBAAiB,IAAI,CAAC,CAQhC,CAAC;AAMF,QAAA,MAAM,gBAAgB,qEACf,IAAI,kBACO;IAAE,EAAE,EAAE,QAAQ,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;CAAE,QAC3D,KAAK,2BAyEZ,CAAC;AAiGF,QAAA,MAAM,gBAAgB,oHACf,IAAI,kBACO,OAAO;;mBAqCxB,CAAC;AAyDF,QAAA,MAAM,eAAe,4CACd,IAAI,qBACU,KAAK,SAAS,CAAC,IAAI,CAAC,kBAIxC,CAAC;AAEF,QAAA,MAAM,mBAAmB,+MAIxB,CAAC;AA0HF;;;GAGG;AACH,QAAA,MAAM,6BAA6B,mBAErB,OAAO,MAAM,EAAE,GAAG,CAAC,SACtB,OAAO,SAAS,GAAG,OAAO,WAAW,OACvC,GAAG,KACP,QAAQ,OAAO,CAqBnB,CAAC;AAEF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,6BAA6B,GAC9B,CAAC"}
@@ -3,6 +3,7 @@
3
3
  var _ = require('lodash');
4
4
  var fp = require('lodash/fp');
5
5
  var strapiUtils = require('@strapi/utils');
6
+ var transformContentTypesToModels = require('../../utils/transform-content-types-to-models.js');
6
7
 
7
8
  const omitComponentData = fp.curry((schema, data)=>{
8
9
  const { attributes } = schema;
@@ -275,8 +276,104 @@ const deleteComponent = async (uid, componentToDelete)=>{
275
276
  const assignComponentData = fp.curry((schema, componentData, data)=>{
276
277
  return fp.pipe(omitComponentData(schema), fp.assign(componentData))(data);
277
278
  });
279
+ /** *************************
280
+ Component relation handling for document operations
281
+ ************************** */ /**
282
+ * Find the parent entry of a component instance.
283
+ *
284
+ * Given a component model, a specific component instance id, and the list of
285
+ * possible parent content types (those that can embed this component),
286
+ * this function checks each parent's *_cmps join table to see if the component
287
+ * instance is linked to a parent entity.
288
+ *
289
+ * - Returns the parent uid, parent table name, and parent id if found.
290
+ * - Returns null if no parent relationship exists.
291
+ */ const findComponentParent = async (componentSchema, componentId, parentSchemasForComponent, opts)=>{
292
+ if (!componentSchema?.uid) return null;
293
+ const schemaBuilder = strapi.db.getSchemaConnection(opts?.trx);
294
+ const withTrx = (qb)=>opts?.trx ? qb.transacting(opts.trx) : qb;
295
+ for (const parent of parentSchemasForComponent){
296
+ if (!parent.collectionName) continue;
297
+ // Use the exact same functions that create the tables
298
+ const identifiers = strapi.db.metadata.identifiers;
299
+ const joinTableName = transformContentTypesToModels.getComponentJoinTableName(parent.collectionName, identifiers);
300
+ try {
301
+ const tableExists = await schemaBuilder.hasTable(joinTableName);
302
+ if (!tableExists) continue;
303
+ // Use the exact same functions that create the columns
304
+ const entityIdColumn = transformContentTypesToModels.getComponentJoinColumnEntityName(identifiers);
305
+ const componentIdColumn = transformContentTypesToModels.getComponentJoinColumnInverseName(identifiers);
306
+ const componentTypeColumn = transformContentTypesToModels.getComponentTypeColumn(identifiers);
307
+ const parentRow = await withTrx(strapi.db.getConnection(joinTableName)).where({
308
+ [componentIdColumn]: componentId,
309
+ [componentTypeColumn]: componentSchema.uid
310
+ }).first(entityIdColumn);
311
+ if (parentRow) {
312
+ return {
313
+ uid: parent.uid,
314
+ table: parent.collectionName,
315
+ parentId: parentRow[entityIdColumn]
316
+ };
317
+ }
318
+ } catch {
319
+ continue;
320
+ }
321
+ }
322
+ return null;
323
+ };
324
+ /**
325
+ * Finds content types that contain the given component and have draft & publish enabled.
326
+ */ const getParentSchemasForComponent = (componentSchema)=>{
327
+ return Object.values(strapi.contentTypes).filter((contentType)=>{
328
+ if (!contentType.options?.draftAndPublish) return false;
329
+ return Object.values(contentType.attributes).some((attr)=>{
330
+ return attr.type === 'component' && attr.component === componentSchema.uid || attr.type === 'dynamiczone' && attr.components?.includes(componentSchema.uid);
331
+ });
332
+ });
333
+ };
334
+ /**
335
+ * Determines if a component relation should be propagated to a new document version
336
+ * when a document with draft and publish is updated.
337
+ */ const shouldPropagateComponentRelationToNewVersion = async (componentRelation, componentSchema, parentSchemasForComponent, trx)=>{
338
+ // Get the component ID column name using the actual component model name
339
+ const componentIdColumn = strapi.db.metadata.identifiers.getJoinColumnAttributeIdName(_.snakeCase(componentSchema.modelName));
340
+ const componentId = componentRelation[componentIdColumn];
341
+ const parent = await findComponentParent(componentSchema, componentId, parentSchemasForComponent, {
342
+ trx
343
+ });
344
+ // Keep relation if component has no parent entry
345
+ if (!parent?.uid) {
346
+ return true;
347
+ }
348
+ const parentContentType = strapi.contentTypes[parent.uid];
349
+ // Keep relation if parent doesn't have draft & publish enabled
350
+ if (!parentContentType?.options?.draftAndPublish) {
351
+ return true;
352
+ }
353
+ // Discard relation if parent has draft & publish enabled
354
+ return false;
355
+ };
356
+ /**
357
+ * Creates a filter function for component relations that can be passed to the generic
358
+ * unidirectional relations utility
359
+ */ const createComponentRelationFilter = ()=>{
360
+ return async (relation, model, trx)=>{
361
+ // Only apply component-specific filtering for components
362
+ if (model.modelType !== 'component') {
363
+ return true;
364
+ }
365
+ const componentSchema = model;
366
+ const parentSchemas = getParentSchemasForComponent(componentSchema);
367
+ // Exit if no draft & publish parent types exist
368
+ if (parentSchemas.length === 0) {
369
+ return true;
370
+ }
371
+ return shouldPropagateComponentRelationToNewVersion(relation, componentSchema, parentSchemas, trx);
372
+ };
373
+ };
278
374
 
279
375
  exports.assignComponentData = assignComponentData;
376
+ exports.createComponentRelationFilter = createComponentRelationFilter;
280
377
  exports.createComponents = createComponents;
281
378
  exports.deleteComponent = deleteComponent;
282
379
  exports.deleteComponents = deleteComponents;