@shipfox/client-workflows 14.0.1 → 15.0.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.
- package/.storybook/preview.tsx +7 -2
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +21 -0
- package/dist/components/job-detail/agent-config-failure-callout.d.ts.map +1 -0
- package/dist/components/{workflow-run-view → job-detail}/agent-config-failure-callout.js +2 -2
- package/dist/components/job-detail/agent-config-failure-callout.js.map +1 -0
- package/dist/components/job-detail/job-detail-header.d.ts +8 -0
- package/dist/components/job-detail/job-detail-header.d.ts.map +1 -0
- package/dist/components/job-detail/job-detail-header.js +111 -0
- package/dist/components/job-detail/job-detail-header.js.map +1 -0
- package/dist/components/job-detail/job-detail-view.d.ts +16 -0
- package/dist/components/job-detail/job-detail-view.d.ts.map +1 -0
- package/dist/components/job-detail/job-detail-view.js +405 -0
- package/dist/components/job-detail/job-detail-view.js.map +1 -0
- package/dist/components/job-detail/job-empty-states.d.ts +10 -0
- package/dist/components/job-detail/job-empty-states.d.ts.map +1 -0
- package/dist/components/job-detail/job-empty-states.js +195 -0
- package/dist/components/job-detail/job-empty-states.js.map +1 -0
- package/dist/components/job-detail/job-execution-switcher.d.ts.map +1 -0
- package/dist/components/job-detail/job-execution-switcher.js.map +1 -0
- package/dist/components/job-detail/job-execution-time-text.d.ts.map +1 -0
- package/dist/components/job-detail/job-execution-time-text.js.map +1 -0
- package/dist/components/job-detail/job-selection.d.ts +24 -0
- package/dist/components/job-detail/job-selection.d.ts.map +1 -0
- package/dist/components/job-detail/job-selection.js +66 -0
- package/dist/components/job-detail/job-selection.js.map +1 -0
- package/dist/components/job-detail/step-attempt-log-panel.d.ts +15 -0
- package/dist/components/job-detail/step-attempt-log-panel.d.ts.map +1 -0
- package/dist/components/{workflow-run-view → job-detail}/step-attempt-log-panel.js +61 -16
- package/dist/components/job-detail/step-attempt-log-panel.js.map +1 -0
- package/dist/components/job-graph/job-graph-content.js +1 -1
- package/dist/components/job-graph/job-graph-content.js.map +1 -1
- package/dist/components/step-list/step-list-model.js +2 -2
- package/dist/components/step-list/step-list-model.js.map +1 -1
- package/dist/components/step-list/step-list.d.ts +1 -0
- package/dist/components/step-list/step-list.d.ts.map +1 -1
- package/dist/components/step-list/step-list.js +29 -4
- package/dist/components/step-list/step-list.js.map +1 -1
- package/dist/components/workflow-run-duration-label.d.ts +9 -4
- package/dist/components/workflow-run-duration-label.d.ts.map +1 -1
- package/dist/components/workflow-run-duration-label.js +27 -7
- package/dist/components/workflow-run-duration-label.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-row.d.ts.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-row.js +6 -5
- package/dist/components/workflow-run-list/workflow-run-row.js.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.js +68 -64
- package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
- package/dist/components/workflow-run-tabs/index.d.ts +0 -3
- package/dist/components/workflow-run-tabs/index.d.ts.map +1 -1
- package/dist/components/workflow-run-tabs/index.js +0 -3
- package/dist/components/workflow-run-tabs/index.js.map +1 -1
- package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts +3 -1
- package/dist/components/workflow-run-tabs/run-annotations-empty.d.ts.map +1 -1
- package/dist/components/workflow-run-tabs/run-annotations-empty.js +2 -2
- package/dist/components/workflow-run-tabs/run-annotations-empty.js.map +1 -1
- package/dist/components/workflow-run-view/index.d.ts +0 -1
- package/dist/components/workflow-run-view/index.d.ts.map +1 -1
- package/dist/components/workflow-run-view/index.js +0 -1
- package/dist/components/workflow-run-view/index.js.map +1 -1
- package/dist/components/workflow-run-view/run-workspace-nav.d.ts +20 -0
- package/dist/components/workflow-run-view/run-workspace-nav.d.ts.map +1 -0
- package/dist/components/workflow-run-view/run-workspace-nav.js +271 -0
- package/dist/components/workflow-run-view/run-workspace-nav.js.map +1 -0
- package/dist/components/workflow-run-view/workflow-run-selection.d.ts.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-selection.js +1 -14
- package/dist/components/workflow-run-view/workflow-run-selection.js.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-view.d.ts +10 -8
- package/dist/components/workflow-run-view/workflow-run-view.d.ts.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-view.js +250 -236
- package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
- package/dist/components/workflow-status/status-visuals.d.ts.map +1 -1
- package/dist/components/workflow-status/status-visuals.js +10 -2
- package/dist/components/workflow-status/status-visuals.js.map +1 -1
- package/dist/components/workflow-status/workflow-status-icon.d.ts +3 -1
- package/dist/components/workflow-status/workflow-status-icon.d.ts.map +1 -1
- package/dist/components/workflow-status/workflow-status-icon.js +13 -2
- package/dist/components/workflow-status/workflow-status-icon.js.map +1 -1
- package/dist/core/entities/job-execution.d.ts +9 -0
- package/dist/core/entities/job-execution.d.ts.map +1 -1
- package/dist/core/entities/job-execution.js +13 -3
- package/dist/core/entities/job-execution.js.map +1 -1
- package/dist/core/entities/job.d.ts.map +1 -1
- package/dist/core/entities/step-attempt.d.ts.map +1 -1
- package/dist/core/entities/step.d.ts +2 -0
- package/dist/core/entities/step.d.ts.map +1 -1
- package/dist/core/entities/step.js +13 -0
- package/dist/core/entities/step.js.map +1 -1
- package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
- package/dist/core/entities/workflow-run.d.ts +56 -1
- package/dist/core/entities/workflow-run.d.ts.map +1 -1
- package/dist/core/entities/workflow-run.js +98 -0
- package/dist/core/entities/workflow-run.js.map +1 -1
- package/dist/core/workflow-run.d.ts +4 -4
- package/dist/core/workflow-run.d.ts.map +1 -1
- package/dist/core/workflow-run.js +3 -3
- package/dist/core/workflow-run.js.map +1 -1
- package/dist/feature.d.ts +20 -16
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +5 -0
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/workflow-runs.d.ts +5 -3
- package/dist/hooks/api/workflow-runs.d.ts.map +1 -1
- package/dist/hooks/api/workflow-runs.js +5 -4
- package/dist/hooks/api/workflow-runs.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pages/workflow-job-detail-page.d.ts +11 -0
- package/dist/pages/workflow-job-detail-page.d.ts.map +1 -0
- package/dist/pages/workflow-job-detail-page.js +66 -0
- package/dist/pages/workflow-job-detail-page.js.map +1 -0
- package/dist/pages/workflow-run-detail-page.d.ts.map +1 -1
- package/dist/pages/workflow-run-detail-page.js +4 -37
- package/dist/pages/workflow-run-detail-page.js.map +1 -1
- package/dist/routes/inputs.d.ts +47 -34
- package/dist/routes/inputs.d.ts.map +1 -1
- package/dist/routes/inputs.js +69 -37
- package/dist/routes/inputs.js.map +1 -1
- package/dist/routes/job-detail.d.ts +10 -0
- package/dist/routes/job-detail.d.ts.map +1 -0
- package/dist/routes/job-detail.js +27 -0
- package/dist/routes/job-detail.js.map +1 -0
- package/dist/routes/project-route.d.ts +1 -1
- package/dist/routes/run-detail.d.ts.map +1 -1
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/workflows.d.ts.map +1 -1
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/components/{workflow-run-view → job-detail}/agent-config-failure-callout.stories.tsx +1 -1
- package/src/components/{workflow-run-view → job-detail}/agent-config-failure-callout.tsx +2 -2
- package/src/components/job-detail/job-detail-header.test.tsx +31 -0
- package/src/components/job-detail/job-detail-header.tsx +111 -0
- package/src/components/job-detail/job-detail-view.stories.tsx +526 -0
- package/src/components/job-detail/job-detail-view.tsx +450 -0
- package/src/components/job-detail/job-empty-states.test.ts +27 -0
- package/src/components/job-detail/job-empty-states.tsx +248 -0
- package/src/components/job-detail/job-selection.test.ts +188 -0
- package/src/components/job-detail/job-selection.ts +96 -0
- package/src/components/{workflow-run-view → job-detail}/step-attempt-log-panel.test.tsx +32 -9
- package/src/components/{workflow-run-view → job-detail}/step-attempt-log-panel.tsx +52 -18
- package/src/components/job-graph/job-graph-content.tsx +1 -1
- package/src/components/step-list/step-list-model.test.ts +1 -1
- package/src/components/step-list/step-list-model.ts +2 -2
- package/src/components/step-list/step-list.stories.tsx +1 -1
- package/src/components/step-list/step-list.test.tsx +33 -0
- package/src/components/step-list/step-list.tsx +40 -9
- package/src/components/workflow-run-duration-label.tsx +50 -12
- package/src/components/workflow-run-list/workflow-run-row.tsx +6 -4
- package/src/components/workflow-run-summary/workflow-run-summary.stories.tsx +38 -0
- package/src/components/workflow-run-summary/workflow-run-summary.test.tsx +79 -5
- package/src/components/workflow-run-summary/workflow-run-summary.tsx +56 -60
- package/src/components/workflow-run-tabs/index.ts +0 -3
- package/src/components/workflow-run-tabs/run-annotations-empty.tsx +6 -2
- package/src/components/workflow-run-view/index.ts +0 -1
- package/src/components/workflow-run-view/run-workspace-nav.test.tsx +242 -0
- package/src/components/workflow-run-view/run-workspace-nav.tsx +301 -0
- package/src/components/workflow-run-view/workflow-run-selection.ts +1 -23
- package/src/components/workflow-run-view/workflow-run-view.test.tsx +62 -1136
- package/src/components/workflow-run-view/workflow-run-view.tsx +330 -321
- package/src/components/workflow-status/status-visuals.ts +5 -2
- package/src/components/workflow-status/workflow-status-icon.stories.tsx +1 -0
- package/src/components/workflow-status/workflow-status-icon.tsx +26 -1
- package/src/core/entities/job-execution.ts +17 -2
- package/src/core/entities/step.ts +26 -0
- package/src/core/entities/workflow-run-display.test.ts +159 -0
- package/src/core/entities/workflow-run.ts +139 -1
- package/src/core/workflow-run.ts +16 -1
- package/src/feature.ts +5 -0
- package/src/hooks/api/workflow-runs.ts +6 -2
- package/src/index.ts +1 -0
- package/src/page-harness-budget.test.ts +1 -0
- package/src/pages/workflow-job-detail-page.test.tsx +539 -0
- package/src/pages/workflow-job-detail-page.tsx +84 -0
- package/src/pages/workflow-run-detail-page.tsx +3 -43
- package/src/pages/workflow-run-pages.test.tsx +77 -332
- package/src/routes/inputs.test.ts +56 -6
- package/src/routes/inputs.ts +64 -17
- package/src/routes/job-detail.tsx +29 -0
- package/test/pages.tsx +25 -3
- package/test/render.tsx +6 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/components/workflow-run-tabs/run-jobs-list.d.ts +0 -18
- package/dist/components/workflow-run-tabs/run-jobs-list.d.ts.map +0 -1
- package/dist/components/workflow-run-tabs/run-jobs-list.js +0 -107
- package/dist/components/workflow-run-tabs/run-jobs-list.js.map +0 -1
- package/dist/components/workflow-run-tabs/run-tab-count.d.ts +0 -6
- package/dist/components/workflow-run-tabs/run-tab-count.d.ts.map +0 -1
- package/dist/components/workflow-run-tabs/run-tab-count.js +0 -27
- package/dist/components/workflow-run-tabs/run-tab-count.js.map +0 -1
- package/dist/components/workflow-run-tabs/run-tab-strip.d.ts +0 -8
- package/dist/components/workflow-run-tabs/run-tab-strip.d.ts.map +0 -1
- package/dist/components/workflow-run-tabs/run-tab-strip.js +0 -82
- package/dist/components/workflow-run-tabs/run-tab-strip.js.map +0 -1
- package/dist/components/workflow-run-view/agent-config-failure-callout.d.ts.map +0 -1
- package/dist/components/workflow-run-view/agent-config-failure-callout.js.map +0 -1
- package/dist/components/workflow-run-view/job-card.d.ts +0 -17
- package/dist/components/workflow-run-view/job-card.d.ts.map +0 -1
- package/dist/components/workflow-run-view/job-card.js +0 -496
- package/dist/components/workflow-run-view/job-card.js.map +0 -1
- package/dist/components/workflow-run-view/job-execution-switcher.d.ts.map +0 -1
- package/dist/components/workflow-run-view/job-execution-switcher.js.map +0 -1
- package/dist/components/workflow-run-view/job-execution-time-text.d.ts.map +0 -1
- package/dist/components/workflow-run-view/job-execution-time-text.js.map +0 -1
- package/dist/components/workflow-run-view/step-attempt-log-panel.d.ts +0 -9
- package/dist/components/workflow-run-view/step-attempt-log-panel.d.ts.map +0 -1
- package/dist/components/workflow-run-view/step-attempt-log-panel.js.map +0 -1
- package/src/components/workflow-run-tabs/run-jobs-list.tsx +0 -151
- package/src/components/workflow-run-tabs/run-tab-count.tsx +0 -28
- package/src/components/workflow-run-tabs/run-tab-strip.stories.tsx +0 -52
- package/src/components/workflow-run-tabs/run-tab-strip.test.tsx +0 -117
- package/src/components/workflow-run-tabs/run-tab-strip.tsx +0 -97
- package/src/components/workflow-run-view/job-card.stories.tsx +0 -789
- package/src/components/workflow-run-view/job-card.test.tsx +0 -115
- package/src/components/workflow-run-view/job-card.tsx +0 -614
- /package/dist/components/{workflow-run-view → job-detail}/agent-config-failure-callout.d.ts +0 -0
- /package/dist/components/{workflow-run-view → job-detail}/job-execution-switcher.d.ts +0 -0
- /package/dist/components/{workflow-run-view → job-detail}/job-execution-switcher.js +0 -0
- /package/dist/components/{workflow-run-view → job-detail}/job-execution-time-text.d.ts +0 -0
- /package/dist/components/{workflow-run-view → job-detail}/job-execution-time-text.js +0 -0
- /package/src/components/{workflow-run-view → job-detail}/job-execution-switcher.tsx +0 -0
- /package/src/components/{workflow-run-view → job-detail}/job-execution-time-text.tsx +0 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobDisplayStatus,\n JobExecutionDisplayDuration,\n JobExecutionDisplayStatus,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n ManualWorkflowLaunch,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowDisplayStatus,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n deriveJobDisplayStatus,\n deriveJobExecutionDisplayStatus,\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunAttemptsQueryOptions,\n workflowRunQueryOptions,\n workflowRunsInfiniteQueryOptions,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {ProjectWorkflowsPage} from './pages/project-workflows-page.js';\nexport {WorkflowRunDetailPage} from './pages/workflow-run-detail-page.js';\nexport {WorkflowRunsPage} from './pages/workflow-run-list-page.js';\n"],"names":["deriveJobDisplayStatus","deriveJobExecutionDisplayStatus","isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunAttemptsQueryOptions","workflowRunQueryOptions","workflowRunsInfiniteQueryOptions","workflowRunsQueryKeys","ProjectWorkflowsPage","WorkflowRunDetailPage","WorkflowRunsPage"],"mappings":"AA2BA,SACEA,sBAAsB,EACtBC,+BAA+B,EAC/BC,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,qBAAqB,QAAO,sCAAsC;AAC1E,SAAQC,gBAAgB,QAAO,oCAAoC"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type {\n AgentConfigIssue,\n JobDisplayDuration,\n JobDisplayStatus,\n JobExecutionDisplayDuration,\n JobExecutionDisplayStatus,\n JobExecutionStatus,\n JobExecutionTime,\n JobStatus,\n ManualWorkflowLaunch,\n Step,\n StepAttempt,\n StepAttemptDisplayDuration,\n StepError,\n StepErrorCategory,\n StepErrorReason,\n StepGateResult,\n StepSourceLocation,\n WorkflowDisplayStatus,\n WorkflowRun,\n WorkflowRunAttempt,\n WorkflowRunDetail,\n WorkflowRunListPage,\n WorkflowRunStatus,\n WorkflowSourceSnapshot,\n WorkflowStatus,\n} from '#core/workflow-run.js';\nexport {\n deriveJobDisplayStatus,\n deriveJobExecutionDisplayStatus,\n isWorkflowRunTerminal,\n isWorkflowStatus,\n Job,\n JobExecution,\n TERMINAL_WORKFLOW_RUN_STATUSES,\n WORKFLOW_RUN_STATUSES,\n workflowRunTriggerLabel,\n} from '#core/workflow-run.js';\nexport {\n type FireManualWorkflowVariables,\n fireManualWorkflow,\n useCancelWorkflowRunMutation,\n useFireManualWorkflowMutation,\n useWorkflowRunAttemptsQuery,\n useWorkflowRunQuery,\n useWorkflowRunsInfiniteQuery,\n type WorkflowRunFilters,\n workflowRunAttemptsQueryOptions,\n workflowRunQueryOptions,\n workflowRunsInfiniteQueryOptions,\n workflowRunsQueryKeys,\n} from './hooks/api/workflow-runs.js';\nexport {ProjectWorkflowsPage} from './pages/project-workflows-page.js';\nexport {WorkflowJobDetailPage} from './pages/workflow-job-detail-page.js';\nexport {WorkflowRunDetailPage} from './pages/workflow-run-detail-page.js';\nexport {WorkflowRunsPage} from './pages/workflow-run-list-page.js';\n"],"names":["deriveJobDisplayStatus","deriveJobExecutionDisplayStatus","isWorkflowRunTerminal","isWorkflowStatus","Job","JobExecution","TERMINAL_WORKFLOW_RUN_STATUSES","WORKFLOW_RUN_STATUSES","workflowRunTriggerLabel","fireManualWorkflow","useCancelWorkflowRunMutation","useFireManualWorkflowMutation","useWorkflowRunAttemptsQuery","useWorkflowRunQuery","useWorkflowRunsInfiniteQuery","workflowRunAttemptsQueryOptions","workflowRunQueryOptions","workflowRunsInfiniteQueryOptions","workflowRunsQueryKeys","ProjectWorkflowsPage","WorkflowJobDetailPage","WorkflowRunDetailPage","WorkflowRunsPage"],"mappings":"AA2BA,SACEA,sBAAsB,EACtBC,+BAA+B,EAC/BC,qBAAqB,EACrBC,gBAAgB,EAChBC,GAAG,EACHC,YAAY,EACZC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,QAClB,wBAAwB;AAC/B,SAEEC,kBAAkB,EAClBC,4BAA4B,EAC5BC,6BAA6B,EAC7BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,4BAA4B,EAE5BC,+BAA+B,EAC/BC,uBAAuB,EACvBC,gCAAgC,EAChCC,qBAAqB,QAChB,+BAA+B;AACtC,SAAQC,oBAAoB,QAAO,oCAAoC;AACvE,SAAQC,qBAAqB,QAAO,sCAAsC;AAC1E,SAAQC,qBAAqB,QAAO,sCAAsC;AAC1E,SAAQC,gBAAgB,QAAO,oCAAoC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type WorkflowJobSearch } from '#routes/inputs.js';
|
|
2
|
+
export interface WorkflowJobDetailPageProps {
|
|
3
|
+
projectId: string;
|
|
4
|
+
workspaceSlug: string;
|
|
5
|
+
projectSlug: string;
|
|
6
|
+
workflowRunId: string;
|
|
7
|
+
jobId: string;
|
|
8
|
+
search?: WorkflowJobSearch;
|
|
9
|
+
}
|
|
10
|
+
export declare function WorkflowJobDetailPage({ projectId, workspaceSlug, projectSlug, workflowRunId, jobId, search, }: WorkflowJobDetailPageProps): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=workflow-job-detail-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-job-detail-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-job-detail-page.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAC,KAAK,iBAAiB,EAA0B,MAAM,mBAAmB,CAAC;AAElF,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,KAAK,EACL,MAAW,GACZ,EAAE,0BAA0B,+BA2D5B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useNavigate } from '@tanstack/react-router';
|
|
3
|
+
import { useCallback, useMemo } from 'react';
|
|
4
|
+
import { JobDetailView } from '#components/job-detail/job-detail-view.js';
|
|
5
|
+
import { WorkflowRunView } from '#components/workflow-run-view/index.js';
|
|
6
|
+
import { isWorkflowRunTerminal } from '#core/workflow-run.js';
|
|
7
|
+
import { useWorkflowRunAttemptQuery, useWorkflowRunAttemptsQuery } from '#hooks/api/workflow-runs.js';
|
|
8
|
+
import { workflowJobSearchParams } from '#routes/inputs.js';
|
|
9
|
+
export function WorkflowJobDetailPage({ projectId, workspaceSlug, projectSlug, workflowRunId, jobId, search = {} }) {
|
|
10
|
+
const navigate = useNavigate();
|
|
11
|
+
const runQuery = useWorkflowRunAttemptQuery({
|
|
12
|
+
workflowRunId,
|
|
13
|
+
runAttempt: search.runAttempt
|
|
14
|
+
});
|
|
15
|
+
const attemptsQuery = useWorkflowRunAttemptsQuery({
|
|
16
|
+
workflowRunId,
|
|
17
|
+
enabled: Boolean(runQuery.data && isWorkflowRunTerminal(runQuery.data.runAttempt.status))
|
|
18
|
+
});
|
|
19
|
+
const newerAttempt = useMemo(()=>{
|
|
20
|
+
const currentAttempt = runQuery.data?.runAttempt.attempt ?? search.runAttempt ?? 1;
|
|
21
|
+
return attemptsQuery.data?.filter((attempt)=>attempt.attempt > currentAttempt).sort((left, right)=>right.attempt - left.attempt)[0]?.attempt;
|
|
22
|
+
}, [
|
|
23
|
+
attemptsQuery.data,
|
|
24
|
+
runQuery.data?.runAttempt.attempt,
|
|
25
|
+
search.runAttempt
|
|
26
|
+
]);
|
|
27
|
+
const newerRunQuery = useWorkflowRunAttemptQuery({
|
|
28
|
+
workflowRunId,
|
|
29
|
+
runAttempt: newerAttempt,
|
|
30
|
+
enabled: newerAttempt !== undefined
|
|
31
|
+
});
|
|
32
|
+
const currentJobKey = runQuery.data?.jobs.find((job)=>job.id === jobId)?.key;
|
|
33
|
+
const newerJob = currentJobKey ? newerRunQuery.data?.jobs.find((job)=>job.key === currentJobKey) : undefined;
|
|
34
|
+
const onSelectionChange = useCallback((nextSelection)=>{
|
|
35
|
+
navigate({
|
|
36
|
+
search: workflowJobSearchParams(nextSelection)
|
|
37
|
+
});
|
|
38
|
+
}, [
|
|
39
|
+
navigate
|
|
40
|
+
]);
|
|
41
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
42
|
+
className: "flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background",
|
|
43
|
+
children: /*#__PURE__*/ _jsx(WorkflowRunView, {
|
|
44
|
+
projectId: projectId,
|
|
45
|
+
workspaceSlug: workspaceSlug,
|
|
46
|
+
projectSlug: projectSlug,
|
|
47
|
+
workflowRunId: workflowRunId,
|
|
48
|
+
runAttempt: search.runAttempt,
|
|
49
|
+
activeJobId: jobId,
|
|
50
|
+
jobSearch: search,
|
|
51
|
+
jobContent: /*#__PURE__*/ _jsx(JobDetailView, {
|
|
52
|
+
workspaceSlug: workspaceSlug,
|
|
53
|
+
projectSlug: projectSlug,
|
|
54
|
+
workflowRunId: workflowRunId,
|
|
55
|
+
jobId: jobId,
|
|
56
|
+
search: search,
|
|
57
|
+
query: runQuery,
|
|
58
|
+
newerAttempt: newerAttempt,
|
|
59
|
+
newerJob: newerJob,
|
|
60
|
+
onSelectionChange: onSelectionChange
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=workflow-job-detail-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/pages/workflow-job-detail-page.tsx"],"sourcesContent":["import {useNavigate} from '@tanstack/react-router';\nimport {useCallback, useMemo} from 'react';\nimport {JobDetailView} from '#components/job-detail/job-detail-view.js';\nimport {WorkflowRunView} from '#components/workflow-run-view/index.js';\nimport {isWorkflowRunTerminal} from '#core/workflow-run.js';\nimport {useWorkflowRunAttemptQuery, useWorkflowRunAttemptsQuery} from '#hooks/api/workflow-runs.js';\nimport {type WorkflowJobSearch, workflowJobSearchParams} from '#routes/inputs.js';\n\nexport interface WorkflowJobDetailPageProps {\n projectId: string;\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId: string;\n jobId: string;\n search?: WorkflowJobSearch;\n}\n\nexport function WorkflowJobDetailPage({\n projectId,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n jobId,\n search = {},\n}: WorkflowJobDetailPageProps) {\n const navigate = useNavigate();\n const runQuery = useWorkflowRunAttemptQuery({\n workflowRunId,\n runAttempt: search.runAttempt,\n });\n const attemptsQuery = useWorkflowRunAttemptsQuery({\n workflowRunId,\n enabled: Boolean(runQuery.data && isWorkflowRunTerminal(runQuery.data.runAttempt.status)),\n });\n const newerAttempt = useMemo(() => {\n const currentAttempt = runQuery.data?.runAttempt.attempt ?? search.runAttempt ?? 1;\n return attemptsQuery.data\n ?.filter((attempt) => attempt.attempt > currentAttempt)\n .sort((left, right) => right.attempt - left.attempt)[0]?.attempt;\n }, [attemptsQuery.data, runQuery.data?.runAttempt.attempt, search.runAttempt]);\n const newerRunQuery = useWorkflowRunAttemptQuery({\n workflowRunId,\n runAttempt: newerAttempt,\n enabled: newerAttempt !== undefined,\n });\n\n const currentJobKey = runQuery.data?.jobs.find((job) => job.id === jobId)?.key;\n const newerJob = currentJobKey\n ? newerRunQuery.data?.jobs.find((job) => job.key === currentJobKey)\n : undefined;\n\n const onSelectionChange = useCallback(\n (nextSelection: WorkflowJobSearch) => {\n navigate({search: workflowJobSearchParams(nextSelection) as never});\n },\n [navigate],\n );\n return (\n <div className=\"flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background\">\n <WorkflowRunView\n projectId={projectId}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n runAttempt={search.runAttempt}\n activeJobId={jobId}\n jobSearch={search}\n jobContent={\n <JobDetailView\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n jobId={jobId}\n search={search}\n query={runQuery}\n newerAttempt={newerAttempt}\n newerJob={newerJob}\n onSelectionChange={onSelectionChange}\n />\n }\n />\n </div>\n );\n}\n"],"names":["useNavigate","useCallback","useMemo","JobDetailView","WorkflowRunView","isWorkflowRunTerminal","useWorkflowRunAttemptQuery","useWorkflowRunAttemptsQuery","workflowJobSearchParams","WorkflowJobDetailPage","projectId","workspaceSlug","projectSlug","workflowRunId","jobId","search","navigate","runQuery","runAttempt","attemptsQuery","enabled","Boolean","data","status","newerAttempt","currentAttempt","attempt","filter","sort","left","right","newerRunQuery","undefined","currentJobKey","jobs","find","job","id","key","newerJob","onSelectionChange","nextSelection","div","className","activeJobId","jobSearch","jobContent","query"],"mappings":";AAAA,SAAQA,WAAW,QAAO,yBAAyB;AACnD,SAAQC,WAAW,EAAEC,OAAO,QAAO,QAAQ;AAC3C,SAAQC,aAAa,QAAO,4CAA4C;AACxE,SAAQC,eAAe,QAAO,yCAAyC;AACvE,SAAQC,qBAAqB,QAAO,wBAAwB;AAC5D,SAAQC,0BAA0B,EAAEC,2BAA2B,QAAO,8BAA8B;AACpG,SAAgCC,uBAAuB,QAAO,oBAAoB;AAWlF,OAAO,SAASC,sBAAsB,EACpCC,SAAS,EACTC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,KAAK,EACLC,SAAS,CAAC,CAAC,EACgB;IAC3B,MAAMC,WAAWhB;IACjB,MAAMiB,WAAWX,2BAA2B;QAC1CO;QACAK,YAAYH,OAAOG,UAAU;IAC/B;IACA,MAAMC,gBAAgBZ,4BAA4B;QAChDM;QACAO,SAASC,QAAQJ,SAASK,IAAI,IAAIjB,sBAAsBY,SAASK,IAAI,CAACJ,UAAU,CAACK,MAAM;IACzF;IACA,MAAMC,eAAetB,QAAQ;QAC3B,MAAMuB,iBAAiBR,SAASK,IAAI,EAAEJ,WAAWQ,WAAWX,OAAOG,UAAU,IAAI;QACjF,OAAOC,cAAcG,IAAI,EACrBK,OAAO,CAACD,UAAYA,QAAQA,OAAO,GAAGD,gBACvCG,KAAK,CAACC,MAAMC,QAAUA,MAAMJ,OAAO,GAAGG,KAAKH,OAAO,CAAC,CAAC,EAAE,EAAEA;IAC7D,GAAG;QAACP,cAAcG,IAAI;QAAEL,SAASK,IAAI,EAAEJ,WAAWQ;QAASX,OAAOG,UAAU;KAAC;IAC7E,MAAMa,gBAAgBzB,2BAA2B;QAC/CO;QACAK,YAAYM;QACZJ,SAASI,iBAAiBQ;IAC5B;IAEA,MAAMC,gBAAgBhB,SAASK,IAAI,EAAEY,KAAKC,KAAK,CAACC,MAAQA,IAAIC,EAAE,KAAKvB,QAAQwB;IAC3E,MAAMC,WAAWN,gBACbF,cAAcT,IAAI,EAAEY,KAAKC,KAAK,CAACC,MAAQA,IAAIE,GAAG,KAAKL,iBACnDD;IAEJ,MAAMQ,oBAAoBvC,YACxB,CAACwC;QACCzB,SAAS;YAACD,QAAQP,wBAAwBiC;QAAuB;IACnE,GACA;QAACzB;KAAS;IAEZ,qBACE,KAAC0B;QAAIC,WAAU;kBACb,cAAA,KAACvC;YACCM,WAAWA;YACXC,eAAeA;YACfC,aAAaA;YACbC,eAAeA;YACfK,YAAYH,OAAOG,UAAU;YAC7B0B,aAAa9B;YACb+B,WAAW9B;YACX+B,0BACE,KAAC3C;gBACCQ,eAAeA;gBACfC,aAAaA;gBACbC,eAAeA;gBACfC,OAAOA;gBACPC,QAAQA;gBACRgC,OAAO9B;gBACPO,cAAcA;gBACde,UAAUA;gBACVC,mBAAmBA;;;;AAM/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-run-detail-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-detail-page.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workflow-run-detail-page.d.ts","sourceRoot":"","sources":["../../src/pages/workflow-run-detail-page.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,kBAAkB,EAAiB,MAAM,mBAAmB,CAAC;AAE1E,UAAU,0BAA0B;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,wBAAgB,qBAAqB,CAAC,EACpC,SAAS,EACT,aAAa,EACb,WAAW,EACX,aAAa,EACb,MAAW,GACZ,EAAE,0BAA0B,+BAc5B"}
|
|
@@ -1,39 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useNavigate } from '@tanstack/react-router';
|
|
3
|
-
import { useCallback } from 'react';
|
|
4
2
|
import { WorkflowRunView } from '#components/workflow-run-view/index.js';
|
|
5
|
-
import {
|
|
3
|
+
import { workflowRunTab } from '#routes/inputs.js';
|
|
6
4
|
export function WorkflowRunDetailPage({ projectId, workspaceSlug, projectSlug, workflowRunId, search = {} }) {
|
|
7
|
-
const navigate = useNavigate();
|
|
8
|
-
const selection = search;
|
|
9
|
-
const onSelectionChange = useCallback((nextSelection)=>{
|
|
10
|
-
navigate({
|
|
11
|
-
search: (previous)=>{
|
|
12
|
-
const current = validateWorkflowRunsSearch(previous);
|
|
13
|
-
return workflowRunSearchParams(current, nextSelection);
|
|
14
|
-
},
|
|
15
|
-
replace: true
|
|
16
|
-
});
|
|
17
|
-
}, [
|
|
18
|
-
navigate
|
|
19
|
-
]);
|
|
20
|
-
const onTabChange = useCallback((nextTab)=>{
|
|
21
|
-
navigate({
|
|
22
|
-
search: (previous)=>{
|
|
23
|
-
const current = validateWorkflowRunsSearch(previous);
|
|
24
|
-
const nextSearch = workflowRunSearchParams({
|
|
25
|
-
...current,
|
|
26
|
-
tab: nextTab
|
|
27
|
-
}, current);
|
|
28
|
-
return nextTab === 'summary' && (current.jobId || current.jobExecutionId || current.stepId || current.stepAttemptId) ? {
|
|
29
|
-
...nextSearch,
|
|
30
|
-
tab: nextTab
|
|
31
|
-
} : nextSearch;
|
|
32
|
-
}
|
|
33
|
-
});
|
|
34
|
-
}, [
|
|
35
|
-
navigate
|
|
36
|
-
]);
|
|
37
5
|
return /*#__PURE__*/ _jsx("div", {
|
|
38
6
|
className: "flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background",
|
|
39
7
|
children: /*#__PURE__*/ _jsx(WorkflowRunView, {
|
|
@@ -41,10 +9,9 @@ export function WorkflowRunDetailPage({ projectId, workspaceSlug, projectSlug, w
|
|
|
41
9
|
workspaceSlug: workspaceSlug,
|
|
42
10
|
projectSlug: projectSlug,
|
|
43
11
|
workflowRunId: workflowRunId,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
tab: workflowRunTab(search)
|
|
47
|
-
onTabChange: onTabChange
|
|
12
|
+
runAttempt: search.runAttempt,
|
|
13
|
+
selection: search,
|
|
14
|
+
tab: workflowRunTab(search)
|
|
48
15
|
})
|
|
49
16
|
});
|
|
50
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/workflow-run-detail-page.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../src/pages/workflow-run-detail-page.tsx"],"sourcesContent":["import {WorkflowRunView} from '#components/workflow-run-view/index.js';\nimport {type WorkflowRunsSearch, workflowRunTab} from '#routes/inputs.js';\n\ninterface WorkflowRunDetailPageProps {\n projectId: string;\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId?: string | undefined;\n search?: WorkflowRunsSearch;\n}\n\nexport function WorkflowRunDetailPage({\n projectId,\n workspaceSlug,\n projectSlug,\n workflowRunId,\n search = {},\n}: WorkflowRunDetailPageProps) {\n return (\n <div className=\"flex min-h-0 flex-1 overflow-hidden bg-background-neutral-background\">\n <WorkflowRunView\n projectId={projectId}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n runAttempt={search.runAttempt}\n selection={search}\n tab={workflowRunTab(search)}\n />\n </div>\n );\n}\n"],"names":["WorkflowRunView","workflowRunTab","WorkflowRunDetailPage","projectId","workspaceSlug","projectSlug","workflowRunId","search","div","className","runAttempt","selection","tab"],"mappings":";AAAA,SAAQA,eAAe,QAAO,yCAAyC;AACvE,SAAiCC,cAAc,QAAO,oBAAoB;AAU1E,OAAO,SAASC,sBAAsB,EACpCC,SAAS,EACTC,aAAa,EACbC,WAAW,EACXC,aAAa,EACbC,SAAS,CAAC,CAAC,EACgB;IAC3B,qBACE,KAACC;QAAIC,WAAU;kBACb,cAAA,KAACT;YACCG,WAAWA;YACXC,eAAeA;YACfC,aAAaA;YACbC,eAAeA;YACfI,YAAYH,OAAOG,UAAU;YAC7BC,WAAWJ;YACXK,KAAKX,eAAeM;;;AAI5B"}
|
package/dist/routes/inputs.d.ts
CHANGED
|
@@ -3,11 +3,11 @@ import type { WorkflowRunSelectionInput } from '#core/workflow-run-url-state.js'
|
|
|
3
3
|
* Statuses the run list can filter by. Absent means all; there is deliberately no `all`
|
|
4
4
|
* value, so "no filter" and "every filter" are the same URL rather than two.
|
|
5
5
|
*/
|
|
6
|
-
export declare const WORKFLOW_RUN_LIST_STATUSES: readonly [
|
|
6
|
+
export declare const WORKFLOW_RUN_LIST_STATUSES: readonly ['succeeded', 'failed', 'running', 'cancelled'];
|
|
7
7
|
export type WorkflowRunListStatus = (typeof WORKFLOW_RUN_LIST_STATUSES)[number];
|
|
8
|
-
export declare const WORKFLOW_RUN_TABS: readonly [
|
|
8
|
+
export declare const WORKFLOW_RUN_TABS: readonly ['summary', 'jobs', 'annotations', 'source'];
|
|
9
9
|
export type WorkflowRunTab = (typeof WORKFLOW_RUN_TABS)[number];
|
|
10
|
-
export declare const WORKFLOW_RUN_ANNOTATION_SEVERITIES: readonly [
|
|
10
|
+
export declare const WORKFLOW_RUN_ANNOTATION_SEVERITIES: readonly ['error', 'warning', 'info', 'success'];
|
|
11
11
|
export type WorkflowRunAnnotationSeverity = (typeof WORKFLOW_RUN_ANNOTATION_SEVERITIES)[number];
|
|
12
12
|
export interface WorkflowRunsSearch extends WorkflowRunSelectionInput {
|
|
13
13
|
search?: string;
|
|
@@ -23,6 +23,7 @@ export interface WorkflowRunsSearch extends WorkflowRunSelectionInput {
|
|
|
23
23
|
annotation?: string;
|
|
24
24
|
severity?: WorkflowRunAnnotationSeverity;
|
|
25
25
|
}
|
|
26
|
+
export type WorkflowJobSearch = Omit<WorkflowRunSelectionInput, 'jobId'>;
|
|
26
27
|
/**
|
|
27
28
|
* Reads the run list and run detail query string.
|
|
28
29
|
*
|
|
@@ -31,6 +32,8 @@ export interface WorkflowRunsSearch extends WorkflowRunSelectionInput {
|
|
|
31
32
|
* parameters are ignored for the same reason.
|
|
32
33
|
*/
|
|
33
34
|
export declare function validateWorkflowRunsSearch(input: Record<string, unknown>): WorkflowRunsSearch;
|
|
35
|
+
/** Reads the job-detail query string without allowing a job id to leak back into URL state. */
|
|
36
|
+
export declare function validateWorkflowJobSearch(input: Record<string, unknown>): WorkflowJobSearch;
|
|
34
37
|
/**
|
|
35
38
|
* Writes the query string back.
|
|
36
39
|
*
|
|
@@ -38,44 +41,48 @@ export declare function validateWorkflowRunsSearch(input: Record<string, unknown
|
|
|
38
41
|
* repeated keys; joining them here would defeat that and break on branch names with commas.
|
|
39
42
|
*/
|
|
40
43
|
export declare function workflowRunSearchParams(search: WorkflowRunsSearch, selection?: WorkflowRunSelectionInput): {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
+
search?: string;
|
|
45
|
+
status?: ("cancelled" | "failed" | "running" | "succeeded")[];
|
|
46
|
+
branch?: string[];
|
|
47
|
+
actor?: string[];
|
|
48
|
+
event?: string[];
|
|
49
|
+
after?: string;
|
|
50
|
+
before?: string;
|
|
51
|
+
tab?: "annotations" | "jobs" | "source";
|
|
52
|
+
annotation?: string;
|
|
53
|
+
severity?: "error" | "info" | "success" | "warning";
|
|
54
|
+
job?: string;
|
|
44
55
|
jobExecution?: string;
|
|
56
|
+
step?: string;
|
|
57
|
+
stepAttempt?: string;
|
|
58
|
+
runAttempt?: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function workflowJobSearchParams(selection: WorkflowJobSearch): {
|
|
45
61
|
job?: string;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
after?: string;
|
|
51
|
-
event?: string[];
|
|
52
|
-
actor?: string[];
|
|
53
|
-
branch?: string[];
|
|
54
|
-
status?: ("running" | "succeeded" | "failed" | "cancelled")[];
|
|
55
|
-
search?: string;
|
|
62
|
+
jobExecution?: string;
|
|
63
|
+
step?: string;
|
|
64
|
+
stepAttempt?: string;
|
|
65
|
+
runAttempt?: string;
|
|
56
66
|
};
|
|
57
|
-
/**
|
|
58
|
-
* Resolves the detail surface for a URL. Explicit tabs win; legacy selection-only URLs belong
|
|
59
|
-
* to Jobs so their selected detail remains visible instead of silently landing on Summary.
|
|
60
|
-
*/
|
|
67
|
+
/** Resolves the run-level surface. Removed Jobs-tab and selection-only URLs fall back to Summary. */
|
|
61
68
|
export declare function workflowRunTab(search: Pick<WorkflowRunsSearch, 'tab' | 'jobId' | 'jobExecutionId' | 'stepId' | 'stepAttemptId'>): WorkflowRunTab;
|
|
62
69
|
/** Serializes only list filters when leaving a run detail page for the run list. */
|
|
63
70
|
export declare function workflowRunListSearchParams(search: WorkflowRunsSearch): {
|
|
64
|
-
runAttempt?: string;
|
|
65
|
-
stepAttempt?: string;
|
|
66
|
-
step?: string;
|
|
67
|
-
jobExecution?: string;
|
|
68
|
-
job?: string;
|
|
69
|
-
severity?: "error" | "success" | "warning" | "info";
|
|
70
|
-
annotation?: string;
|
|
71
|
-
tab?: "jobs" | "annotations" | "source";
|
|
72
|
-
before?: string;
|
|
73
|
-
after?: string;
|
|
74
|
-
event?: string[];
|
|
75
|
-
actor?: string[];
|
|
76
|
-
branch?: string[];
|
|
77
|
-
status?: ("running" | "succeeded" | "failed" | "cancelled")[];
|
|
78
71
|
search?: string;
|
|
72
|
+
status?: ("cancelled" | "failed" | "running" | "succeeded")[];
|
|
73
|
+
branch?: string[];
|
|
74
|
+
actor?: string[];
|
|
75
|
+
event?: string[];
|
|
76
|
+
after?: string;
|
|
77
|
+
before?: string;
|
|
78
|
+
tab?: "annotations" | "jobs" | "source";
|
|
79
|
+
annotation?: string;
|
|
80
|
+
severity?: "error" | "info" | "success" | "warning";
|
|
81
|
+
job?: string;
|
|
82
|
+
jobExecution?: string;
|
|
83
|
+
step?: string;
|
|
84
|
+
stepAttempt?: string;
|
|
85
|
+
runAttempt?: string;
|
|
79
86
|
};
|
|
80
87
|
/**
|
|
81
88
|
* A filter change. Each member is explicitly optional-or-undefined so that "present and
|
|
@@ -108,4 +115,10 @@ export declare function workflowRouteParams(input: Record<string, unknown>): {
|
|
|
108
115
|
projectSlug: string;
|
|
109
116
|
workflowRunId?: string;
|
|
110
117
|
};
|
|
118
|
+
export declare function workflowJobRouteParams(input: Record<string, unknown>): {
|
|
119
|
+
workspaceSlug: string;
|
|
120
|
+
projectSlug: string;
|
|
121
|
+
workflowRunId: string;
|
|
122
|
+
jobId: string;
|
|
123
|
+
};
|
|
111
124
|
//# sourceMappingURL=inputs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/routes/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,iCAAiC,CAAC;AAE/E;;;GAGG;AACH,eAAO,MAAM,0BAA0B,
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/routes/inputs.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/inputs.js
CHANGED
|
@@ -37,7 +37,6 @@ const CALENDAR_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u;
|
|
|
37
37
|
const event = repeatable(input.event);
|
|
38
38
|
const after = calendarDate(input.after);
|
|
39
39
|
const before = calendarDate(input.before);
|
|
40
|
-
const runAttempt = positiveInteger(input.runAttempt);
|
|
41
40
|
const tabValue = string(input.tab);
|
|
42
41
|
const tab = tabValue && TAB_VALUES.has(tabValue) ? tabValue : undefined;
|
|
43
42
|
const annotation = string(input.annotation);
|
|
@@ -74,23 +73,13 @@ const CALENDAR_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u;
|
|
|
74
73
|
...severity ? {
|
|
75
74
|
severity
|
|
76
75
|
} : {},
|
|
77
|
-
...
|
|
78
|
-
jobId: string(input.job)
|
|
79
|
-
} : {},
|
|
80
|
-
...string(input.jobExecution) ? {
|
|
81
|
-
jobExecutionId: string(input.jobExecution)
|
|
82
|
-
} : {},
|
|
83
|
-
...string(input.step) ? {
|
|
84
|
-
stepId: string(input.step)
|
|
85
|
-
} : {},
|
|
86
|
-
...string(input.stepAttempt) ? {
|
|
87
|
-
stepAttemptId: string(input.stepAttempt)
|
|
88
|
-
} : {},
|
|
89
|
-
...runAttempt ? {
|
|
90
|
-
runAttempt
|
|
91
|
-
} : {}
|
|
76
|
+
...workflowSelectionFromSearch(input, true)
|
|
92
77
|
};
|
|
93
78
|
}
|
|
79
|
+
/** Reads the job-detail query string without allowing a job id to leak back into URL state. */ export function validateWorkflowJobSearch(input) {
|
|
80
|
+
const { jobId: _jobId, ...selection } = workflowSelectionFromSearch(input, false);
|
|
81
|
+
return selection;
|
|
82
|
+
}
|
|
94
83
|
/**
|
|
95
84
|
* Writes the query string back.
|
|
96
85
|
*
|
|
@@ -128,29 +117,14 @@ const CALENDAR_DATE_PATTERN = /^\d{4}-\d{2}-\d{2}$/u;
|
|
|
128
117
|
...search.severity ? {
|
|
129
118
|
severity: search.severity
|
|
130
119
|
} : {},
|
|
131
|
-
...selection
|
|
132
|
-
job: selection.jobId
|
|
133
|
-
} : {},
|
|
134
|
-
...selection.jobExecutionId ? {
|
|
135
|
-
jobExecution: selection.jobExecutionId
|
|
136
|
-
} : {},
|
|
137
|
-
...selection.stepId ? {
|
|
138
|
-
step: selection.stepId
|
|
139
|
-
} : {},
|
|
140
|
-
...selection.stepAttemptId ? {
|
|
141
|
-
stepAttempt: selection.stepAttemptId
|
|
142
|
-
} : {},
|
|
143
|
-
...selection.runAttempt ? {
|
|
144
|
-
runAttempt: String(selection.runAttempt)
|
|
145
|
-
} : {}
|
|
120
|
+
...workflowSelectionSearchParams(selection, true)
|
|
146
121
|
};
|
|
147
122
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
*/ export function workflowRunTab(search) {
|
|
152
|
-
if (search.tab) return search.tab;
|
|
153
|
-
if (search.jobId || search.jobExecutionId || search.stepId || search.stepAttemptId) return 'jobs';
|
|
123
|
+
export function workflowJobSearchParams(selection) {
|
|
124
|
+
return workflowSelectionSearchParams(selection, false);
|
|
125
|
+
}
|
|
126
|
+
/** Resolves the run-level surface. Removed Jobs-tab and selection-only URLs fall back to Summary. */ export function workflowRunTab(search) {
|
|
127
|
+
if (search.tab === 'annotations' || search.tab === 'source') return search.tab;
|
|
154
128
|
return 'summary';
|
|
155
129
|
}
|
|
156
130
|
/** Serializes only list filters when leaving a run detail page for the run list. */ export function workflowRunListSearchParams(search) {
|
|
@@ -204,6 +178,64 @@ export function workflowRouteParams(input) {
|
|
|
204
178
|
projectSlug
|
|
205
179
|
};
|
|
206
180
|
}
|
|
181
|
+
export function workflowJobRouteParams(input) {
|
|
182
|
+
const workspaceSlug = string(input.workspaceSlug);
|
|
183
|
+
const projectSlug = string(input.projectSlug);
|
|
184
|
+
const workflowRunId = string(input.workflowRunId);
|
|
185
|
+
const jobId = string(input.jobId);
|
|
186
|
+
if (!workspaceSlug || !projectSlug || !workflowRunId || !jobId) {
|
|
187
|
+
throw new Error('Workflow job route is missing required path parameters.');
|
|
188
|
+
}
|
|
189
|
+
return {
|
|
190
|
+
workspaceSlug,
|
|
191
|
+
projectSlug,
|
|
192
|
+
workflowRunId,
|
|
193
|
+
jobId
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function workflowSelectionFromSearch(input, includeJobId) {
|
|
197
|
+
const jobId = includeJobId ? string(input.job) : undefined;
|
|
198
|
+
const jobExecutionId = string(input.jobExecution);
|
|
199
|
+
const stepId = string(input.step);
|
|
200
|
+
const stepAttemptId = string(input.stepAttempt);
|
|
201
|
+
const runAttempt = positiveInteger(input.runAttempt);
|
|
202
|
+
return {
|
|
203
|
+
...jobId ? {
|
|
204
|
+
jobId
|
|
205
|
+
} : {},
|
|
206
|
+
...jobExecutionId ? {
|
|
207
|
+
jobExecutionId
|
|
208
|
+
} : {},
|
|
209
|
+
...stepId ? {
|
|
210
|
+
stepId
|
|
211
|
+
} : {},
|
|
212
|
+
...stepAttemptId ? {
|
|
213
|
+
stepAttemptId
|
|
214
|
+
} : {},
|
|
215
|
+
...runAttempt ? {
|
|
216
|
+
runAttempt
|
|
217
|
+
} : {}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function workflowSelectionSearchParams(selection, includeJobId) {
|
|
221
|
+
return {
|
|
222
|
+
...includeJobId && selection.jobId ? {
|
|
223
|
+
job: selection.jobId
|
|
224
|
+
} : {},
|
|
225
|
+
...selection.jobExecutionId ? {
|
|
226
|
+
jobExecution: selection.jobExecutionId
|
|
227
|
+
} : {},
|
|
228
|
+
...selection.stepId ? {
|
|
229
|
+
step: selection.stepId
|
|
230
|
+
} : {},
|
|
231
|
+
...selection.stepAttemptId ? {
|
|
232
|
+
stepAttempt: selection.stepAttemptId
|
|
233
|
+
} : {},
|
|
234
|
+
...selection.runAttempt ? {
|
|
235
|
+
runAttempt: String(selection.runAttempt)
|
|
236
|
+
} : {}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
207
239
|
function setOrDelete(target, key, value) {
|
|
208
240
|
if (value === undefined) delete target[key];
|
|
209
241
|
else target[key] = value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/inputs.ts"],"sourcesContent":["import type {WorkflowRunSelectionInput} from '#core/workflow-run-url-state.js';\n\n/**\n * Statuses the run list can filter by. Absent means all; there is deliberately no `all`\n * value, so \"no filter\" and \"every filter\" are the same URL rather than two.\n */\nexport const WORKFLOW_RUN_LIST_STATUSES = ['succeeded', 'failed', 'running', 'cancelled'] as const;\n\nexport type WorkflowRunListStatus = (typeof WORKFLOW_RUN_LIST_STATUSES)[number];\n\nexport const WORKFLOW_RUN_TABS = ['summary', 'jobs', 'annotations', 'source'] as const;\n\nexport type WorkflowRunTab = (typeof WORKFLOW_RUN_TABS)[number];\n\nexport const WORKFLOW_RUN_ANNOTATION_SEVERITIES = ['error', 'warning', 'info', 'success'] as const;\n\nexport type WorkflowRunAnnotationSeverity = (typeof WORKFLOW_RUN_ANNOTATION_SEVERITIES)[number];\n\nexport interface WorkflowRunsSearch extends WorkflowRunSelectionInput {\n search?: string;\n status?: WorkflowRunListStatus[];\n branch?: string[];\n actor?: string[];\n event?: string[];\n /** Inclusive lower bound on the run's local calendar date, `YYYY-MM-DD`. */\n after?: string;\n /** Inclusive upper bound on the run's local calendar date, `YYYY-MM-DD`. */\n before?: string;\n tab?: WorkflowRunTab;\n annotation?: string;\n severity?: WorkflowRunAnnotationSeverity;\n}\n\nconst STATUS_VALUES = new Set<string>(WORKFLOW_RUN_LIST_STATUSES);\nconst TAB_VALUES = new Set<string>(WORKFLOW_RUN_TABS);\nconst ANNOTATION_SEVERITY_VALUES = new Set<string>(WORKFLOW_RUN_ANNOTATION_SEVERITIES);\nconst CALENDAR_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/u;\n\n/**\n * Reads the run list and run detail query string.\n *\n * Every value is dropped rather than rejected when it does not fit: a truncated or\n * hand-edited URL should degrade to a sensible page, never to an error screen. Unknown\n * parameters are ignored for the same reason.\n */\nexport function validateWorkflowRunsSearch(input: Record<string, unknown>): WorkflowRunsSearch {\n const search = string(input.search);\n const status = repeatable(input.status).filter(isWorkflowRunListStatus);\n const branch = repeatable(input.branch);\n const actor = repeatable(input.actor);\n const event = repeatable(input.event);\n const after = calendarDate(input.after);\n const before = calendarDate(input.before);\n const runAttempt = positiveInteger(input.runAttempt);\n const tabValue = string(input.tab);\n const tab = tabValue && TAB_VALUES.has(tabValue) ? (tabValue as WorkflowRunTab) : undefined;\n const annotation = string(input.annotation);\n const severityValue = string(input.severity);\n const severity =\n severityValue && ANNOTATION_SEVERITY_VALUES.has(severityValue)\n ? (severityValue as WorkflowRunAnnotationSeverity)\n : undefined;\n\n return {\n ...(search ? {search} : {}),\n ...(status.length > 0 ? {status} : {}),\n ...(branch.length > 0 ? {branch} : {}),\n ...(actor.length > 0 ? {actor} : {}),\n ...(event.length > 0 ? {event} : {}),\n ...(after ? {after} : {}),\n ...(before ? {before} : {}),\n ...(tab ? {tab} : {}),\n ...(annotation ? {annotation} : {}),\n ...(severity ? {severity} : {}),\n ...(string(input.job) ? {jobId: string(input.job)} : {}),\n ...(string(input.jobExecution) ? {jobExecutionId: string(input.jobExecution)} : {}),\n ...(string(input.step) ? {stepId: string(input.step)} : {}),\n ...(string(input.stepAttempt) ? {stepAttemptId: string(input.stepAttempt)} : {}),\n ...(runAttempt ? {runAttempt} : {}),\n };\n}\n\n/**\n * Writes the query string back.\n *\n * Array values reach the router as arrays and the app's `stringifySearch` expands each into\n * repeated keys; joining them here would defeat that and break on branch names with commas.\n */\nexport function workflowRunSearchParams(\n search: WorkflowRunsSearch,\n selection: WorkflowRunSelectionInput = search,\n) {\n return {\n ...(search.search ? {search: search.search} : {}),\n ...(search.status?.length ? {status: search.status} : {}),\n ...(search.branch?.length ? {branch: search.branch} : {}),\n ...(search.actor?.length ? {actor: search.actor} : {}),\n ...(search.event?.length ? {event: search.event} : {}),\n ...(search.after ? {after: search.after} : {}),\n ...(search.before ? {before: search.before} : {}),\n ...(search.tab && search.tab !== 'summary' ? {tab: search.tab} : {}),\n ...(search.annotation ? {annotation: search.annotation} : {}),\n ...(search.severity ? {severity: search.severity} : {}),\n ...(selection.jobId ? {job: selection.jobId} : {}),\n ...(selection.jobExecutionId ? {jobExecution: selection.jobExecutionId} : {}),\n ...(selection.stepId ? {step: selection.stepId} : {}),\n ...(selection.stepAttemptId ? {stepAttempt: selection.stepAttemptId} : {}),\n ...(selection.runAttempt ? {runAttempt: String(selection.runAttempt)} : {}),\n };\n}\n\n/**\n * Resolves the detail surface for a URL. Explicit tabs win; legacy selection-only URLs belong\n * to Jobs so their selected detail remains visible instead of silently landing on Summary.\n */\nexport function workflowRunTab(\n search: Pick<WorkflowRunsSearch, 'tab' | 'jobId' | 'jobExecutionId' | 'stepId' | 'stepAttemptId'>,\n): WorkflowRunTab {\n if (search.tab) return search.tab;\n if (search.jobId || search.jobExecutionId || search.stepId || search.stepAttemptId) return 'jobs';\n return 'summary';\n}\n\n/** Serializes only list filters when leaving a run detail page for the run list. */\nexport function workflowRunListSearchParams(search: WorkflowRunsSearch) {\n const {tab: _tab, annotation: _annotation, severity: _severity, ...listSearch} = search;\n return workflowRunSearchParams(listSearch, {});\n}\n\n/**\n * A filter change. Each member is explicitly optional-or-undefined so that \"present and\n * undefined\" (clear this filter) stays distinguishable from \"absent\" (leave it alone) under\n * `exactOptionalPropertyTypes`.\n */\nexport interface WorkflowRunFilterPatch {\n search?: string | undefined;\n status?: WorkflowRunListStatus[] | undefined;\n branch?: string[] | undefined;\n actor?: string[] | undefined;\n event?: string[] | undefined;\n after?: string | undefined;\n before?: string | undefined;\n}\n\n/**\n * Applies a filter change.\n *\n * A key present with `undefined`, an empty string, or an empty array clears that filter; a\n * key left out is untouched. Cleared filters are deleted rather than stored empty, so \"no\n * filter\" is one URL instead of several that render the same list.\n */\nexport function applyWorkflowRunFilterPatch(\n search: WorkflowRunsSearch,\n patch: WorkflowRunFilterPatch,\n): WorkflowRunsSearch {\n const next: WorkflowRunsSearch = {...search};\n if ('search' in patch) setOrDelete(next, 'search', patch.search || undefined);\n if ('status' in patch) setOrDelete(next, 'status', nonEmptyList(patch.status));\n if ('branch' in patch) setOrDelete(next, 'branch', nonEmptyList(patch.branch));\n if ('actor' in patch) setOrDelete(next, 'actor', nonEmptyList(patch.actor));\n if ('event' in patch) setOrDelete(next, 'event', nonEmptyList(patch.event));\n if ('after' in patch) setOrDelete(next, 'after', patch.after || undefined);\n if ('before' in patch) setOrDelete(next, 'before', patch.before || undefined);\n return next;\n}\n\n/** Drops every filter while keeping the run-selection parameters the detail route owns. */\nexport function clearWorkflowRunFilters(search: WorkflowRunsSearch): WorkflowRunsSearch {\n return applyWorkflowRunFilterPatch(search, {\n search: undefined,\n status: undefined,\n branch: undefined,\n actor: undefined,\n event: undefined,\n after: undefined,\n before: undefined,\n });\n}\n\n/** True when any list filter is active, which separates \"no matches\" from \"no runs\". */\nexport function hasWorkflowRunFilters(search: WorkflowRunsSearch): boolean {\n return Boolean(\n search.search ||\n search.status?.length ||\n search.branch?.length ||\n search.actor?.length ||\n search.event?.length ||\n search.after ||\n search.before,\n );\n}\n\nexport function workflowRouteParams(input: Record<string, unknown>): {\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId?: string;\n} {\n const workspaceSlug = string(input.workspaceSlug);\n const projectSlug = string(input.projectSlug);\n if (!workspaceSlug || !projectSlug)\n throw new Error('Workflow route is missing required path parameters.');\n const workflowRunId = string(input.workflowRunId);\n return workflowRunId ? {workspaceSlug, projectSlug, workflowRunId} : {workspaceSlug, projectSlug};\n}\n\nfunction setOrDelete<TKey extends keyof WorkflowRunsSearch>(\n target: WorkflowRunsSearch,\n key: TKey,\n value: WorkflowRunsSearch[TKey] | undefined,\n): void {\n if (value === undefined) delete target[key];\n else target[key] = value;\n}\n\nfunction nonEmptyList<TValue>(value: readonly TValue[] | undefined): TValue[] | undefined {\n return value && value.length > 0 ? [...value] : undefined;\n}\n\nfunction isWorkflowRunListStatus(value: string): value is WorkflowRunListStatus {\n return STATUS_VALUES.has(value);\n}\n\n/**\n * Normalizes a repeatable parameter into a deduplicated list.\n *\n * A single occurrence parses as a scalar rather than a one-element array, and the parser\n * coerces bare digits to numbers, so `?branch=2024` has to survive as the string `\"2024\"`.\n */\nfunction repeatable(value: unknown): string[] {\n const values = Array.isArray(value) ? value : [value];\n const normalized = values.flatMap((entry) => {\n if (typeof entry === 'string') return entry.length > 0 ? [entry] : [];\n if (typeof entry === 'number' && Number.isFinite(entry)) return [String(entry)];\n if (typeof entry === 'boolean') return [String(entry)];\n return [];\n });\n return [...new Set(normalized)];\n}\n\nfunction calendarDate(value: unknown): string | undefined {\n if (typeof value !== 'string' || !CALENDAR_DATE_PATTERN.test(value)) return undefined;\n // Rejects a well-shaped but impossible date such as 2026-02-31, which Date rolls forward.\n // Parsed as UTC: whether `2026-05-01` is a real date does not depend on the reader's zone,\n // and a local-time parse would reject a day the reader's zone skipped outright.\n const [year, month, day] = value.split('-').map(Number) as [number, number, number];\n const parsed = new Date(`${value}T00:00:00.000Z`);\n const isRealDate =\n !Number.isNaN(parsed.getTime()) &&\n parsed.getUTCFullYear() === year &&\n parsed.getUTCMonth() === month - 1 &&\n parsed.getUTCDate() === day;\n return isRealDate ? value : undefined;\n}\n\nfunction string(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction positiveInteger(value: unknown): number | undefined {\n const number = typeof value === 'string' ? Number(value) : value;\n return typeof number === 'number' && Number.isInteger(number) && number > 0 ? number : undefined;\n}\n"],"names":["WORKFLOW_RUN_LIST_STATUSES","WORKFLOW_RUN_TABS","WORKFLOW_RUN_ANNOTATION_SEVERITIES","STATUS_VALUES","Set","TAB_VALUES","ANNOTATION_SEVERITY_VALUES","CALENDAR_DATE_PATTERN","validateWorkflowRunsSearch","input","search","string","status","repeatable","filter","isWorkflowRunListStatus","branch","actor","event","after","calendarDate","before","runAttempt","positiveInteger","tabValue","tab","has","undefined","annotation","severityValue","severity","length","job","jobId","jobExecution","jobExecutionId","step","stepId","stepAttempt","stepAttemptId","workflowRunSearchParams","selection","String","workflowRunTab","workflowRunListSearchParams","_tab","_annotation","_severity","listSearch","applyWorkflowRunFilterPatch","patch","next","setOrDelete","nonEmptyList","clearWorkflowRunFilters","hasWorkflowRunFilters","Boolean","workflowRouteParams","workspaceSlug","projectSlug","Error","workflowRunId","target","key","value","values","Array","isArray","normalized","flatMap","entry","Number","isFinite","test","year","month","day","split","map","parsed","Date","isRealDate","isNaN","getTime","getUTCFullYear","getUTCMonth","getUTCDate","number","isInteger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/routes/inputs.ts"],"sourcesContent":["import type {WorkflowRunSelectionInput} from '#core/workflow-run-url-state.js';\n\n/**\n * Statuses the run list can filter by. Absent means all; there is deliberately no `all`\n * value, so \"no filter\" and \"every filter\" are the same URL rather than two.\n */\nexport const WORKFLOW_RUN_LIST_STATUSES = ['succeeded', 'failed', 'running', 'cancelled'] as const;\n\nexport type WorkflowRunListStatus = (typeof WORKFLOW_RUN_LIST_STATUSES)[number];\n\nexport const WORKFLOW_RUN_TABS = ['summary', 'jobs', 'annotations', 'source'] as const;\n\nexport type WorkflowRunTab = (typeof WORKFLOW_RUN_TABS)[number];\n\nexport const WORKFLOW_RUN_ANNOTATION_SEVERITIES = ['error', 'warning', 'info', 'success'] as const;\n\nexport type WorkflowRunAnnotationSeverity = (typeof WORKFLOW_RUN_ANNOTATION_SEVERITIES)[number];\n\nexport interface WorkflowRunsSearch extends WorkflowRunSelectionInput {\n search?: string;\n status?: WorkflowRunListStatus[];\n branch?: string[];\n actor?: string[];\n event?: string[];\n /** Inclusive lower bound on the run's local calendar date, `YYYY-MM-DD`. */\n after?: string;\n /** Inclusive upper bound on the run's local calendar date, `YYYY-MM-DD`. */\n before?: string;\n tab?: WorkflowRunTab;\n annotation?: string;\n severity?: WorkflowRunAnnotationSeverity;\n}\n\nexport type WorkflowJobSearch = Omit<WorkflowRunSelectionInput, 'jobId'>;\n\nconst STATUS_VALUES = new Set<string>(WORKFLOW_RUN_LIST_STATUSES);\nconst TAB_VALUES = new Set<string>(WORKFLOW_RUN_TABS);\nconst ANNOTATION_SEVERITY_VALUES = new Set<string>(WORKFLOW_RUN_ANNOTATION_SEVERITIES);\nconst CALENDAR_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/u;\n\n/**\n * Reads the run list and run detail query string.\n *\n * Every value is dropped rather than rejected when it does not fit: a truncated or\n * hand-edited URL should degrade to a sensible page, never to an error screen. Unknown\n * parameters are ignored for the same reason.\n */\nexport function validateWorkflowRunsSearch(input: Record<string, unknown>): WorkflowRunsSearch {\n const search = string(input.search);\n const status = repeatable(input.status).filter(isWorkflowRunListStatus);\n const branch = repeatable(input.branch);\n const actor = repeatable(input.actor);\n const event = repeatable(input.event);\n const after = calendarDate(input.after);\n const before = calendarDate(input.before);\n const tabValue = string(input.tab);\n const tab = tabValue && TAB_VALUES.has(tabValue) ? (tabValue as WorkflowRunTab) : undefined;\n const annotation = string(input.annotation);\n const severityValue = string(input.severity);\n const severity =\n severityValue && ANNOTATION_SEVERITY_VALUES.has(severityValue)\n ? (severityValue as WorkflowRunAnnotationSeverity)\n : undefined;\n\n return {\n ...(search ? {search} : {}),\n ...(status.length > 0 ? {status} : {}),\n ...(branch.length > 0 ? {branch} : {}),\n ...(actor.length > 0 ? {actor} : {}),\n ...(event.length > 0 ? {event} : {}),\n ...(after ? {after} : {}),\n ...(before ? {before} : {}),\n ...(tab ? {tab} : {}),\n ...(annotation ? {annotation} : {}),\n ...(severity ? {severity} : {}),\n ...workflowSelectionFromSearch(input, true),\n };\n}\n\n/** Reads the job-detail query string without allowing a job id to leak back into URL state. */\nexport function validateWorkflowJobSearch(input: Record<string, unknown>): WorkflowJobSearch {\n const {jobId: _jobId, ...selection} = workflowSelectionFromSearch(input, false);\n return selection;\n}\n\n/**\n * Writes the query string back.\n *\n * Array values reach the router as arrays and the app's `stringifySearch` expands each into\n * repeated keys; joining them here would defeat that and break on branch names with commas.\n */\nexport function workflowRunSearchParams(\n search: WorkflowRunsSearch,\n selection: WorkflowRunSelectionInput = search,\n) {\n return {\n ...(search.search ? {search: search.search} : {}),\n ...(search.status?.length ? {status: search.status} : {}),\n ...(search.branch?.length ? {branch: search.branch} : {}),\n ...(search.actor?.length ? {actor: search.actor} : {}),\n ...(search.event?.length ? {event: search.event} : {}),\n ...(search.after ? {after: search.after} : {}),\n ...(search.before ? {before: search.before} : {}),\n ...(search.tab && search.tab !== 'summary' ? {tab: search.tab} : {}),\n ...(search.annotation ? {annotation: search.annotation} : {}),\n ...(search.severity ? {severity: search.severity} : {}),\n ...workflowSelectionSearchParams(selection, true),\n };\n}\n\nexport function workflowJobSearchParams(selection: WorkflowJobSearch) {\n return workflowSelectionSearchParams(selection, false);\n}\n\n/** Resolves the run-level surface. Removed Jobs-tab and selection-only URLs fall back to Summary. */\nexport function workflowRunTab(\n search: Pick<WorkflowRunsSearch, 'tab' | 'jobId' | 'jobExecutionId' | 'stepId' | 'stepAttemptId'>,\n): WorkflowRunTab {\n if (search.tab === 'annotations' || search.tab === 'source') return search.tab;\n return 'summary';\n}\n\n/** Serializes only list filters when leaving a run detail page for the run list. */\nexport function workflowRunListSearchParams(search: WorkflowRunsSearch) {\n const {tab: _tab, annotation: _annotation, severity: _severity, ...listSearch} = search;\n return workflowRunSearchParams(listSearch, {});\n}\n\n/**\n * A filter change. Each member is explicitly optional-or-undefined so that \"present and\n * undefined\" (clear this filter) stays distinguishable from \"absent\" (leave it alone) under\n * `exactOptionalPropertyTypes`.\n */\nexport interface WorkflowRunFilterPatch {\n search?: string | undefined;\n status?: WorkflowRunListStatus[] | undefined;\n branch?: string[] | undefined;\n actor?: string[] | undefined;\n event?: string[] | undefined;\n after?: string | undefined;\n before?: string | undefined;\n}\n\n/**\n * Applies a filter change.\n *\n * A key present with `undefined`, an empty string, or an empty array clears that filter; a\n * key left out is untouched. Cleared filters are deleted rather than stored empty, so \"no\n * filter\" is one URL instead of several that render the same list.\n */\nexport function applyWorkflowRunFilterPatch(\n search: WorkflowRunsSearch,\n patch: WorkflowRunFilterPatch,\n): WorkflowRunsSearch {\n const next: WorkflowRunsSearch = {...search};\n if ('search' in patch) setOrDelete(next, 'search', patch.search || undefined);\n if ('status' in patch) setOrDelete(next, 'status', nonEmptyList(patch.status));\n if ('branch' in patch) setOrDelete(next, 'branch', nonEmptyList(patch.branch));\n if ('actor' in patch) setOrDelete(next, 'actor', nonEmptyList(patch.actor));\n if ('event' in patch) setOrDelete(next, 'event', nonEmptyList(patch.event));\n if ('after' in patch) setOrDelete(next, 'after', patch.after || undefined);\n if ('before' in patch) setOrDelete(next, 'before', patch.before || undefined);\n return next;\n}\n\n/** Drops every filter while keeping the run-selection parameters the detail route owns. */\nexport function clearWorkflowRunFilters(search: WorkflowRunsSearch): WorkflowRunsSearch {\n return applyWorkflowRunFilterPatch(search, {\n search: undefined,\n status: undefined,\n branch: undefined,\n actor: undefined,\n event: undefined,\n after: undefined,\n before: undefined,\n });\n}\n\n/** True when any list filter is active, which separates \"no matches\" from \"no runs\". */\nexport function hasWorkflowRunFilters(search: WorkflowRunsSearch): boolean {\n return Boolean(\n search.search ||\n search.status?.length ||\n search.branch?.length ||\n search.actor?.length ||\n search.event?.length ||\n search.after ||\n search.before,\n );\n}\n\nexport function workflowRouteParams(input: Record<string, unknown>): {\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId?: string;\n} {\n const workspaceSlug = string(input.workspaceSlug);\n const projectSlug = string(input.projectSlug);\n if (!workspaceSlug || !projectSlug)\n throw new Error('Workflow route is missing required path parameters.');\n const workflowRunId = string(input.workflowRunId);\n return workflowRunId ? {workspaceSlug, projectSlug, workflowRunId} : {workspaceSlug, projectSlug};\n}\n\nexport function workflowJobRouteParams(input: Record<string, unknown>): {\n workspaceSlug: string;\n projectSlug: string;\n workflowRunId: string;\n jobId: string;\n} {\n const workspaceSlug = string(input.workspaceSlug);\n const projectSlug = string(input.projectSlug);\n const workflowRunId = string(input.workflowRunId);\n const jobId = string(input.jobId);\n if (!workspaceSlug || !projectSlug || !workflowRunId || !jobId) {\n throw new Error('Workflow job route is missing required path parameters.');\n }\n return {workspaceSlug, projectSlug, workflowRunId, jobId};\n}\n\nfunction workflowSelectionFromSearch(\n input: Record<string, unknown>,\n includeJobId: boolean,\n): WorkflowRunSelectionInput {\n const jobId = includeJobId ? string(input.job) : undefined;\n const jobExecutionId = string(input.jobExecution);\n const stepId = string(input.step);\n const stepAttemptId = string(input.stepAttempt);\n const runAttempt = positiveInteger(input.runAttempt);\n\n return {\n ...(jobId ? {jobId} : {}),\n ...(jobExecutionId ? {jobExecutionId} : {}),\n ...(stepId ? {stepId} : {}),\n ...(stepAttemptId ? {stepAttemptId} : {}),\n ...(runAttempt ? {runAttempt} : {}),\n };\n}\n\nfunction workflowSelectionSearchParams(\n selection: WorkflowRunSelectionInput,\n includeJobId: boolean,\n) {\n return {\n ...(includeJobId && selection.jobId ? {job: selection.jobId} : {}),\n ...(selection.jobExecutionId ? {jobExecution: selection.jobExecutionId} : {}),\n ...(selection.stepId ? {step: selection.stepId} : {}),\n ...(selection.stepAttemptId ? {stepAttempt: selection.stepAttemptId} : {}),\n ...(selection.runAttempt ? {runAttempt: String(selection.runAttempt)} : {}),\n };\n}\n\nfunction setOrDelete<TKey extends keyof WorkflowRunsSearch>(\n target: WorkflowRunsSearch,\n key: TKey,\n value: WorkflowRunsSearch[TKey] | undefined,\n): void {\n if (value === undefined) delete target[key];\n else target[key] = value;\n}\n\nfunction nonEmptyList<TValue>(value: readonly TValue[] | undefined): TValue[] | undefined {\n return value && value.length > 0 ? [...value] : undefined;\n}\n\nfunction isWorkflowRunListStatus(value: string): value is WorkflowRunListStatus {\n return STATUS_VALUES.has(value);\n}\n\n/**\n * Normalizes a repeatable parameter into a deduplicated list.\n *\n * A single occurrence parses as a scalar rather than a one-element array, and the parser\n * coerces bare digits to numbers, so `?branch=2024` has to survive as the string `\"2024\"`.\n */\nfunction repeatable(value: unknown): string[] {\n const values = Array.isArray(value) ? value : [value];\n const normalized = values.flatMap((entry) => {\n if (typeof entry === 'string') return entry.length > 0 ? [entry] : [];\n if (typeof entry === 'number' && Number.isFinite(entry)) return [String(entry)];\n if (typeof entry === 'boolean') return [String(entry)];\n return [];\n });\n return [...new Set(normalized)];\n}\n\nfunction calendarDate(value: unknown): string | undefined {\n if (typeof value !== 'string' || !CALENDAR_DATE_PATTERN.test(value)) return undefined;\n // Rejects a well-shaped but impossible date such as 2026-02-31, which Date rolls forward.\n // Parsed as UTC: whether `2026-05-01` is a real date does not depend on the reader's zone,\n // and a local-time parse would reject a day the reader's zone skipped outright.\n const [year, month, day] = value.split('-').map(Number) as [number, number, number];\n const parsed = new Date(`${value}T00:00:00.000Z`);\n const isRealDate =\n !Number.isNaN(parsed.getTime()) &&\n parsed.getUTCFullYear() === year &&\n parsed.getUTCMonth() === month - 1 &&\n parsed.getUTCDate() === day;\n return isRealDate ? value : undefined;\n}\n\nfunction string(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction positiveInteger(value: unknown): number | undefined {\n const number = typeof value === 'string' ? Number(value) : value;\n return typeof number === 'number' && Number.isInteger(number) && number > 0 ? number : undefined;\n}\n"],"names":["WORKFLOW_RUN_LIST_STATUSES","WORKFLOW_RUN_TABS","WORKFLOW_RUN_ANNOTATION_SEVERITIES","STATUS_VALUES","Set","TAB_VALUES","ANNOTATION_SEVERITY_VALUES","CALENDAR_DATE_PATTERN","validateWorkflowRunsSearch","input","search","string","status","repeatable","filter","isWorkflowRunListStatus","branch","actor","event","after","calendarDate","before","tabValue","tab","has","undefined","annotation","severityValue","severity","length","workflowSelectionFromSearch","validateWorkflowJobSearch","jobId","_jobId","selection","workflowRunSearchParams","workflowSelectionSearchParams","workflowJobSearchParams","workflowRunTab","workflowRunListSearchParams","_tab","_annotation","_severity","listSearch","applyWorkflowRunFilterPatch","patch","next","setOrDelete","nonEmptyList","clearWorkflowRunFilters","hasWorkflowRunFilters","Boolean","workflowRouteParams","workspaceSlug","projectSlug","Error","workflowRunId","workflowJobRouteParams","includeJobId","job","jobExecutionId","jobExecution","stepId","step","stepAttemptId","stepAttempt","runAttempt","positiveInteger","String","target","key","value","values","Array","isArray","normalized","flatMap","entry","Number","isFinite","test","year","month","day","split","map","parsed","Date","isRealDate","isNaN","getTime","getUTCFullYear","getUTCMonth","getUTCDate","number","isInteger"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { validateWorkflowJobSearch } from './inputs.js';
|
|
2
|
+
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
3
|
+
readonly staticData: {
|
|
4
|
+
readonly layout: "full-bleed";
|
|
5
|
+
};
|
|
6
|
+
readonly validateSearch: typeof validateWorkflowJobSearch;
|
|
7
|
+
readonly component: () => import("react").JSX.Element;
|
|
8
|
+
}>;
|
|
9
|
+
export default _default;
|
|
10
|
+
//# sourceMappingURL=job-detail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"job-detail.d.ts","sourceRoot":"","sources":["../../src/routes/job-detail.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,yBAAyB,EAAyB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineRoute, useRouteParams, useRouteSearch } from '@shipfox/client-shell/runtime';
|
|
3
|
+
import { WorkflowJobDetailPage } from '#pages/workflow-job-detail-page.js';
|
|
4
|
+
import { validateWorkflowJobSearch, workflowJobRouteParams } from './inputs.js';
|
|
5
|
+
import { ProjectRoute } from './project-route.js';
|
|
6
|
+
export default defineRoute({
|
|
7
|
+
staticData: {
|
|
8
|
+
layout: 'full-bleed'
|
|
9
|
+
},
|
|
10
|
+
validateSearch: validateWorkflowJobSearch,
|
|
11
|
+
component: ()=>{
|
|
12
|
+
const { workspaceSlug, projectSlug, workflowRunId, jobId } = useRouteParams(workflowJobRouteParams);
|
|
13
|
+
const search = useRouteSearch(validateWorkflowJobSearch);
|
|
14
|
+
return /*#__PURE__*/ _jsx(ProjectRoute, {
|
|
15
|
+
children: (project)=>/*#__PURE__*/ _jsx(WorkflowJobDetailPage, {
|
|
16
|
+
projectId: project.id,
|
|
17
|
+
workspaceSlug: workspaceSlug,
|
|
18
|
+
projectSlug: projectSlug,
|
|
19
|
+
workflowRunId: workflowRunId,
|
|
20
|
+
jobId: jobId,
|
|
21
|
+
search: search
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=job-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/job-detail.tsx"],"sourcesContent":["import {defineRoute, useRouteParams, useRouteSearch} from '@shipfox/client-shell/runtime';\nimport {WorkflowJobDetailPage} from '#pages/workflow-job-detail-page.js';\nimport {validateWorkflowJobSearch, workflowJobRouteParams} from './inputs.js';\nimport {ProjectRoute} from './project-route.js';\n\nexport default defineRoute({\n staticData: {layout: 'full-bleed'},\n validateSearch: validateWorkflowJobSearch,\n component: () => {\n const {workspaceSlug, projectSlug, workflowRunId, jobId} =\n useRouteParams(workflowJobRouteParams);\n const search = useRouteSearch(validateWorkflowJobSearch);\n\n return (\n <ProjectRoute>\n {(project) => (\n <WorkflowJobDetailPage\n projectId={project.id}\n workspaceSlug={workspaceSlug}\n projectSlug={projectSlug}\n workflowRunId={workflowRunId}\n jobId={jobId}\n search={search}\n />\n )}\n </ProjectRoute>\n );\n },\n});\n"],"names":["defineRoute","useRouteParams","useRouteSearch","WorkflowJobDetailPage","validateWorkflowJobSearch","workflowJobRouteParams","ProjectRoute","staticData","layout","validateSearch","component","workspaceSlug","projectSlug","workflowRunId","jobId","search","project","projectId","id"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,cAAc,EAAEC,cAAc,QAAO,gCAAgC;AAC1F,SAAQC,qBAAqB,QAAO,qCAAqC;AACzE,SAAQC,yBAAyB,EAAEC,sBAAsB,QAAO,cAAc;AAC9E,SAAQC,YAAY,QAAO,qBAAqB;AAEhD,eAAeN,YAAY;IACzBO,YAAY;QAACC,QAAQ;IAAY;IACjCC,gBAAgBL;IAChBM,WAAW;QACT,MAAM,EAACC,aAAa,EAAEC,WAAW,EAAEC,aAAa,EAAEC,KAAK,EAAC,GACtDb,eAAeI;QACjB,MAAMU,SAASb,eAAeE;QAE9B,qBACE,KAACE;sBACE,CAACU,wBACA,KAACb;oBACCc,WAAWD,QAAQE,EAAE;oBACrBP,eAAeA;oBACfC,aAAaA;oBACbC,eAAeA;oBACfC,OAAOA;oBACPC,QAAQA;;;IAKlB;AACF,GAAG"}
|
|
@@ -2,5 +2,5 @@ import { type Project } from '@shipfox/client-projects';
|
|
|
2
2
|
import type { ReactNode } from 'react';
|
|
3
3
|
export declare function ProjectRoute({ children }: {
|
|
4
4
|
children: (project: Project) => ReactNode;
|
|
5
|
-
}): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean |
|
|
5
|
+
}): string | number | bigint | boolean | import("react").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | Iterable<ReactNode> | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | import("react").ReactPortal | null | undefined> | null | undefined;
|
|
6
6
|
//# sourceMappingURL=project-route.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-detail.d.ts","sourceRoot":"","sources":["../../src/routes/run-detail.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,0BAA0B,EAAsB,MAAM,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"run-detail.d.ts","sourceRoot":"","sources":["../../src/routes/run-detail.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,0BAA0B,EAAsB,MAAM,aAAa,CAAC"}
|