@strapi/core 0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603 → 0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c

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 (162) hide show
  1. package/dist/Strapi.d.ts +1 -0
  2. package/dist/Strapi.d.ts.map +1 -1
  3. package/dist/Strapi.js +20 -4
  4. package/dist/Strapi.js.map +1 -1
  5. package/dist/Strapi.mjs +20 -4
  6. package/dist/Strapi.mjs.map +1 -1
  7. package/dist/configuration/config-loader.js.map +1 -1
  8. package/dist/configuration/config-loader.mjs.map +1 -1
  9. package/dist/configuration/urls.js.map +1 -1
  10. package/dist/configuration/urls.mjs.map +1 -1
  11. package/dist/constants.d.ts +3 -0
  12. package/dist/constants.d.ts.map +1 -0
  13. package/dist/constants.js +6 -0
  14. package/dist/constants.js.map +1 -0
  15. package/dist/constants.mjs +4 -0
  16. package/dist/constants.mjs.map +1 -0
  17. package/dist/container.js.map +1 -1
  18. package/dist/container.mjs.map +1 -1
  19. package/dist/core-api/routes/index.js.map +1 -1
  20. package/dist/core-api/routes/index.mjs.map +1 -1
  21. package/dist/core-api/routes/validation/mappers.js.map +1 -1
  22. package/dist/core-api/routes/validation/mappers.mjs.map +1 -1
  23. package/dist/core-api/routes/validation/utils.js.map +1 -1
  24. package/dist/core-api/routes/validation/utils.mjs.map +1 -1
  25. package/dist/core-api/service/collection-type.js.map +1 -1
  26. package/dist/core-api/service/collection-type.mjs.map +1 -1
  27. package/dist/core-api/service/single-type.js.map +1 -1
  28. package/dist/core-api/service/single-type.mjs.map +1 -1
  29. package/dist/domain/content-type/index.js.map +1 -1
  30. package/dist/domain/content-type/index.mjs.map +1 -1
  31. package/dist/domain/module/index.js.map +1 -1
  32. package/dist/domain/module/index.mjs.map +1 -1
  33. package/dist/ee/index.js.map +1 -1
  34. package/dist/ee/index.mjs.map +1 -1
  35. package/dist/ee/license.js +1 -2
  36. package/dist/ee/license.js.map +1 -1
  37. package/dist/ee/license.mjs +1 -2
  38. package/dist/ee/license.mjs.map +1 -1
  39. package/dist/loaders/apis.js.map +1 -1
  40. package/dist/loaders/apis.mjs.map +1 -1
  41. package/dist/loaders/components.js.map +1 -1
  42. package/dist/loaders/components.mjs.map +1 -1
  43. package/dist/loaders/plugins/get-enabled-plugins.js.map +1 -1
  44. package/dist/loaders/plugins/get-enabled-plugins.mjs.map +1 -1
  45. package/dist/loaders/plugins/index.js.map +1 -1
  46. package/dist/loaders/plugins/index.mjs.map +1 -1
  47. package/dist/loaders/src-index.js.map +1 -1
  48. package/dist/loaders/src-index.mjs.map +1 -1
  49. package/dist/middlewares/logger.js.map +1 -1
  50. package/dist/middlewares/logger.mjs.map +1 -1
  51. package/dist/middlewares/response-time.js.map +1 -1
  52. package/dist/middlewares/response-time.mjs.map +1 -1
  53. package/dist/middlewares/security.d.ts.map +1 -1
  54. package/dist/middlewares/security.js +2 -15
  55. package/dist/middlewares/security.js.map +1 -1
  56. package/dist/middlewares/security.mjs +2 -15
  57. package/dist/middlewares/security.mjs.map +1 -1
  58. package/dist/migrations/database/5.0.0-discard-drafts.d.ts +21 -7
  59. package/dist/migrations/database/5.0.0-discard-drafts.d.ts.map +1 -1
  60. package/dist/migrations/database/5.0.0-discard-drafts.js +1144 -60
  61. package/dist/migrations/database/5.0.0-discard-drafts.js.map +1 -1
  62. package/dist/migrations/database/5.0.0-discard-drafts.mjs +1145 -61
  63. package/dist/migrations/database/5.0.0-discard-drafts.mjs.map +1 -1
  64. package/dist/migrations/first-published-at.js.map +1 -1
  65. package/dist/migrations/first-published-at.mjs.map +1 -1
  66. package/dist/package.json.js +13 -12
  67. package/dist/package.json.js.map +1 -1
  68. package/dist/package.json.mjs +13 -12
  69. package/dist/package.json.mjs.map +1 -1
  70. package/dist/providers/index.d.ts.map +1 -1
  71. package/dist/providers/index.js +2 -0
  72. package/dist/providers/index.js.map +1 -1
  73. package/dist/providers/index.mjs +2 -0
  74. package/dist/providers/index.mjs.map +1 -1
  75. package/dist/providers/session-manager.d.ts +3 -0
  76. package/dist/providers/session-manager.d.ts.map +1 -0
  77. package/dist/providers/session-manager.js +23 -0
  78. package/dist/providers/session-manager.js.map +1 -0
  79. package/dist/providers/session-manager.mjs +21 -0
  80. package/dist/providers/session-manager.mjs.map +1 -0
  81. package/dist/registries/apis.js.map +1 -1
  82. package/dist/registries/apis.mjs.map +1 -1
  83. package/dist/registries/custom-fields.js.map +1 -1
  84. package/dist/registries/custom-fields.mjs.map +1 -1
  85. package/dist/registries/namespace.js.map +1 -1
  86. package/dist/registries/namespace.mjs.map +1 -1
  87. package/dist/registries/plugins.js.map +1 -1
  88. package/dist/registries/plugins.mjs.map +1 -1
  89. package/dist/registries/policies.js.map +1 -1
  90. package/dist/registries/policies.mjs.map +1 -1
  91. package/dist/services/config.js.map +1 -1
  92. package/dist/services/config.mjs.map +1 -1
  93. package/dist/services/content-api/index.js.map +1 -1
  94. package/dist/services/content-api/index.mjs.map +1 -1
  95. package/dist/services/content-api/permissions/index.js.map +1 -1
  96. package/dist/services/content-api/permissions/index.mjs.map +1 -1
  97. package/dist/services/core-store.js.map +1 -1
  98. package/dist/services/core-store.mjs.map +1 -1
  99. package/dist/services/document-service/components.d.ts +26 -1
  100. package/dist/services/document-service/components.d.ts.map +1 -1
  101. package/dist/services/document-service/components.js +16 -4
  102. package/dist/services/document-service/components.js.map +1 -1
  103. package/dist/services/document-service/components.mjs +15 -5
  104. package/dist/services/document-service/components.mjs.map +1 -1
  105. package/dist/services/document-service/repository.js +1 -1
  106. package/dist/services/document-service/repository.js.map +1 -1
  107. package/dist/services/document-service/repository.mjs +1 -1
  108. package/dist/services/document-service/repository.mjs.map +1 -1
  109. package/dist/services/document-service/transform/fields.js.map +1 -1
  110. package/dist/services/document-service/transform/fields.mjs.map +1 -1
  111. package/dist/services/document-service/transform/id-map.js.map +1 -1
  112. package/dist/services/document-service/transform/id-map.mjs.map +1 -1
  113. package/dist/services/document-service/utils/clean-component-join-table.d.ts +7 -0
  114. package/dist/services/document-service/utils/clean-component-join-table.d.ts.map +1 -0
  115. package/dist/services/document-service/utils/clean-component-join-table.js +145 -0
  116. package/dist/services/document-service/utils/clean-component-join-table.js.map +1 -0
  117. package/dist/services/document-service/utils/clean-component-join-table.mjs +143 -0
  118. package/dist/services/document-service/utils/clean-component-join-table.mjs.map +1 -0
  119. package/dist/services/entity-service/index.js.map +1 -1
  120. package/dist/services/entity-service/index.mjs.map +1 -1
  121. package/dist/services/entity-validator/blocks-validator.js.map +1 -1
  122. package/dist/services/entity-validator/blocks-validator.mjs.map +1 -1
  123. package/dist/services/entity-validator/index.js.map +1 -1
  124. package/dist/services/entity-validator/index.mjs.map +1 -1
  125. package/dist/services/metrics/sender.d.ts.map +1 -1
  126. package/dist/services/metrics/sender.js +2 -1
  127. package/dist/services/metrics/sender.js.map +1 -1
  128. package/dist/services/metrics/sender.mjs +2 -1
  129. package/dist/services/metrics/sender.mjs.map +1 -1
  130. package/dist/services/server/compose-endpoint.js.map +1 -1
  131. package/dist/services/server/compose-endpoint.mjs.map +1 -1
  132. package/dist/services/server/index.js.map +1 -1
  133. package/dist/services/server/index.mjs.map +1 -1
  134. package/dist/services/server/middleware.js.map +1 -1
  135. package/dist/services/server/middleware.mjs.map +1 -1
  136. package/dist/services/server/register-routes.js.map +1 -1
  137. package/dist/services/server/register-routes.mjs.map +1 -1
  138. package/dist/services/server/routing.js.map +1 -1
  139. package/dist/services/server/routing.mjs.map +1 -1
  140. package/dist/services/session-manager.d.ts +167 -0
  141. package/dist/services/session-manager.d.ts.map +1 -0
  142. package/dist/services/session-manager.js +529 -0
  143. package/dist/services/session-manager.js.map +1 -0
  144. package/dist/services/session-manager.mjs +526 -0
  145. package/dist/services/session-manager.mjs.map +1 -0
  146. package/dist/services/webhook-runner.js +2 -2
  147. package/dist/services/webhook-runner.js.map +1 -1
  148. package/dist/services/webhook-runner.mjs +2 -2
  149. package/dist/services/webhook-runner.mjs.map +1 -1
  150. package/dist/services/worker-queue.js +2 -2
  151. package/dist/services/worker-queue.js.map +1 -1
  152. package/dist/services/worker-queue.mjs +2 -2
  153. package/dist/services/worker-queue.mjs.map +1 -1
  154. package/dist/utils/fetch.js.map +1 -1
  155. package/dist/utils/fetch.mjs.map +1 -1
  156. package/dist/utils/filepath-to-prop-path.js.map +1 -1
  157. package/dist/utils/filepath-to-prop-path.mjs.map +1 -1
  158. package/dist/utils/load-config-file.js.map +1 -1
  159. package/dist/utils/load-config-file.mjs.map +1 -1
  160. package/dist/utils/startup-logger.js.map +1 -1
  161. package/dist/utils/startup-logger.mjs.map +1 -1
  162. package/package.json +13 -12
