@nocobase/app-plugin-projects 0.1.0-beta.7 → 0.1.0-beta.8
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.
- package/CHANGELOG.md +29 -0
- package/README.md +55 -103
- package/dist/client/api/client.d.ts +4 -23
- package/dist/client/api/client.d.ts.map +1 -1
- package/dist/client/api/client.js +4 -48
- package/dist/client/api/client.js.map +1 -1
- package/dist/client/api/keys.d.ts +2 -8
- package/dist/client/api/keys.d.ts.map +1 -1
- package/dist/client/api/keys.js +2 -17
- package/dist/client/api/keys.js.map +1 -1
- package/dist/client/components/pm-badges.d.ts +1 -1
- package/dist/client/components/pm-badges.d.ts.map +1 -1
- package/dist/client/components/pm-executor-select.d.ts +2 -0
- package/dist/client/components/pm-executor-select.d.ts.map +1 -1
- package/dist/client/components/pm-executor-select.js.map +1 -1
- package/dist/client/components/ui/radio-group.d.ts +7 -0
- package/dist/client/components/ui/radio-group.d.ts.map +1 -0
- package/dist/client/components/ui/radio-group.js +12 -0
- package/dist/client/components/ui/radio-group.js.map +1 -0
- package/dist/client/config.d.ts +0 -2
- package/dist/client/config.d.ts.map +1 -1
- package/dist/client/config.js +1 -5
- package/dist/client/config.js.map +1 -1
- package/dist/client/issues.d.ts +2 -4
- package/dist/client/issues.d.ts.map +1 -1
- package/dist/client/issues.js +2 -3
- package/dist/client/issues.js.map +1 -1
- package/dist/client/kit/plans/lookup.d.ts +2 -2
- package/dist/client/kit/plans/lookup.js +3 -3
- package/dist/client/kit/plans/lookup.js.map +1 -1
- package/dist/client/kit/plans/plan-row.js +2 -2
- package/dist/client/kit/plans/plan-row.js.map +1 -1
- package/dist/client/kit.d.ts +2 -9
- package/dist/client/kit.d.ts.map +1 -1
- package/dist/client/kit.js +2 -9
- package/dist/client/kit.js.map +1 -1
- package/dist/client/lib/kinds.d.ts +3 -29
- package/dist/client/lib/kinds.d.ts.map +1 -1
- package/dist/client/lib/kinds.js +7 -46
- package/dist/client/lib/kinds.js.map +1 -1
- package/dist/client/lib/status-events.d.ts +21 -0
- package/dist/client/lib/status-events.d.ts.map +1 -0
- package/dist/client/lib/status-events.js +31 -0
- package/dist/client/lib/status-events.js.map +1 -0
- package/dist/client/lib/status.d.ts +5 -7
- package/dist/client/lib/status.d.ts.map +1 -1
- package/dist/client/lib/status.js +5 -7
- package/dist/client/lib/status.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +6 -256
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +9 -255
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +10 -248
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/pages/issues/board/board-model.d.ts +1 -1
- package/dist/client/pages/issues/board/board-model.js +1 -1
- package/dist/client/pages/issues/board/use-board-move.d.ts +2 -8
- package/dist/client/pages/issues/board/use-board-move.d.ts.map +1 -1
- package/dist/client/pages/issues/board/use-board-move.js +5 -42
- package/dist/client/pages/issues/board/use-board-move.js.map +1 -1
- package/dist/client/pages/issues/detail/new-subtask.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/new-subtask.js +6 -28
- package/dist/client/pages/issues/detail/new-subtask.js.map +1 -1
- package/dist/client/pages/issues/detail/subtask-model.d.ts +1 -1
- package/dist/client/pages/issues/detail/subtask-model.js +1 -1
- package/dist/client/pages/issues/detail/use-confirmed-update.d.ts +6 -8
- package/dist/client/pages/issues/detail/use-confirmed-update.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-confirmed-update.js +9 -42
- package/dist/client/pages/issues/detail/use-confirmed-update.js.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-page.d.ts +0 -4
- package/dist/client/pages/issues/detail/use-issue-page.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-page.js +0 -14
- package/dist/client/pages/issues/detail/use-issue-page.js.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-update.d.ts +2 -2
- package/dist/client/pages/issues/detail/use-issue-update.d.ts.map +1 -1
- package/dist/client/pages/issues/detail/use-issue-update.js +4 -6
- package/dist/client/pages/issues/detail/use-issue-update.js.map +1 -1
- package/dist/client/pages/issues/new-issue-form.d.ts +11 -8
- package/dist/client/pages/issues/new-issue-form.d.ts.map +1 -1
- package/dist/client/pages/issues/new-issue-form.js +47 -79
- package/dist/client/pages/issues/new-issue-form.js.map +1 -1
- package/dist/client/pages/issues/new.d.ts.map +1 -1
- package/dist/client/pages/issues/new.js +2 -1
- package/dist/client/pages/issues/new.js.map +1 -1
- package/dist/client/pages/issues/use-executor-options.d.ts +3 -2
- package/dist/client/pages/issues/use-executor-options.d.ts.map +1 -1
- package/dist/client/pages/issues/use-executor-options.js +5 -23
- package/dist/client/pages/issues/use-executor-options.js.map +1 -1
- package/dist/client/pages/projects/detail/use-project-page.d.ts +4 -26
- package/dist/client/pages/projects/detail/use-project-page.d.ts.map +1 -1
- package/dist/client/pages/projects/detail/use-project-page.js +7 -53
- package/dist/client/pages/projects/detail/use-project-page.js.map +1 -1
- package/dist/client/pages/projects/new.d.ts +1 -1
- package/dist/client/pages/projects/new.d.ts.map +1 -1
- package/dist/client/pages/projects/new.js +3 -7
- package/dist/client/pages/projects/new.js.map +1 -1
- package/dist/client/plugin.d.ts +3 -0
- package/dist/client/plugin.d.ts.map +1 -1
- package/dist/client/plugin.js +8 -1
- package/dist/client/plugin.js.map +1 -1
- package/dist/client/projects.d.ts +2 -2
- package/dist/client/projects.d.ts.map +1 -1
- package/dist/client/projects.js +2 -2
- package/dist/client/projects.js.map +1 -1
- package/dist/client/providers/query-provider.d.ts.map +1 -1
- package/dist/client/providers/query-provider.js +0 -4
- package/dist/client/providers/query-provider.js.map +1 -1
- package/dist/database/migrations/.manifest.json +4 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.d.ts +4 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.d.ts.map +1 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.js +189 -0
- package/dist/database/migrations/202610240010_pm_fixed_statuses.js.map +1 -0
- package/dist/server/composition.d.ts +11 -17
- package/dist/server/composition.d.ts.map +1 -1
- package/dist/server/composition.js +11 -56
- package/dist/server/composition.js.map +1 -1
- package/dist/server/domains/issues/index.d.ts +1 -1
- package/dist/server/domains/issues/index.d.ts.map +1 -1
- package/dist/server/domains/issues/index.js +1 -1
- package/dist/server/domains/issues/index.js.map +1 -1
- package/dist/server/domains/issues/issue.context.d.ts +6 -22
- package/dist/server/domains/issues/issue.context.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.context.js +1 -22
- package/dist/server/domains/issues/issue.context.js.map +1 -1
- package/dist/server/domains/issues/issue.fields.d.ts +3 -3
- package/dist/server/domains/issues/issue.fields.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.fields.js +12 -15
- package/dist/server/domains/issues/issue.fields.js.map +1 -1
- package/dist/server/domains/issues/issue.projects.d.ts +2 -2
- package/dist/server/domains/issues/issue.projects.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.projects.js +1 -2
- package/dist/server/domains/issues/issue.projects.js.map +1 -1
- package/dist/server/domains/issues/issue.queries.d.ts +5 -7
- package/dist/server/domains/issues/issue.queries.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.queries.js +12 -41
- package/dist/server/domains/issues/issue.queries.js.map +1 -1
- package/dist/server/domains/issues/issue.routes.d.ts +1 -1
- package/dist/server/domains/issues/issue.routes.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.routes.js +17 -37
- package/dist/server/domains/issues/issue.routes.js.map +1 -1
- package/dist/server/domains/issues/issue.service.d.ts +20 -44
- package/dist/server/domains/issues/issue.service.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.service.js +19 -80
- package/dist/server/domains/issues/issue.service.js.map +1 -1
- package/dist/server/domains/issues/issue.status.d.ts +6 -10
- package/dist/server/domains/issues/issue.status.d.ts.map +1 -1
- package/dist/server/domains/issues/issue.status.js +3 -20
- package/dist/server/domains/issues/issue.status.js.map +1 -1
- package/dist/server/domains/issues/ports.d.ts +19 -36
- package/dist/server/domains/issues/ports.d.ts.map +1 -1
- package/dist/server/domains/issues/ports.js +0 -5
- package/dist/server/domains/issues/ports.js.map +1 -1
- package/dist/server/domains/notices/notice.planner.d.ts +2 -1
- package/dist/server/domains/notices/notice.planner.d.ts.map +1 -1
- package/dist/server/domains/notices/notice.planner.js +2 -1
- package/dist/server/domains/notices/notice.planner.js.map +1 -1
- package/dist/server/domains/notices/notice.rules.d.ts +1 -4
- package/dist/server/domains/notices/notice.rules.d.ts.map +1 -1
- package/dist/server/domains/notices/notice.rules.js +4 -5
- package/dist/server/domains/notices/notice.rules.js.map +1 -1
- package/dist/server/domains/plans/plan.ops.d.ts +3 -3
- package/dist/server/domains/plans/plan.ops.d.ts.map +1 -1
- package/dist/server/domains/plans/plan.ops.js +7 -10
- package/dist/server/domains/plans/plan.ops.js.map +1 -1
- package/dist/server/domains/projects/index.d.ts +1 -1
- package/dist/server/domains/projects/index.d.ts.map +1 -1
- package/dist/server/domains/projects/index.js.map +1 -1
- package/dist/server/domains/projects/project.routes.d.ts.map +1 -1
- package/dist/server/domains/projects/project.routes.js +1 -3
- package/dist/server/domains/projects/project.routes.js.map +1 -1
- package/dist/server/domains/projects/project.service.d.ts +0 -7
- package/dist/server/domains/projects/project.service.d.ts.map +1 -1
- package/dist/server/domains/projects/project.service.js +0 -17
- package/dist/server/domains/projects/project.service.js.map +1 -1
- package/dist/server/domains/projects/project.store.d.ts +0 -1
- package/dist/server/domains/projects/project.store.d.ts.map +1 -1
- package/dist/server/domains/projects/project.store.js +0 -1
- package/dist/server/domains/projects/project.store.js.map +1 -1
- package/dist/server/domains/reports/report.service.d.ts +1 -12
- package/dist/server/domains/reports/report.service.d.ts.map +1 -1
- package/dist/server/domains/reports/report.service.js +23 -79
- package/dist/server/domains/reports/report.service.js.map +1 -1
- package/dist/server/domains/statuses/event-types.d.ts +16 -0
- package/dist/server/domains/statuses/event-types.d.ts.map +1 -0
- package/dist/server/domains/statuses/event-types.js +31 -0
- package/dist/server/domains/statuses/event-types.js.map +1 -0
- package/dist/server/domains/statuses/index.d.ts +4 -0
- package/dist/server/domains/statuses/index.d.ts.map +1 -0
- package/dist/server/domains/statuses/index.js +4 -0
- package/dist/server/domains/statuses/index.js.map +1 -0
- package/dist/server/domains/statuses/status.catalog.d.ts +15 -0
- package/dist/server/domains/statuses/status.catalog.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.catalog.js +119 -0
- package/dist/server/domains/statuses/status.catalog.js.map +1 -0
- package/dist/server/domains/statuses/status.events.d.ts +15 -0
- package/dist/server/domains/statuses/status.events.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.events.js +2 -0
- package/dist/server/domains/statuses/status.events.js.map +1 -0
- package/dist/server/domains/statuses/status.fire.d.ts +48 -0
- package/dist/server/domains/statuses/status.fire.d.ts.map +1 -0
- package/dist/server/domains/statuses/status.fire.js +38 -0
- package/dist/server/domains/statuses/status.fire.js.map +1 -0
- package/dist/server/domains/subscriptions/subscription.routes.d.ts.map +1 -1
- package/dist/server/domains/subscriptions/subscription.routes.js +4 -2
- package/dist/server/domains/subscriptions/subscription.routes.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.blocking.d.ts +4 -4
- package/dist/server/domains/subtasks/subtask.blocking.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.blocking.js +2 -10
- package/dist/server/domains/subtasks/subtask.blocking.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.release.d.ts +5 -9
- package/dist/server/domains/subtasks/subtask.release.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.release.js +0 -4
- package/dist/server/domains/subtasks/subtask.release.js.map +1 -1
- package/dist/server/domains/subtasks/subtask.service.d.ts +1 -3
- package/dist/server/domains/subtasks/subtask.service.d.ts.map +1 -1
- package/dist/server/domains/subtasks/subtask.service.js +0 -12
- package/dist/server/domains/subtasks/subtask.service.js.map +1 -1
- package/dist/server/kernel/http.d.ts.map +1 -1
- package/dist/server/kernel/http.js +0 -3
- package/dist/server/kernel/http.js.map +1 -1
- package/dist/server/kernel/kinds.d.ts +24 -6
- package/dist/server/kernel/kinds.d.ts.map +1 -1
- package/dist/server/kernel/kinds.js +21 -1
- package/dist/server/kernel/kinds.js.map +1 -1
- package/dist/server/kernel/work.d.ts +8 -4
- package/dist/server/kernel/work.d.ts.map +1 -1
- package/dist/server/kernel/work.js +21 -10
- package/dist/server/kernel/work.js.map +1 -1
- package/dist/server/locales/en-US.d.ts +0 -9
- package/dist/server/locales/en-US.d.ts.map +1 -1
- package/dist/server/locales/en-US.js +0 -9
- package/dist/server/locales/en-US.js.map +1 -1
- package/dist/server/locales/zh-CN.d.ts.map +1 -1
- package/dist/server/locales/zh-CN.js +2 -11
- package/dist/server/locales/zh-CN.js.map +1 -1
- package/dist/server/providers/notifications.d.ts +1 -0
- package/dist/server/providers/notifications.d.ts.map +1 -1
- package/dist/server/providers/notifications.js +6 -120
- package/dist/server/providers/notifications.js.map +1 -1
- package/dist/server/providers/projects.d.ts +3 -8
- package/dist/server/providers/projects.d.ts.map +1 -1
- package/dist/server/providers/projects.js +8 -27
- package/dist/server/providers/projects.js.map +1 -1
- package/dist/server/routes/api.d.ts.map +1 -1
- package/dist/server/routes/api.js +0 -6
- package/dist/server/routes/api.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +1 -27
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +5 -166
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/tokens.d.ts +12 -34
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js +4 -16
- package/dist/server/tokens.js.map +1 -1
- package/dist/shared/access.d.ts +0 -1
- package/dist/shared/access.d.ts.map +1 -1
- package/dist/shared/access.js +2 -11
- package/dist/shared/access.js.map +1 -1
- package/dist/shared/issues.d.ts +5 -36
- package/dist/shared/issues.d.ts.map +1 -1
- package/dist/shared/issues.js.map +1 -1
- package/dist/shared/kinds.d.ts +3 -1
- package/dist/shared/kinds.d.ts.map +1 -1
- package/dist/shared/kinds.js +1 -1
- package/dist/shared/locales/access.en-US.d.ts +0 -1
- package/dist/shared/locales/access.en-US.d.ts.map +1 -1
- package/dist/shared/locales/access.en-US.js +1 -2
- package/dist/shared/locales/access.en-US.js.map +1 -1
- package/dist/shared/locales/access.zh-CN.d.ts.map +1 -1
- package/dist/shared/locales/access.zh-CN.js +1 -2
- package/dist/shared/locales/access.zh-CN.js.map +1 -1
- package/dist/shared/plans.d.ts +4 -6
- package/dist/shared/plans.d.ts.map +1 -1
- package/dist/shared/plans.js +2 -1
- package/dist/shared/plans.js.map +1 -1
- package/dist/shared/projects.d.ts +0 -4
- package/dist/shared/projects.d.ts.map +1 -1
- package/dist/shared/projects.js.map +1 -1
- package/dist/shared/realtime.d.ts +1 -1
- package/dist/shared/realtime.d.ts.map +1 -1
- package/dist/shared/statuses.d.ts +42 -0
- package/dist/shared/statuses.d.ts.map +1 -0
- package/dist/shared/statuses.js +73 -0
- package/dist/shared/statuses.js.map +1 -0
- package/dist/shared/subtasks.d.ts +3 -3
- package/dist/shared/subtasks.d.ts.map +1 -1
- package/package.json +7 -15
- package/skills/nocobase-app-plugin-projects/SKILL.md +26 -50
- package/dist/client/hooks/use-workflow-leave-guard.d.ts +0 -3
- package/dist/client/hooks/use-workflow-leave-guard.d.ts.map +0 -1
- package/dist/client/hooks/use-workflow-leave-guard.js +0 -31
- package/dist/client/hooks/use-workflow-leave-guard.js.map +0 -1
- package/dist/client/lib/built-in-rule-editors.d.ts +0 -13
- package/dist/client/lib/built-in-rule-editors.d.ts.map +0 -1
- package/dist/client/lib/built-in-rule-editors.js +0 -86
- package/dist/client/lib/built-in-rule-editors.js.map +0 -1
- package/dist/client/lib/built-in-rule-types.d.ts +0 -3
- package/dist/client/lib/built-in-rule-types.d.ts.map +0 -1
- package/dist/client/lib/built-in-rule-types.js +0 -63
- package/dist/client/lib/built-in-rule-types.js.map +0 -1
- package/dist/client/lib/status-rule-types.d.ts +0 -60
- package/dist/client/lib/status-rule-types.d.ts.map +0 -1
- package/dist/client/lib/status-rule-types.js +0 -38
- package/dist/client/lib/status-rule-types.js.map +0 -1
- package/dist/client/lib/workflow-events.d.ts +0 -25
- package/dist/client/lib/workflow-events.d.ts.map +0 -1
- package/dist/client/lib/workflow-events.js +0 -30
- package/dist/client/lib/workflow-events.js.map +0 -1
- package/dist/client/pages/config/workflow-detail.d.ts +0 -10
- package/dist/client/pages/config/workflow-detail.d.ts.map +0 -1
- package/dist/client/pages/config/workflow-detail.js +0 -207
- package/dist/client/pages/config/workflow-detail.js.map +0 -1
- package/dist/client/pages/config/workflows/flow-editor.d.ts +0 -15
- package/dist/client/pages/config/workflows/flow-editor.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/flow-editor.js +0 -76
- package/dist/client/pages/config/workflows/flow-editor.js.map +0 -1
- package/dist/client/pages/config/workflows/status-rules.d.ts +0 -21
- package/dist/client/pages/config/workflows/status-rules.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/status-rules.js +0 -203
- package/dist/client/pages/config/workflows/status-rules.js.map +0 -1
- package/dist/client/pages/config/workflows/transitions-matrix.d.ts +0 -20
- package/dist/client/pages/config/workflows/transitions-matrix.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/transitions-matrix.js +0 -114
- package/dist/client/pages/config/workflows/transitions-matrix.js.map +0 -1
- package/dist/client/pages/config/workflows/use-status-name.d.ts +0 -4
- package/dist/client/pages/config/workflows/use-status-name.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/use-status-name.js +0 -17
- package/dist/client/pages/config/workflows/use-status-name.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-diagram.d.ts +0 -17
- package/dist/client/pages/config/workflows/workflow-diagram.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-diagram.js +0 -298
- package/dist/client/pages/config/workflows/workflow-diagram.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-model.d.ts +0 -157
- package/dist/client/pages/config/workflows/workflow-model.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-model.js +0 -403
- package/dist/client/pages/config/workflows/workflow-model.js.map +0 -1
- package/dist/client/pages/config/workflows/workflow-views.d.ts +0 -31
- package/dist/client/pages/config/workflows/workflow-views.d.ts.map +0 -1
- package/dist/client/pages/config/workflows/workflow-views.js +0 -76
- package/dist/client/pages/config/workflows/workflow-views.js.map +0 -1
- package/dist/client/pages/config/workflows.d.ts +0 -8
- package/dist/client/pages/config/workflows.d.ts.map +0 -1
- package/dist/client/pages/config/workflows.js +0 -139
- package/dist/client/pages/config/workflows.js.map +0 -1
- package/dist/client/pages/issues/detail/start-dialog.d.ts +0 -20
- package/dist/client/pages/issues/detail/start-dialog.d.ts.map +0 -1
- package/dist/client/pages/issues/detail/start-dialog.js +0 -31
- package/dist/client/pages/issues/detail/start-dialog.js.map +0 -1
- package/dist/client/pages/projects/workflow-select.d.ts +0 -14
- package/dist/client/pages/projects/workflow-select.d.ts.map +0 -1
- package/dist/client/pages/projects/workflow-select.js +0 -34
- package/dist/client/pages/projects/workflow-select.js.map +0 -1
- package/dist/server/domains/approvals/approval.events.d.ts +0 -47
- package/dist/server/domains/approvals/approval.events.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.events.js +0 -2
- package/dist/server/domains/approvals/approval.events.js.map +0 -1
- package/dist/server/domains/approvals/approval.lifecycle.d.ts +0 -8
- package/dist/server/domains/approvals/approval.lifecycle.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.lifecycle.js +0 -54
- package/dist/server/domains/approvals/approval.lifecycle.js.map +0 -1
- package/dist/server/domains/approvals/approval.routes.d.ts +0 -10
- package/dist/server/domains/approvals/approval.routes.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.routes.js +0 -87
- package/dist/server/domains/approvals/approval.routes.js.map +0 -1
- package/dist/server/domains/approvals/approval.service.d.ts +0 -72
- package/dist/server/domains/approvals/approval.service.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.service.js +0 -261
- package/dist/server/domains/approvals/approval.service.js.map +0 -1
- package/dist/server/domains/approvals/approval.store.d.ts +0 -42
- package/dist/server/domains/approvals/approval.store.d.ts.map +0 -1
- package/dist/server/domains/approvals/approval.store.js +0 -66
- package/dist/server/domains/approvals/approval.store.js.map +0 -1
- package/dist/server/domains/approvals/index.d.ts +0 -4
- package/dist/server/domains/approvals/index.d.ts.map +0 -1
- package/dist/server/domains/approvals/index.js +0 -3
- package/dist/server/domains/approvals/index.js.map +0 -1
- package/dist/server/domains/checklists/checklist.routes.d.ts +0 -9
- package/dist/server/domains/checklists/checklist.routes.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.routes.js +0 -62
- package/dist/server/domains/checklists/checklist.routes.js.map +0 -1
- package/dist/server/domains/checklists/checklist.service.d.ts +0 -26
- package/dist/server/domains/checklists/checklist.service.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.service.js +0 -80
- package/dist/server/domains/checklists/checklist.service.js.map +0 -1
- package/dist/server/domains/checklists/checklist.store.d.ts +0 -32
- package/dist/server/domains/checklists/checklist.store.d.ts.map +0 -1
- package/dist/server/domains/checklists/checklist.store.js +0 -66
- package/dist/server/domains/checklists/checklist.store.js.map +0 -1
- package/dist/server/domains/checklists/index.d.ts +0 -4
- package/dist/server/domains/checklists/index.d.ts.map +0 -1
- package/dist/server/domains/checklists/index.js +0 -4
- package/dist/server/domains/checklists/index.js.map +0 -1
- package/dist/server/domains/workflows/built-in-rule-types.d.ts +0 -40
- package/dist/server/domains/workflows/built-in-rule-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/built-in-rule-types.js +0 -260
- package/dist/server/domains/workflows/built-in-rule-types.js.map +0 -1
- package/dist/server/domains/workflows/event-types.d.ts +0 -21
- package/dist/server/domains/workflows/event-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/event-types.js +0 -31
- package/dist/server/domains/workflows/event-types.js.map +0 -1
- package/dist/server/domains/workflows/index.d.ts +0 -10
- package/dist/server/domains/workflows/index.d.ts.map +0 -1
- package/dist/server/domains/workflows/index.js +0 -10
- package/dist/server/domains/workflows/index.js.map +0 -1
- package/dist/server/domains/workflows/rule-types.d.ts +0 -129
- package/dist/server/domains/workflows/rule-types.d.ts.map +0 -1
- package/dist/server/domains/workflows/rule-types.js +0 -33
- package/dist/server/domains/workflows/rule-types.js.map +0 -1
- package/dist/server/domains/workflows/templates.d.ts +0 -62
- package/dist/server/domains/workflows/templates.d.ts.map +0 -1
- package/dist/server/domains/workflows/templates.js +0 -63
- package/dist/server/domains/workflows/templates.js.map +0 -1
- package/dist/server/domains/workflows/workflow.diff.d.ts +0 -14
- package/dist/server/domains/workflows/workflow.diff.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.diff.js +0 -80
- package/dist/server/domains/workflows/workflow.diff.js.map +0 -1
- package/dist/server/domains/workflows/workflow.events.d.ts +0 -26
- package/dist/server/domains/workflows/workflow.events.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.events.js +0 -2
- package/dist/server/domains/workflows/workflow.events.js.map +0 -1
- package/dist/server/domains/workflows/workflow.fire.d.ts +0 -38
- package/dist/server/domains/workflows/workflow.fire.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.fire.js +0 -57
- package/dist/server/domains/workflows/workflow.fire.js.map +0 -1
- package/dist/server/domains/workflows/workflow.registry.d.ts +0 -27
- package/dist/server/domains/workflows/workflow.registry.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.registry.js +0 -132
- package/dist/server/domains/workflows/workflow.registry.js.map +0 -1
- package/dist/server/domains/workflows/workflow.routes.d.ts +0 -6
- package/dist/server/domains/workflows/workflow.routes.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.routes.js +0 -148
- package/dist/server/domains/workflows/workflow.routes.js.map +0 -1
- package/dist/server/domains/workflows/workflow.rules.d.ts +0 -14
- package/dist/server/domains/workflows/workflow.rules.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.rules.js +0 -212
- package/dist/server/domains/workflows/workflow.rules.js.map +0 -1
- package/dist/server/domains/workflows/workflow.service.d.ts +0 -71
- package/dist/server/domains/workflows/workflow.service.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.service.js +0 -366
- package/dist/server/domains/workflows/workflow.service.js.map +0 -1
- package/dist/server/domains/workflows/workflow.store.d.ts +0 -33
- package/dist/server/domains/workflows/workflow.store.d.ts.map +0 -1
- package/dist/server/domains/workflows/workflow.store.js +0 -148
- package/dist/server/domains/workflows/workflow.store.js.map +0 -1
- package/dist/shared/approvals.d.ts +0 -37
- package/dist/shared/approvals.d.ts.map +0 -1
- package/dist/shared/approvals.js +0 -4
- package/dist/shared/approvals.js.map +0 -1
- package/dist/shared/checklists.d.ts +0 -27
- package/dist/shared/checklists.d.ts.map +0 -1
- package/dist/shared/checklists.js +0 -7
- package/dist/shared/checklists.js.map +0 -1
- package/dist/shared/workflows.d.ts +0 -276
- package/dist/shared/workflows.d.ts.map +0 -1
- package/dist/shared/workflows.js +0 -151
- package/dist/shared/workflows.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.fire.d.ts","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.fire.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,eAAO,MAAM,cAAc,MAAM,CAAC;AAClC,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,MAAM,WAAW,mBAAmB;IAClC,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,4FAA4F;IAC5F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,oHAAoH;IACpH,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACvB,yFAAyF;IACzF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtD;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC;AAC1C,MAAM,MAAM,mBAAmB,GAAG,WAAW,CAAC;AAE9C,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,oGAAoG;IACpG,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzE;;;;OAIG;IACH,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAChB,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACjC;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC;CACxE,GAAG,oBAAoB,CA6CvB"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Firing a contributed workflow event (`event-types.ts`) for a batch of issues: the plugin that registered the event
|
|
3
|
-
* says it happened, and each issue moves along its workflow's transition on it, if there is one. This plugin never
|
|
4
|
-
* knows what the event means.
|
|
5
|
-
*
|
|
6
|
-
* - The move is the system's: the transition is `on` the event with `actors: ['system']`, nobody approves it, and the
|
|
7
|
-
* issue's triggers and notices see the system. The activity names `actor`, the person (or principal) whose action
|
|
8
|
-
* the event reports, with `note` and `details`.
|
|
9
|
-
* - Entry conditions still apply (built-in and contributed `canEnter`, a checklist left incomplete): a refusal leaves
|
|
10
|
-
* that issue where it is, records `auto_move_skipped` with the code, and comes back as `refused`; the other issues
|
|
11
|
-
* still move.
|
|
12
|
-
* - Everything runs in one transaction: the caller's `tx` when given (so its own writes commit with the moves), else
|
|
13
|
-
* a new one. An error that is not a refusal rolls the whole batch back.
|
|
14
|
-
* - Only a registered, contributed event may be fired: the built-in `subtasks.done` is this plugin's own, and an event
|
|
15
|
-
* nobody registered is a programming error (`TypeError`).
|
|
16
|
-
*/
|
|
17
|
-
import { isBuiltInEvent } from '../../../shared/workflows.js';
|
|
18
|
-
import { invalid } from '../../kernel/errors.js';
|
|
19
|
-
export const EVENT_NOTE_MAX = 200;
|
|
20
|
-
export const EVENT_BATCH_MAX = 500;
|
|
21
|
-
export function createWorkflowEventService(deps) {
|
|
22
|
-
function registered(event) {
|
|
23
|
-
if (isBuiltInEvent(event))
|
|
24
|
-
throw new TypeError(`${event} is a built-in workflow event; only its own plugin fires it.`);
|
|
25
|
-
if (!deps.types.get(event))
|
|
26
|
-
throw new TypeError(`No plugin registered the workflow event ${event}.`);
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
types: deps.types,
|
|
30
|
-
target(event, issueId, conn) {
|
|
31
|
-
registered(event);
|
|
32
|
-
return deps.issues().eventTarget(conn ?? deps.tx.read(), issueId, event);
|
|
33
|
-
},
|
|
34
|
-
async fire(firing, outer) {
|
|
35
|
-
registered(firing.event);
|
|
36
|
-
const ids = [...new Set(firing.issueIds)];
|
|
37
|
-
if (ids.length > EVENT_BATCH_MAX)
|
|
38
|
-
throw invalid('INVALID_EVENT_FIRING', `At most ${EVENT_BATCH_MAX} issues at once.`);
|
|
39
|
-
const note = firing.note?.trim();
|
|
40
|
-
if (note && note.length > EVENT_NOTE_MAX)
|
|
41
|
-
throw invalid('INVALID_EVENT_FIRING', `A note is at most ${EVENT_NOTE_MAX} characters.`);
|
|
42
|
-
if (ids.length === 0)
|
|
43
|
-
return [];
|
|
44
|
-
return deps.tx.run(async (tx) => {
|
|
45
|
-
const moves = [];
|
|
46
|
-
for (const id of ids)
|
|
47
|
-
moves.push(await deps.issues().fireEvent(tx, id, firing.event, {
|
|
48
|
-
...(firing.actor ? { actor: firing.actor } : {}),
|
|
49
|
-
...(note ? { note } : {}),
|
|
50
|
-
...(firing.details ? { details: firing.details } : {}),
|
|
51
|
-
}));
|
|
52
|
-
return moves;
|
|
53
|
-
}, outer);
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
//# sourceMappingURL=workflow.fire.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.fire.js","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.fire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKjD,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAmCnC,MAAM,UAAU,0BAA0B,CAAC,IAI1C;IACC,SAAS,UAAU,CAAC,KAAa;QAC/B,IAAI,cAAc,CAAC,KAAK,CAAC;YACvB,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,8DAA8D,CACvE,CAAC;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;YACxB,MAAM,IAAI,SAAS,CAAC,2CAA2C,KAAK,GAAG,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI;YACzB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK;YACtB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC1C,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe;gBAC9B,MAAM,OAAO,CACX,sBAAsB,EACtB,WAAW,eAAe,kBAAkB,CAC7C,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,cAAc;gBACtC,MAAM,OAAO,CACX,sBAAsB,EACtB,qBAAqB,cAAc,cAAc,CAClD,CAAC;YACJ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;gBAC9B,MAAM,KAAK,GAAwB,EAAE,CAAC;gBACtC,KAAK,MAAM,EAAE,IAAI,GAAG;oBAClB,KAAK,CAAC,IAAI,CACR,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE;wBAClD,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBAChD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;wBACzB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACvD,CAAC,CACH,CAAC;gBACJ,OAAO,KAAK,CAAC;YACf,CAAC,EAAE,KAAK,CAAC,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The rules a workflow of this plugin may name (`shared/workflows.ts`), registered on the lifecycle registry that
|
|
3
|
-
* validates definitions and moves issues. Rules run in the transaction of the move: `context` is its `Tx`.
|
|
4
|
-
*
|
|
5
|
-
* Every status rule type, this plugin's own (`built-in-rule-types.ts`) and those other plugins contribute
|
|
6
|
-
* (`rule-types.ts`), is looked up in one `StatusRuleTypes` on each use and adapted here to a lifecycle state rule.
|
|
7
|
-
*
|
|
8
|
-
* Approvers (`APPROVER_ROLES`): `owner` is the issue's owner, `projectLead` the lead of its project (nobody without a
|
|
9
|
-
* project), `admin` every active holder of the admin or owner role.
|
|
10
|
-
*/
|
|
11
|
-
import type { DatabaseConnection } from '@nocobase/db';
|
|
12
|
-
import type { ActivityRecorder } from '../../kernel/activity.js';
|
|
13
|
-
import { type IssueRules } from '../issues/index.js';
|
|
14
|
-
import type { StatusRuleTypes } from './rule-types.js';
|
|
15
|
-
export type { RelationChecks } from './built-in-rule-types.js';
|
|
16
|
-
/** Who the approver roles are, read in the transaction of the move. */
|
|
17
|
-
export interface ApproverDirectory {
|
|
18
|
-
projectLead(conn: DatabaseConnection, projectId: string): Promise<string | null>;
|
|
19
|
-
admins(conn: DatabaseConnection): Promise<readonly string[]>;
|
|
20
|
-
}
|
|
21
|
-
export declare function createIssueRegistry(deps: {
|
|
22
|
-
readonly activity: ActivityRecorder;
|
|
23
|
-
readonly approvers: ApproverDirectory;
|
|
24
|
-
/** Every status rule type: this plugin's own and those other plugins contribute (`withBuiltInTypes`). */
|
|
25
|
-
readonly types: StatusRuleTypes;
|
|
26
|
-
}): IssueRules;
|
|
27
|
-
//# sourceMappingURL=workflow.registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.registry.d.ts","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AASjE,OAAO,EAA0B,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAIV,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAY/D,uEAAuE;AACvE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CACT,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC;CAC9D;AAgHD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC;IACtC,yGAAyG;IACzG,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;CACjC,GAAG,UAAU,CAgBb"}
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
import { createLifecycleRegistry, } from '../../lifecycle/index.js';
|
|
2
|
-
import { findIssue, updateIssue } from '../issues/index.js';
|
|
3
|
-
/** Preserve the lifecycle actor's identity and trace in the public rule contract. */
|
|
4
|
-
function actorOf(actor) {
|
|
5
|
-
return actor;
|
|
6
|
-
}
|
|
7
|
-
/** The status a move leads to, as a rule type sees it. */
|
|
8
|
-
function enteredStatus(ctx) {
|
|
9
|
-
return {
|
|
10
|
-
key: ctx.to,
|
|
11
|
-
name: ctx.machine.states.find((item) => item.key === ctx.to)?.name ?? ctx.to,
|
|
12
|
-
category: (ctx.machine.category(ctx.to) ?? 'started'),
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
/** What a condition is asked about a move: the issue as it is before it. */
|
|
16
|
-
function checkOf(ctx) {
|
|
17
|
-
return {
|
|
18
|
-
tx: ctx.context,
|
|
19
|
-
issue: ctx.subject,
|
|
20
|
-
from: ctx.from,
|
|
21
|
-
status: enteredStatus(ctx),
|
|
22
|
-
actor: actorOf(ctx.actor),
|
|
23
|
-
sourceActor: ctx.sourceActor ?? actorOf(ctx.actor),
|
|
24
|
-
event: ctx.event ?? null,
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* A status rule type as a lifecycle state rule: its conditions guard entering and leaving, with the issue as it is
|
|
29
|
-
* before the move; its action runs on entering, with the issue as it is after it.
|
|
30
|
-
*/
|
|
31
|
-
function stateRuleOf(type, activity) {
|
|
32
|
-
const canEnter = type.canEnter?.bind(type);
|
|
33
|
-
const canLeave = type.canLeave?.bind(type);
|
|
34
|
-
const entered = type.entered?.bind(type);
|
|
35
|
-
return {
|
|
36
|
-
...(type.validate
|
|
37
|
-
? { validate: (config) => type.validate(config) }
|
|
38
|
-
: {}),
|
|
39
|
-
...(canEnter
|
|
40
|
-
? {
|
|
41
|
-
canEnter: (ctx, config) => canEnter(checkOf(ctx), config),
|
|
42
|
-
}
|
|
43
|
-
: {}),
|
|
44
|
-
...(canLeave
|
|
45
|
-
? {
|
|
46
|
-
canLeave: (ctx, config) => canLeave(checkOf(ctx), config),
|
|
47
|
-
}
|
|
48
|
-
: {}),
|
|
49
|
-
...(entered
|
|
50
|
-
? {
|
|
51
|
-
entered: (ctx, config) => enter(entered, ctx, config),
|
|
52
|
-
}
|
|
53
|
-
: {}),
|
|
54
|
-
};
|
|
55
|
-
async function enter(run, ctx, config) {
|
|
56
|
-
const tx = ctx.context;
|
|
57
|
-
let issue = (await findIssue(tx.conn, ctx.subject.id)) ?? ctx.subject;
|
|
58
|
-
const actor = actorOf(ctx.actor);
|
|
59
|
-
const outcome = await run({
|
|
60
|
-
tx,
|
|
61
|
-
get issue() {
|
|
62
|
-
return issue;
|
|
63
|
-
},
|
|
64
|
-
from: ctx.from,
|
|
65
|
-
status: enteredStatus(ctx),
|
|
66
|
-
actor,
|
|
67
|
-
sourceActor: ctx.sourceActor ?? actor,
|
|
68
|
-
async setExecutor(executor) {
|
|
69
|
-
if (issue.executor?.type === executor.type &&
|
|
70
|
-
issue.executor.id === executor.id)
|
|
71
|
-
return issue;
|
|
72
|
-
const now = new Date().toISOString();
|
|
73
|
-
await updateIssue(tx.conn, issue.id, {
|
|
74
|
-
executorType: executor.type,
|
|
75
|
-
executorId: executor.id,
|
|
76
|
-
updatedAt: now,
|
|
77
|
-
lastActivityAt: now,
|
|
78
|
-
});
|
|
79
|
-
await activity.record(tx.conn, {
|
|
80
|
-
issueId: issue.id,
|
|
81
|
-
actor: ctx.sourceActor ?? actor,
|
|
82
|
-
action: 'executor_changed',
|
|
83
|
-
details: {
|
|
84
|
-
from: issue.executor,
|
|
85
|
-
to: executor,
|
|
86
|
-
trigger: 'stageEntered',
|
|
87
|
-
rule: type.type,
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
issue = (await findIssue(tx.conn, issue.id)) ?? issue;
|
|
91
|
-
return issue;
|
|
92
|
-
},
|
|
93
|
-
}, config);
|
|
94
|
-
return outcome;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
export function createIssueRegistry(deps) {
|
|
98
|
-
const approvers = approverRegistry(deps.approvers);
|
|
99
|
-
const adapted = new WeakMap();
|
|
100
|
-
return {
|
|
101
|
-
...approvers,
|
|
102
|
-
findStateRule(type) {
|
|
103
|
-
const found = deps.types.get(type);
|
|
104
|
-
if (!found)
|
|
105
|
-
return undefined;
|
|
106
|
-
let rule = adapted.get(found);
|
|
107
|
-
if (!rule) {
|
|
108
|
-
rule = stateRuleOf(found, deps.activity);
|
|
109
|
-
adapted.set(found, rule);
|
|
110
|
-
}
|
|
111
|
-
return rule;
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
function approverRegistry(directory) {
|
|
116
|
-
return createLifecycleRegistry()
|
|
117
|
-
.approver('owner', {
|
|
118
|
-
resolve: (ctx) => Promise.resolve([ctx.subject.ownerUserId]),
|
|
119
|
-
})
|
|
120
|
-
.approver('projectLead', {
|
|
121
|
-
async resolve(ctx) {
|
|
122
|
-
if (!ctx.subject.projectId)
|
|
123
|
-
return [];
|
|
124
|
-
const lead = await directory.projectLead(ctx.context.conn, ctx.subject.projectId);
|
|
125
|
-
return lead ? [lead] : [];
|
|
126
|
-
},
|
|
127
|
-
})
|
|
128
|
-
.approver('admin', {
|
|
129
|
-
resolve: (ctx) => directory.admins(ctx.context.conn),
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=workflow.registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.registry.js","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { Hono } from 'hono';
|
|
2
|
-
import { type ViewerEnv } from '../../access/request.js';
|
|
3
|
-
import type { WorkflowService } from './workflow.service.js';
|
|
4
|
-
/** `/api/projects/workflows`. */
|
|
5
|
-
export declare function createWorkflowRoutes(workflows: WorkflowService): Hono<ViewerEnv>;
|
|
6
|
-
//# sourceMappingURL=workflow.routes.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.routes.d.ts","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.routes.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAWnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAM7D,iCAAiC;AACjC,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,eAAe,GACzB,IAAI,CAAC,SAAS,CAAC,CAuNjB"}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { apiErrorResponse, apiErrorResponses, apiValidator, cliRoute, dataResponse, describeRoute, emptyResponse, listResponse, } from '@nocobase/app-server/router';
|
|
2
|
-
import { viewerOf } from '../../access/request.js';
|
|
3
|
-
import { boundedList, domainRouter, tags } from '../../kernel/http.js';
|
|
4
|
-
import { BoundedListMeta, CreateWorkflowBody, PreviewWorkflowBody, UpdateWorkflowBody, WorkflowParams, WorkflowPreviewSchema, WorkflowSchema, } from '../../routes/schemas.js';
|
|
5
|
-
const manage = 'Needs `update` on the `pm.workflows` settings item.';
|
|
6
|
-
const statusConflict = 'When issues are still in a status the change would drop (`WORKFLOW_STATUS_CONFLICT`, `metadata.conflicts` per status and project).';
|
|
7
|
-
/** `/api/projects/workflows`. */
|
|
8
|
-
export function createWorkflowRoutes(workflows) {
|
|
9
|
-
const routes = domainRouter();
|
|
10
|
-
routes.get('/', describeRoute({
|
|
11
|
-
tags,
|
|
12
|
-
summary: 'List workflows',
|
|
13
|
-
operationId: 'projectsListWorkflows',
|
|
14
|
-
...cliRoute({
|
|
15
|
-
command: 'workflow list',
|
|
16
|
-
columns: ['id', 'name', 'isDefault', 'projectCount', 'revision'],
|
|
17
|
-
}),
|
|
18
|
-
responses: {
|
|
19
|
-
200: listResponse(WorkflowSchema, BoundedListMeta),
|
|
20
|
-
...apiErrorResponses,
|
|
21
|
-
},
|
|
22
|
-
}), async (context) => context.json(boundedList(await workflows.list(viewerOf(context)))));
|
|
23
|
-
routes.post('/', describeRoute({
|
|
24
|
-
tags,
|
|
25
|
-
summary: 'Create a workflow',
|
|
26
|
-
operationId: 'projectsCreateWorkflow',
|
|
27
|
-
...cliRoute({
|
|
28
|
-
command: 'workflow create',
|
|
29
|
-
args: ['name'],
|
|
30
|
-
flags: {
|
|
31
|
-
copyFrom: {
|
|
32
|
-
name: 'copy-from',
|
|
33
|
-
description: 'The workflow to copy; `null` for the built-in statuses.',
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
examples: ['workflow create "Design review" --copy-from <workflow>'],
|
|
37
|
-
}),
|
|
38
|
-
description: `${manage} The new workflow copies \`copyFrom\`, or the built-in statuses when it is null.`,
|
|
39
|
-
responses: {
|
|
40
|
-
201: dataResponse(WorkflowSchema),
|
|
41
|
-
...apiErrorResponses,
|
|
42
|
-
404: apiErrorResponse(404, 'When `copyFrom` names no workflow.'),
|
|
43
|
-
409: apiErrorResponse(409, 'When a workflow has that name (`WORKFLOW_EXISTS`).'),
|
|
44
|
-
},
|
|
45
|
-
}), apiValidator('json', CreateWorkflowBody), async (context) => context.json({
|
|
46
|
-
data: await workflows.create(viewerOf(context), context.req.valid('json')),
|
|
47
|
-
}, 201));
|
|
48
|
-
routes.get('/:workflowId', describeRoute({
|
|
49
|
-
tags,
|
|
50
|
-
summary: 'Get a workflow',
|
|
51
|
-
operationId: 'projectsGetWorkflow',
|
|
52
|
-
...cliRoute({
|
|
53
|
-
command: 'workflow get',
|
|
54
|
-
flags: { workflowId: { name: 'workflow' } },
|
|
55
|
-
}),
|
|
56
|
-
responses: {
|
|
57
|
-
200: dataResponse(WorkflowSchema),
|
|
58
|
-
...apiErrorResponses,
|
|
59
|
-
404: apiErrorResponse(404),
|
|
60
|
-
},
|
|
61
|
-
}), apiValidator('param', WorkflowParams), async (context) => context.json({
|
|
62
|
-
data: await workflows.get(viewerOf(context), context.req.valid('param').workflowId),
|
|
63
|
-
}));
|
|
64
|
-
routes.patch('/:workflowId', describeRoute({
|
|
65
|
-
tags,
|
|
66
|
-
summary: 'Update a workflow',
|
|
67
|
-
operationId: 'projectsUpdateWorkflow',
|
|
68
|
-
...cliRoute({
|
|
69
|
-
command: 'workflow update',
|
|
70
|
-
bodyFile: 'file',
|
|
71
|
-
flags: { workflowId: { name: 'workflow' } },
|
|
72
|
-
examples: [
|
|
73
|
-
'workflow get <workflow> --json > workflow.json',
|
|
74
|
-
'workflow update <workflow> --file change.json',
|
|
75
|
-
],
|
|
76
|
-
}),
|
|
77
|
-
description: `${manage} \`definition\` is a \`ProjectsWorkflowDefinition\`; its problems are answered as 400 \`INVALID_WORKFLOW\` with \`metadata.issues\` at their paths.`,
|
|
78
|
-
responses: {
|
|
79
|
-
200: dataResponse(WorkflowSchema),
|
|
80
|
-
...apiErrorResponses,
|
|
81
|
-
400: apiErrorResponse(400, statusConflict),
|
|
82
|
-
404: apiErrorResponse(404),
|
|
83
|
-
409: apiErrorResponse(409, 'When the workflow changed since `revision` (`REVISION_CONFLICT`), or another workflow has that name (`WORKFLOW_EXISTS`).'),
|
|
84
|
-
},
|
|
85
|
-
}), apiValidator('param', WorkflowParams), apiValidator('json', UpdateWorkflowBody), async (context) => context.json({
|
|
86
|
-
data: await workflows.update(viewerOf(context), context.req.valid('param').workflowId, context.req.valid('json')),
|
|
87
|
-
}));
|
|
88
|
-
// What saving a definition would change; nothing is written.
|
|
89
|
-
routes.post('/:workflowId/preview', describeRoute({
|
|
90
|
-
tags,
|
|
91
|
-
summary: 'Preview the rule changes of a workflow definition',
|
|
92
|
-
operationId: 'projectsPreviewWorkflow',
|
|
93
|
-
...cliRoute({
|
|
94
|
-
command: 'workflow preview',
|
|
95
|
-
bodyFile: 'file',
|
|
96
|
-
flags: { workflowId: { name: 'workflow' } },
|
|
97
|
-
examples: ['workflow preview <workflow> --file change.json'],
|
|
98
|
-
}),
|
|
99
|
-
description: 'What saving `definition` would change in the workflow’s status rules; nothing is written.',
|
|
100
|
-
responses: {
|
|
101
|
-
200: dataResponse(WorkflowPreviewSchema),
|
|
102
|
-
...apiErrorResponses,
|
|
103
|
-
404: apiErrorResponse(404),
|
|
104
|
-
},
|
|
105
|
-
}), apiValidator('param', WorkflowParams), apiValidator('json', PreviewWorkflowBody), async (context) => context.json({
|
|
106
|
-
data: await workflows.preview(viewerOf(context), context.req.valid('param').workflowId, context.req.valid('json')),
|
|
107
|
-
}));
|
|
108
|
-
routes.post('/:workflowId/setDefault', describeRoute({
|
|
109
|
-
tags,
|
|
110
|
-
summary: 'Make a workflow the default',
|
|
111
|
-
operationId: 'projectsSetDefaultWorkflow',
|
|
112
|
-
...cliRoute({
|
|
113
|
-
command: 'workflow set-default',
|
|
114
|
-
flags: { workflowId: { name: 'workflow' } },
|
|
115
|
-
}),
|
|
116
|
-
description: `${manage} Projects without a workflow, and issues without a project, use the default.`,
|
|
117
|
-
responses: {
|
|
118
|
-
200: dataResponse(WorkflowSchema),
|
|
119
|
-
...apiErrorResponses,
|
|
120
|
-
400: apiErrorResponse(400, statusConflict),
|
|
121
|
-
404: apiErrorResponse(404),
|
|
122
|
-
},
|
|
123
|
-
}), apiValidator('param', WorkflowParams), async (context) => context.json({
|
|
124
|
-
data: await workflows.setDefault(viewerOf(context), context.req.valid('param').workflowId),
|
|
125
|
-
}));
|
|
126
|
-
routes.delete('/:workflowId', describeRoute({
|
|
127
|
-
tags,
|
|
128
|
-
summary: 'Delete a workflow',
|
|
129
|
-
operationId: 'projectsDeleteWorkflow',
|
|
130
|
-
...cliRoute({
|
|
131
|
-
command: 'workflow delete',
|
|
132
|
-
flags: { workflowId: { name: 'workflow' } },
|
|
133
|
-
confirm: 'Delete this workflow?',
|
|
134
|
-
}),
|
|
135
|
-
description: manage,
|
|
136
|
-
responses: {
|
|
137
|
-
204: emptyResponse(),
|
|
138
|
-
...apiErrorResponses,
|
|
139
|
-
400: apiErrorResponse(400, 'When it is the default workflow or a project uses it (`WORKFLOW_IN_USE`).'),
|
|
140
|
-
404: apiErrorResponse(404),
|
|
141
|
-
},
|
|
142
|
-
}), apiValidator('param', WorkflowParams), async (context) => {
|
|
143
|
-
await workflows.remove(viewerOf(context), context.req.valid('param').workflowId);
|
|
144
|
-
return context.body(null, 204);
|
|
145
|
-
});
|
|
146
|
-
return routes;
|
|
147
|
-
}
|
|
148
|
-
//# sourceMappingURL=workflow.routes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.routes.js","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type WorkflowDefinition } from '../../../shared/workflows.js';
|
|
2
|
-
import { type LifecycleSchema } from '../../lifecycle/index.js';
|
|
3
|
-
import type { KindRegistry } from '../../kernel/kinds.js';
|
|
4
|
-
import type { IssueRules } from '../issues/index.js';
|
|
5
|
-
import type { StatusRuleTypes } from './rule-types.js';
|
|
6
|
-
import type { WorkflowEventTypes } from './event-types.js';
|
|
7
|
-
/** What a workflow may hold, the actors being the registered kinds and the events the built-in and contributed ones. */
|
|
8
|
-
export declare function workflowSchema(kinds: KindRegistry, events?: WorkflowEventTypes): LifecycleSchema;
|
|
9
|
-
/**
|
|
10
|
-
* The definition, valid for this plugin, or 400 `INVALID_WORKFLOW` with every problem in `details.issues`. `base` is
|
|
11
|
-
* the definition being replaced: its statuses keep their category.
|
|
12
|
-
*/
|
|
13
|
-
export declare function checkDefinition(input: unknown, base: WorkflowDefinition | null, registry: IssueRules, kinds: KindRegistry, ruleTypes?: StatusRuleTypes, events?: WorkflowEventTypes): WorkflowDefinition;
|
|
14
|
-
//# sourceMappingURL=workflow.rules.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflow.rules.d.ts","sourceRoot":"","sources":["../../../../server/domains/workflows/workflow.rules.ts"],"names":[],"mappings":"AAiBA,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,wHAAwH;AACxH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,eAAe,CAWjB;AAiKD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,kBAAkB,GAAG,IAAI,EAC/B,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,kBAAkB,GAC1B,kBAAkB,CA8CpB"}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* What a workflow of this plugin may contain, on top of what any lifecycle keeps (`server/lifecycle`):
|
|
3
|
-
*
|
|
4
|
-
* - the built-in statuses are all there, marked built-in, with their fixed category; no other status is;
|
|
5
|
-
* - a transition names registered kinds only (`kernel/kinds.ts`), each within what its kind allows: a kind may refuse
|
|
6
|
-
* to enter some categories of status, or to target "any status";
|
|
7
|
-
* - a person can leave every status, so no issue gets stuck where nobody may move it;
|
|
8
|
-
* - a status carries each kind of rule at most once;
|
|
9
|
-
* - an event transition (`on`) is the system's alone, on a built-in event or one another plugin contributed
|
|
10
|
-
* (`event-types.ts`), leaving and entering only the categories of status the event allows; a transition on an event
|
|
11
|
-
* whose plugin is gone is kept while it is unchanged;
|
|
12
|
-
* - a rule sits only on the categories of status its type allows;
|
|
13
|
-
* - `commentRunLimit`, when there, is a positive integer.
|
|
14
|
-
*
|
|
15
|
-
* The rules a status or transition names must be registered (`workflow.registry.ts`), with valid settings.
|
|
16
|
-
*/
|
|
17
|
-
import { COLORS } from '../../../shared/common.js';
|
|
18
|
-
import { ANY_STATUS, BUILTIN_STATUSES, STATUS_CATEGORIES, STATUS_NAME_MAX, WORKFLOW_EVENTS, } from '../../../shared/workflows.js';
|
|
19
|
-
import { validateDefinition, } from '../../lifecycle/index.js';
|
|
20
|
-
import { invalid } from '../../kernel/errors.js';
|
|
21
|
-
import { SYSTEM_KIND } from '../../../shared/kinds.js';
|
|
22
|
-
/** What a workflow may hold, the actors being the registered kinds and the events the built-in and contributed ones. */
|
|
23
|
-
export function workflowSchema(kinds, events) {
|
|
24
|
-
return {
|
|
25
|
-
categories: STATUS_CATEGORIES,
|
|
26
|
-
actors: kinds.list().map((kind) => kind.key),
|
|
27
|
-
colors: COLORS,
|
|
28
|
-
events: [
|
|
29
|
-
...WORKFLOW_EVENTS,
|
|
30
|
-
...(events?.list().map((event) => event.key) ?? []),
|
|
31
|
-
],
|
|
32
|
-
limits: { nameLength: STATUS_NAME_MAX },
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
function builtInStatuses(definition) {
|
|
36
|
-
const issues = [];
|
|
37
|
-
definition.states.forEach((state, index) => {
|
|
38
|
-
const builtIn = BUILTIN_STATUSES.find((status) => status.key === state.key);
|
|
39
|
-
if (builtIn && !state.builtIn)
|
|
40
|
-
issues.push({
|
|
41
|
-
path: `states[${index}].builtIn`,
|
|
42
|
-
message: `${state.key} is a built-in status.`,
|
|
43
|
-
});
|
|
44
|
-
if (!builtIn && state.builtIn)
|
|
45
|
-
issues.push({
|
|
46
|
-
path: `states[${index}].builtIn`,
|
|
47
|
-
message: `Only ${BUILTIN_STATUSES.map((status) => status.key).join(', ')} are built-in.`,
|
|
48
|
-
});
|
|
49
|
-
if (builtIn && state.category !== builtIn.category)
|
|
50
|
-
issues.push({
|
|
51
|
-
path: `states[${index}].category`,
|
|
52
|
-
message: `The category of ${state.key} is fixed (${builtIn.category}).`,
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
for (const status of BUILTIN_STATUSES)
|
|
56
|
-
if (!definition.states.some((state) => state.key === status.key))
|
|
57
|
-
issues.push({
|
|
58
|
-
path: 'states',
|
|
59
|
-
message: `The built-in status ${status.key} cannot be removed.`,
|
|
60
|
-
});
|
|
61
|
-
return issues;
|
|
62
|
-
}
|
|
63
|
-
/** Each transition within what its kinds allow. */
|
|
64
|
-
function kindLimits(kinds) {
|
|
65
|
-
return (definition) => {
|
|
66
|
-
const categories = new Map(definition.states.map((state) => [state.key, state.category]));
|
|
67
|
-
return definition.transitions.flatMap((transition, index) => transition.actors.flatMap((key) => {
|
|
68
|
-
const kind = kinds.get(key);
|
|
69
|
-
if (!kind)
|
|
70
|
-
return [];
|
|
71
|
-
const any = transition.to === ANY_STATUS;
|
|
72
|
-
const category = categories.get(transition.to);
|
|
73
|
-
const refused = any
|
|
74
|
-
? kind.mayTargetAny === false
|
|
75
|
-
: category !== undefined && kind.mayEnter?.(category) === false;
|
|
76
|
-
return refused
|
|
77
|
-
? [
|
|
78
|
-
{
|
|
79
|
-
path: `transitions[${index}].actors`,
|
|
80
|
-
message: any
|
|
81
|
-
? `${key} may not move an issue to any status.`
|
|
82
|
-
: `${key} may not move an issue into a ${category} status.`,
|
|
83
|
-
},
|
|
84
|
-
]
|
|
85
|
-
: [];
|
|
86
|
-
}));
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
function peopleCanLeave(definition) {
|
|
90
|
-
const byPeople = definition.transitions.filter((transition) => transition.actors.includes('user'));
|
|
91
|
-
return definition.states.flatMap((state, index) => byPeople.some((transition) => (transition.from === ANY_STATUS || transition.from === state.key) &&
|
|
92
|
-
transition.to !== state.key)
|
|
93
|
-
? []
|
|
94
|
-
: [
|
|
95
|
-
{
|
|
96
|
-
path: `states[${index}]`,
|
|
97
|
-
message: `Nobody may move an issue out of ${state.key}; let people leave it.`,
|
|
98
|
-
},
|
|
99
|
-
]);
|
|
100
|
-
}
|
|
101
|
-
function eventTransitionsAreSystem(definition) {
|
|
102
|
-
return definition.transitions.flatMap((transition, index) => transition.on !== undefined &&
|
|
103
|
-
(transition.actors.length !== 1 || transition.actors[0] !== SYSTEM_KIND)
|
|
104
|
-
? [
|
|
105
|
-
{
|
|
106
|
-
path: `transitions[${index}].actors`,
|
|
107
|
-
message: `Only ${SYSTEM_KIND} takes a transition on ${transition.on}.`,
|
|
108
|
-
},
|
|
109
|
-
]
|
|
110
|
-
: []);
|
|
111
|
-
}
|
|
112
|
-
function oneRulePerType(definition) {
|
|
113
|
-
return definition.states.flatMap((state, index) => {
|
|
114
|
-
const seen = new Set();
|
|
115
|
-
return (state.rules ?? []).flatMap((rule, position) => {
|
|
116
|
-
if (!seen.has(rule.type)) {
|
|
117
|
-
seen.add(rule.type);
|
|
118
|
-
return [];
|
|
119
|
-
}
|
|
120
|
-
return [
|
|
121
|
-
{
|
|
122
|
-
path: `states[${index}].rules[${position}]`,
|
|
123
|
-
message: `${state.key} has a ${rule.type} rule already.`,
|
|
124
|
-
},
|
|
125
|
-
];
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
/** Each rule on a status of a category its type allows; a rule whose type is gone is not checked. */
|
|
130
|
-
function rulePlacement(types) {
|
|
131
|
-
return (definition) => definition.states.flatMap((state, index) => (state.rules ?? []).flatMap((rule, position) => {
|
|
132
|
-
const categories = types?.get(rule.type)?.categories;
|
|
133
|
-
return categories &&
|
|
134
|
-
!categories.includes(state.category)
|
|
135
|
-
? [
|
|
136
|
-
{
|
|
137
|
-
path: `states[${index}].rules[${position}].type`,
|
|
138
|
-
message: `A ${rule.type} rule cannot be on a ${state.category} status.`,
|
|
139
|
-
},
|
|
140
|
-
]
|
|
141
|
-
: [];
|
|
142
|
-
}));
|
|
143
|
-
}
|
|
144
|
-
/** Each transition on a contributed event between statuses of the categories it allows; a gone event is not checked. */
|
|
145
|
-
function eventPlacement(events) {
|
|
146
|
-
return (definition) => {
|
|
147
|
-
const categories = new Map(definition.states.map((state) => [state.key, state.category]));
|
|
148
|
-
return definition.transitions.flatMap((transition, index) => {
|
|
149
|
-
const event = transition.on ? events?.get(transition.on) : undefined;
|
|
150
|
-
if (!event)
|
|
151
|
-
return [];
|
|
152
|
-
return ['from', 'to'].flatMap((end) => {
|
|
153
|
-
const allowed = event[end];
|
|
154
|
-
const category = categories.get(transition[end]);
|
|
155
|
-
return allowed && category && !allowed.includes(category)
|
|
156
|
-
? [
|
|
157
|
-
{
|
|
158
|
-
path: `transitions[${index}].${end}`,
|
|
159
|
-
message: `A transition on ${event.key} cannot ${end === 'from' ? 'leave' : 'enter'} a ${category} status.`,
|
|
160
|
-
},
|
|
161
|
-
]
|
|
162
|
-
: [];
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* The definition, valid for this plugin, or 400 `INVALID_WORKFLOW` with every problem in `details.issues`. `base` is
|
|
169
|
-
* the definition being replaced: its statuses keep their category.
|
|
170
|
-
*/
|
|
171
|
-
export function checkDefinition(input, base, registry, kinds, ruleTypes, events) {
|
|
172
|
-
// The lifecycle knows states and transitions only: the workflow's own setting is checked here.
|
|
173
|
-
const record = input !== null && typeof input === 'object' && !Array.isArray(input)
|
|
174
|
-
? input
|
|
175
|
-
: null;
|
|
176
|
-
const { commentRunLimit, ...lifecycle } = record ?? {};
|
|
177
|
-
const limitIssues = commentRunLimit === undefined ||
|
|
178
|
-
(typeof commentRunLimit === 'number' &&
|
|
179
|
-
Number.isSafeInteger(commentRunLimit) &&
|
|
180
|
-
commentRunLimit > 0)
|
|
181
|
-
? []
|
|
182
|
-
: [
|
|
183
|
-
{
|
|
184
|
-
path: 'commentRunLimit',
|
|
185
|
-
message: 'commentRunLimit is a positive integer.',
|
|
186
|
-
},
|
|
187
|
-
];
|
|
188
|
-
const result = validateDefinition(record ? lifecycle : input, workflowSchema(kinds, events), {
|
|
189
|
-
base,
|
|
190
|
-
registry,
|
|
191
|
-
rules: [
|
|
192
|
-
builtInStatuses,
|
|
193
|
-
kindLimits(kinds),
|
|
194
|
-
peopleCanLeave,
|
|
195
|
-
oneRulePerType,
|
|
196
|
-
eventTransitionsAreSystem,
|
|
197
|
-
rulePlacement(ruleTypes),
|
|
198
|
-
eventPlacement(events),
|
|
199
|
-
],
|
|
200
|
-
});
|
|
201
|
-
if (!result.ok || limitIssues.length > 0)
|
|
202
|
-
throw invalid('INVALID_WORKFLOW', 'The workflow is not valid.', {
|
|
203
|
-
issues: [...(result.ok ? [] : result.issues), ...limitIssues],
|
|
204
|
-
});
|
|
205
|
-
return {
|
|
206
|
-
...result.definition,
|
|
207
|
-
...(commentRunLimit === undefined
|
|
208
|
-
? {}
|
|
209
|
-
: { commentRunLimit: commentRunLimit }),
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=workflow.rules.js.map
|