@shipfox/client-workflows 4.0.0 → 6.0.1
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +68 -0
- package/dist/components/workflow-run-list/types.d.ts +12 -0
- package/dist/components/workflow-run-list/types.d.ts.map +1 -1
- package/dist/components/workflow-run-list/types.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-view.d.ts +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-view.d.ts.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list-view.js +32 -11
- package/dist/components/workflow-run-list/workflow-run-list-view.js.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list.d.ts +1 -1
- package/dist/components/workflow-run-list/workflow-run-list.d.ts.map +1 -1
- package/dist/components/workflow-run-list/workflow-run-list.js +7 -2
- package/dist/components/workflow-run-list/workflow-run-list.js.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.d.ts +2 -3
- package/dist/components/workflow-run-summary/workflow-run-summary.d.ts.map +1 -1
- package/dist/components/workflow-run-summary/workflow-run-summary.js.map +1 -1
- package/dist/components/workflow-run-view/job-card.d.ts.map +1 -1
- package/dist/components/workflow-run-view/job-card.js +9 -8
- package/dist/components/workflow-run-view/job-card.js.map +1 -1
- package/dist/components/workflow-run-view/workflow-run-view.js.map +1 -1
- package/dist/core/entities/job-execution.d.ts +11 -6
- package/dist/core/entities/job-execution.d.ts.map +1 -1
- package/dist/core/entities/job-execution.js +0 -19
- package/dist/core/entities/job-execution.js.map +1 -1
- package/dist/core/entities/job.d.ts +32 -10
- package/dist/core/entities/job.d.ts.map +1 -1
- package/dist/core/entities/job.js +0 -22
- package/dist/core/entities/job.js.map +1 -1
- package/dist/core/entities/step-attempt.d.ts +28 -3
- package/dist/core/entities/step-attempt.d.ts.map +1 -1
- package/dist/core/entities/step-attempt.js +0 -17
- package/dist/core/entities/step-attempt.js.map +1 -1
- package/dist/core/entities/step.d.ts +6 -6
- package/dist/core/entities/step.d.ts.map +1 -1
- package/dist/core/entities/step.js +19 -49
- package/dist/core/entities/step.js.map +1 -1
- package/dist/core/entities/workflow-run-attempt.d.ts +0 -2
- package/dist/core/entities/workflow-run-attempt.d.ts.map +1 -1
- package/dist/core/entities/workflow-run-attempt.js +0 -12
- package/dist/core/entities/workflow-run-attempt.js.map +1 -1
- package/dist/core/entities/workflow-run.d.ts +6 -7
- package/dist/core/entities/workflow-run.d.ts.map +1 -1
- package/dist/core/entities/workflow-run.js +1 -67
- package/dist/core/entities/workflow-run.js.map +1 -1
- package/dist/core/workflow-run.d.ts +9 -9
- package/dist/core/workflow-run.d.ts.map +1 -1
- package/dist/core/workflow-run.js +6 -6
- package/dist/core/workflow-run.js.map +1 -1
- package/dist/feature.d.ts +23 -0
- package/dist/feature.d.ts.map +1 -1
- package/dist/feature.js +22 -9
- package/dist/feature.js.map +1 -1
- package/dist/hooks/api/workflow-run-mapper.d.ts +12 -0
- package/dist/hooks/api/workflow-run-mapper.d.ts.map +1 -0
- package/dist/hooks/api/workflow-run-mapper.js +207 -0
- package/dist/hooks/api/workflow-run-mapper.js.map +1 -0
- package/dist/hooks/api/workflow-runs.d.ts +25 -55
- package/dist/hooks/api/workflow-runs.d.ts.map +1 -1
- package/dist/hooks/api/workflow-runs.js +95 -51
- package/dist/hooks/api/workflow-runs.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pages/project-workflows-page.d.ts +4 -0
- package/dist/pages/project-workflows-page.d.ts.map +1 -0
- package/dist/pages/project-workflows-page.js +479 -0
- package/dist/pages/project-workflows-page.js.map +1 -0
- package/dist/pages/workflow-run-page.d.ts +3 -1
- package/dist/pages/workflow-run-page.d.ts.map +1 -1
- package/dist/pages/workflow-run-page.js +21 -14
- package/dist/pages/workflow-run-page.js.map +1 -1
- package/dist/routes/inputs.d.ts +22 -0
- package/dist/routes/inputs.d.ts.map +1 -0
- package/dist/routes/inputs.js +76 -0
- package/dist/routes/inputs.js.map +1 -0
- package/dist/routes/run-detail.d.ts +2 -0
- package/dist/routes/run-detail.d.ts.map +1 -1
- package/dist/routes/run-detail.js +6 -6
- package/dist/routes/run-detail.js.map +1 -1
- package/dist/routes/runs.d.ts +2 -0
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +6 -6
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/workflows.d.ts +5 -0
- package/dist/routes/workflows.d.ts.map +1 -0
- package/dist/routes/workflows.js +14 -0
- package/dist/routes/workflows.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -1
- package/package.json +13 -12
- package/src/components/workflow-run-list/types.ts +6 -0
- package/src/components/workflow-run-list/workflow-run-list-view.tsx +27 -11
- package/src/components/workflow-run-list/workflow-run-list.tsx +6 -0
- package/src/components/workflow-run-summary/workflow-run-attempt-switcher.test.tsx +5 -6
- package/src/components/workflow-run-summary/workflow-run-summary.tsx +3 -3
- package/src/components/workflow-run-view/job-card.tsx +20 -11
- package/src/components/workflow-run-view/workflow-run-view.test.tsx +3 -3
- package/src/components/workflow-run-view/workflow-run-view.tsx +2 -2
- package/src/core/entities/job-execution.ts +12 -28
- package/src/core/entities/job.ts +44 -45
- package/src/core/entities/step-attempt.ts +9 -20
- package/src/core/entities/step.ts +38 -66
- package/src/core/entities/workflow-run-attempt.ts +0 -14
- package/src/core/entities/workflow-run.ts +8 -86
- package/src/core/workflow-run.test.ts +13 -11
- package/src/core/workflow-run.ts +8 -13
- package/src/feature.ts +24 -10
- package/src/hooks/api/workflow-run-mapper.ts +246 -0
- package/src/hooks/api/workflow-runs.test.tsx +57 -59
- package/src/hooks/api/workflow-runs.ts +187 -88
- package/src/index.ts +5 -0
- package/src/page-harness-budget.test.ts +1 -0
- package/src/pages/project-workflows-page.test.tsx +247 -0
- package/src/pages/project-workflows-page.tsx +448 -0
- package/src/pages/workflow-run-page.test.tsx +4 -2
- package/src/pages/workflow-run-page.tsx +22 -17
- package/src/routes/inputs.test.ts +22 -0
- package/src/routes/inputs.ts +58 -0
- package/src/routes/run-detail.tsx +12 -8
- package/src/routes/runs.tsx +11 -4
- package/src/routes/workflows.tsx +10 -0
- package/test/fixtures/workflow-run.ts +9 -7
- package/test/pages.tsx +48 -6
- package/tsconfig.build.tsbuildinfo +1 -1
- package/vercel.json +5 -0
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useNavigate
|
|
2
|
+
import { useNavigate } from '@tanstack/react-router';
|
|
3
3
|
import { useCallback, useEffect } from 'react';
|
|
4
4
|
import { WorkflowRunList } from '#components/workflow-run-list/workflow-run-list.js';
|
|
5
5
|
import { WorkflowRunView } from '#components/workflow-run-view/index.js';
|
|
6
|
-
import { withoutWorkflowRunSelectionSearch, withWorkflowRunSelectionSearch, workflowRunSelectionFromSearch } from '#core/workflow-run-url-state.js';
|
|
7
6
|
import { useWorkflowRunsInfiniteQuery } from '#hooks/api/workflow-runs.js';
|
|
7
|
+
import { workflowRunSearchParams } from '#routes/inputs.js';
|
|
8
8
|
import { WorkflowRunFirstTimeUse } from './workflow-run-first-time-use.js';
|
|
9
9
|
/**
|
|
10
10
|
* Resolve which surface the runs path should show from a single read of the runs list:
|
|
@@ -12,7 +12,7 @@ import { WorkflowRunFirstTimeUse } from './workflow-run-first-time-use.js';
|
|
|
12
12
|
* never empty (navigation happens in an effect since it mutates history);
|
|
13
13
|
* - report `hasNoRuns` once the list has loaded with zero runs, so a brand-new project lands
|
|
14
14
|
* on the first-time-use surface instead of an empty rail and a perpetual detail skeleton.
|
|
15
|
-
*/ function useWorkflowRunPageTarget(workspaceId, projectId, workflowRunId) {
|
|
15
|
+
*/ function useWorkflowRunPageTarget(workspaceId, projectId, workflowRunId, search) {
|
|
16
16
|
const navigate = useNavigate();
|
|
17
17
|
const { data, isPending } = useWorkflowRunsInfiniteQuery(projectId, {});
|
|
18
18
|
const firstWorkflowRunId = data?.pages[0]?.runs[0]?.id;
|
|
@@ -29,7 +29,7 @@ import { WorkflowRunFirstTimeUse } from './workflow-run-first-time-use.js';
|
|
|
29
29
|
pid: projectId,
|
|
30
30
|
workflowRunId: firstWorkflowRunId
|
|
31
31
|
},
|
|
32
|
-
search: (
|
|
32
|
+
search: workflowRunSearchParams(search, {}),
|
|
33
33
|
replace: true
|
|
34
34
|
});
|
|
35
35
|
}, [
|
|
@@ -38,25 +38,24 @@ import { WorkflowRunFirstTimeUse } from './workflow-run-first-time-use.js';
|
|
|
38
38
|
projectId,
|
|
39
39
|
workflowRunId,
|
|
40
40
|
isLoaded,
|
|
41
|
-
firstWorkflowRunId
|
|
41
|
+
firstWorkflowRunId,
|
|
42
|
+
search
|
|
42
43
|
]);
|
|
43
44
|
return {
|
|
44
45
|
hasNoRuns: isLoaded && firstWorkflowRunId === undefined
|
|
45
46
|
};
|
|
46
47
|
}
|
|
47
|
-
export function WorkflowRunPage({ workspaceId, projectId, workflowRunId }) {
|
|
48
|
-
const { hasNoRuns } = useWorkflowRunPageTarget(workspaceId, projectId, workflowRunId);
|
|
48
|
+
export function WorkflowRunPage({ workspaceId, projectId, workflowRunId, search = {} }) {
|
|
49
|
+
const { hasNoRuns } = useWorkflowRunPageTarget(workspaceId, projectId, workflowRunId, search);
|
|
49
50
|
const navigate = useNavigate();
|
|
50
|
-
const
|
|
51
|
-
strict: false
|
|
52
|
-
});
|
|
53
|
-
const selection = workflowRunSelectionFromSearch(search);
|
|
51
|
+
const selection = search;
|
|
54
52
|
const onSelectionChange = useCallback((nextSelection)=>{
|
|
55
53
|
navigate({
|
|
56
|
-
search: (
|
|
54
|
+
search: workflowRunSearchParams(search, nextSelection)
|
|
57
55
|
});
|
|
58
56
|
}, [
|
|
59
|
-
navigate
|
|
57
|
+
navigate,
|
|
58
|
+
search
|
|
60
59
|
]);
|
|
61
60
|
if (!workflowRunId && hasNoRuns) {
|
|
62
61
|
return /*#__PURE__*/ _jsx(WorkflowRunFirstTimeUse, {});
|
|
@@ -67,7 +66,15 @@ export function WorkflowRunPage({ workspaceId, projectId, workflowRunId }) {
|
|
|
67
66
|
/*#__PURE__*/ _jsx(WorkflowRunList, {
|
|
68
67
|
workspaceId: workspaceId,
|
|
69
68
|
projectId: projectId,
|
|
70
|
-
selectedWorkflowRunId: workflowRunId
|
|
69
|
+
selectedWorkflowRunId: workflowRunId,
|
|
70
|
+
search: search.search ?? '',
|
|
71
|
+
statusFilter: search.status ?? 'all',
|
|
72
|
+
onFiltersChange: (filters)=>navigate({
|
|
73
|
+
search: workflowRunSearchParams({
|
|
74
|
+
...search,
|
|
75
|
+
...filters
|
|
76
|
+
})
|
|
77
|
+
})
|
|
71
78
|
}),
|
|
72
79
|
/*#__PURE__*/ _jsx(WorkflowRunView, {
|
|
73
80
|
workspaceId: workspaceId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/pages/workflow-run-page.tsx"],"sourcesContent":["import {useNavigate
|
|
1
|
+
{"version":3,"sources":["../../src/pages/workflow-run-page.tsx"],"sourcesContent":["import {useNavigate} from '@tanstack/react-router';\nimport {useCallback, useEffect} from 'react';\nimport {WorkflowRunList} from '#components/workflow-run-list/workflow-run-list.js';\nimport {WorkflowRunView} from '#components/workflow-run-view/index.js';\nimport type {WorkflowRunSelectionInput} from '#core/workflow-run-url-state.js';\nimport {useWorkflowRunsInfiniteQuery} from '#hooks/api/workflow-runs.js';\nimport {type WorkflowRunsSearch, workflowRunSearchParams} from '#routes/inputs.js';\nimport {WorkflowRunFirstTimeUse} from './workflow-run-first-time-use.js';\n\ninterface WorkflowRunPageProps {\n workspaceId: string;\n projectId: string;\n workflowRunId?: string | undefined;\n search?: WorkflowRunsSearch;\n}\n\n/**\n * Resolve which surface the runs path should show from a single read of the runs list:\n * - when opened without a workflow run id, point the URL at the most recent run so the detail pane is\n * never empty (navigation happens in an effect since it mutates history);\n * - report `hasNoRuns` once the list has loaded with zero runs, so a brand-new project lands\n * on the first-time-use surface instead of an empty rail and a perpetual detail skeleton.\n */\nfunction useWorkflowRunPageTarget(\n workspaceId: string,\n projectId: string,\n workflowRunId: string | undefined,\n search: WorkflowRunsSearch,\n) {\n const navigate = useNavigate();\n const {data, isPending} = useWorkflowRunsInfiniteQuery(projectId, {});\n const firstWorkflowRunId = data?.pages[0]?.runs[0]?.id;\n // Gate on data presence, not `!isError`: a transient refetch error after a prior success\n // keeps `data`, so the redirect (and the no-runs surface) still resolve from it instead of\n // stalling on the rail while active-run polling hits a blip.\n const isLoaded = !isPending && data !== undefined;\n\n useEffect(() => {\n if (workflowRunId || !isLoaded || !firstWorkflowRunId) return;\n navigate({\n to: '/workspaces/$wid/projects/$pid/runs/$workflowRunId',\n params: {wid: workspaceId, pid: projectId, workflowRunId: firstWorkflowRunId},\n search: workflowRunSearchParams(search, {}),\n replace: true,\n });\n }, [navigate, workspaceId, projectId, workflowRunId, isLoaded, firstWorkflowRunId, search]);\n\n return {hasNoRuns: isLoaded && firstWorkflowRunId === undefined};\n}\n\nexport function WorkflowRunPage({\n workspaceId,\n projectId,\n workflowRunId,\n search = {},\n}: WorkflowRunPageProps) {\n const {hasNoRuns} = useWorkflowRunPageTarget(workspaceId, projectId, workflowRunId, search);\n const navigate = useNavigate();\n const selection: WorkflowRunSelectionInput = search;\n const onSelectionChange = useCallback(\n (nextSelection: WorkflowRunSelectionInput) => {\n navigate({\n search: workflowRunSearchParams(search, nextSelection) as never,\n });\n },\n [navigate, search],\n );\n\n if (!workflowRunId && hasNoRuns) {\n return <WorkflowRunFirstTimeUse />;\n }\n\n return (\n <div className=\"flex min-h-0 flex-1 overflow-hidden\">\n <WorkflowRunList\n workspaceId={workspaceId}\n projectId={projectId}\n selectedWorkflowRunId={workflowRunId}\n search={search.search ?? ''}\n statusFilter={search.status ?? 'all'}\n onFiltersChange={(filters) =>\n navigate({search: workflowRunSearchParams({...search, ...filters}) as never})\n }\n />\n <WorkflowRunView\n workspaceId={workspaceId}\n projectId={projectId}\n workflowRunId={workflowRunId}\n selection={selection}\n onSelectionChange={onSelectionChange}\n />\n </div>\n );\n}\n"],"names":["useNavigate","useCallback","useEffect","WorkflowRunList","WorkflowRunView","useWorkflowRunsInfiniteQuery","workflowRunSearchParams","WorkflowRunFirstTimeUse","useWorkflowRunPageTarget","workspaceId","projectId","workflowRunId","search","navigate","data","isPending","firstWorkflowRunId","pages","runs","id","isLoaded","undefined","to","params","wid","pid","replace","hasNoRuns","WorkflowRunPage","selection","onSelectionChange","nextSelection","div","className","selectedWorkflowRunId","statusFilter","status","onFiltersChange","filters"],"mappings":";AAAA,SAAQA,WAAW,QAAO,yBAAyB;AACnD,SAAQC,WAAW,EAAEC,SAAS,QAAO,QAAQ;AAC7C,SAAQC,eAAe,QAAO,qDAAqD;AACnF,SAAQC,eAAe,QAAO,yCAAyC;AAEvE,SAAQC,4BAA4B,QAAO,8BAA8B;AACzE,SAAiCC,uBAAuB,QAAO,oBAAoB;AACnF,SAAQC,uBAAuB,QAAO,mCAAmC;AASzE;;;;;;CAMC,GACD,SAASC,yBACPC,WAAmB,EACnBC,SAAiB,EACjBC,aAAiC,EACjCC,MAA0B;IAE1B,MAAMC,WAAWb;IACjB,MAAM,EAACc,IAAI,EAAEC,SAAS,EAAC,GAAGV,6BAA6BK,WAAW,CAAC;IACnE,MAAMM,qBAAqBF,MAAMG,KAAK,CAAC,EAAE,EAAEC,IAAI,CAAC,EAAE,EAAEC;IACpD,yFAAyF;IACzF,2FAA2F;IAC3F,6DAA6D;IAC7D,MAAMC,WAAW,CAACL,aAAaD,SAASO;IAExCnB,UAAU;QACR,IAAIS,iBAAiB,CAACS,YAAY,CAACJ,oBAAoB;QACvDH,SAAS;YACPS,IAAI;YACJC,QAAQ;gBAACC,KAAKf;gBAAagB,KAAKf;gBAAWC,eAAeK;YAAkB;YAC5EJ,QAAQN,wBAAwBM,QAAQ,CAAC;YACzCc,SAAS;QACX;IACF,GAAG;QAACb;QAAUJ;QAAaC;QAAWC;QAAeS;QAAUJ;QAAoBJ;KAAO;IAE1F,OAAO;QAACe,WAAWP,YAAYJ,uBAAuBK;IAAS;AACjE;AAEA,OAAO,SAASO,gBAAgB,EAC9BnB,WAAW,EACXC,SAAS,EACTC,aAAa,EACbC,SAAS,CAAC,CAAC,EACU;IACrB,MAAM,EAACe,SAAS,EAAC,GAAGnB,yBAAyBC,aAAaC,WAAWC,eAAeC;IACpF,MAAMC,WAAWb;IACjB,MAAM6B,YAAuCjB;IAC7C,MAAMkB,oBAAoB7B,YACxB,CAAC8B;QACClB,SAAS;YACPD,QAAQN,wBAAwBM,QAAQmB;QAC1C;IACF,GACA;QAAClB;QAAUD;KAAO;IAGpB,IAAI,CAACD,iBAAiBgB,WAAW;QAC/B,qBAAO,KAACpB;IACV;IAEA,qBACE,MAACyB;QAAIC,WAAU;;0BACb,KAAC9B;gBACCM,aAAaA;gBACbC,WAAWA;gBACXwB,uBAAuBvB;gBACvBC,QAAQA,OAAOA,MAAM,IAAI;gBACzBuB,cAAcvB,OAAOwB,MAAM,IAAI;gBAC/BC,iBAAiB,CAACC,UAChBzB,SAAS;wBAACD,QAAQN,wBAAwB;4BAAC,GAAGM,MAAM;4BAAE,GAAG0B,OAAO;wBAAA;oBAAW;;0BAG/E,KAAClC;gBACCK,aAAaA;gBACbC,WAAWA;gBACXC,eAAeA;gBACfkB,WAAWA;gBACXC,mBAAmBA;;;;AAI3B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WorkflowRunListStatusFilter } from '#components/workflow-run-list/types.js';
|
|
2
|
+
import type { WorkflowRunSelectionInput } from '#core/workflow-run-url-state.js';
|
|
3
|
+
export interface WorkflowRunsSearch extends WorkflowRunSelectionInput {
|
|
4
|
+
search?: string;
|
|
5
|
+
status?: WorkflowRunListStatusFilter;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateWorkflowRunsSearch(input: Record<string, unknown>): WorkflowRunsSearch;
|
|
8
|
+
export declare function workflowRunSearchParams(search: WorkflowRunsSearch, selection?: WorkflowRunSelectionInput): {
|
|
9
|
+
runAttempt?: string;
|
|
10
|
+
stepAttempt?: string;
|
|
11
|
+
step?: string;
|
|
12
|
+
jobExecution?: string;
|
|
13
|
+
job?: string;
|
|
14
|
+
status?: "running" | "failed";
|
|
15
|
+
search?: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function workflowRouteParams(input: Record<string, unknown>): {
|
|
18
|
+
wid: string;
|
|
19
|
+
pid: string;
|
|
20
|
+
workflowRunId?: string;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=inputs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inputs.d.ts","sourceRoot":"","sources":["../../src/routes/inputs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,iCAAiC,CAAC;AAE/E,MAAM,WAAW,kBAAmB,SAAQ,yBAAyB;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,2BAA2B,CAAC;CACtC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAa7F;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,EAC1B,SAAS,GAAE,yBAAkC;;;;;;;;EAW9C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAMA"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
export function validateWorkflowRunsSearch(input) {
|
|
2
|
+
const search = string(input.search);
|
|
3
|
+
const status = input.status === 'failed' || input.status === 'running' ? input.status : 'all';
|
|
4
|
+
const runAttempt = positiveInteger(input.runAttempt);
|
|
5
|
+
return {
|
|
6
|
+
...search ? {
|
|
7
|
+
search
|
|
8
|
+
} : {},
|
|
9
|
+
...status === 'all' ? {} : {
|
|
10
|
+
status
|
|
11
|
+
},
|
|
12
|
+
...string(input.job) ? {
|
|
13
|
+
jobId: string(input.job)
|
|
14
|
+
} : {},
|
|
15
|
+
...string(input.jobExecution) ? {
|
|
16
|
+
jobExecutionId: string(input.jobExecution)
|
|
17
|
+
} : {},
|
|
18
|
+
...string(input.step) ? {
|
|
19
|
+
stepId: string(input.step)
|
|
20
|
+
} : {},
|
|
21
|
+
...string(input.stepAttempt) ? {
|
|
22
|
+
stepAttemptId: string(input.stepAttempt)
|
|
23
|
+
} : {},
|
|
24
|
+
...runAttempt ? {
|
|
25
|
+
runAttempt
|
|
26
|
+
} : {}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export function workflowRunSearchParams(search, selection = search) {
|
|
30
|
+
return {
|
|
31
|
+
...search.search ? {
|
|
32
|
+
search: search.search
|
|
33
|
+
} : {},
|
|
34
|
+
...search.status && search.status !== 'all' ? {
|
|
35
|
+
status: search.status
|
|
36
|
+
} : {},
|
|
37
|
+
...selection.jobId ? {
|
|
38
|
+
job: selection.jobId
|
|
39
|
+
} : {},
|
|
40
|
+
...selection.jobExecutionId ? {
|
|
41
|
+
jobExecution: selection.jobExecutionId
|
|
42
|
+
} : {},
|
|
43
|
+
...selection.stepId ? {
|
|
44
|
+
step: selection.stepId
|
|
45
|
+
} : {},
|
|
46
|
+
...selection.stepAttemptId ? {
|
|
47
|
+
stepAttempt: selection.stepAttemptId
|
|
48
|
+
} : {},
|
|
49
|
+
...selection.runAttempt ? {
|
|
50
|
+
runAttempt: String(selection.runAttempt)
|
|
51
|
+
} : {}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function workflowRouteParams(input) {
|
|
55
|
+
const wid = string(input.wid);
|
|
56
|
+
const pid = string(input.pid);
|
|
57
|
+
if (!wid || !pid) throw new Error('Workflow route is missing required path parameters.');
|
|
58
|
+
const workflowRunId = string(input.workflowRunId);
|
|
59
|
+
return workflowRunId ? {
|
|
60
|
+
wid,
|
|
61
|
+
pid,
|
|
62
|
+
workflowRunId
|
|
63
|
+
} : {
|
|
64
|
+
wid,
|
|
65
|
+
pid
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function string(value) {
|
|
69
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
70
|
+
}
|
|
71
|
+
function positiveInteger(value) {
|
|
72
|
+
const number = typeof value === 'string' ? Number(value) : value;
|
|
73
|
+
return typeof number === 'number' && Number.isInteger(number) && number > 0 ? number : undefined;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
//# sourceMappingURL=inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/inputs.ts"],"sourcesContent":["import type {WorkflowRunListStatusFilter} from '#components/workflow-run-list/types.js';\nimport type {WorkflowRunSelectionInput} from '#core/workflow-run-url-state.js';\n\nexport interface WorkflowRunsSearch extends WorkflowRunSelectionInput {\n search?: string;\n status?: WorkflowRunListStatusFilter;\n}\n\nexport function validateWorkflowRunsSearch(input: Record<string, unknown>): WorkflowRunsSearch {\n const search = string(input.search);\n const status = input.status === 'failed' || input.status === 'running' ? input.status : 'all';\n const runAttempt = positiveInteger(input.runAttempt);\n return {\n ...(search ? {search} : {}),\n ...(status === 'all' ? {} : {status}),\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\nexport function workflowRunSearchParams(\n search: WorkflowRunsSearch,\n selection: WorkflowRunSelectionInput = search,\n) {\n return {\n ...(search.search ? {search: search.search} : {}),\n ...(search.status && search.status !== 'all' ? {status: search.status} : {}),\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\nexport function workflowRouteParams(input: Record<string, unknown>): {\n wid: string;\n pid: string;\n workflowRunId?: string;\n} {\n const wid = string(input.wid);\n const pid = string(input.pid);\n if (!wid || !pid) throw new Error('Workflow route is missing required path parameters.');\n const workflowRunId = string(input.workflowRunId);\n return workflowRunId ? {wid, pid, workflowRunId} : {wid, pid};\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":["validateWorkflowRunsSearch","input","search","string","status","runAttempt","positiveInteger","job","jobId","jobExecution","jobExecutionId","step","stepId","stepAttempt","stepAttemptId","workflowRunSearchParams","selection","String","workflowRouteParams","wid","pid","Error","workflowRunId","value","length","undefined","number","Number","isInteger"],"mappings":"AAQA,OAAO,SAASA,2BAA2BC,KAA8B;IACvE,MAAMC,SAASC,OAAOF,MAAMC,MAAM;IAClC,MAAME,SAASH,MAAMG,MAAM,KAAK,YAAYH,MAAMG,MAAM,KAAK,YAAYH,MAAMG,MAAM,GAAG;IACxF,MAAMC,aAAaC,gBAAgBL,MAAMI,UAAU;IACnD,OAAO;QACL,GAAIH,SAAS;YAACA;QAAM,IAAI,CAAC,CAAC;QAC1B,GAAIE,WAAW,QAAQ,CAAC,IAAI;YAACA;QAAM,CAAC;QACpC,GAAID,OAAOF,MAAMM,GAAG,IAAI;YAACC,OAAOL,OAAOF,MAAMM,GAAG;QAAC,IAAI,CAAC,CAAC;QACvD,GAAIJ,OAAOF,MAAMQ,YAAY,IAAI;YAACC,gBAAgBP,OAAOF,MAAMQ,YAAY;QAAC,IAAI,CAAC,CAAC;QAClF,GAAIN,OAAOF,MAAMU,IAAI,IAAI;YAACC,QAAQT,OAAOF,MAAMU,IAAI;QAAC,IAAI,CAAC,CAAC;QAC1D,GAAIR,OAAOF,MAAMY,WAAW,IAAI;YAACC,eAAeX,OAAOF,MAAMY,WAAW;QAAC,IAAI,CAAC,CAAC;QAC/E,GAAIR,aAAa;YAACA;QAAU,IAAI,CAAC,CAAC;IACpC;AACF;AAEA,OAAO,SAASU,wBACdb,MAA0B,EAC1Bc,YAAuCd,MAAM;IAE7C,OAAO;QACL,GAAIA,OAAOA,MAAM,GAAG;YAACA,QAAQA,OAAOA,MAAM;QAAA,IAAI,CAAC,CAAC;QAChD,GAAIA,OAAOE,MAAM,IAAIF,OAAOE,MAAM,KAAK,QAAQ;YAACA,QAAQF,OAAOE,MAAM;QAAA,IAAI,CAAC,CAAC;QAC3E,GAAIY,UAAUR,KAAK,GAAG;YAACD,KAAKS,UAAUR,KAAK;QAAA,IAAI,CAAC,CAAC;QACjD,GAAIQ,UAAUN,cAAc,GAAG;YAACD,cAAcO,UAAUN,cAAc;QAAA,IAAI,CAAC,CAAC;QAC5E,GAAIM,UAAUJ,MAAM,GAAG;YAACD,MAAMK,UAAUJ,MAAM;QAAA,IAAI,CAAC,CAAC;QACpD,GAAII,UAAUF,aAAa,GAAG;YAACD,aAAaG,UAAUF,aAAa;QAAA,IAAI,CAAC,CAAC;QACzE,GAAIE,UAAUX,UAAU,GAAG;YAACA,YAAYY,OAAOD,UAAUX,UAAU;QAAC,IAAI,CAAC,CAAC;IAC5E;AACF;AAEA,OAAO,SAASa,oBAAoBjB,KAA8B;IAKhE,MAAMkB,MAAMhB,OAAOF,MAAMkB,GAAG;IAC5B,MAAMC,MAAMjB,OAAOF,MAAMmB,GAAG;IAC5B,IAAI,CAACD,OAAO,CAACC,KAAK,MAAM,IAAIC,MAAM;IAClC,MAAMC,gBAAgBnB,OAAOF,MAAMqB,aAAa;IAChD,OAAOA,gBAAgB;QAACH;QAAKC;QAAKE;IAAa,IAAI;QAACH;QAAKC;IAAG;AAC9D;AAEA,SAASjB,OAAOoB,KAAc;IAC5B,OAAO,OAAOA,UAAU,YAAYA,MAAMC,MAAM,GAAG,IAAID,QAAQE;AACjE;AAEA,SAASnB,gBAAgBiB,KAAc;IACrC,MAAMG,SAAS,OAAOH,UAAU,WAAWI,OAAOJ,SAASA;IAC3D,OAAO,OAAOG,WAAW,YAAYC,OAAOC,SAAS,CAACF,WAAWA,SAAS,IAAIA,SAASD;AACzF"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { validateWorkflowRunsSearch } from './inputs.js';
|
|
1
2
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
2
3
|
readonly staticData: {
|
|
3
4
|
readonly layout: "full-bleed";
|
|
4
5
|
};
|
|
6
|
+
readonly validateSearch: typeof validateWorkflowRunsSearch;
|
|
5
7
|
readonly component: () => import("react").JSX.Element;
|
|
6
8
|
}>;
|
|
7
9
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-detail.d.ts","sourceRoot":"","sources":["../../src/routes/run-detail.tsx"],"names":[],"mappings":"
|
|
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;;;;;;;;AAE5E,wBAcG"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { defineRoute } from '@shipfox/client-shell/runtime';
|
|
3
|
-
import { useParams } from '@tanstack/react-router';
|
|
2
|
+
import { defineRoute, useRouteParams, useRouteSearch } from '@shipfox/client-shell/runtime';
|
|
4
3
|
import { WorkflowRunPage } from '#pages/workflow-run-page.js';
|
|
4
|
+
import { validateWorkflowRunsSearch, workflowRouteParams } from './inputs.js';
|
|
5
5
|
export default defineRoute({
|
|
6
6
|
staticData: {
|
|
7
7
|
layout: 'full-bleed'
|
|
8
8
|
},
|
|
9
|
+
validateSearch: validateWorkflowRunsSearch,
|
|
9
10
|
component: ()=>{
|
|
10
|
-
const { wid, pid, workflowRunId } =
|
|
11
|
-
strict: false
|
|
12
|
-
});
|
|
11
|
+
const { wid, pid, workflowRunId } = useRouteParams(workflowRouteParams);
|
|
13
12
|
return /*#__PURE__*/ _jsx(WorkflowRunPage, {
|
|
14
13
|
workspaceId: wid,
|
|
15
14
|
projectId: pid,
|
|
16
|
-
workflowRunId: workflowRunId
|
|
15
|
+
workflowRunId: workflowRunId,
|
|
16
|
+
search: useRouteSearch(validateWorkflowRunsSearch)
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/run-detail.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/routes/run-detail.tsx"],"sourcesContent":["import {defineRoute, useRouteParams, useRouteSearch} from '@shipfox/client-shell/runtime';\nimport {WorkflowRunPage} from '#pages/workflow-run-page.js';\nimport {validateWorkflowRunsSearch, workflowRouteParams} from './inputs.js';\n\nexport default defineRoute({\n staticData: {layout: 'full-bleed'},\n validateSearch: validateWorkflowRunsSearch,\n component: () => {\n const {wid, pid, workflowRunId} = useRouteParams(workflowRouteParams);\n return (\n <WorkflowRunPage\n workspaceId={wid}\n projectId={pid}\n workflowRunId={workflowRunId}\n search={useRouteSearch(validateWorkflowRunsSearch)}\n />\n );\n },\n});\n"],"names":["defineRoute","useRouteParams","useRouteSearch","WorkflowRunPage","validateWorkflowRunsSearch","workflowRouteParams","staticData","layout","validateSearch","component","wid","pid","workflowRunId","workspaceId","projectId","search"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,cAAc,EAAEC,cAAc,QAAO,gCAAgC;AAC1F,SAAQC,eAAe,QAAO,8BAA8B;AAC5D,SAAQC,0BAA0B,EAAEC,mBAAmB,QAAO,cAAc;AAE5E,eAAeL,YAAY;IACzBM,YAAY;QAACC,QAAQ;IAAY;IACjCC,gBAAgBJ;IAChBK,WAAW;QACT,MAAM,EAACC,GAAG,EAAEC,GAAG,EAAEC,aAAa,EAAC,GAAGX,eAAeI;QACjD,qBACE,KAACF;YACCU,aAAaH;YACbI,WAAWH;YACXC,eAAeA;YACfG,QAAQb,eAAeE;;IAG7B;AACF,GAAG"}
|
package/dist/routes/runs.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { validateWorkflowRunsSearch } from './inputs.js';
|
|
1
2
|
declare const _default: import("@shipfox/client-shell/runtime").RouteImpl<{
|
|
2
3
|
readonly staticData: {
|
|
3
4
|
readonly layout: "full-bleed";
|
|
4
5
|
};
|
|
6
|
+
readonly validateSearch: typeof validateWorkflowRunsSearch;
|
|
5
7
|
readonly component: () => import("react").JSX.Element;
|
|
6
8
|
}>;
|
|
7
9
|
export default _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/routes/runs.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../../src/routes/runs.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAC,0BAA0B,EAAsB,MAAM,aAAa,CAAC;;;;;;;;AAE5E,wBAaG"}
|
package/dist/routes/runs.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { defineRoute } from '@shipfox/client-shell/runtime';
|
|
3
|
-
import { useParams } from '@tanstack/react-router';
|
|
2
|
+
import { defineRoute, useRouteParams, useRouteSearch } from '@shipfox/client-shell/runtime';
|
|
4
3
|
import { WorkflowRunPage } from '#pages/workflow-run-page.js';
|
|
4
|
+
import { validateWorkflowRunsSearch, workflowRouteParams } from './inputs.js';
|
|
5
5
|
export default defineRoute({
|
|
6
6
|
staticData: {
|
|
7
7
|
layout: 'full-bleed'
|
|
8
8
|
},
|
|
9
|
+
validateSearch: validateWorkflowRunsSearch,
|
|
9
10
|
component: ()=>{
|
|
10
|
-
const { wid, pid } =
|
|
11
|
-
strict: false
|
|
12
|
-
});
|
|
11
|
+
const { wid, pid } = useRouteParams(workflowRouteParams);
|
|
13
12
|
return /*#__PURE__*/ _jsx(WorkflowRunPage, {
|
|
14
13
|
workspaceId: wid,
|
|
15
|
-
projectId: pid
|
|
14
|
+
projectId: pid,
|
|
15
|
+
search: useRouteSearch(validateWorkflowRunsSearch)
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
});
|
package/dist/routes/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/routes/runs.tsx"],"sourcesContent":["import {defineRoute} from '@shipfox/client-shell/runtime';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/routes/runs.tsx"],"sourcesContent":["import {defineRoute, useRouteParams, useRouteSearch} from '@shipfox/client-shell/runtime';\nimport {WorkflowRunPage} from '#pages/workflow-run-page.js';\nimport {validateWorkflowRunsSearch, workflowRouteParams} from './inputs.js';\n\nexport default defineRoute({\n staticData: {layout: 'full-bleed'},\n validateSearch: validateWorkflowRunsSearch,\n component: () => {\n const {wid, pid} = useRouteParams(workflowRouteParams);\n return (\n <WorkflowRunPage\n workspaceId={wid}\n projectId={pid}\n search={useRouteSearch(validateWorkflowRunsSearch)}\n />\n );\n },\n});\n"],"names":["defineRoute","useRouteParams","useRouteSearch","WorkflowRunPage","validateWorkflowRunsSearch","workflowRouteParams","staticData","layout","validateSearch","component","wid","pid","workspaceId","projectId","search"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,cAAc,EAAEC,cAAc,QAAO,gCAAgC;AAC1F,SAAQC,eAAe,QAAO,8BAA8B;AAC5D,SAAQC,0BAA0B,EAAEC,mBAAmB,QAAO,cAAc;AAE5E,eAAeL,YAAY;IACzBM,YAAY;QAACC,QAAQ;IAAY;IACjCC,gBAAgBJ;IAChBK,WAAW;QACT,MAAM,EAACC,GAAG,EAAEC,GAAG,EAAC,GAAGV,eAAeI;QAClC,qBACE,KAACF;YACCS,aAAaF;YACbG,WAAWF;YACXG,QAAQZ,eAAeE;;IAG7B;AACF,GAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/routes/workflows.tsx"],"names":[],"mappings":";;;AAIA,wBAKG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { defineRoute, useRouteParams } from '@shipfox/client-shell/runtime';
|
|
3
|
+
import { ProjectWorkflowsPage } from '#pages/project-workflows-page.js';
|
|
4
|
+
import { workflowRouteParams } from './inputs.js';
|
|
5
|
+
export default defineRoute({
|
|
6
|
+
component: ()=>{
|
|
7
|
+
const { pid } = useRouteParams(workflowRouteParams);
|
|
8
|
+
return /*#__PURE__*/ _jsx(ProjectWorkflowsPage, {
|
|
9
|
+
projectId: pid
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=workflows.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/routes/workflows.tsx"],"sourcesContent":["import {defineRoute, useRouteParams} from '@shipfox/client-shell/runtime';\nimport {ProjectWorkflowsPage} from '#pages/project-workflows-page.js';\nimport {workflowRouteParams} from './inputs.js';\n\nexport default defineRoute({\n component: () => {\n const {pid} = useRouteParams(workflowRouteParams);\n return <ProjectWorkflowsPage projectId={pid} />;\n },\n});\n"],"names":["defineRoute","useRouteParams","ProjectWorkflowsPage","workflowRouteParams","component","pid","projectId"],"mappings":";AAAA,SAAQA,WAAW,EAAEC,cAAc,QAAO,gCAAgC;AAC1E,SAAQC,oBAAoB,QAAO,mCAAmC;AACtE,SAAQC,mBAAmB,QAAO,cAAc;AAEhD,eAAeH,YAAY;IACzBI,WAAW;QACT,MAAM,EAACC,GAAG,EAAC,GAAGJ,eAAeE;QAC7B,qBAAO,KAACD;YAAqBI,WAAWD;;IAC1C;AACF,GAAG"}
|