@@ -1 +1 @@
1
- {"version":3,"file":"5.0.0-discard-drafts.mjs","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"sourcesContent":["/**\n * This migration is responsible for creating the draft counterpart for all the entries that were in a published state.\n *\n * In v4, entries could either be in a draft or published state, but not both at the same time.\n * In v5, we introduced the concept of document, and an entry can be in a draft or published state.\n *\n * This means the migration needs to create the draft counterpart if an entry was published.\n *\n * This migration performs the following steps:\n * 1. Creates draft entries for all published entries, without it's components, dynamic zones or relations.\n * 2. Using the document service, discard those same drafts to copy its relations.\n */\n\n/* eslint-disable no-continue */\nimport type { UID } from '@strapi/types';\nimport type { Database, Migration } from '@strapi/database';\nimport { async, contentTypes } from '@strapi/utils';\nimport { createDocumentService } from '../../services/document-service';\n\ntype DocumentVersion = { documentId: string; locale: string };\ntype Knex = Parameters<Migration['up']>[0];\n\n/**\n * Check if the model has draft and publish enabled.\n */\nconst hasDraftAndPublish = async (trx: Knex, meta: any) => {\n const hasTable = await trx.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n return false;\n }\n\n const uid = meta.uid as UID.ContentType;\n const model = strapi.getModel(uid);\n const hasDP = contentTypes.hasDraftAndPublish(model);\n if (!hasDP) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Copy all the published entries to draft entries, without it's components, dynamic zones or relations.\n * This ensures all necessary draft's exist before copying it's relations.\n */\nasync function copyPublishedEntriesToDraft({\n db,\n trx,\n uid,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n}) {\n // Extract all scalar attributes to use in the insert query\n const meta = db.metadata.get(uid);\n\n // Get scalar attributes that will be copied over the new draft\n const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute: any) => {\n if (['id'].includes(attribute.columnName)) {\n return acc;\n }\n\n if (contentTypes.isScalarAttribute(attribute)) {\n acc.push(attribute.columnName);\n }\n\n return acc;\n }, [] as string[]);\n\n /**\n * Query to copy the published entries into draft entries.\n *\n * INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n * SELECT columnName1, columnName2, columnName3, ...\n * FROM tableName\n */\n await trx\n // INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n .into(\n trx.raw(`?? (${scalarAttributes.map(() => `??`).join(', ')})`, [\n meta.tableName,\n ...scalarAttributes,\n ])\n )\n .insert((subQb: typeof trx) => {\n // SELECT columnName1, columnName2, columnName3, ...\n subQb\n .select(\n ...scalarAttributes.map((att: string) => {\n // Override 'publishedAt' and 'updatedAt' attributes\n if (att === 'published_at') {\n return trx.raw('NULL as ??', 'published_at');\n }\n\n return att;\n })\n )\n .from(meta.tableName)\n // Only select entries that were published\n .whereNotNull('published_at');\n });\n}\n\n/**\n * Load a batch of versions to discard.\n *\n * Versions with only a draft version will be ignored.\n * Only versions with a published version (which always have a draft version) will be discarded.\n */\nexport async function* getBatchToDiscard({\n db,\n trx,\n uid,\n defaultBatchSize = 1000,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n defaultBatchSize?: number;\n}) {\n const client = db.config.connection.client;\n const isSQLite =\n typeof client === 'string' && ['sqlite', 'sqlite3', 'better-sqlite3'].includes(client);\n\n // The SQLite documentation states that the maximum number of terms in a\n // compound SELECT statement is 500 by default.\n // See: https://www.sqlite.org/limits.html\n // To ensure a successful migration, we limit the batch size to 500 for SQLite.\n const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n // Look for the published entries to discard\n const batch: DocumentVersion[] = await db\n .queryBuilder(uid)\n .select(['id', 'documentId', 'locale'])\n .where({ publishedAt: { $ne: null } })\n .limit(batchSize)\n .offset(offset)\n .orderBy('id')\n .transacting(trx)\n .execute();\n\n if (batch.length < batchSize) {\n hasMore = false;\n }\n\n offset += batchSize;\n yield batch;\n }\n}\n\n/**\n * 2 pass migration to create the draft entries for all the published entries.\n * And then discard the drafts to copy the relations.\n */\nconst migrateUp = async (trx: Knex, db: Database) => {\n const dpModels = [];\n for (const meta of db.metadata.values()) {\n const hasDP = await hasDraftAndPublish(trx, meta);\n if (hasDP) {\n dpModels.push(meta);\n }\n }\n\n /**\n * Create plain draft entries for all the entries that were published.\n */\n for (const model of dpModels) {\n await copyPublishedEntriesToDraft({ db, trx, uid: model.uid });\n }\n\n /**\n * Discard the drafts will copy the relations from the published entries to the newly created drafts.\n *\n * Load a batch of entries (batched to prevent loading millions of rows at once ),\n * and discard them using the document service.\n *\n * NOTE: This is using a custom document service without any validations,\n * to prevent the migration from failing if users already had invalid data in V4.\n * E.g. @see https://github.com/strapi/strapi/issues/21583\n */\n const documentService = createDocumentService(strapi, {\n async validateEntityCreation(_, data) {\n return data;\n },\n async validateEntityUpdate(_, data) {\n // Data can be partially empty on partial updates\n // This migration doesn't trigger any update (or partial update),\n // so it's safe to return the data as is.\n return data as any;\n },\n });\n\n for (const model of dpModels) {\n const discardDraft = async (entry: DocumentVersion) =>\n documentService(model.uid as UID.ContentType).discardDraft({\n documentId: entry.documentId,\n locale: entry.locale,\n });\n\n for await (const batch of getBatchToDiscard({ db, trx, uid: model.uid })) {\n // NOTE: concurrency had to be disabled to prevent a race condition with self-references\n // TODO: improve performance in a safe way\n await async.map(batch, discardDraft, { concurrency: 1 });\n }\n }\n};\n\nexport const discardDocumentDrafts: Migration = {\n name: 'core::5.0.0-discard-drafts',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["hasDraftAndPublish","trx","meta","hasTable","schema","tableName","uid","model","strapi","getModel","hasDP","contentTypes","copyPublishedEntriesToDraft","db","metadata","get","scalarAttributes","Object","values","attributes","reduce","acc","attribute","includes","columnName","isScalarAttribute","push","into","raw","map","join","insert","subQb","select","att","from","whereNotNull","getBatchToDiscard","defaultBatchSize","client","config","connection","isSQLite","batchSize","Math","min","offset","hasMore","batch","queryBuilder","where","publishedAt","$ne","limit","orderBy","transacting","execute","length","migrateUp","dpModels","documentService","createDocumentService","validateEntityCreation","_","data","validateEntityUpdate","discardDraft","entry","documentId","locale","async","concurrency","discardDocumentDrafts","name","up","down","Error"],"mappings":"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"}
1
+ {"version":3,"file":"5.0.0-discard-drafts.mjs","sources":["../../../src/migrations/database/5.0.0-discard-drafts.ts"],"sourcesContent":["/**\n * Migration overview\n * ===================\n * 1. Create bare draft rows for every published entry, cloning only scalar fields (no relations/components yet).\n * We do this with a single INSERT … SELECT per content type to avoid touching the document service for every single v4 entry.\n *\n * 2. Rewire all relations so the newly created drafts behave exactly like calling `documentService.discardDraft()`\n * on every published entry:\n * - Join-table relations (self, manyToMany, etc.) are copied in bulk.\n * - Foreign keys (joinColumn relations) are updated so draft rows point to draft targets.\n * - Component relations are copied while respecting the discard logic: each draft gets its own component instance,\n * and the component’s relations (including nested components) are remapped to draft targets.\n *\n * 3. Components are duplicated at the database layer (new component rows + join-table rows). We deliberately clone\n * instead of sharing component IDs so that draft edits don’t mutate published data.\n *\n * Why we do it this way\n * ----------------------\n * • Efficiency: calling the document service per entry would issue several queries per relation/component. The SQL\n * batches mirror the service’s behavior but execute in O(content types × batches), so the migration scales to\n * millions of entries.\n\n * • Memory safety: any caches that track per-record information (component parent lookups, clone maps) are scoped to\n * a single batch of 1,000 entries. Schema-level caches (component metadata, join table names) remain global because\n * they’re tiny and reused.\n */\n\n/* eslint-disable no-continue */\nimport type { UID } from '@strapi/types';\nimport type { Database, Migration } from '@strapi/database';\nimport { createId } from '@paralleldrive/cuid2';\nimport { contentTypes } from '@strapi/utils';\nimport createDebug from 'debug';\nimport {\n getComponentJoinTableName,\n getComponentJoinColumnEntityName,\n getComponentJoinColumnInverseName,\n getComponentTypeColumn,\n} from '../../utils/transform-content-types-to-models';\n\ntype DocumentVersion = { documentId: string; locale: string };\ntype Knex = Parameters<Migration['up']>[0];\n\n/**\n * Check if the model has draft and publish enabled.\n */\nconst hasDraftAndPublish = async (trx: Knex, meta: any) => {\n const hasTable = await trx.schema.hasTable(meta.tableName);\n\n if (!hasTable) {\n return false;\n }\n\n const uid = meta.uid as UID.ContentType;\n const model = strapi.getModel(uid);\n const hasDP = contentTypes.hasDraftAndPublish(model);\n if (!hasDP) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Copy all the published entries to draft entries, without it's components, dynamic zones or relations.\n * This ensures all necessary draft's exist before copying it's relations.\n */\nasync function copyPublishedEntriesToDraft({\n db,\n trx,\n uid,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n}) {\n // Extract all scalar attributes to use in the insert query\n const meta = db.metadata.get(uid);\n\n // Get scalar attributes that will be copied over the new draft\n const scalarAttributes = Object.values(meta.attributes).reduce((acc, attribute: any) => {\n if (['id'].includes(attribute.columnName)) {\n return acc;\n }\n\n if (contentTypes.isScalarAttribute(attribute)) {\n acc.push(attribute.columnName);\n }\n\n return acc;\n }, [] as string[]);\n\n /**\n * Query to copy the published entries into draft entries.\n *\n * INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n * SELECT columnName1, columnName2, columnName3, ...\n * FROM tableName\n */\n await trx\n // INSERT INTO tableName (columnName1, columnName2, columnName3, ...)\n .into(\n trx.raw(`?? (${scalarAttributes.map(() => `??`).join(', ')})`, [\n meta.tableName,\n ...scalarAttributes,\n ])\n )\n .insert((subQb: typeof trx) => {\n // SELECT columnName1, columnName2, columnName3, ...\n subQb\n .select(\n ...scalarAttributes.map((att: string) => {\n // NOTE: these literals reference Strapi's built-in system columns. They never get shortened by\n // the identifier migration (5.0.0-01-convert-identifiers-long-than-max-length) so we can safely\n // compare/use them directly here.\n if (att === 'published_at') {\n return trx.raw('NULL as ??', 'published_at');\n }\n\n return att;\n })\n )\n .from(meta.tableName)\n // Only select entries that were published\n .whereNotNull('published_at');\n });\n}\n\n/**\n * Copy relations from published entries to draft entries using direct database queries.\n * This replaces the need to call discardDraft for each entry.\n */\nasync function copyRelationsToDrafts({ db, trx, uid }: { db: Database; trx: Knex; uid: string }) {\n const meta = db.metadata.get(uid);\n if (!meta) {\n return;\n }\n\n // Create mapping from published entry ID to draft entry ID\n const publishedToDraftMap = await buildPublishedToDraftMap({ trx, uid, meta });\n\n if (!publishedToDraftMap || publishedToDraftMap.size === 0) {\n return;\n }\n\n // Copy relations for this content type\n await copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n });\n\n // Copy relations from other content types that target this content type\n await copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n });\n\n // Copy relations from this content type that target other content types (category 3)\n await copyRelationsToOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n });\n\n // Copy component relations from published entries to draft entries\n await copyComponentRelations({\n trx,\n uid,\n publishedToDraftMap,\n });\n}\n\n/**\n * Helper to batch process arrays in chunks\n */\nfunction chunkArray<T>(array: T[], chunkSize: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += chunkSize) {\n chunks.push(array.slice(i, i + chunkSize));\n }\n return chunks;\n}\n\nconst applyJoinTableOrdering = (qb: any, joinTable: any, sourceColumnName: string) => {\n const seenColumns = new Set<string>();\n\n const enqueueColumn = (column?: string, direction: 'asc' | 'desc' = 'asc') => {\n if (!column || seenColumns.has(column)) {\n return;\n }\n\n seenColumns.add(column);\n qb.orderBy(column, direction);\n };\n\n enqueueColumn(sourceColumnName, 'asc');\n\n if (Array.isArray(joinTable?.orderBy)) {\n for (const clause of joinTable.orderBy) {\n if (!clause || typeof clause !== 'object') {\n continue;\n }\n\n const [column, direction] = Object.entries(clause)[0] ?? [];\n if (!column) {\n continue;\n }\n\n const normalizedDirection =\n typeof direction === 'string' && direction.toLowerCase() === 'desc' ? 'desc' : 'asc';\n enqueueColumn(column, normalizedDirection as 'asc' | 'desc');\n }\n }\n\n enqueueColumn(joinTable?.orderColumnName, 'asc');\n enqueueColumn(joinTable?.orderColumn, 'asc');\n enqueueColumn('id', 'asc');\n};\n\ntype ParentSchemaInfo = { uid: string; collectionName?: string };\ntype ComponentParentInstance = { uid: string; parentId: number | string };\n\nconst componentParentSchemasCache = new Map<string, ParentSchemaInfo[]>();\nconst joinTableExistsCache = new Map<string, boolean>();\nconst componentMetaCache = new Map<string, any>();\n\nconst DUPLICATE_ERROR_CODES = new Set(['23505', 'ER_DUP_ENTRY', 'SQLITE_CONSTRAINT_UNIQUE']);\n\nconst debug = createDebug('strapi::migration::discard-drafts');\n\nconst normalizeId = (value: any): number | null => {\n if (value == null) {\n return null;\n }\n\n const num = Number(value);\n\n if (Number.isNaN(num)) {\n return null;\n }\n\n return num;\n};\n\nconst getMappedValue = <T>(map: Map<number, T> | null | undefined, key: any): T | undefined => {\n if (!map) {\n return undefined;\n }\n\n const normalized = normalizeId(key);\n\n if (normalized == null) {\n return undefined;\n }\n\n return map.get(normalized);\n};\n\nconst resolveInsertedId = (insertResult: any): number | null => {\n if (insertResult == null) {\n return null;\n }\n\n if (typeof insertResult === 'number') {\n return insertResult;\n }\n\n if (Array.isArray(insertResult)) {\n if (insertResult.length === 0) {\n return null;\n }\n\n const first = insertResult[0];\n if (first == null) {\n return null;\n }\n\n if (typeof first === 'number') {\n return first;\n }\n\n if (typeof first === 'object') {\n if ('id' in first) {\n return Number(first.id);\n }\n\n const idKey = Object.keys(first).find((key) => key.toLowerCase() === 'id');\n if (idKey) {\n return Number((first as Record<string, any>)[idKey]);\n }\n }\n }\n\n if (typeof insertResult === 'object' && 'id' in insertResult) {\n return Number(insertResult.id);\n }\n\n return null;\n};\n\nconst isDuplicateEntryError = (error: any): boolean => {\n if (!error) {\n return false;\n }\n\n if (DUPLICATE_ERROR_CODES.has(error.code)) {\n return true;\n }\n\n const message = typeof error.message === 'string' ? error.message : '';\n return message.includes('duplicate key') || message.includes('UNIQUE constraint failed');\n};\n\nconst insertRowWithDuplicateHandling = async (\n trx: Knex,\n tableName: string,\n row: Record<string, any>,\n context: Record<string, any> = {}\n) => {\n try {\n const client = trx.client.config.client;\n\n if (\n client === 'postgres' ||\n client === 'pg' ||\n client === 'sqlite3' ||\n client === 'better-sqlite3'\n ) {\n await trx(tableName).insert(row).onConflict().ignore();\n return;\n }\n\n if (client === 'mysql' || client === 'mysql2') {\n await trx.raw(`INSERT IGNORE INTO ?? SET ?`, [tableName, row]);\n return;\n }\n\n await trx(tableName).insert(row);\n } catch (error: any) {\n if (!isDuplicateEntryError(error)) {\n const details = JSON.stringify(context);\n const wrapped = new Error(\n `Failed to insert row into ${tableName}: ${error.message} | context=${details}`\n );\n (wrapped as any).cause = error;\n throw wrapped;\n }\n }\n};\n\nfunction listComponentParentSchemas(componentUid: string): ParentSchemaInfo[] {\n if (!componentParentSchemasCache.has(componentUid)) {\n const schemas = [\n ...Object.values(strapi.contentTypes),\n ...Object.values(strapi.components),\n ] as any[];\n\n const parents = schemas\n .filter((schema) => {\n if (!schema?.attributes) {\n return false;\n }\n\n return Object.values(schema.attributes).some((attr: any) => {\n if (attr.type === 'component') {\n return attr.component === componentUid;\n }\n\n if (attr.type === 'dynamiczone') {\n return attr.components?.includes(componentUid);\n }\n\n return false;\n });\n })\n .map((schema) => ({ uid: schema.uid, collectionName: schema.collectionName }));\n\n componentParentSchemasCache.set(componentUid, parents);\n }\n\n return componentParentSchemasCache.get(componentUid)!;\n}\n\nasync function ensureTableExists(trx: Knex, tableName: string): Promise<boolean> {\n if (!joinTableExistsCache.has(tableName)) {\n const exists = await trx.schema.hasTable(tableName);\n joinTableExistsCache.set(tableName, exists);\n }\n\n return joinTableExistsCache.get(tableName)!;\n}\n\ntype ComponentHierarchyCaches = {\n parentInstanceCache: Map<string, ComponentParentInstance | null>;\n ancestorDpCache: Map<string, boolean>;\n parentDpCache: Map<string, boolean>;\n};\n\nasync function findComponentParentInstance(\n trx: Knex,\n identifiers: any,\n componentUid: string,\n componentId: number | string,\n excludeUid: string | undefined,\n caches: ComponentHierarchyCaches\n): Promise<ComponentParentInstance | null> {\n const cacheKey = `${componentUid}:${componentId}:${excludeUid ?? 'ALL'}`;\n if (caches.parentInstanceCache.has(cacheKey)) {\n return caches.parentInstanceCache.get(cacheKey)!;\n }\n\n const parentComponentIdColumn = getComponentJoinColumnInverseName(identifiers);\n const parentComponentTypeColumn = getComponentTypeColumn(identifiers);\n const parentEntityIdColumn = getComponentJoinColumnEntityName(identifiers);\n\n const potentialParents = listComponentParentSchemas(componentUid).filter(\n (schema) => schema.uid !== excludeUid\n );\n\n for (const parentSchema of potentialParents) {\n if (!parentSchema.collectionName) {\n continue;\n }\n\n const parentJoinTableName = getComponentJoinTableName(parentSchema.collectionName, identifiers);\n\n try {\n if (!(await ensureTableExists(trx, parentJoinTableName))) {\n continue;\n }\n\n const parentRow = await trx(parentJoinTableName)\n .where({\n [parentComponentIdColumn]: componentId,\n [parentComponentTypeColumn]: componentUid,\n })\n .first(parentEntityIdColumn);\n\n if (parentRow) {\n const parentInstance: ComponentParentInstance = {\n uid: parentSchema.uid,\n parentId: parentRow[parentEntityIdColumn],\n };\n\n caches.parentInstanceCache.set(cacheKey, parentInstance);\n return parentInstance;\n }\n } catch {\n continue;\n }\n }\n\n caches.parentInstanceCache.set(cacheKey, null);\n return null;\n}\n\nconst getComponentMeta = (componentUid: string) => {\n if (!componentMetaCache.has(componentUid)) {\n const meta = strapi.db.metadata.get(componentUid);\n componentMetaCache.set(componentUid, meta ?? null);\n }\n\n return componentMetaCache.get(componentUid);\n};\n\nasync function hasDraftPublishAncestorForParent(\n trx: Knex,\n identifiers: any,\n parent: ComponentParentInstance,\n caches: ComponentHierarchyCaches\n): Promise<boolean> {\n const cacheKey = `${parent.uid}:${parent.parentId}`;\n if (caches.parentDpCache.has(cacheKey)) {\n return caches.parentDpCache.get(cacheKey)!;\n }\n\n const parentContentType = strapi.contentTypes[\n parent.uid as keyof typeof strapi.contentTypes\n ] as any;\n if (parentContentType) {\n const result = !!parentContentType?.options?.draftAndPublish;\n caches.parentDpCache.set(cacheKey, result);\n return result;\n }\n\n const parentComponent = strapi.components[parent.uid as keyof typeof strapi.components] as any;\n if (!parentComponent) {\n caches.parentDpCache.set(cacheKey, false);\n return false;\n }\n\n const result = await hasDraftPublishAncestorForComponent(\n trx,\n identifiers,\n parent.uid,\n parent.parentId,\n undefined,\n caches\n );\n caches.parentDpCache.set(cacheKey, result);\n return result;\n}\n\nasync function hasDraftPublishAncestorForComponent(\n trx: Knex,\n identifiers: any,\n componentUid: string,\n componentId: number | string,\n excludeUid: string | undefined,\n caches: ComponentHierarchyCaches\n): Promise<boolean> {\n const cacheKey = `${componentUid}:${componentId}:${excludeUid ?? 'ALL'}`;\n if (caches.ancestorDpCache.has(cacheKey)) {\n return caches.ancestorDpCache.get(cacheKey)!;\n }\n\n const parent = await findComponentParentInstance(\n trx,\n identifiers,\n componentUid,\n componentId,\n excludeUid,\n caches\n );\n\n if (!parent) {\n caches.ancestorDpCache.set(cacheKey, false);\n return false;\n }\n\n const result = await hasDraftPublishAncestorForParent(trx, identifiers, parent, caches);\n caches.ancestorDpCache.set(cacheKey, result);\n return result;\n}\n\nconst resolveNowValue = (trx: Knex) => {\n if (typeof trx.fn?.now === 'function') {\n return trx.fn.now();\n }\n\n return new Date();\n};\n\nasync function getDraftMapForTarget(\n trx: Knex,\n targetUid: string,\n draftMapCache: Map<string, Map<number, number> | null>\n): Promise<Map<number, number> | null> {\n if (draftMapCache.has(targetUid)) {\n return draftMapCache.get(targetUid) ?? null;\n }\n\n const targetMeta = strapi.db.metadata.get(targetUid);\n if (!targetMeta) {\n draftMapCache.set(targetUid, null);\n return null;\n }\n\n const map = await buildPublishedToDraftMap({\n trx,\n uid: targetUid,\n meta: targetMeta,\n options: { requireDraftAndPublish: true },\n });\n\n draftMapCache.set(targetUid, map ?? null);\n return map ?? null;\n}\n\nasync function mapTargetId(\n trx: Knex,\n originalId: number | string | null,\n targetUid: string | undefined,\n parentUid: string,\n parentPublishedToDraftMap: Map<number, number>,\n draftMapCache: Map<string, Map<number, number> | null>\n) {\n if (originalId == null || !targetUid) {\n return originalId;\n }\n\n if (targetUid === parentUid) {\n return parentPublishedToDraftMap.get(Number(originalId)) ?? originalId;\n }\n\n const targetMap = await getDraftMapForTarget(trx, targetUid, draftMapCache);\n if (!targetMap) {\n return originalId;\n }\n\n return targetMap.get(Number(originalId)) ?? originalId;\n}\n\nconst ensureObjectWithoutId = (row: Record<string, any>) => {\n const cloned = { ...row };\n if ('id' in cloned) {\n delete cloned.id;\n }\n return cloned;\n};\n\nasync function cloneComponentRelationJoinTables(\n trx: Knex,\n componentMeta: any,\n componentUid: string,\n originalComponentId: number,\n newComponentId: number,\n parentUid: string,\n parentPublishedToDraftMap: Map<number, number>,\n draftMapCache: Map<string, Map<number, number> | null>\n) {\n for (const attribute of Object.values(componentMeta.attributes) as any) {\n if (attribute.type !== 'relation' || !attribute.joinTable) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n const sourceColumnName = joinTable.joinColumn.name;\n const targetColumnName = joinTable.inverseJoinColumn.name;\n\n if (!componentMeta.relationsLogPrinted) {\n debug(\n `[cloneComponentRelationJoinTables] Inspecting join table ${joinTable.name} for component ${componentUid}`\n );\n componentMeta.relationsLogPrinted = true;\n }\n\n const relations = await trx(joinTable.name)\n .select('*')\n .where(sourceColumnName, originalComponentId);\n\n if (relations.length === 0) {\n continue;\n }\n\n for (const relation of relations) {\n const clonedRelation = ensureObjectWithoutId(relation);\n clonedRelation[sourceColumnName] = newComponentId;\n\n if (targetColumnName in clonedRelation) {\n const originalTargetId = clonedRelation[targetColumnName];\n clonedRelation[targetColumnName] = await mapTargetId(\n trx,\n clonedRelation[targetColumnName],\n attribute.target,\n parentUid,\n parentPublishedToDraftMap,\n draftMapCache\n );\n\n debug(\n `[cloneComponentRelationJoinTables] ${componentUid} join ${joinTable.name}: mapped ${targetColumnName} from ${originalTargetId} to ${clonedRelation[targetColumnName]} (target=${attribute.target})`\n );\n }\n\n debug(\n `[cloneComponentRelationJoinTables] inserting relation into ${joinTable.name} (component=${componentUid}, source=${newComponentId})`\n );\n\n await insertRowWithDuplicateHandling(trx, joinTable.name, clonedRelation, {\n componentUid,\n originalComponentId,\n newComponentId,\n joinTable: joinTable.name,\n sourceColumnName,\n targetColumnName,\n targetUid: attribute.target,\n parentUid,\n });\n }\n }\n}\n\nasync function cloneComponentInstance({\n trx,\n componentUid,\n componentId,\n parentUid,\n parentPublishedToDraftMap,\n draftMapCache,\n}: {\n trx: Knex;\n componentUid: string;\n componentId: number;\n parentUid: string;\n parentPublishedToDraftMap: Map<number, number>;\n draftMapCache: Map<string, Map<number, number> | null>;\n}): Promise<number> {\n const componentMeta = getComponentMeta(componentUid);\n if (!componentMeta) {\n return componentId;\n }\n\n const componentTableName = componentMeta.tableName;\n const componentPrimaryKey = Number.isNaN(Number(componentId)) ? componentId : Number(componentId);\n const componentRow = await trx(componentTableName)\n .select('*')\n .where('id', componentPrimaryKey)\n .first();\n\n if (!componentRow) {\n return componentId;\n }\n\n const newComponentRow: Record<string, any> = ensureObjectWithoutId(componentRow);\n\n // `document_id`, `created_at`, `updated_at` are Strapi system columns whose names remain stable across the\n // identifier-shortening migration, so it’s safe to check them directly here.\n if ('document_id' in newComponentRow) {\n newComponentRow.document_id = createId();\n }\n\n if ('updated_at' in newComponentRow) {\n newComponentRow.updated_at = resolveNowValue(trx);\n }\n\n if ('created_at' in newComponentRow && newComponentRow.created_at == null) {\n newComponentRow.created_at = resolveNowValue(trx);\n }\n\n for (const attribute of Object.values(componentMeta.attributes) as any) {\n if (attribute.type !== 'relation') {\n continue;\n }\n\n const joinColumn = attribute.joinColumn;\n if (!joinColumn) {\n continue;\n }\n\n const columnName = joinColumn.name;\n if (!columnName || !(columnName in newComponentRow)) {\n continue;\n }\n\n newComponentRow[columnName] = await mapTargetId(\n trx,\n newComponentRow[columnName],\n attribute.target,\n parentUid,\n parentPublishedToDraftMap,\n draftMapCache\n );\n }\n\n let insertResult;\n try {\n insertResult = await trx(componentTableName).insert(newComponentRow, ['id']);\n } catch (error: any) {\n insertResult = await trx(componentTableName).insert(newComponentRow);\n }\n\n let newComponentId = resolveInsertedId(insertResult);\n\n if (!newComponentId) {\n if ('document_id' in newComponentRow && newComponentRow.document_id) {\n const insertedRow = await trx(componentTableName)\n .select('id')\n .where('document_id', newComponentRow.document_id)\n .orderBy('id', 'desc')\n .first();\n newComponentId = insertedRow?.id ?? null;\n }\n\n if (!newComponentId) {\n const insertedRow = await trx(componentTableName).select('id').orderBy('id', 'desc').first();\n newComponentId = insertedRow?.id ?? null;\n }\n }\n\n if (!newComponentId) {\n throw new Error(`Failed to clone component ${componentUid} (id: ${componentId})`);\n }\n\n newComponentId = Number(newComponentId);\n\n if (Number.isNaN(newComponentId)) {\n throw new Error(`Invalid cloned component identifier for ${componentUid} (id: ${componentId})`);\n }\n\n await cloneComponentRelationJoinTables(\n trx,\n componentMeta,\n componentUid,\n Number(componentPrimaryKey),\n newComponentId,\n parentUid,\n parentPublishedToDraftMap,\n draftMapCache\n );\n\n return newComponentId;\n}\n\ntype DraftMapOptions = {\n requireDraftAndPublish?: boolean;\n};\n\nasync function buildPublishedToDraftMap({\n trx,\n uid,\n meta,\n options = {},\n}: {\n trx: Knex;\n uid: string;\n meta: any;\n options?: DraftMapOptions;\n}): Promise<Map<number, number> | null> {\n if (!meta) {\n return null;\n }\n\n const model = strapi.getModel(uid as UID.ContentType);\n const hasDraftAndPublishEnabled = contentTypes.hasDraftAndPublish(model);\n\n if (options.requireDraftAndPublish && !hasDraftAndPublishEnabled) {\n return null;\n }\n\n const [publishedEntries, draftEntries] = await Promise.all([\n // `document_id`, `locale`, and `published_at` are core columns that keep their exact names after the\n // identifier-shortening migration, so selecting them by literal is safe.\n trx(meta.tableName).select(['id', 'document_id', 'locale']).whereNotNull('published_at') as any,\n trx(meta.tableName).select(['id', 'document_id', 'locale']).whereNull('published_at') as any,\n ]);\n\n if (publishedEntries.length === 0 || draftEntries.length === 0) {\n return null;\n }\n\n const i18nService = strapi.plugin('i18n')?.service('content-types');\n const contentType = strapi.contentTypes[uid as keyof typeof strapi.contentTypes] as any;\n const isLocalized = i18nService?.isLocalizedContentType(contentType) ?? false;\n\n const draftByDocumentId = new Map<string, (typeof draftEntries)[0]>();\n for (const draft of draftEntries) {\n if (!draft.document_id) {\n continue;\n }\n\n const key = isLocalized ? `${draft.document_id}:${draft.locale || ''}` : draft.document_id;\n const existing = draftByDocumentId.get(key);\n if (!existing) {\n draftByDocumentId.set(key, draft);\n continue;\n }\n\n const existingId = Number(existing.id);\n const draftId = Number(draft.id);\n\n if (Number.isNaN(existingId) || Number.isNaN(draftId)) {\n draftByDocumentId.set(key, draft);\n continue;\n }\n\n if (draftId > existingId) {\n draftByDocumentId.set(key, draft);\n }\n }\n\n const publishedToDraftMap = new Map<number, number>();\n for (const published of publishedEntries) {\n if (!published.document_id) {\n continue;\n }\n\n const key = isLocalized\n ? `${published.document_id}:${published.locale || ''}`\n : published.document_id;\n\n const draft = draftByDocumentId.get(key);\n if (draft) {\n const publishedId = normalizeId(published.id);\n const draftId = normalizeId(draft.id);\n\n if (publishedId == null || draftId == null) {\n continue;\n }\n\n publishedToDraftMap.set(publishedId, draftId);\n }\n }\n\n return publishedToDraftMap.size > 0 ? publishedToDraftMap : null;\n}\n\n/**\n * Copy relations within the same content type (self-referential relations)\n */\nasync function copyRelationsForContentType({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n}) {\n const meta = strapi.db.metadata.get(uid);\n if (!meta) return;\n\n const publishedIds = Array.from(publishedToDraftMap.keys());\n\n for (const attribute of Object.values(meta.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n // Skip component join tables - they are handled by copyComponentRelations\n if (joinTable.name.includes('_cmps')) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n // Process in batches to avoid MySQL query size limits\n const publishedIdsChunks = chunkArray(publishedIds, 1000);\n\n for (const publishedIdsChunk of publishedIdsChunks) {\n // Get relations where the source is a published entry (in batches)\n const relationsQuery = trx(joinTable.name)\n .select('*')\n .whereIn(sourceColumnName, publishedIdsChunk);\n\n applyJoinTableOrdering(relationsQuery, joinTable, sourceColumnName);\n\n const relations = await relationsQuery;\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n // Remove the 'id' field to avoid duplicate key errors\n const newRelations = relations\n .map((relation) => {\n const newSourceId = getMappedValue(publishedToDraftMap, relation[sourceColumnName]);\n const newTargetId = getMappedValue(publishedToDraftMap, relation[targetColumnName]);\n\n if (!newSourceId || !newTargetId) {\n // Skip if no mapping found\n return null;\n }\n\n // Create new relation object without the 'id' field\n const { id, ...relationWithoutId } = relation;\n return {\n ...relationWithoutId,\n [sourceColumnName]: newSourceId,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n }\n }\n }\n}\n\n/**\n * Copy relations from other content types that target this content type\n */\nasync function copyRelationsFromOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n}) {\n const targetMeta = strapi.db.metadata.get(uid);\n if (!targetMeta) {\n return;\n }\n\n const publishedTargetIds = Array.from(publishedToDraftMap.keys())\n .map((value) => normalizeId(value))\n .filter((value): value is number => value != null);\n\n if (publishedTargetIds.length === 0) {\n return;\n }\n\n const draftTargetIds = Array.from(publishedToDraftMap.values())\n .map((value) => normalizeId(value))\n .filter((value): value is number => value != null);\n\n const models = [\n ...(Object.values(strapi.contentTypes) as any[]),\n ...(Object.values(strapi.components) as any[]),\n ];\n\n const buildRelationKey = (\n relation: Record<string, any>,\n sourceColumnName: string,\n targetId: number | string | null\n ) => {\n const sourceId = normalizeId(relation[sourceColumnName]) ?? relation[sourceColumnName];\n const fieldValue = 'field' in relation ? (relation.field ?? '') : '';\n const componentTypeValue = 'component_type' in relation ? (relation.component_type ?? '') : '';\n\n return `${sourceId ?? 'null'}::${targetId ?? 'null'}::${fieldValue}::${componentTypeValue}`;\n };\n\n for (const model of models) {\n const dbModel = strapi.db.metadata.get(model.uid);\n if (!dbModel) {\n continue;\n }\n\n const sourceHasDraftAndPublish = Boolean(model.options?.draftAndPublish);\n\n for (const attribute of Object.values(dbModel.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target !== uid) {\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n // Component join tables are handled separately when cloning components.\n if (joinTable.name.includes('_cmps')) {\n continue;\n }\n\n // If the source content type also has draft/publish, its own cloning routine will recreate its relations.\n if (sourceHasDraftAndPublish) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n const existingKeys = new Set<string>();\n\n if (draftTargetIds.length > 0) {\n const draftIdChunks = chunkArray(draftTargetIds, 1000);\n for (const draftChunk of draftIdChunks) {\n const existingRelationsQuery = trx(joinTable.name)\n .select('*')\n .whereIn(targetColumnName, draftChunk);\n\n applyJoinTableOrdering(existingRelationsQuery, joinTable, sourceColumnName);\n\n const existingRelations = await existingRelationsQuery;\n\n for (const relation of existingRelations) {\n existingKeys.add(\n buildRelationKey(relation, sourceColumnName, normalizeId(relation[targetColumnName]))\n );\n }\n }\n }\n\n const publishedIdChunks = chunkArray(publishedTargetIds, 1000);\n\n for (const chunk of publishedIdChunks) {\n const relationsQuery = trx(joinTable.name).select('*').whereIn(targetColumnName, chunk);\n\n applyJoinTableOrdering(relationsQuery, joinTable, sourceColumnName);\n\n const relations = await relationsQuery;\n if (relations.length === 0) {\n continue;\n }\n\n const newRelations: Array<Record<string, any>> = [];\n\n for (const relation of relations) {\n const newTargetId = getMappedValue(publishedToDraftMap, relation[targetColumnName]);\n if (!newTargetId) {\n continue;\n }\n\n const key = buildRelationKey(relation, sourceColumnName, newTargetId);\n if (existingKeys.has(key)) {\n continue;\n }\n\n existingKeys.add(key);\n\n const { id, ...relationWithoutId } = relation;\n newRelations.push({\n ...relationWithoutId,\n [targetColumnName]: newTargetId,\n });\n }\n\n if (newRelations.length === 0) {\n continue;\n }\n\n try {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n } catch (error: any) {\n if (!isDuplicateEntryError(error)) {\n throw error;\n }\n\n for (const relation of newRelations) {\n await insertRowWithDuplicateHandling(trx, joinTable.name, relation, {\n reason: 'duplicate-draft-target-relation',\n sourceUid: model.uid,\n targetUid: uid,\n });\n }\n }\n }\n }\n }\n}\n\n/**\n * Copy relations from this content type that target other content types (category 3)\n * Example: Article -> Categories/Tags\n */\nasync function copyRelationsToOtherContentTypes({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n}) {\n const meta = strapi.db.metadata.get(uid);\n if (!meta) return;\n\n const publishedIds = Array.from(publishedToDraftMap.keys());\n\n // Cache target publishedToDraftMap to avoid duplicate calls for same target\n const targetMapCache = new Map<string, Map<number, number> | null>();\n\n for (const attribute of Object.values(meta.attributes) as any) {\n if (attribute.type !== 'relation' || attribute.target === uid) {\n // Skip self-referential relations (handled by copyRelationsForContentType)\n continue;\n }\n\n const joinTable = attribute.joinTable;\n if (!joinTable) {\n continue;\n }\n\n // Skip component join tables - they are handled by copyComponentRelations\n if (joinTable.name.includes('_cmps')) {\n continue;\n }\n\n const { name: sourceColumnName } = joinTable.joinColumn;\n const { name: targetColumnName } = joinTable.inverseJoinColumn;\n\n // Get target content type's publishedToDraftMap if it has draft/publish (cached)\n const targetUid = attribute.target;\n if (!targetMapCache.has(targetUid)) {\n const targetMeta = strapi.db.metadata.get(targetUid);\n const targetMap = await buildPublishedToDraftMap({\n trx,\n uid: targetUid,\n meta: targetMeta,\n options: { requireDraftAndPublish: true },\n });\n targetMapCache.set(targetUid, targetMap);\n }\n const targetPublishedToDraftMap = targetMapCache.get(targetUid);\n\n // Process in batches to avoid MySQL query size limits\n const publishedIdsChunks = chunkArray(publishedIds, 1000);\n\n for (const publishedIdsChunk of publishedIdsChunks) {\n // Get relations where the source is a published entry of our content type (in batches)\n const relationsQuery = trx(joinTable.name)\n .select('*')\n .whereIn(sourceColumnName, publishedIdsChunk);\n\n applyJoinTableOrdering(relationsQuery, joinTable, sourceColumnName);\n\n const relations = await relationsQuery;\n\n if (relations.length === 0) {\n continue;\n }\n\n // Create new relations pointing to draft entries\n // Remove the 'id' field to avoid duplicate key errors\n const newRelations = relations\n .map((relation) => {\n const newSourceId = getMappedValue(publishedToDraftMap, relation[sourceColumnName]);\n\n if (!newSourceId) {\n return null;\n }\n\n // Map target ID to draft if target has draft/publish enabled\n // This matches discard() behavior: drafts relate to drafts\n let newTargetId = relation[targetColumnName];\n if (targetPublishedToDraftMap) {\n const mappedTargetId = getMappedValue(\n targetPublishedToDraftMap,\n relation[targetColumnName]\n );\n if (mappedTargetId) {\n newTargetId = mappedTargetId;\n }\n // If no draft mapping, keep published target (target might not have DP or was deleted)\n }\n\n // Create new relation object without the 'id' field\n const { id, ...relationWithoutId } = relation;\n return {\n ...relationWithoutId,\n [sourceColumnName]: newSourceId,\n [targetColumnName]: newTargetId,\n };\n })\n .filter(Boolean);\n\n if (newRelations.length > 0) {\n try {\n await trx.batchInsert(joinTable.name, newRelations, 1000);\n } catch (error: any) {\n // If batch insert fails due to duplicates, try with conflict handling\n if (error.code === '23505' || error.message?.includes('duplicate key')) {\n const client = trx.client.config.client;\n if (client === 'postgres' || client === 'pg') {\n for (const relation of newRelations) {\n try {\n await trx(joinTable.name).insert(relation).onConflict().ignore();\n } catch (err: any) {\n if (err.code !== '23505' && !err.message?.includes('duplicate key')) {\n throw err;\n }\n }\n }\n } else {\n throw error;\n }\n } else {\n throw error;\n }\n }\n }\n }\n }\n}\n\n/**\n * Update JoinColumn relations (oneToOne, manyToOne foreign keys) to point to draft versions\n * This matches discard() behavior: when creating drafts, foreign keys should point to draft targets\n */\nasync function updateJoinColumnRelations({\n db,\n trx,\n uid,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n}) {\n const meta = db.metadata.get(uid);\n if (!meta) {\n return;\n }\n\n // Create mapping from published entry ID to draft entry ID\n const publishedToDraftMap = await buildPublishedToDraftMap({ trx, uid, meta });\n\n if (!publishedToDraftMap || publishedToDraftMap.size === 0) {\n return;\n }\n\n // Cache target publishedToDraftMap to avoid duplicate calls for same target\n const targetMapCache = new Map<string, Map<number, number> | null>();\n\n // Find all JoinColumn relations (oneToOne, manyToOne without joinTable)\n for (const attribute of Object.values(meta.attributes) as any) {\n if (attribute.type !== 'relation') {\n continue;\n }\n\n // Skip relations with joinTable (handled by copyRelationsToOtherContentTypes)\n if (attribute.joinTable) {\n continue;\n }\n\n // Only handle oneToOne and manyToOne relations that use joinColumn\n const joinColumn = attribute.joinColumn;\n if (!joinColumn) {\n continue;\n }\n\n const targetUid = attribute.target;\n const foreignKeyColumn = joinColumn.name;\n\n // Get target content type's publishedToDraftMap if it has draft/publish (cached)\n if (!targetMapCache.has(targetUid)) {\n const targetMeta = strapi.db.metadata.get(targetUid);\n const targetMap = await buildPublishedToDraftMap({\n trx,\n uid: targetUid,\n meta: targetMeta,\n options: { requireDraftAndPublish: true },\n });\n targetMapCache.set(targetUid, targetMap);\n }\n const targetPublishedToDraftMap = targetMapCache.get(targetUid);\n\n if (!targetPublishedToDraftMap) {\n // Target doesn't have draft/publish, foreign keys are fine as-is\n continue;\n }\n\n const draftIds = Array.from(publishedToDraftMap.values());\n if (draftIds.length === 0) {\n continue;\n }\n\n const draftIdsChunks = chunkArray(draftIds, 1000);\n\n for (const draftIdsChunk of draftIdsChunks) {\n // Get draft entries with their foreign key values\n const draftEntriesWithFk = await trx(meta.tableName)\n .select(['id', foreignKeyColumn])\n .whereIn('id', draftIdsChunk)\n .whereNotNull(foreignKeyColumn);\n\n const updates = draftEntriesWithFk.reduce<\n Array<{ id: number | string; draftTargetId: number | string }>\n >((acc, draftEntry) => {\n const publishedTargetIdRaw = draftEntry[foreignKeyColumn];\n const normalizedPublishedTargetId = normalizeId(publishedTargetIdRaw);\n const draftTargetId =\n normalizedPublishedTargetId == null\n ? undefined\n : targetPublishedToDraftMap.get(normalizedPublishedTargetId);\n\n if (draftTargetId != null && normalizeId(draftTargetId) !== normalizedPublishedTargetId) {\n acc.push({ id: draftEntry.id as number | string, draftTargetId });\n }\n\n return acc;\n }, []);\n\n if (updates.length === 0) {\n continue;\n }\n\n const caseFragments = updates.map(() => 'WHEN ? THEN ?').join(' ');\n const idsPlaceholders = updates.map(() => '?').join(', ');\n\n await trx.raw(\n `UPDATE ?? SET ?? = CASE ?? ${caseFragments} ELSE ?? END WHERE ?? IN (${idsPlaceholders})`,\n [\n meta.tableName,\n foreignKeyColumn,\n 'id',\n ...updates.flatMap(({ id, draftTargetId }) => [id, draftTargetId]),\n foreignKeyColumn,\n 'id',\n ...updates.map(({ id }) => id),\n ]\n );\n }\n }\n}\n\n/**\n * Copy component relations from published entries to draft entries\n */\nasync function copyComponentRelations({\n trx,\n uid,\n publishedToDraftMap,\n}: {\n trx: Knex;\n uid: string;\n publishedToDraftMap: Map<number, number>;\n}) {\n const meta = strapi.db.metadata.get(uid);\n if (!meta) {\n return;\n }\n\n // Get collectionName from content type schema (Meta only has tableName which may be shortened)\n const contentType = strapi.contentTypes[uid as keyof typeof strapi.contentTypes] as any;\n const collectionName = contentType?.collectionName;\n if (!collectionName) {\n return;\n }\n\n const identifiers = strapi.db.metadata.identifiers;\n const joinTableName = getComponentJoinTableName(collectionName, identifiers);\n const entityIdColumn = getComponentJoinColumnEntityName(identifiers);\n const componentIdColumn = getComponentJoinColumnInverseName(identifiers);\n const componentTypeColumn = getComponentTypeColumn(identifiers);\n const fieldColumn = identifiers.FIELD_COLUMN;\n const orderColumn = identifiers.ORDER_COLUMN;\n\n // Check if component join table exists\n const hasTable = await trx.schema.hasTable(joinTableName);\n if (!hasTable) {\n return;\n }\n\n const publishedIds = Array.from(publishedToDraftMap.keys());\n\n // Process in batches to avoid MySQL query size limits\n const publishedIdsChunks = chunkArray(publishedIds, 1000);\n\n for (const publishedIdsChunk of publishedIdsChunks) {\n // Get component relations for published entries\n const componentRelations = await trx(joinTableName)\n .select('*')\n .whereIn(entityIdColumn, publishedIdsChunk);\n\n if (componentRelations.length === 0) {\n continue;\n }\n\n const componentCloneCache = new Map<string, Map<string, number>>();\n const componentTargetDraftMapCache = new Map<string, Map<number, number> | null>();\n const componentHierarchyCaches: ComponentHierarchyCaches = {\n parentInstanceCache: new Map(),\n ancestorDpCache: new Map(),\n parentDpCache: new Map(),\n };\n\n // Filter component relations: only propagate if component's parent in the component hierarchy doesn't have draft/publish\n // This matches discardDraft() behavior via shouldPropagateComponentRelationToNewVersion\n //\n // The logic: find what contains this component instance (could be a content type or another component).\n // If it's a component, recursively check its parents. If any parent in the chain has DP, filter out the relation.\n const filteredComponentRelations = await Promise.all(\n componentRelations.map(async (relation) => {\n const componentId = relation[componentIdColumn];\n const componentType = relation[componentTypeColumn];\n const entityId = relation[entityIdColumn];\n\n const componentSchema = strapi.components[\n componentType as keyof typeof strapi.components\n ] as any;\n\n if (!componentSchema) {\n debug(\n `[copyComponentRelations] ${uid}: Keeping relation - unknown component type ${componentType} (entity: ${entityId}, componentId: ${componentId})`\n );\n return relation;\n }\n\n const componentParent = await findComponentParentInstance(\n trx,\n identifiers,\n componentSchema.uid,\n componentId,\n uid,\n componentHierarchyCaches\n );\n\n if (!componentParent) {\n debug(\n `[copyComponentRelations] ${uid}: Keeping relation - component ${componentType} (id: ${componentId}) is directly on entity ${entityId} (no nested parent found)`\n );\n return relation;\n }\n\n debug(\n `[copyComponentRelations] ${uid}: Component ${componentType} (id: ${componentId}, entity: ${entityId}) has parent in hierarchy: ${componentParent.uid} (parentId: ${componentParent.parentId})`\n );\n\n const hasDPParent = await hasDraftPublishAncestorForParent(\n trx,\n identifiers,\n componentParent,\n componentHierarchyCaches\n );\n\n if (hasDPParent) {\n debug(\n `[copyComponentRelations] Filtering: component ${componentType} (id: ${componentId}, entity: ${entityId}) has DP parent in hierarchy (${componentParent.uid})`\n );\n return null;\n }\n\n debug(\n `[copyComponentRelations] ${uid}: Keeping relation - component ${componentType} (id: ${componentId}, entity: ${entityId}) has no DP parent in hierarchy`\n );\n\n return relation;\n })\n );\n\n // Filter out null values (filtered relations)\n const relationsToProcess = filteredComponentRelations.filter(Boolean) as Array<\n Record<string, any>\n >;\n\n const filteredCount = componentRelations.length - relationsToProcess.length;\n if (filteredCount > 0) {\n debug(\n `[copyComponentRelations] ${uid}: Filtered ${filteredCount} of ${componentRelations.length} component relations (removed ${filteredCount} with DP parents)`\n );\n }\n\n // Create new component relations for draft entries\n // Remove the 'id' field to avoid duplicate key errors\n const mappedRelations = (\n await Promise.all(\n relationsToProcess.map(async (relation) => {\n const newEntityId = getMappedValue(publishedToDraftMap, relation[entityIdColumn]);\n\n if (!newEntityId) {\n return null;\n }\n\n const componentId = relation[componentIdColumn];\n const componentType = relation[componentTypeColumn];\n const componentKey = `${componentId}:${newEntityId}`;\n\n let cloneMap = componentCloneCache.get(componentType);\n if (!cloneMap) {\n cloneMap = new Map();\n componentCloneCache.set(componentType, cloneMap);\n }\n\n let newComponentId = cloneMap.get(componentKey);\n\n if (!newComponentId) {\n newComponentId = await cloneComponentInstance({\n trx,\n componentUid: componentType,\n componentId: Number(componentId),\n parentUid: uid,\n parentPublishedToDraftMap: publishedToDraftMap,\n draftMapCache: componentTargetDraftMapCache,\n });\n\n cloneMap.set(componentKey, newComponentId);\n }\n\n const { id, ...relationWithoutId } = relation;\n return {\n ...relationWithoutId,\n [entityIdColumn]: newEntityId,\n [componentIdColumn]: newComponentId,\n };\n })\n )\n ).filter(Boolean) as Array<Record<string, any>>;\n\n // Deduplicate relations based on the unique constraint columns\n // This prevents duplicates within the same batch that could cause conflicts\n const uniqueKeyMap = new Map<string, Record<string, any>>();\n for (const relation of mappedRelations) {\n const uniqueKey = `${relation[entityIdColumn]}_${relation[componentIdColumn]}_${relation[fieldColumn]}_${relation[componentTypeColumn]}`;\n if (!uniqueKeyMap.has(uniqueKey)) {\n uniqueKeyMap.set(uniqueKey, relation);\n }\n }\n const deduplicatedRelations = Array.from(uniqueKeyMap.values());\n\n if (deduplicatedRelations.length === 0) {\n continue;\n }\n\n // Check which relations already exist in the database to avoid conflicts\n // We need to check all unique constraint columns (entity_id, cmp_id, field, component_type)\n const existingRelations = await trx(joinTableName)\n .select([entityIdColumn, componentIdColumn, fieldColumn, componentTypeColumn])\n .where((qb) => {\n // Build OR conditions for each relation we want to check\n for (const relation of deduplicatedRelations) {\n qb.orWhere((subQb) => {\n subQb\n .where(entityIdColumn, relation[entityIdColumn])\n .where(componentIdColumn, relation[componentIdColumn])\n .where(fieldColumn, relation[fieldColumn])\n .where(componentTypeColumn, relation[componentTypeColumn]);\n });\n }\n });\n\n // Create a set of existing relation keys for fast lookup\n const existingKeys = new Set<string>();\n for (const existing of existingRelations) {\n const key = `${existing[entityIdColumn]}_${existing[componentIdColumn]}_${existing[fieldColumn]}_${existing[componentTypeColumn]}`;\n existingKeys.add(key);\n }\n\n // Filter out relations that already exist\n const newComponentRelations = deduplicatedRelations.filter((relation) => {\n const key = `${relation[entityIdColumn]}_${relation[componentIdColumn]}_${relation[fieldColumn]}_${relation[componentTypeColumn]}`;\n return !existingKeys.has(key);\n });\n\n if (newComponentRelations.length > 0) {\n // Insert component relations while surfacing unexpected constraint issues.\n // Use INSERT ... ON CONFLICT DO NOTHING (PostgreSQL) or catch duplicate key errors explicitly for other clients.\n const client = trx.client.config.client;\n\n if (client === 'postgres' || client === 'pg') {\n // PostgreSQL: Insert one at a time with ON CONFLICT DO NOTHING\n // Use raw SQL for more reliable conflict handling\n let insertedCount = 0;\n let skippedCount = 0;\n for (const relation of newComponentRelations) {\n try {\n // Use raw SQL - ?? is for identifiers, ? is for values in Knex\n const orderValue = relation[orderColumn] ?? null;\n\n await trx.raw(\n `INSERT INTO ?? (??, ??, ??, ??, ??) VALUES (?, ?, ?, ?, ?) \n ON CONFLICT (??, ??, ??, ??) DO NOTHING`,\n [\n joinTableName,\n entityIdColumn,\n componentIdColumn,\n fieldColumn,\n componentTypeColumn,\n orderColumn,\n relation[entityIdColumn],\n relation[componentIdColumn],\n relation[fieldColumn],\n relation[componentTypeColumn],\n orderValue,\n entityIdColumn,\n componentIdColumn,\n fieldColumn,\n componentTypeColumn,\n ]\n );\n insertedCount += 1;\n } catch (error: any) {\n // Ignore duplicate key errors (PostgreSQL error code 23505)\n // This can happen if the record already exists in the database\n if (error.code !== '23505' && !error.message?.includes('duplicate key')) {\n throw error;\n } else {\n skippedCount += 1;\n }\n }\n }\n if (insertedCount > 0 || skippedCount > 0) {\n debug(\n `[copyComponentRelations] ${uid}: Inserted ${insertedCount} component relations, skipped ${skippedCount} duplicates`\n );\n }\n } else if (client === 'mysql' || client === 'mysql2') {\n try {\n await trx(joinTableName).insert(newComponentRelations);\n } catch (error: any) {\n if (error.code !== 'ER_DUP_ENTRY') {\n throw error;\n }\n\n for (const relation of newComponentRelations) {\n try {\n await trx(joinTableName).insert(relation);\n } catch (err: any) {\n if (err.code !== 'ER_DUP_ENTRY') {\n throw err;\n }\n }\n }\n }\n } else {\n // SQLite: Try to insert and ignore errors\n for (const relation of newComponentRelations) {\n try {\n await trx(joinTableName).insert(relation);\n } catch (error: any) {\n // Ignore duplicate key errors\n if (error.code !== 'SQLITE_CONSTRAINT_UNIQUE' && error.code !== '23505') {\n throw error;\n }\n }\n }\n }\n }\n }\n}\n\n/**\n * 2 pass migration to create the draft entries for all the published entries.\n * And then copy relations directly using database queries.\n */\nconst migrateUp = async (trx: Knex, db: Database) => {\n strapi.log.info('[discard-drafts] Migration started');\n const dpModels = [];\n for (const meta of db.metadata.values()) {\n const hasDP = await hasDraftAndPublish(trx, meta);\n if (hasDP) {\n dpModels.push(meta);\n }\n }\n\n debug(`Found ${dpModels.length} draft/publish content types to process`);\n\n /**\n * Create plain draft entries for all the entries that were published.\n */\n strapi.log.info('[discard-drafts] Stage 1/3 – cloning published entries into draft rows');\n for (const model of dpModels) {\n debug(` • cloning scalars for ${model.uid}`);\n await copyPublishedEntriesToDraft({ db, trx, uid: model.uid });\n }\n strapi.log.info('[discard-drafts] Stage 1/3 complete');\n\n /**\n * Copy relations from published entries to draft entries using direct database queries.\n * This is much more efficient than calling discardDraft for each entry.\n */\n strapi.log.info('[discard-drafts] Stage 2/3 – copying relations and components to drafts');\n for (const model of dpModels) {\n debug(` • copying relations for ${model.uid}`);\n await copyRelationsToDrafts({ db, trx, uid: model.uid });\n }\n strapi.log.info('[discard-drafts] Stage 2/3 complete');\n\n /**\n * Update JoinColumn relations (foreign keys) to point to draft versions\n * This matches discard() behavior: drafts relate to drafts\n */\n strapi.log.info('[discard-drafts] Stage 3/3 – updating foreign key references to draft targets');\n for (const model of dpModels) {\n debug(` • updating join columns for ${model.uid}`);\n await updateJoinColumnRelations({ db, trx, uid: model.uid });\n }\n strapi.log.info('[discard-drafts] Stage 3/3 complete');\n\n strapi.log.info('[discard-drafts] Migration completed successfully');\n};\n\n/**\n * Load a batch of versions to discard.\n *\n * Versions with only a draft version will be ignored.\n * Only versions with a published version (which always have a draft version) will be discarded.\n */\nexport async function* getBatchToDiscard({\n db,\n trx,\n uid,\n defaultBatchSize = 1000,\n}: {\n db: Database;\n trx: Knex;\n uid: string;\n defaultBatchSize?: number;\n}) {\n const client = db.config.connection.client;\n const isSQLite =\n typeof client === 'string' && ['sqlite', 'sqlite3', 'better-sqlite3'].includes(client);\n\n // The SQLite documentation states that the maximum number of terms in a\n // compound SELECT statement is 500 by default.\n // See: https://www.sqlite.org/limits.html\n // To ensure a successful migration, we limit the batch size to 500 for SQLite.\n const batchSize = isSQLite ? Math.min(defaultBatchSize, 500) : defaultBatchSize;\n let offset = 0;\n let hasMore = true;\n\n while (hasMore) {\n // Look for the published entries to discard\n const batch: DocumentVersion[] = await db\n .queryBuilder(uid)\n .select(['id', 'documentId', 'locale'])\n .where({ publishedAt: { $ne: null } })\n .limit(batchSize)\n .offset(offset)\n .orderBy('id')\n .transacting(trx)\n .execute();\n\n if (batch.length < batchSize) {\n hasMore = false;\n }\n\n offset += batchSize;\n yield batch;\n }\n}\n\nexport const discardDocumentDrafts: Migration = {\n name: 'core::5.0.0-discard-drafts',\n async up(trx, db) {\n await migrateUp(trx, db);\n },\n async down() {\n throw new Error('not implemented');\n },\n};\n"],"names":["hasDraftAndPublish","trx","meta","hasTable","schema","tableName","uid","model","strapi","getModel","hasDP","contentTypes","copyPublishedEntriesToDraft","db","metadata","get","scalarAttributes","Object","values","attributes","reduce","acc","attribute","includes","columnName","isScalarAttribute","push","into","raw","map","join","insert","subQb","select","att","from","whereNotNull","copyRelationsToDrafts","publishedToDraftMap","buildPublishedToDraftMap","size","copyRelationsForContentType","copyRelationsFromOtherContentTypes","copyRelationsToOtherContentTypes","copyComponentRelations","chunkArray","array","chunkSize","chunks","i","length","slice","applyJoinTableOrdering","qb","joinTable","sourceColumnName","seenColumns","Set","enqueueColumn","column","direction","has","add","orderBy","Array","isArray","clause","entries","normalizedDirection","toLowerCase","orderColumnName","orderColumn","componentParentSchemasCache","Map","joinTableExistsCache","componentMetaCache","DUPLICATE_ERROR_CODES","debug","createDebug","normalizeId","value","num","Number","isNaN","getMappedValue","key","undefined","normalized","resolveInsertedId","insertResult","first","id","idKey","keys","find","isDuplicateEntryError","error","code","message","insertRowWithDuplicateHandling","row","context","client","config","onConflict","ignore","details","JSON","stringify","wrapped","Error","cause","listComponentParentSchemas","componentUid","schemas","components","parents","filter","some","attr","type","component","collectionName","set","ensureTableExists","exists","findComponentParentInstance","identifiers","componentId","excludeUid","caches","cacheKey","parentInstanceCache","parentComponentIdColumn","getComponentJoinColumnInverseName","parentComponentTypeColumn","getComponentTypeColumn","parentEntityIdColumn","getComponentJoinColumnEntityName","potentialParents","parentSchema","parentJoinTableName","getComponentJoinTableName","parentRow","where","parentInstance","parentId","getComponentMeta","hasDraftPublishAncestorForParent","parent","parentDpCache","parentContentType","result","options","draftAndPublish","parentComponent","hasDraftPublishAncestorForComponent","ancestorDpCache","resolveNowValue","fn","now","Date","getDraftMapForTarget","targetUid","draftMapCache","targetMeta","requireDraftAndPublish","mapTargetId","originalId","parentUid","parentPublishedToDraftMap","targetMap","ensureObjectWithoutId","cloned","cloneComponentRelationJoinTables","componentMeta","originalComponentId","newComponentId","joinColumn","name","targetColumnName","inverseJoinColumn","relationsLogPrinted","relations","relation","clonedRelation","originalTargetId","target","cloneComponentInstance","componentTableName","componentPrimaryKey","componentRow","newComponentRow","document_id","createId","updated_at","created_at","insertedRow","hasDraftAndPublishEnabled","publishedEntries","draftEntries","Promise","all","whereNull","i18nService","plugin","service","contentType","isLocalized","isLocalizedContentType","draftByDocumentId","draft","locale","existing","existingId","draftId","published","publishedId","publishedIds","publishedIdsChunks","publishedIdsChunk","relationsQuery","whereIn","newRelations","newSourceId","newTargetId","relationWithoutId","Boolean","batchInsert","publishedTargetIds","draftTargetIds","models","buildRelationKey","targetId","sourceId","fieldValue","field","componentTypeValue","component_type","dbModel","sourceHasDraftAndPublish","existingKeys","draftIdChunks","draftChunk","existingRelationsQuery","existingRelations","publishedIdChunks","chunk","reason","sourceUid","targetMapCache","targetPublishedToDraftMap","mappedTargetId","err","updateJoinColumnRelations","foreignKeyColumn","draftIds","draftIdsChunks","draftIdsChunk","draftEntriesWithFk","updates","draftEntry","publishedTargetIdRaw","normalizedPublishedTargetId","draftTargetId","caseFragments","idsPlaceholders","flatMap","joinTableName","entityIdColumn","componentIdColumn","componentTypeColumn","fieldColumn","FIELD_COLUMN","ORDER_COLUMN","componentRelations","componentCloneCache","componentTargetDraftMapCache","componentHierarchyCaches","filteredComponentRelations","componentType","entityId","componentSchema","componentParent","hasDPParent","relationsToProcess","filteredCount","mappedRelations","newEntityId","componentKey","cloneMap","uniqueKeyMap","uniqueKey","deduplicatedRelations","orWhere","newComponentRelations","insertedCount","skippedCount","orderValue","migrateUp","log","info","dpModels","getBatchToDiscard","defaultBatchSize","connection","isSQLite","batchSize","Math","min","offset","hasMore","batch","queryBuilder","publishedAt","$ne","limit","transacting","execute","discardDocumentDrafts","up","down"],"mappings":"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"}
@@ -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,eAAiB,EAAA;AACpB,QAAA;AACF;AAEA,IAAA,OAAOE,MAAOC,CAAAA,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,YAAc,CAAA;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF;YAEA,MAAMC,WAAAA,GAAcN,YAAY,CAACK,GAAI,CAAA;AAErC,YAAA,IAAI,CAACE,wBAAAA,CAAkBC,wBAAwB,CAACF,WAAc,CAAA,EAAA;AAC5D,gBAAA;AACF;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAkB,EAAA;AAC7C,gBAAA;AACF;AAEA,YAAA,MAAMC,OAA6B,GAAA,MAAMV,MAAOC,CAAAA,EAAE,CAC/CU,YAAY,CAACP,GACbQ,CAAAA,CAAAA,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,iBAAiBC,CAAEC,CAAAA,OAAO,CAACP,OAAAA,EAAS,CAACQ,IAAS,GAAA,CAAC,EAAEA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAKE,CAAAA,MAAM,CAAC,CAAC,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAOC,CAAAA,MAAM,CAACR,cAAiB,CAAA,CAAA;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAG,EAAA;AACrB,oBAAA;AACF;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAE,CAAA,CAACZ,gBAAgB,IAAI,IAAQY,IAAAA,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAM,EAAA;AAC1E,oBAAA;AACF;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAMK,CAAAA,MAAM,CAAC,CAACR,IAASA,GAAAA,IAAAA,CAAKS,WAAW,IAAI,IAAMC,CAAAA,CAAAA,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAkB,EAAA;AACrB,oBAAA;AACF;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAkB,EAAA,IAAIqB,IAAKL,CAAAA,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAE1BP,CAAAA,CAAAA,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ;AACF;AACF,KAAA,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.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,eAAiB,EAAA;AACpB,QAAA;AACF;AAEA,IAAA,OAAOE,MAAOC,CAAAA,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,YAAc,CAAA;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF;YAEA,MAAMC,WAAAA,GAAcN,YAAY,CAACK,GAAI,CAAA;AAErC,YAAA,IAAI,CAACE,wBAAAA,CAAkBC,wBAAwB,CAACF,WAAc,CAAA,EAAA;AAC5D,gBAAA;AACF;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAkB,EAAA;AAC7C,gBAAA;AACF;AAEA,YAAA,MAAMC,OAA6B,GAAA,MAAMV,MAAOC,CAAAA,EAAE,CAC/CU,YAAY,CAACP,GACbQ,CAAAA,CAAAA,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAiBC,GAAAA,CAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAGA,EAAAA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAE,CAAA,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAOC,CAAAA,MAAM,CAACR,cAAiB,CAAA,CAAA;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAG,EAAA;AACrB,oBAAA;AACF;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAE,CAAA,CAACZ,gBAAgB,IAAI,IAAQY,IAAAA,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAM,EAAA;AAC1E,oBAAA;AACF;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAMK,CAAAA,MAAM,CAAC,CAACR,IAASA,GAAAA,IAAAA,CAAKS,WAAW,IAAI,IAAMC,CAAAA,CAAAA,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAkB,EAAA;AACrB,oBAAA;AACF;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAkB,EAAA,IAAIqB,IAAKL,CAAAA,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAE1BP,CAAAA,CAAAA,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ;AACF;AACF,KAAA,CAAA;AACF;;;;"}
@@ -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,eAAiB,EAAA;AACpB,QAAA;AACF;AAEA,IAAA,OAAOE,MAAOC,CAAAA,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,cAAc,CAAA;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF;YAEA,MAAMC,WAAAA,GAAcN,cAAY,CAACK,GAAI,CAAA;AAErC,YAAA,IAAI,CAACE,YAAAA,CAAkBC,wBAAwB,CAACF,WAAc,CAAA,EAAA;AAC5D,gBAAA;AACF;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAkB,EAAA;AAC7C,gBAAA;AACF;AAEA,YAAA,MAAMC,OAA6B,GAAA,MAAMV,MAAOC,CAAAA,EAAE,CAC/CU,YAAY,CAACP,GACbQ,CAAAA,CAAAA,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,iBAAiBC,CAAEC,CAAAA,OAAO,CAACP,OAAAA,EAAS,CAACQ,IAAS,GAAA,CAAC,EAAEA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAKE,CAAAA,MAAM,CAAC,CAAC,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAOC,CAAAA,MAAM,CAACR,cAAiB,CAAA,CAAA;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAG,EAAA;AACrB,oBAAA;AACF;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAE,CAAA,CAACZ,gBAAgB,IAAI,IAAQY,IAAAA,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAM,EAAA;AAC1E,oBAAA;AACF;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAMK,CAAAA,MAAM,CAAC,CAACR,IAASA,GAAAA,IAAAA,CAAKS,WAAW,IAAI,IAAMC,CAAAA,CAAAA,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAkB,EAAA;AACrB,oBAAA;AACF;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAkB,EAAA,IAAIqB,IAAKL,CAAAA,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAE1BP,CAAAA,CAAAA,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ;AACF;AACF,KAAA,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.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,eAAiB,EAAA;AACpB,QAAA;AACF;AAEA,IAAA,OAAOE,MAAOC,CAAAA,EAAE,CAACC,WAAW,CAAC,OAAOC,GAAAA,GAAAA;QAClC,IAAK,MAAMC,OAAOL,cAAc,CAAA;AAC9B,YAAA,IAAI,CAACD,eAAe,CAACM,GAAAA,CAAI,EAAE;AACzB,gBAAA;AACF;YAEA,MAAMC,WAAAA,GAAcN,cAAY,CAACK,GAAI,CAAA;AAErC,YAAA,IAAI,CAACE,YAAAA,CAAkBC,wBAAwB,CAACF,WAAc,CAAA,EAAA;AAC5D,gBAAA;AACF;AAEA,YAAA,IAAI,CAACA,WAAAA,CAAYG,UAAU,EAAEC,gBAAkB,EAAA;AAC7C,gBAAA;AACF;AAEA,YAAA,MAAMC,OAA6B,GAAA,MAAMV,MAAOC,CAAAA,EAAE,CAC/CU,YAAY,CAACP,GACbQ,CAAAA,CAAAA,MAAM,CAAC,GAAA,CAAA,CACPC,WAAW,CAACV,KACZW,OAAO,EAAA;;;AAIV,YAAA,MAAMC,cAAiBC,GAAAA,CAAAA,CAAEC,OAAO,CAACP,SAAS,CAACQ,IAAAA,GAAS,CAAGA,EAAAA,IAAAA,CAAKC,UAAU,CAAC,CAAC,EAAED,IAAAA,CAAKE,MAAM,CAAE,CAAA,CAAA;AAEvF,YAAA,KAAK,MAAMC,KAAAA,IAASC,MAAOC,CAAAA,MAAM,CAACR,cAAiB,CAAA,CAAA;;gBAEjD,IAAIM,KAAAA,CAAMG,MAAM,IAAI,CAAG,EAAA;AACrB,oBAAA;AACF;;AAGA,gBAAA,IAAIH,KAAK,CAAC,CAAE,CAAA,CAACZ,gBAAgB,IAAI,IAAQY,IAAAA,KAAK,CAAC,CAAA,CAAE,CAACZ,gBAAgB,IAAI,IAAM,EAAA;AAC1E,oBAAA;AACF;gBAEA,MAAMgB,gBAAAA,GAAmBJ,KAAMK,CAAAA,MAAM,CAAC,CAACR,IAASA,GAAAA,IAAAA,CAAKS,WAAW,IAAI,IAAMC,CAAAA,CAAAA,EAAE,CAAC,CAAA,CAAA;AAC7E,gBAAA,IAAI,CAACH,gBAAkB,EAAA;AACrB,oBAAA;AACF;AAEA,gBAAA,MAAMzB,OAAOC,EAAE,CACZU,YAAY,CAACP,GAAAA,CAAAA,CACbyB,MAAM,CAAC;oBACNpB,gBAAkB,EAAA,IAAIqB,IAAKL,CAAAA,gBAAAA,CAAiBE,WAAW;AACzD,iBAAA,CAAA,CACCI,KAAK,CAAC;AACLZ,oBAAAA,UAAAA,EAAYM,iBAAiBN,UAAU;AACvCC,oBAAAA,MAAAA,EAAQK,iBAAiBL;iBAE1BP,CAAAA,CAAAA,WAAW,CAACV,GAAAA,CAAAA,CACZW,OAAO,EAAA;AACZ;AACF;AACF,KAAA,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 = "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603";
6
+ var version = "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c";
7
7
  var description = "Core of Strapi";
8
8
  var homepage = "https://strapi.io";
9
9
  var bugs = {
@@ -59,14 +59,14 @@ 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-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
63
- "@strapi/database": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
64
- "@strapi/generators": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
65
- "@strapi/logger": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
66
- "@strapi/permissions": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
67
- "@strapi/types": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
68
- "@strapi/typescript-utils": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
69
- "@strapi/utils": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
62
+ "@strapi/admin": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
63
+ "@strapi/database": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
64
+ "@strapi/generators": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
65
+ "@strapi/logger": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
66
+ "@strapi/permissions": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
67
+ "@strapi/types": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
68
+ "@strapi/typescript-utils": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
69
+ "@strapi/utils": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
70
70
  "@vercel/stega": "0.1.2",
71
71
  bcryptjs: "2.4.3",
72
72
  boxen: "5.1.2",
@@ -87,6 +87,7 @@ var dependencies = {
87
87
  inquirer: "8.2.5",
88
88
  "is-docker": "2.2.1",
89
89
  "json-logic-js": "2.0.5",
90
+ jsonwebtoken: "9.0.0",
90
91
  koa: "2.16.1",
91
92
  "koa-body": "6.0.1",
92
93
  "koa-compose": "4.1.0",
@@ -114,7 +115,7 @@ var dependencies = {
114
115
  };
115
116
  var devDependencies = {
116
117
  "@strapi/ts-zen": "^0.2.0",
117
- "@swc/core": "1.9.3",
118
+ "@swc/core": "1.13.5",
118
119
  "@types/bcryptjs": "2.4.3",
119
120
  "@types/configstore": "5.0.1",
120
121
  "@types/delegates": "1.0.0",
@@ -133,9 +134,9 @@ var devDependencies = {
133
134
  "@types/node": "18.19.24",
134
135
  "@types/node-schedule": "2.1.7",
135
136
  "@types/statuses": "2.0.1",
136
- "eslint-config-custom": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
137
+ "eslint-config-custom": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
137
138
  supertest: "6.3.3",
138
- tsconfig: "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603"
139
+ tsconfig: "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c"
139
140
  };
140
141
  var engines = {
141
142
  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-experimental.83f23a40206562f4b4916d31f95bf453e8511603";
2
+ var version = "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c";
3
3
  var description = "Core of Strapi";
4
4
  var homepage = "https://strapi.io";
5
5
  var bugs = {
@@ -55,14 +55,14 @@ 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-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
59
- "@strapi/database": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
60
- "@strapi/generators": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
61
- "@strapi/logger": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
62
- "@strapi/permissions": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
63
- "@strapi/types": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
64
- "@strapi/typescript-utils": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
65
- "@strapi/utils": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
58
+ "@strapi/admin": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
59
+ "@strapi/database": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
60
+ "@strapi/generators": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
61
+ "@strapi/logger": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
62
+ "@strapi/permissions": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
63
+ "@strapi/types": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
64
+ "@strapi/typescript-utils": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
65
+ "@strapi/utils": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
66
66
  "@vercel/stega": "0.1.2",
67
67
  bcryptjs: "2.4.3",
68
68
  boxen: "5.1.2",
@@ -83,6 +83,7 @@ var dependencies = {
83
83
  inquirer: "8.2.5",
84
84
  "is-docker": "2.2.1",
85
85
  "json-logic-js": "2.0.5",
86
+ jsonwebtoken: "9.0.0",
86
87
  koa: "2.16.1",
87
88
  "koa-body": "6.0.1",
88
89
  "koa-compose": "4.1.0",
@@ -110,7 +111,7 @@ var dependencies = {
110
111
  };
111
112
  var devDependencies = {
112
113
  "@strapi/ts-zen": "^0.2.0",
113
- "@swc/core": "1.9.3",
114
+ "@swc/core": "1.13.5",
114
115
  "@types/bcryptjs": "2.4.3",
115
116
  "@types/configstore": "5.0.1",
116
117
  "@types/delegates": "1.0.0",
@@ -129,9 +130,9 @@ var devDependencies = {
129
130
  "@types/node": "18.19.24",
130
131
  "@types/node-schedule": "2.1.7",
131
132
  "@types/statuses": "2.0.1",
132
- "eslint-config-custom": "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603",
133
+ "eslint-config-custom": "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c",
133
134
  supertest: "6.3.3",
134
- tsconfig: "0.0.0-experimental.83f23a40206562f4b4916d31f95bf453e8511603"
135
+ tsconfig: "0.0.0-experimental.848e0ac442910c1ad22a7c5eaab07088827fb53c"
135
136
  };
136
137
  var engines = {
137
138
  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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAA8D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,SAAS,EAAE,QAAQ,EAQ/B,CAAC"}
@@ -4,6 +4,7 @@ var admin = require('./admin.js');
4
4
  var coreStore = require('./coreStore.js');
5
5
  var cron = require('./cron.js');
6
6
  var registries = require('./registries.js');
7
+ var sessionManager = require('./session-manager.js');
7
8
  var telemetry = require('./telemetry.js');
8
9
  var webhooks = require('./webhooks.js');
9
10
 
@@ -11,6 +12,7 @@ const providers = [
11
12
  registries,
12
13
  admin,
13
14
  coreStore,
15
+ sessionManager,
14
16
  webhooks,
15
17
  telemetry,
16
18
  cron
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/providers/index.ts"],"sourcesContent":["import admin from './admin';\nimport coreStore from './coreStore';\nimport cron from './cron';\nimport registries from './registries';\nimport telemetry from './telemetry';\nimport webhooks from './webhooks';\n\nimport type { Provider } from './provider';\n\nexport const providers: Provider[] = [registries, admin, coreStore, webhooks, telemetry, cron];\n"],"names":["providers","registries","admin","coreStore","webhooks","telemetry","cron"],"mappings":";;;;;;;;;MASaA,SAAwB,GAAA;AAACC,IAAAA,UAAAA;AAAYC,IAAAA,KAAAA;AAAOC,IAAAA,SAAAA;AAAWC,IAAAA,QAAAA;AAAUC,IAAAA,SAAAA;AAAWC,IAAAA;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/providers/index.ts"],"sourcesContent":["import admin from './admin';\nimport coreStore from './coreStore';\nimport cron from './cron';\nimport registries from './registries';\nimport sessionManager from './session-manager';\nimport telemetry from './telemetry';\nimport webhooks from './webhooks';\n\nimport type { Provider } from './provider';\n\nexport const providers: Provider[] = [\n registries,\n admin,\n coreStore,\n sessionManager,\n webhooks,\n telemetry,\n cron,\n];\n"],"names":["providers","registries","admin","coreStore","sessionManager","webhooks","telemetry","cron"],"mappings":";;;;;;;;;;MAUaA,SAAwB,GAAA;AACnCC,IAAAA,UAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,cAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA;;;;;"}
@@ -2,6 +2,7 @@ import admin from './admin.mjs';
2
2
  import coreStore from './coreStore.mjs';
3
3
  import cron from './cron.mjs';
4
4
  import registries from './registries.mjs';
5
+ import sessionManager from './session-manager.mjs';
5
6
  import telemetry from './telemetry.mjs';
6
7
  import webhooks from './webhooks.mjs';
7
8
 
@@ -9,6 +10,7 @@ const providers = [
9
10
  registries,
10
11
  admin,
11
12
  coreStore,
13
+ sessionManager,
12
14
  webhooks,
13
15
  telemetry,
14
16
  cron
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/providers/index.ts"],"sourcesContent":["import admin from './admin';\nimport coreStore from './coreStore';\nimport cron from './cron';\nimport registries from './registries';\nimport telemetry from './telemetry';\nimport webhooks from './webhooks';\n\nimport type { Provider } from './provider';\n\nexport const providers: Provider[] = [registries, admin, coreStore, webhooks, telemetry, cron];\n"],"names":["providers","registries","admin","coreStore","webhooks","telemetry","cron"],"mappings":";;;;;;;MASaA,SAAwB,GAAA;AAACC,IAAAA,UAAAA;AAAYC,IAAAA,KAAAA;AAAOC,IAAAA,SAAAA;AAAWC,IAAAA,QAAAA;AAAUC,IAAAA,SAAAA;AAAWC,IAAAA;;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../src/providers/index.ts"],"sourcesContent":["import admin from './admin';\nimport coreStore from './coreStore';\nimport cron from './cron';\nimport registries from './registries';\nimport sessionManager from './session-manager';\nimport telemetry from './telemetry';\nimport webhooks from './webhooks';\n\nimport type { Provider } from './provider';\n\nexport const providers: Provider[] = [\n registries,\n admin,\n coreStore,\n sessionManager,\n webhooks,\n telemetry,\n cron,\n];\n"],"names":["providers","registries","admin","coreStore","sessionManager","webhooks","telemetry","cron"],"mappings":";;;;;;;;MAUaA,SAAwB,GAAA;AACnCC,IAAAA,UAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,cAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA;;;;;"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("./provider").Provider;
2
+ export default _default;
3
+ //# sourceMappingURL=session-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/providers/session-manager.ts"],"names":[],"mappings":";AAYA,wBAoBG"}
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+
3
+ var provider = require('./provider.js');
4
+ var sessionManager$1 = require('../services/session-manager.js');
5
+
6
+ var sessionManager = provider.defineProvider({
7
+ init (strapi) {
8
+ strapi.add('sessionManager', ()=>sessionManager$1.createSessionManager({
9
+ db: strapi.db
10
+ }));
11
+ },
12
+ async register (strapi) {
13
+ // Get JWT secret from admin auth settings (same as admin token service)
14
+ const adminAuth = strapi.config.get('admin.auth', {});
15
+ const jwtSecret = adminAuth.secret;
16
+ if (!jwtSecret) {
17
+ throw new Error('Missing admin.auth.secret configuration. The SessionManager requires a JWT secret');
18
+ }
19
+ }
20
+ });
21
+
22
+ module.exports = sessionManager;
23
+ //# sourceMappingURL=session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.js","sources":["../../src/providers/session-manager.ts"],"sourcesContent":["import type { Algorithm } from 'jsonwebtoken';\nimport { defineProvider } from './provider';\nimport { createSessionManager } from '../services/session-manager';\n\ninterface AdminAuthConfig {\n secret?: string;\n options?: {\n algorithm?: Algorithm;\n [key: string]: unknown;\n };\n}\n\nexport default defineProvider({\n init(strapi) {\n strapi.add('sessionManager', () =>\n createSessionManager({\n db: strapi.db,\n })\n );\n },\n\n async register(strapi) {\n // Get JWT secret from admin auth settings (same as admin token service)\n const adminAuth = strapi.config.get<AdminAuthConfig>('admin.auth', {});\n const jwtSecret = adminAuth.secret;\n\n if (!jwtSecret) {\n throw new Error(\n 'Missing admin.auth.secret configuration. The SessionManager requires a JWT secret'\n );\n }\n },\n});\n"],"names":["defineProvider","init","strapi","add","createSessionManager","db","register","adminAuth","config","get","jwtSecret","secret","Error"],"mappings":";;;;;AAYA,qBAAeA,uBAAe,CAAA;AAC5BC,IAAAA,IAAAA,CAAAA,CAAKC,MAAM,EAAA;AACTA,QAAAA,MAAAA,CAAOC,GAAG,CAAC,gBAAkB,EAAA,IAC3BC,qCAAqB,CAAA;AACnBC,gBAAAA,EAAAA,EAAIH,OAAOG;AACb,aAAA,CAAA,CAAA;AAEJ,KAAA;AAEA,IAAA,MAAMC,UAASJ,MAAM,EAAA;;AAEnB,QAAA,MAAMK,YAAYL,MAAOM,CAAAA,MAAM,CAACC,GAAG,CAAkB,cAAc,EAAC,CAAA;QACpE,MAAMC,SAAAA,GAAYH,UAAUI,MAAM;AAElC,QAAA,IAAI,CAACD,SAAW,EAAA;AACd,YAAA,MAAM,IAAIE,KACR,CAAA,mFAAA,CAAA;AAEJ;AACF;AACF,CAAG,CAAA;;;;"}
@@ -0,0 +1,21 @@
1
+ import { defineProvider } from './provider.mjs';
2
+ import { createSessionManager } from '../services/session-manager.mjs';
3
+
4
+ var sessionManager = defineProvider({
5
+ init (strapi) {
6
+ strapi.add('sessionManager', ()=>createSessionManager({
7
+ db: strapi.db
8
+ }));
9
+ },
10
+ async register (strapi) {
11
+ // Get JWT secret from admin auth settings (same as admin token service)
12
+ const adminAuth = strapi.config.get('admin.auth', {});
13
+ const jwtSecret = adminAuth.secret;
14
+ if (!jwtSecret) {
15
+ throw new Error('Missing admin.auth.secret configuration. The SessionManager requires a JWT secret');
16
+ }
17
+ }
18
+ });
19
+
20
+ export { sessionManager as default };
21
+ //# sourceMappingURL=session-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.mjs","sources":["../../src/providers/session-manager.ts"],"sourcesContent":["import type { Algorithm } from 'jsonwebtoken';\nimport { defineProvider } from './provider';\nimport { createSessionManager } from '../services/session-manager';\n\ninterface AdminAuthConfig {\n secret?: string;\n options?: {\n algorithm?: Algorithm;\n [key: string]: unknown;\n };\n}\n\nexport default defineProvider({\n init(strapi) {\n strapi.add('sessionManager', () =>\n createSessionManager({\n db: strapi.db,\n })\n );\n },\n\n async register(strapi) {\n // Get JWT secret from admin auth settings (same as admin token service)\n const adminAuth = strapi.config.get<AdminAuthConfig>('admin.auth', {});\n const jwtSecret = adminAuth.secret;\n\n if (!jwtSecret) {\n throw new Error(\n 'Missing admin.auth.secret configuration. The SessionManager requires a JWT secret'\n );\n }\n },\n});\n"],"names":["defineProvider","init","strapi","add","createSessionManager","db","register","adminAuth","config","get","jwtSecret","secret","Error"],"mappings":";;;AAYA,qBAAeA,cAAe,CAAA;AAC5BC,IAAAA,IAAAA,CAAAA,CAAKC,MAAM,EAAA;AACTA,QAAAA,MAAAA,CAAOC,GAAG,CAAC,gBAAkB,EAAA,IAC3BC,oBAAqB,CAAA;AACnBC,gBAAAA,EAAAA,EAAIH,OAAOG;AACb,aAAA,CAAA,CAAA;AAEJ,KAAA;AAEA,IAAA,MAAMC,UAASJ,MAAM,EAAA;;AAEnB,QAAA,MAAMK,YAAYL,MAAOM,CAAAA,MAAM,CAACC,GAAG,CAAkB,cAAc,EAAC,CAAA;QACpE,MAAMC,SAAAA,GAAYH,UAAUI,MAAM;AAElC,QAAA,IAAI,CAACD,SAAW,EAAA;AACd,YAAA,MAAM,IAAIE,KACR,CAAA,mFAAA,CAAA;AAEJ;AACF;AACF,CAAG,CAAA;;;;"}