@strapi/review-workflows 5.57.0 → 5.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/admin/routes/content-manager/model/id/components/Header.js +6 -6
  2. package/dist/admin/routes/content-manager/model/id/components/Header.js.map +1 -1
  3. package/dist/admin/routes/content-manager/model/id/components/Header.mjs +6 -6
  4. package/dist/admin/routes/content-manager/model/id/components/Header.mjs.map +1 -1
  5. package/dist/admin/routes/content-manager/model/id/components/Panel.js +6 -6
  6. package/dist/admin/routes/content-manager/model/id/components/Panel.js.map +1 -1
  7. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs +6 -6
  8. package/dist/admin/routes/content-manager/model/id/components/Panel.mjs.map +1 -1
  9. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js +13 -0
  10. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js.map +1 -0
  11. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs +11 -0
  12. package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs.map +1 -0
  13. package/dist/admin/routes/settings/components/Stages.js.map +1 -1
  14. package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
  15. package/dist/admin/src/routes/content-manager/model/id/components/Header.d.ts +2 -1
  16. package/dist/admin/src/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.d.ts +5 -0
  17. package/dist/server/controllers/workflows.js +6 -10
  18. package/dist/server/controllers/workflows.js.map +1 -1
  19. package/dist/server/controllers/workflows.mjs +6 -10
  20. package/dist/server/controllers/workflows.mjs.map +1 -1
  21. package/dist/server/entitlements.js +29 -0
  22. package/dist/server/entitlements.js.map +1 -0
  23. package/dist/server/entitlements.mjs +27 -0
  24. package/dist/server/entitlements.mjs.map +1 -0
  25. package/dist/server/index.js +5 -0
  26. package/dist/server/index.js.map +1 -1
  27. package/dist/server/index.mjs +5 -0
  28. package/dist/server/index.mjs.map +1 -1
  29. package/dist/server/register.js +2 -0
  30. package/dist/server/register.js.map +1 -1
  31. package/dist/server/register.mjs +2 -0
  32. package/dist/server/register.mjs.map +1 -1
  33. package/dist/server/services/metrics/index.js +2 -2
  34. package/dist/server/services/metrics/index.js.map +1 -1
  35. package/dist/server/services/metrics/index.mjs +2 -2
  36. package/dist/server/services/metrics/index.mjs.map +1 -1
  37. package/dist/server/services/metrics/weekly-metrics.js +1 -1
  38. package/dist/server/services/metrics/weekly-metrics.js.map +1 -1
  39. package/dist/server/services/metrics/weekly-metrics.mjs +1 -1
  40. package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -1
  41. package/dist/server/services/stage-permissions.js +4 -4
  42. package/dist/server/services/stage-permissions.js.map +1 -1
  43. package/dist/server/services/stage-permissions.mjs +4 -4
  44. package/dist/server/services/stage-permissions.mjs.map +1 -1
  45. package/dist/server/services/stages.js +2 -2
  46. package/dist/server/services/stages.js.map +1 -1
  47. package/dist/server/services/stages.mjs +2 -2
  48. package/dist/server/services/stages.mjs.map +1 -1
  49. package/dist/server/services/workflows.js +2 -2
  50. package/dist/server/services/workflows.js.map +1 -1
  51. package/dist/server/services/workflows.mjs +2 -2
  52. package/dist/server/services/workflows.mjs.map +1 -1
  53. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  54. package/dist/server/src/entitlements.d.ts +7 -0
  55. package/dist/server/src/entitlements.d.ts.map +1 -0
  56. package/dist/server/src/index.d.ts +21 -21
  57. package/dist/server/src/index.d.ts.map +1 -1
  58. package/dist/server/src/register.d.ts.map +1 -1
  59. package/dist/server/src/services/index.d.ts +5 -8
  60. package/dist/server/src/services/index.d.ts.map +1 -1
  61. package/dist/server/src/services/metrics/index.d.ts +8 -2
  62. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  63. package/dist/server/src/services/metrics/weekly-metrics.d.ts +2 -6
  64. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  65. package/dist/server/src/services/workflows.d.ts +5 -3
  66. package/dist/server/src/services/workflows.d.ts.map +1 -1
  67. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  68. package/package.json +10 -8
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = getVisibleContentTypesUID(contentTypes).filter((uid) =>\n hasStageAttribute(contentTypes[uid])\n );\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep({}, strapi.ee.features.get('review-workflows'), {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n });\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","ee","features","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","workflowsValidationService","getService"],"mappings":"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"}
1
+ {"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\nimport { registerReviewWorkflowsEntitlements } from './entitlements';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = getVisibleContentTypesUID(contentTypes).filter((uid) =>\n hasStageAttribute(contentTypes[uid])\n );\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep({}, strapi.ee.features.get('review-workflows'), {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n });\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n\n registerReviewWorkflowsEntitlements(strapi);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","ee","features","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","workflowsValidationService","getService","registerReviewWorkflowsEntitlements"],"mappings":"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"}
@@ -8,6 +8,7 @@ import migrateWorkflowsContentTypes from './migrations/multiple-workflows.mjs';
8
8
  import migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows.mjs';
