@strapi/core 5.57.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/Strapi.d.ts +28 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +5 -0
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +5 -0
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/ee/entitlements.d.ts +44 -0
  8. package/dist/ee/entitlements.d.ts.map +1 -0
  9. package/dist/ee/entitlements.js +54 -0
  10. package/dist/ee/entitlements.js.map +1 -0
  11. package/dist/ee/entitlements.mjs +51 -0
  12. package/dist/ee/entitlements.mjs.map +1 -0
  13. package/dist/ee/index.d.ts +33 -0
  14. package/dist/ee/index.d.ts.map +1 -1
  15. package/dist/ee/index.js +70 -3
  16. package/dist/ee/index.js.map +1 -1
  17. package/dist/ee/index.mjs +71 -4
  18. package/dist/ee/index.mjs.map +1 -1
  19. package/dist/ee/license.d.ts +10 -0
  20. package/dist/ee/license.d.ts.map +1 -1
  21. package/dist/ee/license.js +25 -1
  22. package/dist/ee/license.js.map +1 -1
  23. package/dist/ee/license.mjs +25 -2
  24. package/dist/ee/license.mjs.map +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1 -1
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/loaders/apis.d.ts.map +1 -1
  31. package/dist/loaders/apis.js.map +1 -1
  32. package/dist/loaders/apis.mjs.map +1 -1
  33. package/dist/loaders/plugins/get-enabled-plugins.js +2 -2
  34. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  35. package/dist/loaders/plugins/get-enabled-plugins.mjs +2 -2
  36. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  37. package/dist/middlewares/cors.d.ts.map +1 -1
  38. package/dist/middlewares/cors.js.map +1 -1
  39. package/dist/middlewares/cors.mjs.map +1 -1
  40. package/dist/migrations/database/5.0.0-discard-drafts.js +1 -1
  41. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  42. package/dist/migrations/database/5.0.0-discard-drafts.mjs +1 -1
  43. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  44. package/dist/migrations/first-published-at.js +1 -1
  45. package/dist/migrations/first-published-at.js.map +1 -1
  46. package/dist/migrations/first-published-at.mjs +1 -1
  47. package/dist/migrations/first-published-at.mjs.map +1 -1
  48. package/dist/package.json.js +18 -17
  49. package/dist/package.json.js.map +1 -1
  50. package/dist/package.json.mjs +18 -17
  51. package/dist/package.json.mjs.map +1 -1
  52. package/dist/registries/controllers.d.ts.map +1 -1
  53. package/dist/registries/controllers.js.map +1 -1
  54. package/dist/registries/controllers.mjs.map +1 -1
  55. package/dist/services/content-source-maps.js +6 -6
  56. package/dist/services/content-source-maps.js.map +1 -1
  57. package/dist/services/content-source-maps.mjs +6 -6
  58. package/dist/services/content-source-maps.mjs.map +1 -1
  59. package/dist/services/document-service/components.d.ts +13 -11
  60. package/dist/services/document-service/components.d.ts.map +1 -1
  61. package/dist/services/document-service/components.js +115 -66
  62. package/dist/services/document-service/components.js.map +1 -1
  63. package/dist/services/document-service/components.mjs +116 -67
  64. package/dist/services/document-service/components.mjs.map +1 -1
  65. package/dist/services/document-service/events.d.ts.map +1 -1
  66. package/dist/services/document-service/events.js +5 -1
  67. package/dist/services/document-service/events.js.map +1 -1
  68. package/dist/services/document-service/events.mjs +5 -1
  69. package/dist/services/document-service/events.mjs.map +1 -1
  70. package/dist/services/document-service/repository.d.ts.map +1 -1
  71. package/dist/services/document-service/repository.js +26 -7
  72. package/dist/services/document-service/repository.js.map +1 -1
  73. package/dist/services/document-service/repository.mjs +27 -8
  74. package/dist/services/document-service/repository.mjs.map +1 -1
  75. package/dist/services/document-service/transform/data.d.ts.map +1 -1
  76. package/dist/services/document-service/transform/data.js.map +1 -1
  77. package/dist/services/document-service/transform/data.mjs.map +1 -1
  78. package/dist/services/document-service/transform/fields.d.ts.map +1 -1
  79. package/dist/services/document-service/transform/fields.js +7 -1
  80. package/dist/services/document-service/transform/fields.js.map +1 -1
  81. package/dist/services/document-service/transform/fields.mjs +7 -1
  82. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  83. package/dist/services/document-service/transform/populate.d.ts.map +1 -1
  84. package/dist/services/document-service/transform/populate.js +8 -1
  85. package/dist/services/document-service/transform/populate.js.map +1 -1
  86. package/dist/services/document-service/transform/populate.mjs +8 -1
  87. package/dist/services/document-service/transform/populate.mjs.map +1 -1
  88. package/dist/services/document-service/transform/relations/transform/default-locale.d.ts +4 -1
  89. package/dist/services/document-service/transform/relations/transform/default-locale.d.ts.map +1 -1
  90. package/dist/services/document-service/transform/relations/transform/default-locale.js +12 -9
  91. package/dist/services/document-service/transform/relations/transform/default-locale.js.map +1 -1
  92. package/dist/services/document-service/transform/relations/transform/default-locale.mjs +12 -10
  93. package/dist/services/document-service/transform/relations/transform/default-locale.mjs.map +1 -1
  94. package/dist/services/document-service/transform/relations/utils/map-relation.d.ts.map +1 -1
  95. package/dist/services/document-service/transform/relations/utils/map-relation.js +10 -4
  96. package/dist/services/document-service/transform/relations/utils/map-relation.js.map +1 -1
  97. package/dist/services/document-service/transform/relations/utils/map-relation.mjs +10 -4
  98. package/dist/services/document-service/transform/relations/utils/map-relation.mjs.map +1 -1
  99. package/dist/services/document-service/utils/clone-relations.d.ts +21 -4
  100. package/dist/services/document-service/utils/clone-relations.d.ts.map +1 -1
  101. package/dist/services/document-service/utils/clone-relations.js +619 -34
  102. package/dist/services/document-service/utils/clone-relations.js.map +1 -1
  103. package/dist/services/document-service/utils/clone-relations.mjs +619 -36
  104. package/dist/services/document-service/utils/clone-relations.mjs.map +1 -1
  105. package/dist/services/document-service/utils/unidirectional-relations.d.ts +4 -2
  106. package/dist/services/document-service/utils/unidirectional-relations.d.ts.map +1 -1
  107. package/dist/services/document-service/utils/unidirectional-relations.js +1 -10
  108. package/dist/services/document-service/utils/unidirectional-relations.js.map +1 -1
  109. package/dist/services/document-service/utils/unidirectional-relations.mjs +1 -10
  110. package/dist/services/document-service/utils/unidirectional-relations.mjs.map +1 -1
  111. package/dist/services/event-hub.d.ts.map +1 -1
  112. package/dist/services/event-hub.js +23 -5
  113. package/dist/services/event-hub.js.map +1 -1
  114. package/dist/services/event-hub.mjs +23 -5
  115. package/dist/services/event-hub.mjs.map +1 -1
  116. package/dist/services/webhook-store.js +2 -2
  117. package/dist/services/webhook-store.js.map +1 -1
  118. package/dist/services/webhook-store.mjs +2 -2
  119. package/dist/services/webhook-store.mjs.map +1 -1
  120. package/dist/utils/detect-customizations.d.ts +31 -0
  121. package/dist/utils/detect-customizations.d.ts.map +1 -0
  122. package/dist/utils/detect-customizations.js +173 -0
  123. package/dist/utils/detect-customizations.js.map +1 -0
  124. package/dist/utils/detect-customizations.mjs +165 -0
  125. package/dist/utils/detect-customizations.mjs.map +1 -0
  126. package/dist/utils/fetch.d.ts.map +1 -1
  127. package/dist/utils/fetch.js +44 -8
  128. package/dist/utils/fetch.js.map +1 -1
  129. package/dist/utils/fetch.mjs +37 -8
  130. package/dist/utils/fetch.mjs.map +1 -1
  131. package/dist/utils/transform-content-types-to-models.js +5 -5
  132. package/dist/utils/transform-content-types-to-models.js.map +1 -1
  133. package/dist/utils/transform-content-types-to-models.mjs +5 -5
  134. package/dist/utils/transform-content-types-to-models.mjs.map +1 -1
  135. package/package.json +18 -17
@@ -36,7 +36,7 @@ const enableFirstPublishedAt = async ({ oldContentTypes, contentTypes })=>{
36
36
  if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {
37
37
  continue;
38
38
  }
39
- const publishedContent = items.filter((item)=>item.publishedAt != null).at(0);
39
+ const publishedContent = items.find((item)=>item.publishedAt != null);
40
40
  if (!publishedContent) {
41
41
  continue;
42
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"first-published-at.js","sources":["../../src/migrations/first-published-at.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport _ from 'lodash';\nimport { Input } from './draft-publish';\n\ninterface ContentTypeData {\n id: number;\n documentId: string;\n publishedAt: Date;\n firstPublishedAt: Date;\n locale: string;\n}\n\nconst enableFirstPublishedAt = async ({ oldContentTypes, contentTypes }: Input) => {\n if (!oldContentTypes) {\n return;\n }\n\n return strapi.db.transaction(async (trx) => {\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const contentType = contentTypes[uid];\n\n if (!contentTypesUtils.hasFirstPublishedAtField(contentType)) {\n continue;\n }\n\n if (!contentType.attributes?.firstPublishedAt) {\n continue;\n }\n\n const content: ContentTypeData[] = await strapi.db\n .queryBuilder(uid)\n .select('*')\n .transacting(trx)\n .execute();\n\n // Process content types in pairs: draft and published.\n // If only one exist, which means the value is not published yet and we can ignore it\n const groupedContent = _.groupBy(content, (item) => `${item.documentId}-${item.locale}`);\n\n for (const items of Object.values(groupedContent)) {\n // If there is only one item, which means nothing is published yet for this locale\n if (items.length <= 1) {\n continue;\n }\n\n // If firstPublishedAt is already present, do not do anything\n if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {\n continue;\n }\n\n const publishedContent = items.filter((item) => item.publishedAt != null).at(0);\n if (!publishedContent) {\n continue;\n }\n\n await strapi.db\n .queryBuilder(uid)\n .update({\n firstPublishedAt: new Date(publishedContent.publishedAt),\n })\n .where({\n documentId: publishedContent.documentId,\n locale: publishedContent.locale,\n })\n .transacting(trx)\n .execute();\n }\n }\n });\n};\n\nexport { enableFirstPublishedAt as enable };\n"],"names":["enableFirstPublishedAt","oldContentTypes","contentTypes","strapi","db","transaction","trx","uid","contentType","contentTypesUtils","hasFirstPublishedAtField","attributes","firstPublishedAt","content","queryBuilder","select","transacting","execute","groupedContent","_","groupBy","item","documentId","locale","items","Object","values","length","publishedContent","filter","publishedAt","at","update","Date","where"],"mappings":";;;;;;;;;AAYA,MAAMA,yBAAyB,OAAO,EAAEC,eAAe,EAAEC,YAAY,EAAS,GAAA;AAC5E,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;AAEA,IAAA,OAAOE,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,YAAAA,CAAc;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF,YAAA;YAEA,MAAMC,WAAAA,GAAcN,YAAY,CAACK,GAAAA,CAAI;AAErC,YAAA,IAAI,CAACE,wBAAAA,CAAkBC,wBAAwB,CAACF,WAAAA,CAAAA,EAAc;AAC5D,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAAA,EAAkB;AAC7C,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMC,OAAAA,GAA6B,MAAMV,MAAAA,CAAOC,EAAE,CAC/CU,YAAY,CAACP,GAAAA,CAAAA,CACbQ,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAAA,GAAiBC,kBAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAA,EAAGA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAA,CAAE,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACR,cAAAA,CAAAA,CAAiB;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAA,EAAG;AACrB,oBAAA;AACF,gBAAA;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,IAAQY,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,EAAM;AAC1E,oBAAA;AACF,gBAAA;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAAA,CAAMK,MAAM,CAAC,CAACR,IAAAA,GAASA,IAAAA,CAAKS,WAAW,IAAI,IAAA,CAAA,CAAMC,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAAA,EAAkB;AACrB,oBAAA;AACF,gBAAA;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAAA,EAAkB,IAAIqB,IAAAA,CAAKL,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAC3B,CAAA,CACCP,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"first-published-at.js","sources":["../../src/migrations/first-published-at.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport _ from 'lodash';\nimport { Input } from './draft-publish';\n\ninterface ContentTypeData {\n id: number;\n documentId: string;\n publishedAt: Date;\n firstPublishedAt: Date;\n locale: string;\n}\n\nconst enableFirstPublishedAt = async ({ oldContentTypes, contentTypes }: Input) => {\n if (!oldContentTypes) {\n return;\n }\n\n return strapi.db.transaction(async (trx) => {\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const contentType = contentTypes[uid];\n\n if (!contentTypesUtils.hasFirstPublishedAtField(contentType)) {\n continue;\n }\n\n if (!contentType.attributes?.firstPublishedAt) {\n continue;\n }\n\n const content: ContentTypeData[] = await strapi.db\n .queryBuilder(uid)\n .select('*')\n .transacting(trx)\n .execute();\n\n // Process content types in pairs: draft and published.\n // If only one exist, which means the value is not published yet and we can ignore it\n const groupedContent = _.groupBy(content, (item) => `${item.documentId}-${item.locale}`);\n\n for (const items of Object.values(groupedContent)) {\n // If there is only one item, which means nothing is published yet for this locale\n if (items.length <= 1) {\n continue;\n }\n\n // If firstPublishedAt is already present, do not do anything\n if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {\n continue;\n }\n\n const publishedContent = items.find((item) => item.publishedAt != null);\n if (!publishedContent) {\n continue;\n }\n\n await strapi.db\n .queryBuilder(uid)\n .update({\n firstPublishedAt: new Date(publishedContent.publishedAt),\n })\n .where({\n documentId: publishedContent.documentId,\n locale: publishedContent.locale,\n })\n .transacting(trx)\n .execute();\n }\n }\n });\n};\n\nexport { enableFirstPublishedAt as enable };\n"],"names":["enableFirstPublishedAt","oldContentTypes","contentTypes","strapi","db","transaction","trx","uid","contentType","contentTypesUtils","hasFirstPublishedAtField","attributes","firstPublishedAt","content","queryBuilder","select","transacting","execute","groupedContent","_","groupBy","item","documentId","locale","items","Object","values","length","publishedContent","find","publishedAt","update","Date","where"],"mappings":";;;;;;;;;AAYA,MAAMA,yBAAyB,OAAO,EAAEC,eAAe,EAAEC,YAAY,EAAS,GAAA;AAC5E,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;AAEA,IAAA,OAAOE,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,YAAAA,CAAc;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF,YAAA;YAEA,MAAMC,WAAAA,GAAcN,YAAY,CAACK,GAAAA,CAAI;AAErC,YAAA,IAAI,CAACE,wBAAAA,CAAkBC,wBAAwB,CAACF,WAAAA,CAAAA,EAAc;AAC5D,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAAA,EAAkB;AAC7C,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMC,OAAAA,GAA6B,MAAMV,MAAAA,CAAOC,EAAE,CAC/CU,YAAY,CAACP,GAAAA,CAAAA,CACbQ,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAAA,GAAiBC,kBAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAA,EAAGA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAA,CAAE,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACR,cAAAA,CAAAA,CAAiB;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAA,EAAG;AACrB,oBAAA;AACF,gBAAA;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,IAAQY,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,EAAM;AAC1E,oBAAA;AACF,gBAAA;gBAEA,MAAMgB,gBAAAA,GAAmBJ,MAAMK,IAAI,CAAC,CAACR,IAAAA,GAASA,IAAAA,CAAKS,WAAW,IAAI,IAAA,CAAA;AAClE,gBAAA,IAAI,CAACF,gBAAAA,EAAkB;AACrB,oBAAA;AACF,gBAAA;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbwB,MAAM,CAAC;oBACNnB,gBAAAA,EAAkB,IAAIoB,IAAAA,CAAKJ,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCG,KAAK,CAAC;AACLX,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAC3B,CAAA,CACCP,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -30,7 +30,7 @@ const enableFirstPublishedAt = async ({ oldContentTypes, contentTypes: contentTy
30
30
  if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {
31
31
  continue;
32
32
  }
33
- const publishedContent = items.filter((item)=>item.publishedAt != null).at(0);
33
+ const publishedContent = items.find((item)=>item.publishedAt != null);
34
34
  if (!publishedContent) {
35
35
  continue;
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"first-published-at.mjs","sources":["../../src/migrations/first-published-at.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport _ from 'lodash';\nimport { Input } from './draft-publish';\n\ninterface ContentTypeData {\n id: number;\n documentId: string;\n publishedAt: Date;\n firstPublishedAt: Date;\n locale: string;\n}\n\nconst enableFirstPublishedAt = async ({ oldContentTypes, contentTypes }: Input) => {\n if (!oldContentTypes) {\n return;\n }\n\n return strapi.db.transaction(async (trx) => {\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const contentType = contentTypes[uid];\n\n if (!contentTypesUtils.hasFirstPublishedAtField(contentType)) {\n continue;\n }\n\n if (!contentType.attributes?.firstPublishedAt) {\n continue;\n }\n\n const content: ContentTypeData[] = await strapi.db\n .queryBuilder(uid)\n .select('*')\n .transacting(trx)\n .execute();\n\n // Process content types in pairs: draft and published.\n // If only one exist, which means the value is not published yet and we can ignore it\n const groupedContent = _.groupBy(content, (item) => `${item.documentId}-${item.locale}`);\n\n for (const items of Object.values(groupedContent)) {\n // If there is only one item, which means nothing is published yet for this locale\n if (items.length <= 1) {\n continue;\n }\n\n // If firstPublishedAt is already present, do not do anything\n if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {\n continue;\n }\n\n const publishedContent = items.filter((item) => item.publishedAt != null).at(0);\n if (!publishedContent) {\n continue;\n }\n\n await strapi.db\n .queryBuilder(uid)\n .update({\n firstPublishedAt: new Date(publishedContent.publishedAt),\n })\n .where({\n documentId: publishedContent.documentId,\n locale: publishedContent.locale,\n })\n .transacting(trx)\n .execute();\n }\n }\n });\n};\n\nexport { enableFirstPublishedAt as enable };\n"],"names":["enableFirstPublishedAt","oldContentTypes","contentTypes","strapi","db","transaction","trx","uid","contentType","contentTypesUtils","hasFirstPublishedAtField","attributes","firstPublishedAt","content","queryBuilder","select","transacting","execute","groupedContent","_","groupBy","item","documentId","locale","items","Object","values","length","publishedContent","filter","publishedAt","at","update","Date","where"],"mappings":";;;AAYA,MAAMA,yBAAyB,OAAO,EAAEC,eAAe,gBAAEC,cAAY,EAAS,GAAA;AAC5E,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;AAEA,IAAA,OAAOE,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,cAAAA,CAAc;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF,YAAA;YAEA,MAAMC,WAAAA,GAAcN,cAAY,CAACK,GAAAA,CAAI;AAErC,YAAA,IAAI,CAACE,YAAAA,CAAkBC,wBAAwB,CAACF,WAAAA,CAAAA,EAAc;AAC5D,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAAA,EAAkB;AAC7C,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMC,OAAAA,GAA6B,MAAMV,MAAAA,CAAOC,EAAE,CAC/CU,YAAY,CAACP,GAAAA,CAAAA,CACbQ,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAAA,GAAiBC,CAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAA,EAAGA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAA,CAAE,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACR,cAAAA,CAAAA,CAAiB;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAA,EAAG;AACrB,oBAAA;AACF,gBAAA;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,IAAQY,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,EAAM;AAC1E,oBAAA;AACF,gBAAA;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAAA,CAAMK,MAAM,CAAC,CAACR,IAAAA,GAASA,IAAAA,CAAKS,WAAW,IAAI,IAAA,CAAA,CAAMC,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAAA,EAAkB;AACrB,oBAAA;AACF,gBAAA;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAAA,EAAkB,IAAIqB,IAAAA,CAAKL,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAC3B,CAAA,CACCP,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"first-published-at.mjs","sources":["../../src/migrations/first-published-at.ts"],"sourcesContent":["import { contentTypes as contentTypesUtils } from '@strapi/utils';\nimport _ from 'lodash';\nimport { Input } from './draft-publish';\n\ninterface ContentTypeData {\n id: number;\n documentId: string;\n publishedAt: Date;\n firstPublishedAt: Date;\n locale: string;\n}\n\nconst enableFirstPublishedAt = async ({ oldContentTypes, contentTypes }: Input) => {\n if (!oldContentTypes) {\n return;\n }\n\n return strapi.db.transaction(async (trx) => {\n for (const uid in contentTypes) {\n if (!oldContentTypes[uid]) {\n continue;\n }\n\n const contentType = contentTypes[uid];\n\n if (!contentTypesUtils.hasFirstPublishedAtField(contentType)) {\n continue;\n }\n\n if (!contentType.attributes?.firstPublishedAt) {\n continue;\n }\n\n const content: ContentTypeData[] = await strapi.db\n .queryBuilder(uid)\n .select('*')\n .transacting(trx)\n .execute();\n\n // Process content types in pairs: draft and published.\n // If only one exist, which means the value is not published yet and we can ignore it\n const groupedContent = _.groupBy(content, (item) => `${item.documentId}-${item.locale}`);\n\n for (const items of Object.values(groupedContent)) {\n // If there is only one item, which means nothing is published yet for this locale\n if (items.length <= 1) {\n continue;\n }\n\n // If firstPublishedAt is already present, do not do anything\n if (items[0].firstPublishedAt != null && items[1].firstPublishedAt != null) {\n continue;\n }\n\n const publishedContent = items.find((item) => item.publishedAt != null);\n if (!publishedContent) {\n continue;\n }\n\n await strapi.db\n .queryBuilder(uid)\n .update({\n firstPublishedAt: new Date(publishedContent.publishedAt),\n })\n .where({\n documentId: publishedContent.documentId,\n locale: publishedContent.locale,\n })\n .transacting(trx)\n .execute();\n }\n }\n });\n};\n\nexport { enableFirstPublishedAt as enable };\n"],"names":["enableFirstPublishedAt","oldContentTypes","contentTypes","strapi","db","transaction","trx","uid","contentType","contentTypesUtils","hasFirstPublishedAtField","attributes","firstPublishedAt","content","queryBuilder","select","transacting","execute","groupedContent","_","groupBy","item","documentId","locale","items","Object","values","length","publishedContent","find","publishedAt","update","Date","where"],"mappings":";;;AAYA,MAAMA,yBAAyB,OAAO,EAAEC,eAAe,gBAAEC,cAAY,EAAS,GAAA;AAC5E,IAAA,IAAI,CAACD,eAAAA,EAAiB;AACpB,QAAA;AACF,IAAA;AAEA,IAAA,OAAOE,MAAAA,CAAOC,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,cAAAA,CAAc;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF,YAAA;YAEA,MAAMC,WAAAA,GAAcN,cAAY,CAACK,GAAAA,CAAI;AAErC,YAAA,IAAI,CAACE,YAAAA,CAAkBC,wBAAwB,CAACF,WAAAA,CAAAA,EAAc;AAC5D,gBAAA;AACF,YAAA;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAAA,EAAkB;AAC7C,gBAAA;AACF,YAAA;AAEA,YAAA,MAAMC,OAAAA,GAA6B,MAAMV,MAAAA,CAAOC,EAAE,CAC/CU,YAAY,CAACP,GAAAA,CAAAA,CACbQ,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAAA,GAAiBC,CAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAA,EAAGA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAA,CAAE,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAAA,CAAOC,MAAM,CAACR,cAAAA,CAAAA,CAAiB;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAA,EAAG;AACrB,oBAAA;AACF,gBAAA;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,IAAQY,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAA,EAAM;AAC1E,oBAAA;AACF,gBAAA;gBAEA,MAAMgB,gBAAAA,GAAmBJ,MAAMK,IAAI,CAAC,CAACR,IAAAA,GAASA,IAAAA,CAAKS,WAAW,IAAI,IAAA,CAAA;AAClE,gBAAA,IAAI,CAACF,gBAAAA,EAAkB;AACrB,oBAAA;AACF,gBAAA;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbwB,MAAM,CAAC;oBACNnB,gBAAAA,EAAkB,IAAIoB,IAAAA,CAAKJ,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCG,KAAK,CAAC;AACLX,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAC3B,CAAA,CACCP,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ,YAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var name = "@strapi/core";
6
- var version = "5.57.0";
6
+ var version = "5.59.0";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -63,18 +63,18 @@ var dependencies = {
63
63
  "@casl/ability": "6.7.5",
64
64
  "@koa/cors": "5.0.0",
65
65
  "@koa/router": "12.0.2",
66
- "@modelcontextprotocol/node": "2.0.0",
67
- "@modelcontextprotocol/server": "2.0.0",
66
+ "@modelcontextprotocol/node": "2.1.1",
67
+ "@modelcontextprotocol/server": "2.3.1",
68
68
  "@paralleldrive/cuid2": "2.2.2",
69
- "@strapi/admin": "5.57.0",
70
- "@strapi/database": "5.57.0",
71
- "@strapi/generators": "5.57.0",
72
- "@strapi/logger": "5.57.0",
73
- "@strapi/openapi": "5.57.0",
74
- "@strapi/permissions": "5.57.0",
75
- "@strapi/types": "5.57.0",
76
- "@strapi/typescript-utils": "5.57.0",
77
- "@strapi/utils": "5.57.0",
69
+ "@strapi/admin": "5.59.0",
70
+ "@strapi/database": "5.59.0",
71
+ "@strapi/generators": "5.59.0",
72
+ "@strapi/logger": "5.59.0",
73
+ "@strapi/openapi": "5.59.0",
74
+ "@strapi/permissions": "5.59.0",
75
+ "@strapi/types": "5.59.0",
76
+ "@strapi/typescript-utils": "5.59.0",
77
+ "@strapi/utils": "5.59.0",
78
78
  "@vercel/stega": "0.1.2",
79
79
  bcryptjs: "2.4.3",
80
80
  boxen: "5.1.2",
@@ -116,12 +116,12 @@ var dependencies = {
116
116
  "resolve.exports": "2.0.2",
117
117
  semver: "7.7.4",
118
118
  typescript: "5.9.3",
119
- undici: "6.29.0",
119
+ undici: "8.12.1",
120
120
  yup: "0.32.9",
121
121
  zod: "4.4.3"
122
122
  };
123
123
  var devDependencies = {
124
- "@modelcontextprotocol/client": "2.0.0",
124
+ "@modelcontextprotocol/client": "2.3.1",
125
125
  "@swc/core": "1.13.5",
126
126
  "@types/bcryptjs": "2.4.3",
127
127
  "@types/configstore": "5.0.1",
@@ -133,6 +133,7 @@ var devDependencies = {
133
133
  "@types/json-logic-js": "2.0.8",
134
134
  "@types/koa": "2.15.2",
135
135
  "@types/koa-compress": "4.0.3",
136
+ "@types/koa-favicon": "2.1.5",
136
137
  "@types/koa-static": "4.0.2",
137
138
  "@types/koa__router": "12.0.0",
138
139
  "@types/lodash": "^4.14.191",
@@ -140,12 +141,12 @@ var devDependencies = {
140
141
  "@types/node": "20.19.41",
141
142
  ajv: "8.20.0",
142
143
  "ajv-formats": "3.0.1",
143
- "eslint-config-custom": "5.57.0",
144
+ "eslint-config-custom": "5.59.0",
144
145
  jest: "29.6.0",
145
146
  supertest: "7.2.2",
146
- tsconfig: "5.57.0",
147
+ tsconfig: "5.59.0",
147
148
  vitest: "catalog:",
148
- "vitest-config": "5.57.0"
149
+ "vitest-config": "5.59.0"
149
150
  };
150
151
  var engines = {
151
152
  node: ">=20.0.0 <=26.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 = "5.57.0";
2
+ var version = "5.59.0";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -59,18 +59,18 @@ var dependencies = {
59
59
  "@casl/ability": "6.7.5",
60
60
  "@koa/cors": "5.0.0",
61
61
  "@koa/router": "12.0.2",
62
- "@modelcontextprotocol/node": "2.0.0",
63
- "@modelcontextprotocol/server": "2.0.0",
62
+ "@modelcontextprotocol/node": "2.1.1",
63
+ "@modelcontextprotocol/server": "2.3.1",
64
64
  "@paralleldrive/cuid2": "2.2.2",
65
- "@strapi/admin": "5.57.0",
66
- "@strapi/database": "5.57.0",
67
- "@strapi/generators": "5.57.0",
68
- "@strapi/logger": "5.57.0",
69
- "@strapi/openapi": "5.57.0",
70
- "@strapi/permissions": "5.57.0",
71
- "@strapi/types": "5.57.0",
72
- "@strapi/typescript-utils": "5.57.0",
73
- "@strapi/utils": "5.57.0",
65
+ "@strapi/admin": "5.59.0",
66
+ "@strapi/database": "5.59.0",
67
+ "@strapi/generators": "5.59.0",
68
+ "@strapi/logger": "5.59.0",
69
+ "@strapi/openapi": "5.59.0",
70
+ "@strapi/permissions": "5.59.0",
71
+ "@strapi/types": "5.59.0",
72
+ "@strapi/typescript-utils": "5.59.0",
73
+ "@strapi/utils": "5.59.0",
74
74
  "@vercel/stega": "0.1.2",
75
75
  bcryptjs: "2.4.3",
76
76
  boxen: "5.1.2",
@@ -112,12 +112,12 @@ var dependencies = {
112
112
  "resolve.exports": "2.0.2",
113
113
  semver: "7.7.4",
114
114
  typescript: "5.9.3",
115
- undici: "6.29.0",
115
+ undici: "8.12.1",
116
116
  yup: "0.32.9",
117
117
  zod: "4.4.3"
118
118
  };
119
119
  var devDependencies = {
120
- "@modelcontextprotocol/client": "2.0.0",
120
+ "@modelcontextprotocol/client": "2.3.1",
121
121
  "@swc/core": "1.13.5",
122
122
  "@types/bcryptjs": "2.4.3",
123
123
  "@types/configstore": "5.0.1",
@@ -129,6 +129,7 @@ var devDependencies = {
129
129
  "@types/json-logic-js": "2.0.8",
130
130
  "@types/koa": "2.15.2",
131
131
  "@types/koa-compress": "4.0.3",
132
+ "@types/koa-favicon": "2.1.5",
132
133
  "@types/koa-static": "4.0.2",
133
134
  "@types/koa__router": "12.0.0",
134
135
  "@types/lodash": "^4.14.191",
@@ -136,12 +137,12 @@ var devDependencies = {
136
137
  "@types/node": "20.19.41",
137
138
  ajv: "8.20.0",
138
139
  "ajv-formats": "3.0.1",
139
- "eslint-config-custom": "5.57.0",
140
+ "eslint-config-custom": "5.59.0",
140
141
  jest: "29.6.0",
141
142
  supertest: "7.2.2",
142
- tsconfig: "5.57.0",
143
+ tsconfig: "5.59.0",
143
144
  vitest: "catalog:",
144
- "vitest-config": "5.57.0"
145
+ "vitest-config": "5.59.0"
145
146
  };
146
147
  var engines = {
147
148
  node: ">=20.0.0 <=26.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../src/registries/controllers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,MAAM,iBAAiB,GACzB,CAAC,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC,UAAU,CAAC,GACtD,IAAI,CAAC,UAAU,CAAC;AACpB,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACpE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC;AAE/E,QAAA,MAAM,mBAAmB,GAAI,QAAQ,IAAI,CAAC,MAAM;IAK5C;;OAEG;;IAKH;;OAEG;aACM,GAAG,CAAC,UAAU;IAavB;;OAEG;sBACe,MAAM;IAgBxB;;OAEG;aACM,GAAG,CAAC,UAAU,SAAS,iBAAiB;IAMjD;;OAEG;mBACY,MAAM,kBAAkB,oBAAoB;IAe3D;;OAEG;0BACmB,GAAG,CAAC,UAAU,YAAY,kBAAkB;CAarE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"controllers.d.ts","sourceRoot":"","sources":["../../src/registries/controllers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAG/C,MAAM,MAAM,iBAAiB,GAC3B,CAAC,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;AACpE,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC;AAE/E,QAAA,MAAM,mBAAmB,GAAI,QAAQ,IAAI,CAAC,MAAM;IAK5C;;OAEG;;IAKH;;OAEG;aACM,GAAG,CAAC,UAAU;IAavB;;OAEG;sBACe,MAAM;IAgBxB;;OAEG;aACM,GAAG,CAAC,UAAU,SAAS,iBAAiB;IAMjD;;OAEG;mBACY,MAAM,kBAAkB,oBAAoB;IAe3D;;OAEG;0BACmB,GAAG,CAAC,UAAU,YAAY,kBAAkB;CAarE,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"controllers.js","sources":["../../src/registries/controllers.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ControllerFactory =\n | ((params: { strapi: Core.Strapi }) => Core.Controller)\n | Core.Controller;\nexport type ControllerFactoryMap = Record<UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<UID.Controller, Core.Controller>;\nexport type ControllerExtendFn = (service: Core.Controller) => Core.Controller;\n\nconst controllersRegistry = (strapi: Core.Strapi) => {\n const controllers: ControllerFactoryMap = {};\n const instances: ControllerMap = {};\n\n return {\n /**\n * Returns this list of registered controllers uids\n */\n keys() {\n return Object.keys(controllers);\n },\n\n /**\n * Returns the instance of a controller. Instantiate the controller if not already done\n */\n get(uid: UID.Controller) {\n if (instances[uid]) {\n return instances[uid];\n }\n\n const controller = controllers[uid];\n\n if (controller) {\n instances[uid] = typeof controller === 'function' ? controller({ strapi }) : controller;\n return instances[uid];\n }\n },\n\n /**\n * Returns a map with all the controller in a namespace\n */\n getAll(namespace: string) {\n const filteredControllers = pickBy(controllers, (_, uid) => hasNamespace(uid, namespace));\n\n const map = {};\n for (const uid of Object.keys(filteredControllers) as UID.Controller[]) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a controller\n */\n set(uid: UID.Controller, value: ControllerFactory) {\n controllers[uid] = value;\n delete instances[uid];\n return this;\n },\n\n /**\n * Registers a map of controllers for a specific namespace\n */\n add(namespace: string, newControllers: ControllerFactoryMap) {\n for (const controllerName of Object.keys(newControllers) as UID.Controller[]) {\n const controller = newControllers[controllerName];\n const uid = addNamespace(controllerName, namespace) as UID.Controller;\n\n if (has(controllers, uid)) {\n throw new Error(`Controller ${uid} has already been registered.`);\n }\n\n controllers[uid] = controller;\n }\n\n return this;\n },\n\n /**\n * Wraps a controller to extend it\n */\n extend(controllerUID: UID.Controller, extendFn: ControllerExtendFn) {\n const currentController = this.get(controllerUID);\n\n if (!currentController) {\n throw new Error(`Controller ${controllerUID} doesn't exist`);\n }\n\n const newController = extendFn(currentController);\n instances[controllerUID] = newController;\n\n return this;\n },\n };\n};\n\nexport default controllersRegistry;\n"],"names":["controllersRegistry","strapi","controllers","instances","keys","Object","get","uid","controller","getAll","namespace","filteredControllers","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","value","add","newControllers","controllerName","addNamespace","has","Error","extend","controllerUID","extendFn","currentController","newController"],"mappings":";;;;;AAWA,MAAMA,sBAAsB,CAACC,MAAAA,GAAAA;AAC3B,IAAA,MAAMC,cAAoC,EAAC;AAC3C,IAAA,MAAMC,YAA2B,EAAC;IAElC,OAAO;AACL;;QAGAC,IAAAA,CAAAA,GAAAA;YACE,OAAOC,MAAAA,CAAOD,IAAI,CAACF,WAAAA,CAAAA;AACrB,QAAA,CAAA;AAEA;;AAEC,QACDI,KAAIC,GAAmB,EAAA;YACrB,IAAIJ,SAAS,CAACI,GAAAA,CAAI,EAAE;gBAClB,OAAOJ,SAAS,CAACI,GAAAA,CAAI;AACvB,YAAA;YAEA,MAAMC,UAAAA,GAAaN,WAAW,CAACK,GAAAA,CAAI;AAEnC,YAAA,IAAIC,UAAAA,EAAY;AACdL,gBAAAA,SAAS,CAACI,GAAAA,CAAI,GAAG,OAAOC,UAAAA,KAAe,aAAaA,UAAAA,CAAW;AAAEP,oBAAAA;iBAAO,CAAA,GAAKO,UAAAA;gBAC7E,OAAOL,SAAS,CAACI,GAAAA,CAAI;AACvB,YAAA;AACF,QAAA,CAAA;AAEA;;AAEC,QACDE,QAAOC,WAAiB,EAAA;AACtB,YAAA,MAAMC,sBAAsBC,QAAAA,CAAOV,WAAAA,EAAa,CAACW,CAAAA,EAAGN,GAAAA,GAAQO,uBAAaP,GAAAA,EAAKG,WAAAA,CAAAA,CAAAA;AAE9E,YAAA,MAAMK,MAAM,EAAC;AACb,YAAA,KAAK,MAAMR,GAAAA,IAAOF,MAAAA,CAAOD,IAAI,CAACO,mBAAAA,CAAAA,CAA0C;gBACtEN,MAAAA,CAAOW,cAAc,CAACD,GAAAA,EAAKR,GAAAA,EAAK;oBAC9BU,UAAAA,EAAY,IAAA;oBACZX,GAAAA,EAAK,IAAA;wBACH,OAAO,IAAI,CAACA,GAAG,CAACC,GAAAA,CAAAA;AAClB,oBAAA;AACF,iBAAA,CAAA;AACF,YAAA;YAEA,OAAOQ,GAAAA;AACT,QAAA,CAAA;AAEA;;QAGAG,GAAAA,CAAAA,CAAIX,GAAmB,EAAEY,KAAwB,EAAA;YAC/CjB,WAAW,CAACK,IAAI,GAAGY,KAAAA;YACnB,OAAOhB,SAAS,CAACI,GAAAA,CAAI;AACrB,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAa,GAAAA,CAAAA,CAAIV,WAAiB,EAAEW,cAAoC,EAAA;AACzD,YAAA,KAAK,MAAMC,cAAAA,IAAkBjB,MAAAA,CAAOD,IAAI,CAACiB,cAAAA,CAAAA,CAAqC;gBAC5E,MAAMb,UAAAA,GAAaa,cAAc,CAACC,cAAAA,CAAe;gBACjD,MAAMf,GAAAA,GAAMgB,uBAAaD,cAAAA,EAAgBZ,WAAAA,CAAAA;gBAEzC,IAAIc,KAAAA,CAAItB,aAAaK,GAAAA,CAAAA,EAAM;AACzB,oBAAA,MAAM,IAAIkB,KAAAA,CAAM,CAAC,WAAW,EAAElB,GAAAA,CAAI,6BAA6B,CAAC,CAAA;AAClE,gBAAA;gBAEAL,WAAW,CAACK,IAAI,GAAGC,UAAAA;AACrB,YAAA;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAA;AAEA;;QAGAkB,MAAAA,CAAAA,CAAOC,aAA6B,EAAEC,QAA4B,EAAA;AAChE,YAAA,MAAMC,iBAAAA,GAAoB,IAAI,CAACvB,GAAG,CAACqB,aAAAA,CAAAA;AAEnC,YAAA,IAAI,CAACE,iBAAAA,EAAmB;AACtB,gBAAA,MAAM,IAAIJ,KAAAA,CAAM,CAAC,WAAW,EAAEE,aAAAA,CAAc,cAAc,CAAC,CAAA;AAC7D,YAAA;AAEA,YAAA,MAAMG,gBAAgBF,QAAAA,CAASC,iBAAAA,CAAAA;YAC/B1B,SAAS,CAACwB,cAAc,GAAGG,aAAAA;AAE3B,YAAA,OAAO,IAAI;AACb,QAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"controllers.js","sources":["../../src/registries/controllers.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ControllerFactory =\n ((params: { strapi: Core.Strapi }) => Core.Controller) | Core.Controller;\nexport type ControllerFactoryMap = Record<UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<UID.Controller, Core.Controller>;\nexport type ControllerExtendFn = (service: Core.Controller) => Core.Controller;\n\nconst controllersRegistry = (strapi: Core.Strapi) => {\n const controllers: ControllerFactoryMap = {};\n const instances: ControllerMap = {};\n\n return {\n /**\n * Returns this list of registered controllers uids\n */\n keys() {\n return Object.keys(controllers);\n },\n\n /**\n * Returns the instance of a controller. Instantiate the controller if not already done\n */\n get(uid: UID.Controller) {\n if (instances[uid]) {\n return instances[uid];\n }\n\n const controller = controllers[uid];\n\n if (controller) {\n instances[uid] = typeof controller === 'function' ? controller({ strapi }) : controller;\n return instances[uid];\n }\n },\n\n /**\n * Returns a map with all the controller in a namespace\n */\n getAll(namespace: string) {\n const filteredControllers = pickBy(controllers, (_, uid) => hasNamespace(uid, namespace));\n\n const map = {};\n for (const uid of Object.keys(filteredControllers) as UID.Controller[]) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a controller\n */\n set(uid: UID.Controller, value: ControllerFactory) {\n controllers[uid] = value;\n delete instances[uid];\n return this;\n },\n\n /**\n * Registers a map of controllers for a specific namespace\n */\n add(namespace: string, newControllers: ControllerFactoryMap) {\n for (const controllerName of Object.keys(newControllers) as UID.Controller[]) {\n const controller = newControllers[controllerName];\n const uid = addNamespace(controllerName, namespace) as UID.Controller;\n\n if (has(controllers, uid)) {\n throw new Error(`Controller ${uid} has already been registered.`);\n }\n\n controllers[uid] = controller;\n }\n\n return this;\n },\n\n /**\n * Wraps a controller to extend it\n */\n extend(controllerUID: UID.Controller, extendFn: ControllerExtendFn) {\n const currentController = this.get(controllerUID);\n\n if (!currentController) {\n throw new Error(`Controller ${controllerUID} doesn't exist`);\n }\n\n const newController = extendFn(currentController);\n instances[controllerUID] = newController;\n\n return this;\n },\n };\n};\n\nexport default controllersRegistry;\n"],"names":["controllersRegistry","strapi","controllers","instances","keys","Object","get","uid","controller","getAll","namespace","filteredControllers","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","value","add","newControllers","controllerName","addNamespace","has","Error","extend","controllerUID","extendFn","currentController","newController"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"controllers.mjs","sources":["../../src/registries/controllers.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ControllerFactory =\n | ((params: { strapi: Core.Strapi }) => Core.Controller)\n | Core.Controller;\nexport type ControllerFactoryMap = Record<UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<UID.Controller, Core.Controller>;\nexport type ControllerExtendFn = (service: Core.Controller) => Core.Controller;\n\nconst controllersRegistry = (strapi: Core.Strapi) => {\n const controllers: ControllerFactoryMap = {};\n const instances: ControllerMap = {};\n\n return {\n /**\n * Returns this list of registered controllers uids\n */\n keys() {\n return Object.keys(controllers);\n },\n\n /**\n * Returns the instance of a controller. Instantiate the controller if not already done\n */\n get(uid: UID.Controller) {\n if (instances[uid]) {\n return instances[uid];\n }\n\n const controller = controllers[uid];\n\n if (controller) {\n instances[uid] = typeof controller === 'function' ? controller({ strapi }) : controller;\n return instances[uid];\n }\n },\n\n /**\n * Returns a map with all the controller in a namespace\n */\n getAll(namespace: string) {\n const filteredControllers = pickBy(controllers, (_, uid) => hasNamespace(uid, namespace));\n\n const map = {};\n for (const uid of Object.keys(filteredControllers) as UID.Controller[]) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a controller\n */\n set(uid: UID.Controller, value: ControllerFactory) {\n controllers[uid] = value;\n delete instances[uid];\n return this;\n },\n\n /**\n * Registers a map of controllers for a specific namespace\n */\n add(namespace: string, newControllers: ControllerFactoryMap) {\n for (const controllerName of Object.keys(newControllers) as UID.Controller[]) {\n const controller = newControllers[controllerName];\n const uid = addNamespace(controllerName, namespace) as UID.Controller;\n\n if (has(controllers, uid)) {\n throw new Error(`Controller ${uid} has already been registered.`);\n }\n\n controllers[uid] = controller;\n }\n\n return this;\n },\n\n /**\n * Wraps a controller to extend it\n */\n extend(controllerUID: UID.Controller, extendFn: ControllerExtendFn) {\n const currentController = this.get(controllerUID);\n\n if (!currentController) {\n throw new Error(`Controller ${controllerUID} doesn't exist`);\n }\n\n const newController = extendFn(currentController);\n instances[controllerUID] = newController;\n\n return this;\n },\n };\n};\n\nexport default controllersRegistry;\n"],"names":["controllersRegistry","strapi","controllers","instances","keys","Object","get","uid","controller","getAll","namespace","filteredControllers","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","value","add","newControllers","controllerName","addNamespace","has","Error","extend","controllerUID","extendFn","currentController","newController"],"mappings":"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"}
1
+ {"version":3,"file":"controllers.mjs","sources":["../../src/registries/controllers.ts"],"sourcesContent":["import { has, pickBy } from 'lodash';\nimport type { Core, UID } from '@strapi/types';\nimport { addNamespace, hasNamespace } from './namespace';\n\nexport type ControllerFactory =\n ((params: { strapi: Core.Strapi }) => Core.Controller) | Core.Controller;\nexport type ControllerFactoryMap = Record<UID.Controller, ControllerFactory>;\nexport type ControllerMap = Record<UID.Controller, Core.Controller>;\nexport type ControllerExtendFn = (service: Core.Controller) => Core.Controller;\n\nconst controllersRegistry = (strapi: Core.Strapi) => {\n const controllers: ControllerFactoryMap = {};\n const instances: ControllerMap = {};\n\n return {\n /**\n * Returns this list of registered controllers uids\n */\n keys() {\n return Object.keys(controllers);\n },\n\n /**\n * Returns the instance of a controller. Instantiate the controller if not already done\n */\n get(uid: UID.Controller) {\n if (instances[uid]) {\n return instances[uid];\n }\n\n const controller = controllers[uid];\n\n if (controller) {\n instances[uid] = typeof controller === 'function' ? controller({ strapi }) : controller;\n return instances[uid];\n }\n },\n\n /**\n * Returns a map with all the controller in a namespace\n */\n getAll(namespace: string) {\n const filteredControllers = pickBy(controllers, (_, uid) => hasNamespace(uid, namespace));\n\n const map = {};\n for (const uid of Object.keys(filteredControllers) as UID.Controller[]) {\n Object.defineProperty(map, uid, {\n enumerable: true,\n get: () => {\n return this.get(uid);\n },\n });\n }\n\n return map;\n },\n\n /**\n * Registers a controller\n */\n set(uid: UID.Controller, value: ControllerFactory) {\n controllers[uid] = value;\n delete instances[uid];\n return this;\n },\n\n /**\n * Registers a map of controllers for a specific namespace\n */\n add(namespace: string, newControllers: ControllerFactoryMap) {\n for (const controllerName of Object.keys(newControllers) as UID.Controller[]) {\n const controller = newControllers[controllerName];\n const uid = addNamespace(controllerName, namespace) as UID.Controller;\n\n if (has(controllers, uid)) {\n throw new Error(`Controller ${uid} has already been registered.`);\n }\n\n controllers[uid] = controller;\n }\n\n return this;\n },\n\n /**\n * Wraps a controller to extend it\n */\n extend(controllerUID: UID.Controller, extendFn: ControllerExtendFn) {\n const currentController = this.get(controllerUID);\n\n if (!currentController) {\n throw new Error(`Controller ${controllerUID} doesn't exist`);\n }\n\n const newController = extendFn(currentController);\n instances[controllerUID] = newController;\n\n return this;\n },\n };\n};\n\nexport default controllersRegistry;\n"],"names":["controllersRegistry","strapi","controllers","instances","keys","Object","get","uid","controller","getAll","namespace","filteredControllers","pickBy","_","hasNamespace","map","defineProperty","enumerable","set","value","add","newControllers","controllerName","addNamespace","has","Error","extend","controllerUID","extendFn","currentController","newController"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  var stega = require('@vercel/stega');
4
4
  var strapiUtils = require('@strapi/utils');
5
5
 
6
- const ENCODABLE_TYPES = [
6
+ const ENCODABLE_TYPES = new Set([
7
7
  'string',
8
8
  'text',
9
9
  'richtext',
@@ -18,9 +18,9 @@ const ENCODABLE_TYPES = [
18
18
  'media',
19
19
  'email',
20
20
  'password'
21
- ];
21
+ ]);
22
22
  // TODO: use a centralized store for these fields that would be shared with the CM and CTB
23
- const EXCLUDED_FIELDS = [
23
+ const EXCLUDED_FIELDS = new Set([
24
24
  'id',
25
25
  'documentId',
26
26
  'locale',
@@ -30,7 +30,7 @@ const EXCLUDED_FIELDS = [
30
30
  'created_at',
31
31
  'updated_at',
32
32
  'publishedAt'
33
- ];
33
+ ]);
34
34
  const isObject = (value)=>{
35
35
  return typeof value === 'object' && value !== null;
36
36
  };
@@ -185,7 +185,7 @@ const createContentSourceMapsService = (strapi)=>{
185
185
  return data;
186
186
  }
187
187
  return strapiUtils.traverseEntity(({ key, value, attribute, schema, path, parent }, { set })=>{
188
- if (!attribute || EXCLUDED_FIELDS.includes(key)) {
188
+ if (!attribute || EXCLUDED_FIELDS.has(key)) {
189
189
  return;
190
190
  }
191
191
  if (attribute.type === 'blocks' && Array.isArray(value)) {
@@ -199,7 +199,7 @@ const createContentSourceMapsService = (strapi)=>{
199
199
  }));
200
200
  return;
201
201
  }
202
- if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
202
+ if (ENCODABLE_TYPES.has(attribute.type) && typeof value === 'string') {
203
203
  // For inner fields of a multi-media field's items (e.g. `medias.0.url`),
204
204
  // drop the array index so all items share the same encoded path. The
205
205
  // preview groups them under one highlight and opens the multi-media
@@ -1 +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';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\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 * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\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\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\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, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}
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';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nconst ENCODABLE_TYPES = new Set([\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 * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\n */\n]);\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = new Set([\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\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\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, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.has(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.has(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","Set","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","has","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { vercelStegaCombine } from '@vercel/stega';
2
2
  import { traverseEntity } from '@strapi/utils';
3
3
 
4
- const ENCODABLE_TYPES = [
4
+ const ENCODABLE_TYPES = new Set([
5
5
  'string',
6
6
  'text',
7
7
  'richtext',
@@ -16,9 +16,9 @@ const ENCODABLE_TYPES = [
16
16
  'media',
17
17
  'email',
18
18
  'password'
19
- ];
19
+ ]);
20
20
  // TODO: use a centralized store for these fields that would be shared with the CM and CTB
21
- const EXCLUDED_FIELDS = [
21
+ const EXCLUDED_FIELDS = new Set([
22
22
  'id',
23
23
  'documentId',
24
24
  'locale',
@@ -28,7 +28,7 @@ const EXCLUDED_FIELDS = [
28
28
  'created_at',
29
29
  'updated_at',
30
30
  'publishedAt'
31
- ];
31
+ ]);
32
32
  const isObject = (value)=>{
33
33
  return typeof value === 'object' && value !== null;
34
34
  };
@@ -183,7 +183,7 @@ const createContentSourceMapsService = (strapi)=>{
183
183
  return data;
184
184
  }
185
185
  return traverseEntity(({ key, value, attribute, schema, path, parent }, { set })=>{
186
- if (!attribute || EXCLUDED_FIELDS.includes(key)) {
186
+ if (!attribute || EXCLUDED_FIELDS.has(key)) {
187
187
  return;
188
188
  }
189
189
  if (attribute.type === 'blocks' && Array.isArray(value)) {
@@ -197,7 +197,7 @@ const createContentSourceMapsService = (strapi)=>{
197
197
  }));
198
198
  return;
199
199
  }
200
- if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {
200
+ if (ENCODABLE_TYPES.has(attribute.type) && typeof value === 'string') {
201
201
  // For inner fields of a multi-media field's items (e.g. `medias.0.url`),
202
202
  // drop the array index so all items share the same encoded path. The
203
203
  // preview groups them under one highlight and opens the multi-media
@@ -1 +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';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\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 * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\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\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\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, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.includes(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.includes(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","includes","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}
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';\nimport type { FieldContentSourceMap } from '@strapi/admin/strapi-admin';\n\nconst ENCODABLE_TYPES = new Set([\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 * - integer, float and decimal: number\n * - boolean: boolean (believe it or not)\n * - uid: can be stringified but would mess up URLs\n *\n * The blocks type is an array of nodes — handled in a dedicated branch below\n * because it requires walking the AST to encode the first text leaf of each visual block.\n */\n]);\n\n// TODO: use a centralized store for these fields that would be shared with the CM and CTB\nconst EXCLUDED_FIELDS = new Set([\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\ntype BlocksEncodeMetadata = Omit<FieldContentSourceMap, 'path' | 'type'> & { fieldPath: string };\n\ntype EncodeFieldFn = (text: string, metadata: FieldContentSourceMap) => string;\n\nconst isObject = (value: unknown): value is Record<string, any> => {\n return typeof value === 'object' && value !== null;\n};\n\nconst blocksFieldMetadata = (metadata: BlocksEncodeMetadata): FieldContentSourceMap => ({\n ...metadata,\n path: metadata.fieldPath,\n type: 'blocks',\n});\n\n/**\n * Walk a subtree depth-first and stega-encode the first `{ type: 'text', text }` leaf only.\n */\nconst encodeFirstTextLeaf = (\n node: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): { node: unknown; encoded: boolean } => {\n if (!isObject(node)) {\n return { node, encoded: false };\n }\n\n if (node.type === 'text' && typeof node.text === 'string') {\n return {\n node: {\n ...node,\n text: encodeField(node.text, blocksFieldMetadata(metadata)),\n },\n encoded: true,\n };\n }\n\n if (Array.isArray(node.children)) {\n let encoded = false;\n const children = node.children.map((child) => {\n if (encoded) {\n return child;\n }\n\n const result = encodeFirstTextLeaf(child, metadata, encodeField);\n encoded = result.encoded;\n return result.node;\n });\n\n return {\n node: { ...node, children },\n encoded,\n };\n }\n\n return { node, encoded: false };\n};\n\nconst encodeListBlock = (\n listNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n const children = (listNode.children as unknown[]).map((child) => {\n if (!isObject(child)) {\n return child;\n }\n\n if (child.type === 'list-item') {\n return encodeFirstTextLeaf(child, metadata, encodeField).node;\n }\n\n if (child.type === 'list') {\n return encodeListBlock(child, metadata, encodeField);\n }\n\n return child;\n });\n\n return { ...listNode, children };\n};\n\nconst encodeImageBlock = (\n imageNode: Record<string, unknown>,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): Record<string, unknown> => {\n if (!isObject(imageNode.image)) {\n return imageNode;\n }\n\n const { alternativeText } = imageNode.image as Record<string, unknown>;\n // Encode the alt text (not the URL). Encoding the URL corrupts the src attribute and can\n // cause the preview highlight to expand across the entire page. The alt attribute is a\n // safe target: it's visible to the previewScript via getAttribute and never used as a URL.\n // Only encode when alternativeText is a non-empty string — images with no alt text get\n // no stega marker and won't independently trigger the highlight, but the blocks field\n // as a whole remains highlightable via its other (text) blocks.\n if (typeof alternativeText !== 'string' || alternativeText.length === 0) {\n return imageNode;\n }\n\n return {\n ...imageNode,\n image: {\n ...(imageNode.image as Record<string, unknown>),\n alternativeText: encodeField(alternativeText, blocksFieldMetadata(metadata)),\n },\n };\n};\n\n/**\n * Pure transformation over a blocks AST. Injects one stega marker per visual block\n * (first text leaf, or image alt text) using the blocks field path for all markers.\n * Code blocks are skipped entirely.\n */\nconst encodeBlocks = (\n blocks: unknown,\n metadata: BlocksEncodeMetadata,\n encodeField: EncodeFieldFn\n): unknown => {\n if (!Array.isArray(blocks)) {\n return blocks;\n }\n\n return blocks.map((block) => {\n if (!isObject(block)) {\n return block;\n }\n\n switch (block.type) {\n case 'code':\n // Skip encoding — encoding code content would corrupt the syntax.\n return block;\n case 'image':\n return encodeImageBlock(block, metadata, encodeField);\n case 'list':\n return encodeListBlock(block, metadata, encodeField);\n case 'paragraph':\n case 'heading':\n case 'quote':\n return encodeFirstTextLeaf(block, metadata, encodeField).node;\n default:\n return block;\n }\n });\n};\n\nconst createContentSourceMapsService = (strapi: Core.Strapi) => {\n return {\n encodeField(\n text: string,\n { kind, model, documentId, type, path, locale, fieldPath }: FieldContentSourceMap\n ) {\n /**\n * Combine all metadata into into a one string so we only have to deal with one data-atribute\n * on the frontend. Make it human readable because that data-attribute may be set manually by\n * users for fields that don't support sourcemap encoding.\n */\n const strapiSource = new URLSearchParams();\n strapiSource.set('documentId', documentId);\n strapiSource.set('type', type);\n strapiSource.set('path', path);\n\n if (model) {\n strapiSource.set('model', model);\n }\n if (kind) {\n strapiSource.set('kind', kind);\n }\n if (locale) {\n strapiSource.set('locale', locale);\n }\n if (fieldPath) {\n strapiSource.set('fieldPath', fieldPath);\n }\n\n const encoded = vercelStegaCombine(\n text,\n {\n strapiSource: strapiSource.toString(),\n },\n false\n );\n\n return encoded;\n },\n\n encodeBlocks(blocks: unknown, metadata: BlocksEncodeMetadata): unknown {\n return encodeBlocks(blocks, metadata, this.encodeField.bind(this));\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, schema, path, parent }, { set }) => {\n if (!attribute || EXCLUDED_FIELDS.has(key)) {\n return;\n }\n\n if (attribute.type === 'blocks' && Array.isArray(value)) {\n const fieldPath = path.rawWithIndices!;\n set(\n key,\n this.encodeBlocks(value, {\n fieldPath,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\n return;\n }\n\n if (ENCODABLE_TYPES.has(attribute.type) && typeof value === 'string') {\n // For inner fields of a multi-media field's items (e.g. `medias.0.url`),\n // drop the array index so all items share the same encoded path. The\n // preview groups them under one highlight and opens the multi-media\n // input as a single field, matching the side editor.\n const parentAttr = parent?.attribute;\n const isInsideMultiMedia =\n parentAttr?.type === 'media' && (parentAttr as any).multiple === true;\n const encodedPath =\n isInsideMultiMedia && parent?.path?.rawWithIndices\n ? `${parent.path.rawWithIndices}.${key}`\n : path.rawWithIndices!;\n\n set(\n key,\n this.encodeField(value, {\n path: encodedPath,\n type: attribute.type,\n kind: schema.kind,\n model: schema.uid as UID.Schema,\n locale: data.locale,\n documentId: data.documentId,\n }) as any\n );\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, encodeBlocks };\nexport type { BlocksEncodeMetadata, EncodeFieldFn };\n"],"names":["ENCODABLE_TYPES","Set","EXCLUDED_FIELDS","isObject","value","blocksFieldMetadata","metadata","path","fieldPath","type","encodeFirstTextLeaf","node","encodeField","encoded","text","Array","isArray","children","map","child","result","encodeListBlock","listNode","encodeImageBlock","imageNode","image","alternativeText","length","encodeBlocks","blocks","block","createContentSourceMapsService","strapi","kind","model","documentId","locale","strapiSource","URLSearchParams","set","vercelStegaCombine","toString","bind","encodeEntry","data","schema","undefined","traverseEntity","key","attribute","parent","has","rawWithIndices","uid","parentAttr","isInsideMultiMedia","multiple","encodedPath","getModel","encodeSourceMaps","Promise","all","item","error","log"],"mappings":"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"}