9
9
  import reviewWorkflowsMiddlewares from './middlewares/review-workflows.mjs';
10
10
  import { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows.mjs';
11
+ import { registerReviewWorkflowsEntitlements } from './entitlements.mjs';
11
12
  import { MAX_STAGES_PER_WORKFLOW, MAX_WORKFLOWS, ENTITY_STAGE_ATTRIBUTE, ENTITY_ASSIGNEE_ATTRIBUTE, STAGE_MODEL_UID } from './constants/workflows.mjs';
12
13
 
13
14
  const setRelation = (attributeName, target, contentType)=>{
@@ -104,6 +105,7 @@ var register = (async ({ strapi })=>{
104
105
  strapi
105
106
  });
106
107
  workflowsValidationService.register(reviewWorkflowsOptions);
108
+ registerReviewWorkflowsEntitlements(strapi);
107
109
  });
108
110
 
109
111
  export { register as default };
@@ -1 +1 @@
1
- {"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = getVisibleContentTypesUID(contentTypes).filter((uid) =>\n hasStageAttribute(contentTypes[uid])\n );\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep({}, strapi.ee.features.get('review-workflows'), {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n });\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","ee","features","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","workflowsValidationService","getService"],"mappings":"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"}
1
+ {"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import { defaultsDeep } from 'lodash';\n\nimport type { Core, UID } from '@strapi/types';\n\nimport { getService, getAdminService } from './utils';\nimport migrateReviewWorkflowStagesColor from './migrations/set-stages-default-color';\nimport migrateReviewWorkflowStagesRoles from './migrations/set-stages-roles';\nimport migrateReviewWorkflowStagesTransferToRoles from './migrations/setup-stage-transfer-to-roles';\nimport migrateReviewWorkflowName from './migrations/set-workflow-default-name';\nimport migrateWorkflowsContentTypes from './migrations/multiple-workflows';\nimport migrateDeletedCTInWorkflows from './migrations/handle-deleted-ct-in-workflows';\nimport reviewWorkflowsMiddlewares from './middlewares/review-workflows';\n\nimport { getVisibleContentTypesUID, hasStageAttribute } from './utils/review-workflows';\nimport { registerReviewWorkflowsEntitlements } from './entitlements';\n\nimport {\n ENTITY_STAGE_ATTRIBUTE,\n ENTITY_ASSIGNEE_ATTRIBUTE,\n STAGE_MODEL_UID,\n MAX_WORKFLOWS,\n MAX_STAGES_PER_WORKFLOW,\n} from './constants/workflows';\n\nconst setRelation = (attributeName: any, target: any, contentType: any) => {\n Object.assign(contentType.attributes, {\n [attributeName]: {\n writable: true,\n private: false,\n configurable: false,\n visible: false,\n useJoinTable: true, // We want a join table to persist data when downgrading to CE\n type: 'relation',\n relation: 'oneToOne',\n target,\n },\n });\n\n return contentType;\n};\n\n/**\n * Add the stage and assignee attributes to content types\n */\nfunction extendReviewWorkflowContentTypes({ strapi }: { strapi: Core.Strapi }) {\n const contentTypeToExtend = getVisibleContentTypesUID(strapi.contentTypes);\n\n for (const contentTypeUID of contentTypeToExtend) {\n strapi.get('content-types').extend(contentTypeUID, (contentType: any) => {\n // Set Stage attribute\n setRelation(ENTITY_STAGE_ATTRIBUTE, STAGE_MODEL_UID, contentType);\n // Set Assignee attribute\n setRelation(ENTITY_ASSIGNEE_ATTRIBUTE, 'admin::user', contentType);\n });\n }\n}\n\n/**\n * Persist the stage & assignee attributes so they are not removed when downgrading to CE.\n *\n * TODO: V6 - Instead of persisting the join tables, always create the stage & assignee attributes, even in CE mode\n * It was decided in V4 & V5 to not expose them in CE (as they pollute the CTs) but it's not worth given the complexity this needs\n */\nfunction persistRWOnDowngrade({ strapi }: { strapi: Core.Strapi }) {\n const { removePersistedTablesWithSuffix, persistTables } = getAdminService('persist-tables');\n\n return async ({ contentTypes }: { contentTypes: Record<UID.ContentType, any> }) => {\n const getStageTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the stage join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_STAGE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const getAssigneeTableToPersist = (contentTypeUID: UID.ContentType) => {\n // Persist the assignee join table\n const { attributes, tableName } = strapi.db.metadata.get(contentTypeUID) as any;\n const joinTableName = attributes[ENTITY_ASSIGNEE_ATTRIBUTE].joinTable.name;\n return {\n name: joinTableName,\n dependsOn: [{ name: tableName }],\n };\n };\n\n const enabledRWContentTypes = getVisibleContentTypesUID(contentTypes).filter((uid) =>\n hasStageAttribute(contentTypes[uid])\n );\n\n // Remove previously created join tables and persist the new ones\n const stageJoinTablesToPersist = enabledRWContentTypes.map(getStageTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_stage_lnk');\n await persistTables(stageJoinTablesToPersist);\n\n // Remove previously created join tables and persist the new ones\n const assigneeJoinTablesToPersist = enabledRWContentTypes.map(getAssigneeTableToPersist);\n await removePersistedTablesWithSuffix('_strapi_assignee_lnk');\n await persistTables(assigneeJoinTablesToPersist);\n };\n}\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n // Data Migrations\n strapi.hook('strapi::content-types.afterSync').register(persistRWOnDowngrade({ strapi }));\n strapi\n .hook('strapi::content-types.afterSync')\n .register(migrateReviewWorkflowStagesColor)\n .register(migrateReviewWorkflowStagesRoles)\n .register(migrateReviewWorkflowStagesTransferToRoles)\n .register(migrateReviewWorkflowName)\n .register(migrateWorkflowsContentTypes)\n .register(migrateDeletedCTInWorkflows);\n\n // Middlewares\n reviewWorkflowsMiddlewares.contentTypeMiddleware(strapi);\n\n // Schema customization\n extendReviewWorkflowContentTypes({ strapi });\n\n // License limits\n const reviewWorkflowsOptions = defaultsDeep({}, strapi.ee.features.get('review-workflows'), {\n numberOfWorkflows: MAX_WORKFLOWS,\n stagesPerWorkflow: MAX_STAGES_PER_WORKFLOW,\n });\n const workflowsValidationService = getService('validation', { strapi });\n workflowsValidationService.register(reviewWorkflowsOptions);\n\n registerReviewWorkflowsEntitlements(strapi);\n};\n"],"names":["setRelation","attributeName","target","contentType","Object","assign","attributes","writable","private","configurable","visible","useJoinTable","type","relation","extendReviewWorkflowContentTypes","strapi","contentTypeToExtend","getVisibleContentTypesUID","contentTypes","contentTypeUID","get","extend","ENTITY_STAGE_ATTRIBUTE","STAGE_MODEL_UID","ENTITY_ASSIGNEE_ATTRIBUTE","persistRWOnDowngrade","removePersistedTablesWithSuffix","persistTables","getAdminService","getStageTableToPersist","tableName","db","metadata","joinTableName","joinTable","name","dependsOn","getAssigneeTableToPersist","enabledRWContentTypes","filter","uid","hasStageAttribute","stageJoinTablesToPersist","map","assigneeJoinTablesToPersist","hook","register","migrateReviewWorkflowStagesColor","migrateReviewWorkflowStagesRoles","migrateReviewWorkflowStagesTransferToRoles","migrateReviewWorkflowName","migrateWorkflowsContentTypes","migrateDeletedCTInWorkflows","reviewWorkflowsMiddlewares","contentTypeMiddleware","reviewWorkflowsOptions","defaultsDeep","ee","features","numberOfWorkflows","MAX_WORKFLOWS","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW","workflowsValidationService","getService","registerReviewWorkflowsEntitlements"],"mappings":"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"}
@@ -34,8 +34,8 @@ const sendDidEditAssignee = async (fromId, toId)=>{
34
34
  to: toId
35
35
  });
36
36
  };
37
- const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes)=>{
38
- strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
37
+ const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({ numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes })=>{
38
+ await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
39
39
  groupProperties: {
40
40
  numberOfActiveWorkflows,
41
41
  avgStagesCount,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (\n numberOfActiveWorkflows: number,\n avgStagesCount: number,\n maxStagesCount: number,\n activatedContentTypes: number\n) => {\n strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;;;;;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AAEO,MAAMG,4CAAAA,GAA+C,OAC1DC,uBAAAA,EACAC,gBACAC,cAAAA,EACAC,qBAAAA,GAAAA;AAEAnB,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QAChEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport type WeeklyMetrics = {\n numberOfActiveWorkflows: number;\n avgStagesCount: number;\n maxStagesCount: number | undefined;\n activatedContentTypes: number;\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n}: WeeklyMetrics) => {\n await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;;;;;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AASO,MAAMG,4CAAAA,GAA+C,OAAO,EACjEC,uBAAuB,EACvBC,cAAc,EACdC,cAAc,EACdC,qBAAqB,EACP,GAAA;AACd,IAAA,MAAMnB,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QACtEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;;;;;;;;;"}
@@ -30,8 +30,8 @@ const sendDidEditAssignee = async (fromId, toId)=>{
30
30
  to: toId
31
31
  });
32
32
  };
33
- const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes)=>{
34
- strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
33
+ const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({ numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes })=>{
34
+ await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
35
35
  groupProperties: {
36
36
  numberOfActiveWorkflows,
37
37
  avgStagesCount,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (\n numberOfActiveWorkflows: number,\n avgStagesCount: number,\n maxStagesCount: number,\n activatedContentTypes: number\n) => {\n strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AAEO,MAAMG,4CAAAA,GAA+C,OAC1DC,uBAAAA,EACAC,gBACAC,cAAAA,EACAC,qBAAAA,GAAAA;AAEAnB,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QAChEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport type WeeklyMetrics = {\n numberOfActiveWorkflows: number;\n avgStagesCount: number;\n maxStagesCount: number | undefined;\n activatedContentTypes: number;\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n}: WeeklyMetrics) => {\n await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AASO,MAAMG,4CAAAA,GAA+C,OAAO,EACjEC,uBAAuB,EACvBC,cAAc,EACdC,cAAc,EACdC,qBAAqB,EACP,GAAA;AACd,IAAA,MAAMnB,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QACtEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;"}
@@ -44,7 +44,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
44
44
  },
45
45
  async sendMetrics () {
46
46
  const computedMetrics = await this.computeMetrics();
47
- metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
47
+ await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
48
48
  const metricsInfoStored = await getMetricsStoreValue();
49
49
  // @ts-expect-error metricsInfoStored can use spread
50
50
  await setMetricsStoreValue({
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
1
+ {"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\nimport type workflowMetrics from './index';\nimport type { WeeklyMetrics } from './index';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi }) as typeof workflowMetrics;\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics(): Promise<WeeklyMetrics> {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
@@ -42,7 +42,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
42
42
  },
43
43
  async sendMetrics () {
44
44
  const computedMetrics = await this.computeMetrics();
45
- metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
45
+ await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
46
46
  const metricsInfoStored = await getMetricsStoreValue();
47
47
  // @ts-expect-error metricsInfoStored can use spread
48
48
  await setMetricsStoreValue({
@@ -1 +1 @@
1
- {"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
1
+ {"version":3,"file":"weekly-metrics.mjs","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\nimport type workflowMetrics from './index';\nimport type { WeeklyMetrics } from './index';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi }) as typeof workflowMetrics;\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics(): Promise<WeeklyMetrics> {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":"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"}
@@ -5,9 +5,9 @@ var index = require('../utils/index.js');
5
5
  var workflows = require('../constants/workflows.js');
6
6
 
7
7
  const { ApplicationError } = utils.errors;
8
- const validActions = [
8
+ const validActions = new Set([
9
9
  workflows.STAGE_TRANSITION_UID
10
- ];
10
+ ]);
11
11
  var stagePermissions = (({ strapi })=>{
12
12
  const roleService = index.getAdminService('role');
13
13
  const permissionService = index.getAdminService('permission');
@@ -20,7 +20,7 @@ var stagePermissions = (({ strapi })=>{
20
20
  };
21
21
  return {
22
22
  async register ({ roleId, action, fromStage }) {
23
- if (!validActions.includes(action)) {
23
+ if (!validActions.has(action)) {
24
24
  throw new ApplicationError(`Invalid action ${action}`);
25
25
  }
26
26
  const permissions = await roleService.addPermissions(roleId, [
@@ -38,7 +38,7 @@ var stagePermissions = (({ strapi })=>{
38
38
  return utils.async.map(permissions, this.register);
39
39
  },
40
40
  async registerTo ({ roleId, action, toStage }) {
41
- if (!validActions.includes(action)) {
41
+ if (!validActions.has(action)) {
42
42
  throw new ApplicationError(`Invalid action ${action}`);
43
43
  }
44
44
  const permissions = await roleService.addPermissions(roleId, [
@@ -1 +1 @@
1
- {"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
1
+ {"version":3,"file":"stage-permissions.js","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = new Set([STAGE_TRANSITION_UID]);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","Set","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","has","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","undefined"],"mappings":"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"}
@@ -3,9 +3,9 @@ import { getAdminService } from '../utils/index.mjs';
3
3
  import { STAGE_MODEL_UID, STAGE_TRANSITION_UID } from '../constants/workflows.mjs';
4
4
 
5
5
  const { ApplicationError } = errors;
6
- const validActions = [
6
+ const validActions = new Set([
7
7
  STAGE_TRANSITION_UID
8
- ];
8
+ ]);
9
9
  var stagePermissions = (({ strapi })=>{
10
10
  const roleService = getAdminService('role');
11
11
  const permissionService = getAdminService('permission');
@@ -18,7 +18,7 @@ var stagePermissions = (({ strapi })=>{
18
18
  };
19
19
  return {
20
20
  async register ({ roleId, action, fromStage }) {
21
- if (!validActions.includes(action)) {
21
+ if (!validActions.has(action)) {
22
22
  throw new ApplicationError(`Invalid action ${action}`);
23
23
  }
24
24
  const permissions = await roleService.addPermissions(roleId, [
@@ -36,7 +36,7 @@ var stagePermissions = (({ strapi })=>{
36
36
  return async.map(permissions, this.register);
37
37
  },
38
38
  async registerTo ({ roleId, action, toStage }) {
39
- if (!validActions.includes(action)) {
39
+ if (!validActions.has(action)) {
40
40
  throw new ApplicationError(`Invalid action ${action}`);
41
41
  }
42
42
  const permissions = await roleService.addPermissions(roleId, [
@@ -1 +1 @@
1
- {"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = [STAGE_TRANSITION_UID];\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.includes(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","includes","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","Set","undefined","has"],"mappings":"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"}
1
+ {"version":3,"file":"stage-permissions.mjs","sources":["../../../server/src/services/stage-permissions.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { async, errors } from '@strapi/utils';\nimport { getAdminService } from '../utils';\nimport { STAGE_TRANSITION_UID, STAGE_MODEL_UID } from '../constants/workflows';\n\nconst { ApplicationError } = errors;\nconst validActions = new Set([STAGE_TRANSITION_UID]);\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const roleService = getAdminService('role');\n const permissionService = getAdminService('permission');\n\n const getUserRoles = () => {\n const requestState = strapi.requestContext.get()?.state;\n if (!requestState) {\n return null;\n }\n\n return (requestState.user?.roles as { id: number; code: string }[] | undefined) ?? null;\n };\n\n return {\n async register({\n roleId,\n action,\n fromStage,\n }: {\n roleId: number;\n action: string;\n fromStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n from: fromStage,\n },\n },\n ]);\n\n // TODO: Filter response\n return permissions;\n },\n async registerMany(permissions: { roleId: number; action: string; fromStage: number }[]) {\n return async.map(permissions, this.register);\n },\n async registerTo({\n roleId,\n action,\n toStage,\n }: {\n roleId: number;\n action: string;\n toStage: number;\n }) {\n if (!validActions.has(action)) {\n throw new ApplicationError(`Invalid action ${action}`);\n }\n const permissions = await roleService.addPermissions(roleId, [\n {\n action,\n actionParameters: {\n to: toStage,\n },\n },\n ]);\n\n return permissions;\n },\n async registerManyTo(permissions: { roleId: number; action: string; toStage: number }[]) {\n return async.map(permissions, this.registerTo);\n },\n async unregister(permissions: { id: number }[]) {\n const permissionIds = permissions.map((permission) => permission?.id);\n await permissionService.deleteByIds(permissionIds);\n },\n can(action: string, fromStage: number) {\n const requestState = strapi.requestContext.get()?.state;\n\n if (!requestState) {\n return false;\n }\n\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n return requestState.userAbility.can({\n name: action,\n params: { from: fromStage },\n });\n },\n async canTransitionToStage(toStageId: number) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const targetStage = await strapi.db.query(STAGE_MODEL_UID).findOne({\n where: { id: toStageId },\n populate: { permissions: { populate: ['role'] } },\n });\n\n if (!targetStage) {\n return false;\n }\n\n return this.canTransitionToStageWithPermissions(targetStage);\n },\n /**\n * Check if the current user can transition to a stage using pre-loaded permissions.\n * The stage must already have its permissions populated with roles.\n */\n canTransitionToStageWithPermissions(stage: {\n permissions?: { actionParameters?: { to?: number }; role?: { id: number } | number }[];\n }) {\n const userRoles = getUserRoles();\n if (!userRoles) {\n return false;\n }\n\n if (userRoles.some((role) => role.code === 'strapi-super-admin')) {\n return true;\n }\n\n const toPermissions = (stage.permissions || []).filter(\n (p: { actionParameters?: { to?: number } }) => p.actionParameters?.to\n );\n\n const userRoleIds = new Set(userRoles.map((role) => role.id));\n\n return toPermissions.some((p: { role?: { id: number } | number }) => {\n const roleId = typeof p.role === 'object' ? p.role?.id : p.role;\n return roleId !== undefined && userRoleIds.has(roleId);\n });\n },\n };\n};\n"],"names":["ApplicationError","errors","validActions","Set","STAGE_TRANSITION_UID","strapi","roleService","getAdminService","permissionService","getUserRoles","requestState","requestContext","get","state","user","roles","register","roleId","action","fromStage","has","permissions","addPermissions","actionParameters","from","registerMany","async","map","registerTo","toStage","to","registerManyTo","unregister","permissionIds","permission","id","deleteByIds","can","userRoles","some","role","code","userAbility","name","params","canTransitionToStage","toStageId","targetStage","db","query","STAGE_MODEL_UID","findOne","where","populate","canTransitionToStageWithPermissions","stage","toPermissions","filter","p","userRoleIds","undefined"],"mappings":";;;;AAKA,MAAM,EAAEA,gBAAgB,EAAE,GAAGC,MAAAA;AAC7B,MAAMC,YAAAA,GAAe,IAAIC,GAAAA,CAAI;AAACC,IAAAA;AAAqB,CAAA,CAAA;AAEnD,uBAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;AACjD,IAAA,MAAMC,cAAcC,eAAAA,CAAgB,MAAA,CAAA;AACpC,IAAA,MAAMC,oBAAoBD,eAAAA,CAAgB,YAAA,CAAA;AAE1C,IAAA,MAAME,YAAAA,GAAe,IAAA;AACnB,QAAA,MAAMC,YAAAA,GAAeL,MAAAA,CAAOM,cAAc,CAACC,GAAG,EAAA,EAAIC,KAAAA;AAClD,QAAA,IAAI,CAACH,YAAAA,EAAc;YACjB,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,OAAO,YAACA,CAAaI,IAAI,EAAEC,KAAAA,IAAwD,IAAA;AACrF,IAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,UAAS,EACbC,MAAM,EACNC,MAAM,EACNC,SAAS,EAKV,EAAA;AACC,YAAA,IAAI,CAACjB,YAAAA,CAAakB,GAAG,CAACF,MAAAA,CAAAA,EAAS;AAC7B,gBAAA,MAAM,IAAIlB,gBAAAA,CAAiB,CAAC,eAAe,EAAEkB,MAAAA,CAAAA,CAAQ,CAAA;AACvD,YAAA;AACA,YAAA,MAAMG,WAAAA,GAAc,MAAMf,WAAAA,CAAYgB,cAAc,CAACL,MAAAA,EAAQ;AAC3D,gBAAA;AACEC,oBAAAA,MAAAA;oBACAK,gBAAAA,EAAkB;wBAChBC,IAAAA,EAAML;AACR;AACF;AACD,aAAA,CAAA;;YAGD,OAAOE,WAAAA;AACT,QAAA,CAAA;AACA,QAAA,MAAMI,cAAaJ,WAAoE,EAAA;AACrF,YAAA,OAAOK,MAAMC,GAAG,CAACN,WAAAA,EAAa,IAAI,CAACL,QAAQ,CAAA;AAC7C,QAAA,CAAA;AACA,QAAA,MAAMY,YAAW,EACfX,MAAM,EACNC,MAAM,EACNW,OAAO,EAKR,EAAA;AACC,YAAA,IAAI,CAAC3B,YAAAA,CAAakB,GAAG,CAACF,MAAAA,CAAAA,EAAS;AAC7B,gBAAA,MAAM,IAAIlB,gBAAAA,CAAiB,CAAC,eAAe,EAAEkB,MAAAA,CAAAA,CAAQ,CAAA;AACvD,YAAA;AACA,YAAA,MAAMG,WAAAA,GAAc,MAAMf,WAAAA,CAAYgB,cAAc,CAACL,MAAAA,EAAQ;AAC3D,gBAAA;AACEC,oBAAAA,MAAAA;oBACAK,gBAAAA,EAAkB;wBAChBO,EAAAA,EAAID;AACN;AACF;AACD,aAAA,CAAA;YAED,OAAOR,WAAAA;AACT,QAAA,CAAA;AACA,QAAA,MAAMU,gBAAeV,WAAkE,EAAA;AACrF,YAAA,OAAOK,MAAMC,GAAG,CAACN,WAAAA,EAAa,IAAI,CAACO,UAAU,CAAA;AAC/C,QAAA,CAAA;AACA,QAAA,MAAMI,YAAWX,WAA6B,EAAA;AAC5C,YAAA,MAAMY,gBAAgBZ,WAAAA,CAAYM,GAAG,CAAC,CAACO,aAAeA,UAAAA,EAAYC,EAAAA,CAAAA;YAClE,MAAM3B,iBAAAA,CAAkB4B,WAAW,CAACH,aAAAA,CAAAA;AACtC,QAAA,CAAA;QACAI,GAAAA,CAAAA,CAAInB,MAAc,EAAEC,SAAiB,EAAA;AACnC,YAAA,MAAMT,YAAAA,GAAeL,MAAAA,CAAOM,cAAc,CAACC,GAAG,EAAA,EAAIC,KAAAA;AAElD,YAAA,IAAI,CAACH,YAAAA,EAAc;gBACjB,OAAO,KAAA;AACT,YAAA;AAEA,YAAA,MAAM4B,SAAAA,GAAY7B,YAAAA,EAAAA;AAClB,YAAA,IAAI,CAAC6B,SAAAA,EAAW;gBACd,OAAO,KAAA;AACT,YAAA;YAEA,IAAIA,SAAAA,CAAUC,IAAI,CAAC,CAACC,OAASA,IAAAA,CAAKC,IAAI,KAAK,oBAAA,CAAA,EAAuB;gBAChE,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,OAAO/B,YAAAA,CAAagC,WAAW,CAACL,GAAG,CAAC;gBAClCM,IAAAA,EAAMzB,MAAAA;gBACN0B,MAAAA,EAAQ;oBAAEpB,IAAAA,EAAML;AAAU;AAC5B,aAAA,CAAA;AACF,QAAA,CAAA;AACA,QAAA,MAAM0B,sBAAqBC,SAAiB,EAAA;AAC1C,YAAA,MAAMR,SAAAA,GAAY7B,YAAAA,EAAAA;AAClB,YAAA,IAAI,CAAC6B,SAAAA,EAAW;gBACd,OAAO,KAAA;AACT,YAAA;YAEA,IAAIA,SAAAA,CAAUC,IAAI,CAAC,CAACC,OAASA,IAAAA,CAAKC,IAAI,KAAK,oBAAA,CAAA,EAAuB;gBAChE,OAAO,IAAA;AACT,YAAA;YAEA,MAAMM,WAAAA,GAAc,MAAM1C,MAAAA,CAAO2C,EAAE,CAACC,KAAK,CAACC,eAAAA,CAAAA,CAAiBC,OAAO,CAAC;gBACjEC,KAAAA,EAAO;oBAAEjB,EAAAA,EAAIW;AAAU,iBAAA;gBACvBO,QAAAA,EAAU;oBAAEhC,WAAAA,EAAa;wBAAEgC,QAAAA,EAAU;AAAC,4BAAA;AAAO;AAAC;AAAE;AAClD,aAAA,CAAA;AAEA,YAAA,IAAI,CAACN,WAAAA,EAAa;gBAChB,OAAO,KAAA;AACT,YAAA;YAEA,OAAO,IAAI,CAACO,mCAAmC,CAACP,WAAAA,CAAAA;AAClD,QAAA,CAAA;AACA;;;AAGC,QACDO,qCAAoCC,KAEnC,EAAA;AACC,YAAA,MAAMjB,SAAAA,GAAY7B,YAAAA,EAAAA;AAClB,YAAA,IAAI,CAAC6B,SAAAA,EAAW;gBACd,OAAO,KAAA;AACT,YAAA;YAEA,IAAIA,SAAAA,CAAUC,IAAI,CAAC,CAACC,OAASA,IAAAA,CAAKC,IAAI,KAAK,oBAAA,CAAA,EAAuB;gBAChE,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAMe,aAAAA,GAAiBD,CAAAA,KAAAA,CAAMlC,WAAW,IAAI,EAAE,EAAEoC,MAAM,CACpD,CAACC,CAAAA,GAA8CA,CAAAA,CAAEnC,gBAAgB,EAAEO,EAAAA,CAAAA;YAGrE,MAAM6B,WAAAA,GAAc,IAAIxD,GAAAA,CAAImC,SAAAA,CAAUX,GAAG,CAAC,CAACa,IAAAA,GAASA,IAAAA,CAAKL,EAAE,CAAA,CAAA;YAE3D,OAAOqB,aAAAA,CAAcjB,IAAI,CAAC,CAACmB,CAAAA,GAAAA;gBACzB,MAAMzC,MAAAA,GAAS,OAAOyC,CAAAA,CAAElB,IAAI,KAAK,QAAA,GAAWkB,CAAAA,CAAElB,IAAI,EAAEL,EAAAA,GAAKuB,CAAAA,CAAElB,IAAI;AAC/D,gBAAA,OAAOvB,MAAAA,KAAW2C,SAAAA,IAAaD,WAAAA,CAAYvC,GAAG,CAACH,MAAAA,CAAAA;AACjD,YAAA,CAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
@@ -159,7 +159,7 @@ var stages = (({ strapi })=>{
159
159
  });
160
160
  },
161
161
  async deleteStagePermissions (stages) {
162
- const permissions = stages.map((s)=>s.permissions || []).flat();
162
+ const permissions = stages.flatMap((s)=>s.permissions || []);
163
163
  await stagePermissionsService.unregister(permissions || []);
164
164
  },
165
165
  count ({ workflowId } = {}) {
@@ -378,7 +378,7 @@ const normalizeStageForDiff = (stage)=>({
378
378
  // If no matching element is found before the startIndex,
379
379
  // search the remaining elements in the array
380
380
  const remainingArray = stages.slice(startIndex + 1);
381
- const nearestObject = remainingArray.filter(condition)[0];
381
+ const nearestObject = remainingArray.find(condition);
382
382
  return nearestObject;
383
383
  }
384
384