@flanksource/clicky-ui 0.3.58 → 0.3.60
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/NOTICE.md +58 -0
- package/dist/clicky.cjs +3 -1
- package/dist/clicky.d.ts +1 -0
- package/dist/clicky.d.ts.map +1 -1
- package/dist/clicky.js +3 -1
- package/dist/data/Clicky.cjs +23 -270
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +5 -29
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +11 -259
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/PromptBanner.model.cjs +10 -0
- package/dist/data/PromptBanner.model.cjs.map +1 -1
- package/dist/data/PromptBanner.model.d.ts +2 -0
- package/dist/data/PromptBanner.model.d.ts.map +1 -1
- package/dist/data/PromptBanner.model.js +10 -1
- package/dist/data/PromptBanner.model.js.map +1 -1
- package/dist/data/PromptDialog.cjs +16 -49
- package/dist/data/PromptDialog.cjs.map +1 -1
- package/dist/data/PromptDialog.d.ts +7 -1
- package/dist/data/PromptDialog.d.ts.map +1 -1
- package/dist/data/PromptDialog.js +17 -50
- package/dist/data/PromptDialog.js.map +1 -1
- package/dist/data/PromptForm.cjs +79 -0
- package/dist/data/PromptForm.cjs.map +1 -0
- package/dist/data/PromptForm.d.ts +26 -0
- package/dist/data/PromptForm.d.ts.map +1 -0
- package/dist/data/PromptForm.js +79 -0
- package/dist/data/PromptForm.js.map +1 -0
- package/dist/data/PromptIndicator.cjs +82 -0
- package/dist/data/PromptIndicator.cjs.map +1 -0
- package/dist/data/PromptIndicator.d.ts +19 -0
- package/dist/data/PromptIndicator.d.ts.map +1 -0
- package/dist/data/PromptIndicator.js +82 -0
- package/dist/data/PromptIndicator.js.map +1 -0
- package/dist/data/PromptList.cjs +67 -0
- package/dist/data/PromptList.cjs.map +1 -0
- package/dist/data/PromptList.d.ts +13 -0
- package/dist/data/PromptList.d.ts.map +1 -0
- package/dist/data/PromptList.js +67 -0
- package/dist/data/PromptList.js.map +1 -0
- package/dist/data/clicky-download.cjs +251 -0
- package/dist/data/clicky-download.cjs.map +1 -0
- package/dist/data/clicky-download.d.ts +55 -0
- package/dist/data/clicky-download.d.ts.map +1 -0
- package/dist/data/clicky-download.js +244 -0
- package/dist/data/clicky-download.js.map +1 -0
- package/dist/data/git/GitChangeList.cjs +11 -4
- package/dist/data/git/GitChangeList.cjs.map +1 -1
- package/dist/data/git/GitChangeList.d.ts +2 -35
- package/dist/data/git/GitChangeList.d.ts.map +1 -1
- package/dist/data/git/GitChangeList.js +11 -4
- package/dist/data/git/GitChangeList.js.map +1 -1
- package/dist/data/git/GitLink.cjs +13 -0
- package/dist/data/git/GitLink.cjs.map +1 -0
- package/dist/data/git/GitLink.d.ts +8 -0
- package/dist/data/git/GitLink.d.ts.map +1 -0
- package/dist/data/git/GitLink.js +13 -0
- package/dist/data/git/GitLink.js.map +1 -0
- package/dist/data/git/git-links.cjs +54 -0
- package/dist/data/git/git-links.cjs.map +1 -0
- package/dist/data/git/git-links.d.ts +4 -0
- package/dist/data/git/git-links.d.ts.map +1 -0
- package/dist/data/git/git-links.js +53 -0
- package/dist/data/git/git-links.js.map +1 -0
- package/dist/data/git/index.d.ts +3 -0
- package/dist/data/git/index.d.ts.map +1 -1
- package/dist/data/git/types.d.ts +54 -0
- package/dist/data/git/types.d.ts.map +1 -0
- package/dist/data/test-runner/MatrixMarks.cjs +4 -3
- package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
- package/dist/data/test-runner/MatrixMarks.d.ts +7 -4
- package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
- package/dist/data/test-runner/MatrixMarks.js +4 -3
- package/dist/data/test-runner/MatrixMarks.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +1 -1
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +1 -1
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.js +1 -1
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +2 -2
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +2 -2
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +7 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +7 -0
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +7 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/index.d.ts +1 -1
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +3 -3
- package/dist/data/test-runner/marks.cjs.map +1 -1
- package/dist/data/test-runner/marks.js +3 -3
- package/dist/data/test-runner/marks.js.map +1 -1
- package/dist/data/test-runner/matrix-marks.cjs +12 -3
- package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
- package/dist/data/test-runner/matrix-marks.d.ts +13 -0
- package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
- package/dist/data/test-runner/matrix-marks.js +12 -3
- package/dist/data/test-runner/matrix-marks.js.map +1 -1
- package/dist/data/test-runner/status.cjs +1 -1
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.js +1 -1
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/test-runner/types.d.ts +2 -0
- package/dist/data/test-runner/types.d.ts.map +1 -1
- package/dist/data/traces/index.d.ts +2 -0
- package/dist/data/traces/index.d.ts.map +1 -1
- package/dist/data/traces/otel/OtelTraceDetail.cjs +102 -78
- package/dist/data/traces/otel/OtelTraceDetail.cjs.map +1 -1
- package/dist/data/traces/otel/OtelTraceDetail.d.ts +6 -2
- package/dist/data/traces/otel/OtelTraceDetail.d.ts.map +1 -1
- package/dist/data/traces/otel/OtelTraceDetail.js +102 -78
- package/dist/data/traces/otel/OtelTraceDetail.js.map +1 -1
- package/dist/data/traces/otel/OtelTraceTable.cjs +43 -7
- package/dist/data/traces/otel/OtelTraceTable.cjs.map +1 -1
- package/dist/data/traces/otel/OtelTraceTable.d.ts +14 -3
- package/dist/data/traces/otel/OtelTraceTable.d.ts.map +1 -1
- package/dist/data/traces/otel/OtelTraceTable.js +44 -8
- package/dist/data/traces/otel/OtelTraceTable.js.map +1 -1
- package/dist/data/traces/otel/profile-listing.cjs +61 -0
- package/dist/data/traces/otel/profile-listing.cjs.map +1 -0
- package/dist/data/traces/otel/profile-listing.d.ts +23 -0
- package/dist/data/traces/otel/profile-listing.d.ts.map +1 -0
- package/dist/data/traces/otel/profile-listing.js +60 -0
- package/dist/data/traces/otel/profile-listing.js.map +1 -0
- package/dist/data/traces/otel/profile-spans.cjs +22 -0
- package/dist/data/traces/otel/profile-spans.cjs.map +1 -0
- package/dist/data/traces/otel/profile-spans.d.ts +4 -0
- package/dist/data/traces/otel/profile-spans.d.ts.map +1 -0
- package/dist/data/traces/otel/profile-spans.js +22 -0
- package/dist/data/traces/otel/profile-spans.js.map +1 -0
- package/dist/data/traces/otel/span-traces.cjs +7 -1
- package/dist/data/traces/otel/span-traces.cjs.map +1 -1
- package/dist/data/traces/otel/span-traces.d.ts +2 -0
- package/dist/data/traces/otel/span-traces.d.ts.map +1 -1
- package/dist/data/traces/otel/span-traces.js +7 -2
- package/dist/data/traces/otel/span-traces.js.map +1 -1
- package/dist/data/useClickyTableMenu.cjs +33 -0
- package/dist/data/useClickyTableMenu.cjs.map +1 -0
- package/dist/data/useClickyTableMenu.d.ts +17 -0
- package/dist/data/useClickyTableMenu.d.ts.map +1 -0
- package/dist/data/useClickyTableMenu.js +33 -0
- package/dist/data/useClickyTableMenu.js.map +1 -0
- package/dist/data/verification/adapterViews.cjs +3 -1
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +5 -2
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +4 -2
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +28 -7
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +28 -7
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/stepKind.cjs +1 -0
- package/dist/data/verification/stepKind.cjs.map +1 -1
- package/dist/data/verification/stepKind.d.ts.map +1 -1
- package/dist/data/verification/stepKind.js +1 -0
- package/dist/data/verification/stepKind.js.map +1 -1
- package/dist/data/verification/stepKindViews.cjs +17 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -1
- package/dist/data/verification/stepKindViews.d.ts +4 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -1
- package/dist/data/verification/stepKindViews.js +17 -1
- package/dist/data/verification/stepKindViews.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +121 -2
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +55 -3
- package/dist/git.cjs +6 -0
- package/dist/git.d.ts +4 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +3 -0
- package/dist/hooks/use-prompts.cjs +18 -11
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +18 -11
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/icons/components/UiApi.cjs +37 -0
- package/dist/icons/components/UiApi.cjs.map +1 -0
- package/dist/icons/components/UiApi.d.ts +9 -0
- package/dist/icons/components/UiApi.d.ts.map +1 -0
- package/dist/icons/components/UiApi.js +35 -0
- package/dist/icons/components/UiApi.js.map +1 -0
- package/dist/icons/components/UiApiBridge.cjs +38 -0
- package/dist/icons/components/UiApiBridge.cjs.map +1 -0
- package/dist/icons/components/UiApiBridge.d.ts +9 -0
- package/dist/icons/components/UiApiBridge.d.ts.map +1 -0
- package/dist/icons/components/UiApiBridge.js +36 -0
- package/dist/icons/components/UiApiBridge.js.map +1 -0
- package/dist/icons/components/UiApiGateway.cjs +33 -0
- package/dist/icons/components/UiApiGateway.cjs.map +1 -0
- package/dist/icons/components/UiApiGateway.d.ts +9 -0
- package/dist/icons/components/UiApiGateway.d.ts.map +1 -0
- package/dist/icons/components/UiApiGateway.js +31 -0
- package/dist/icons/components/UiApiGateway.js.map +1 -0
- package/dist/icons/components/UiApiRequest.cjs +37 -0
- package/dist/icons/components/UiApiRequest.cjs.map +1 -0
- package/dist/icons/components/UiApiRequest.d.ts +9 -0
- package/dist/icons/components/UiApiRequest.d.ts.map +1 -0
- package/dist/icons/components/UiApiRequest.js +35 -0
- package/dist/icons/components/UiApiRequest.js.map +1 -0
- package/dist/icons/components/UiArrowDecision.cjs +51 -0
- package/dist/icons/components/UiArrowDecision.cjs.map +1 -0
- package/dist/icons/components/UiArrowDecision.d.ts +15 -0
- package/dist/icons/components/UiArrowDecision.d.ts.map +1 -0
- package/dist/icons/components/UiArrowDecision.js +48 -0
- package/dist/icons/components/UiArrowDecision.js.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.cjs +51 -0
- package/dist/icons/components/UiArrowSquareIn.cjs.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.d.ts +15 -0
- package/dist/icons/components/UiArrowSquareIn.d.ts.map +1 -0
- package/dist/icons/components/UiArrowSquareIn.js +48 -0
- package/dist/icons/components/UiArrowSquareIn.js.map +1 -0
- package/dist/icons/components/UiBatchCheck.cjs +55 -0
- package/dist/icons/components/UiBatchCheck.cjs.map +1 -0
- package/dist/icons/components/UiBatchCheck.d.ts +15 -0
- package/dist/icons/components/UiBatchCheck.d.ts.map +1 -0
- package/dist/icons/components/UiBatchCheck.js +52 -0
- package/dist/icons/components/UiBatchCheck.js.map +1 -0
- package/dist/icons/components/UiBatchJob.cjs +39 -0
- package/dist/icons/components/UiBatchJob.cjs.map +1 -0
- package/dist/icons/components/UiBatchJob.d.ts +9 -0
- package/dist/icons/components/UiBatchJob.d.ts.map +1 -0
- package/dist/icons/components/UiBatchJob.js +37 -0
- package/dist/icons/components/UiBatchJob.js.map +1 -0
- package/dist/icons/components/UiBatchRequest.cjs +39 -0
- package/dist/icons/components/UiBatchRequest.cjs.map +1 -0
- package/dist/icons/components/UiBatchRequest.d.ts +9 -0
- package/dist/icons/components/UiBatchRequest.d.ts.map +1 -0
- package/dist/icons/components/UiBatchRequest.js +37 -0
- package/dist/icons/components/UiBatchRequest.js.map +1 -0
- package/dist/icons/components/UiBpmnConditional.cjs +29 -0
- package/dist/icons/components/UiBpmnConditional.cjs.map +1 -0
- package/dist/icons/components/UiBpmnConditional.d.ts +9 -0
- package/dist/icons/components/UiBpmnConditional.d.ts.map +1 -0
- package/dist/icons/components/UiBpmnConditional.js +27 -0
- package/dist/icons/components/UiBpmnConditional.js.map +1 -0
- package/dist/icons/components/UiBranchFlow.cjs +33 -0
- package/dist/icons/components/UiBranchFlow.cjs.map +1 -0
- package/dist/icons/components/UiBranchFlow.d.ts +9 -0
- package/dist/icons/components/UiBranchFlow.d.ts.map +1 -0
- package/dist/icons/components/UiBranchFlow.js +31 -0
- package/dist/icons/components/UiBranchFlow.js.map +1 -0
- package/dist/icons/components/UiClassicBatch.cjs +29 -0
- package/dist/icons/components/UiClassicBatch.cjs.map +1 -0
- package/dist/icons/components/UiClassicBatch.d.ts +9 -0
- package/dist/icons/components/UiClassicBatch.d.ts.map +1 -0
- package/dist/icons/components/UiClassicBatch.js +27 -0
- package/dist/icons/components/UiClassicBatch.js.map +1 -0
- package/dist/icons/components/UiCodeFile.cjs +29 -0
- package/dist/icons/components/UiCodeFile.cjs.map +1 -0
- package/dist/icons/components/UiCodeFile.d.ts +9 -0
- package/dist/icons/components/UiCodeFile.d.ts.map +1 -0
- package/dist/icons/components/UiCodeFile.js +27 -0
- package/dist/icons/components/UiCodeFile.js.map +1 -0
- package/dist/icons/components/UiColumnsLayout.cjs +29 -0
- package/dist/icons/components/UiColumnsLayout.cjs.map +1 -0
- package/dist/icons/components/UiColumnsLayout.d.ts +9 -0
- package/dist/icons/components/UiColumnsLayout.d.ts.map +1 -0
- package/dist/icons/components/UiColumnsLayout.js +27 -0
- package/dist/icons/components/UiColumnsLayout.js.map +1 -0
- package/dist/icons/components/UiCondition.cjs +37 -0
- package/dist/icons/components/UiCondition.cjs.map +1 -0
- package/dist/icons/components/UiCondition.d.ts +9 -0
- package/dist/icons/components/UiCondition.d.ts.map +1 -0
- package/dist/icons/components/UiCondition.js +35 -0
- package/dist/icons/components/UiCondition.js.map +1 -0
- package/dist/icons/components/UiConditions.cjs +29 -0
- package/dist/icons/components/UiConditions.cjs.map +1 -0
- package/dist/icons/components/UiConditions.d.ts +9 -0
- package/dist/icons/components/UiConditions.d.ts.map +1 -0
- package/dist/icons/components/UiConditions.js +27 -0
- package/dist/icons/components/UiConditions.js.map +1 -0
- package/dist/icons/components/UiDelayQueue.cjs +40 -0
- package/dist/icons/components/UiDelayQueue.cjs.map +1 -0
- package/dist/icons/components/UiDelayQueue.d.ts +9 -0
- package/dist/icons/components/UiDelayQueue.d.ts.map +1 -0
- package/dist/icons/components/UiDelayQueue.js +38 -0
- package/dist/icons/components/UiDelayQueue.js.map +1 -0
- package/dist/icons/components/UiDynamicForm.cjs +51 -0
- package/dist/icons/components/UiDynamicForm.cjs.map +1 -0
- package/dist/icons/components/UiDynamicForm.d.ts +15 -0
- package/dist/icons/components/UiDynamicForm.d.ts.map +1 -0
- package/dist/icons/components/UiDynamicForm.js +48 -0
- package/dist/icons/components/UiDynamicForm.js.map +1 -0
- package/dist/icons/components/UiFlowArrow.cjs +51 -0
- package/dist/icons/components/UiFlowArrow.cjs.map +1 -0
- package/dist/icons/components/UiFlowArrow.d.ts +15 -0
- package/dist/icons/components/UiFlowArrow.d.ts.map +1 -0
- package/dist/icons/components/UiFlowArrow.js +48 -0
- package/dist/icons/components/UiFlowArrow.js.map +1 -0
- package/dist/icons/components/UiFormFields.cjs +33 -0
- package/dist/icons/components/UiFormFields.cjs.map +1 -0
- package/dist/icons/components/UiFormFields.d.ts +9 -0
- package/dist/icons/components/UiFormFields.d.ts.map +1 -0
- package/dist/icons/components/UiFormFields.js +31 -0
- package/dist/icons/components/UiFormFields.js.map +1 -0
- package/dist/icons/components/UiFormStep.cjs +38 -0
- package/dist/icons/components/UiFormStep.cjs.map +1 -0
- package/dist/icons/components/UiFormStep.d.ts +9 -0
- package/dist/icons/components/UiFormStep.d.ts.map +1 -0
- package/dist/icons/components/UiFormStep.js +36 -0
- package/dist/icons/components/UiFormStep.js.map +1 -0
- package/dist/icons/components/UiGatewayApi.cjs +32 -0
- package/dist/icons/components/UiGatewayApi.cjs.map +1 -0
- package/dist/icons/components/UiGatewayApi.d.ts +9 -0
- package/dist/icons/components/UiGatewayApi.d.ts.map +1 -0
- package/dist/icons/components/UiGatewayApi.js +30 -0
- package/dist/icons/components/UiGatewayApi.js.map +1 -0
- package/dist/icons/components/UiImportArrow.cjs +29 -0
- package/dist/icons/components/UiImportArrow.cjs.map +1 -0
- package/dist/icons/components/UiImportArrow.d.ts +9 -0
- package/dist/icons/components/UiImportArrow.d.ts.map +1 -0
- package/dist/icons/components/UiImportArrow.js +27 -0
- package/dist/icons/components/UiImportArrow.js.map +1 -0
- package/dist/icons/components/UiInputField.cjs +33 -0
- package/dist/icons/components/UiInputField.cjs.map +1 -0
- package/dist/icons/components/UiInputField.d.ts +9 -0
- package/dist/icons/components/UiInputField.d.ts.map +1 -0
- package/dist/icons/components/UiInputField.js +31 -0
- package/dist/icons/components/UiInputField.js.map +1 -0
- package/dist/icons/components/UiInsertTable.cjs +29 -0
- package/dist/icons/components/UiInsertTable.cjs.map +1 -0
- package/dist/icons/components/UiInsertTable.d.ts +9 -0
- package/dist/icons/components/UiInsertTable.d.ts.map +1 -0
- package/dist/icons/components/UiInsertTable.js +27 -0
- package/dist/icons/components/UiInsertTable.js.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.cjs +32 -0
- package/dist/icons/components/UiLayoutTemplate.cjs.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.d.ts +9 -0
- package/dist/icons/components/UiLayoutTemplate.d.ts.map +1 -0
- package/dist/icons/components/UiLayoutTemplate.js +30 -0
- package/dist/icons/components/UiLayoutTemplate.js.map +1 -0
- package/dist/icons/components/UiLayoutWindow.cjs +56 -0
- package/dist/icons/components/UiLayoutWindow.cjs.map +1 -0
- package/dist/icons/components/UiLayoutWindow.d.ts +15 -0
- package/dist/icons/components/UiLayoutWindow.d.ts.map +1 -0
- package/dist/icons/components/UiLayoutWindow.js +53 -0
- package/dist/icons/components/UiLayoutWindow.js.map +1 -0
- package/dist/icons/components/UiListEnd.cjs +33 -0
- package/dist/icons/components/UiListEnd.cjs.map +1 -0
- package/dist/icons/components/UiListEnd.d.ts +9 -0
- package/dist/icons/components/UiListEnd.d.ts.map +1 -0
- package/dist/icons/components/UiListEnd.js +31 -0
- package/dist/icons/components/UiListEnd.js.map +1 -0
- package/dist/icons/components/UiListEndLine.cjs +51 -0
- package/dist/icons/components/UiListEndLine.cjs.map +1 -0
- package/dist/icons/components/UiListEndLine.d.ts +15 -0
- package/dist/icons/components/UiListEndLine.d.ts.map +1 -0
- package/dist/icons/components/UiListEndLine.js +48 -0
- package/dist/icons/components/UiListEndLine.js.map +1 -0
- package/dist/icons/components/UiListNumbers.cjs +51 -0
- package/dist/icons/components/UiListNumbers.cjs.map +1 -0
- package/dist/icons/components/UiListNumbers.d.ts +15 -0
- package/dist/icons/components/UiListNumbers.d.ts.map +1 -0
- package/dist/icons/components/UiListNumbers.js +48 -0
- package/dist/icons/components/UiListNumbers.js.map +1 -0
- package/dist/icons/components/UiLowPriority.cjs +29 -0
- package/dist/icons/components/UiLowPriority.cjs.map +1 -0
- package/dist/icons/components/UiLowPriority.d.ts +9 -0
- package/dist/icons/components/UiLowPriority.d.ts.map +1 -0
- package/dist/icons/components/UiLowPriority.js +27 -0
- package/dist/icons/components/UiLowPriority.js.map +1 -0
- package/dist/icons/components/UiMergeQueue.cjs +38 -0
- package/dist/icons/components/UiMergeQueue.cjs.map +1 -0
- package/dist/icons/components/UiMergeQueue.d.ts +9 -0
- package/dist/icons/components/UiMergeQueue.d.ts.map +1 -0
- package/dist/icons/components/UiMergeQueue.js +36 -0
- package/dist/icons/components/UiMergeQueue.js.map +1 -0
- package/dist/icons/components/UiPipelineStage.cjs +33 -0
- package/dist/icons/components/UiPipelineStage.cjs.map +1 -0
- package/dist/icons/components/UiPipelineStage.d.ts +9 -0
- package/dist/icons/components/UiPipelineStage.d.ts.map +1 -0
- package/dist/icons/components/UiPipelineStage.js +31 -0
- package/dist/icons/components/UiPipelineStage.js.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.cjs +29 -0
- package/dist/icons/components/UiPlaylistRemove.cjs.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.d.ts +9 -0
- package/dist/icons/components/UiPlaylistRemove.d.ts.map +1 -0
- package/dist/icons/components/UiPlaylistRemove.js +27 -0
- package/dist/icons/components/UiPlaylistRemove.js.map +1 -0
- package/dist/icons/components/UiReportForms.cjs +51 -0
- package/dist/icons/components/UiReportForms.cjs.map +1 -0
- package/dist/icons/components/UiReportForms.d.ts +15 -0
- package/dist/icons/components/UiReportForms.d.ts.map +1 -0
- package/dist/icons/components/UiReportForms.js +48 -0
- package/dist/icons/components/UiReportForms.js.map +1 -0
- package/dist/icons/components/UiScreenTemplate.cjs +29 -0
- package/dist/icons/components/UiScreenTemplate.cjs.map +1 -0
- package/dist/icons/components/UiScreenTemplate.d.ts +9 -0
- package/dist/icons/components/UiScreenTemplate.d.ts.map +1 -0
- package/dist/icons/components/UiScreenTemplate.js +27 -0
- package/dist/icons/components/UiScreenTemplate.js.map +1 -0
- package/dist/icons/components/UiServices.cjs +29 -0
- package/dist/icons/components/UiServices.cjs.map +1 -0
- package/dist/icons/components/UiServices.d.ts +9 -0
- package/dist/icons/components/UiServices.d.ts.map +1 -0
- package/dist/icons/components/UiServices.js +27 -0
- package/dist/icons/components/UiServices.js.map +1 -0
- package/dist/icons/components/UiSkipCircle.cjs +51 -0
- package/dist/icons/components/UiSkipCircle.cjs.map +1 -0
- package/dist/icons/components/UiSkipCircle.d.ts +15 -0
- package/dist/icons/components/UiSkipCircle.d.ts.map +1 -0
- package/dist/icons/components/UiSkipCircle.js +48 -0
- package/dist/icons/components/UiSkipCircle.js.map +1 -0
- package/dist/icons/components/UiTaskBatch.cjs +33 -0
- package/dist/icons/components/UiTaskBatch.cjs.map +1 -0
- package/dist/icons/components/UiTaskBatch.d.ts +9 -0
- package/dist/icons/components/UiTaskBatch.d.ts.map +1 -0
- package/dist/icons/components/UiTaskBatch.js +31 -0
- package/dist/icons/components/UiTaskBatch.js.map +1 -0
- package/dist/icons/components/UiTodoList.cjs +29 -0
- package/dist/icons/components/UiTodoList.cjs.map +1 -0
- package/dist/icons/components/UiTodoList.d.ts +9 -0
- package/dist/icons/components/UiTodoList.d.ts.map +1 -0
- package/dist/icons/components/UiTodoList.js +27 -0
- package/dist/icons/components/UiTodoList.js.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.cjs +51 -0
- package/dist/icons/components/UiTrayArrowDown.cjs.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.d.ts +15 -0
- package/dist/icons/components/UiTrayArrowDown.d.ts.map +1 -0
- package/dist/icons/components/UiTrayArrowDown.js +48 -0
- package/dist/icons/components/UiTrayArrowDown.js.map +1 -0
- package/dist/icons/components/UiVault.cjs +51 -0
- package/dist/icons/components/UiVault.cjs.map +1 -0
- package/dist/icons/components/UiVault.d.ts +15 -0
- package/dist/icons/components/UiVault.d.ts.map +1 -0
- package/dist/icons/components/UiVault.js +48 -0
- package/dist/icons/components/UiVault.js.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.cjs +39 -0
- package/dist/icons/components/UiWebServiceDefinition.cjs.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.d.ts +9 -0
- package/dist/icons/components/UiWebServiceDefinition.d.ts.map +1 -0
- package/dist/icons/components/UiWebServiceDefinition.js +37 -0
- package/dist/icons/components/UiWebServiceDefinition.js.map +1 -0
- package/dist/icons/components/UiWebhook.cjs +29 -0
- package/dist/icons/components/UiWebhook.cjs.map +1 -0
- package/dist/icons/components/UiWebhook.d.ts +9 -0
- package/dist/icons/components/UiWebhook.d.ts.map +1 -0
- package/dist/icons/components/UiWebhook.js +27 -0
- package/dist/icons/components/UiWebhook.js.map +1 -0
- package/dist/icons/components/UiWebhookLine.cjs +51 -0
- package/dist/icons/components/UiWebhookLine.cjs.map +1 -0
- package/dist/icons/components/UiWebhookLine.d.ts +15 -0
- package/dist/icons/components/UiWebhookLine.d.ts.map +1 -0
- package/dist/icons/components/UiWebhookLine.js +48 -0
- package/dist/icons/components/UiWebhookLine.js.map +1 -0
- package/dist/icons/index.d.ts +58 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +90 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +90 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +103 -0
- package/dist/icons.js +46 -1
- package/dist/index.cjs +128 -3
- package/dist/index.js +59 -4
- package/dist/overlay/DropdownMenu.cjs +17 -14
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +1 -0
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +18 -15
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +49 -12
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +10 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +51 -14
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/EntitySurface.cjs +38 -0
- package/dist/rpc/EntitySurface.cjs.map +1 -0
- package/dist/rpc/EntitySurface.d.ts +17 -0
- package/dist/rpc/EntitySurface.d.ts.map +1 -0
- package/dist/rpc/EntitySurface.js +38 -0
- package/dist/rpc/EntitySurface.js.map +1 -0
- package/dist/rpc/ExplorerNav.cjs +48 -0
- package/dist/rpc/ExplorerNav.cjs.map +1 -0
- package/dist/rpc/ExplorerNav.d.ts +12 -0
- package/dist/rpc/ExplorerNav.d.ts.map +1 -0
- package/dist/rpc/ExplorerNav.js +48 -0
- package/dist/rpc/ExplorerNav.js.map +1 -0
- package/dist/rpc/explorer-nav-context.cjs +5 -0
- package/dist/rpc/explorer-nav-context.cjs.map +1 -0
- package/dist/rpc/explorer-nav-context.d.ts +11 -0
- package/dist/rpc/explorer-nav-context.d.ts.map +1 -0
- package/dist/rpc/explorer-nav-context.js +6 -0
- package/dist/rpc/explorer-nav-context.js.map +1 -0
- package/dist/rpc.cjs +4 -0
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +3 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepKind.cjs","names":["formatTestDuration"],"sources":["../../../src/data/verification/stepKind.ts"],"sourcesContent":["// The typed step-kind detail gavel's fixture verifier attaches to a node\n// (fixtures/verifier/report.go): `detail.step` names the kind and id, beside\n// the structured `wait`, `attempts`, `exports`, `outputs` and (for a\n// background Playwright watcher) `events`. Parsed here, once, so the detail\n// view and the copy brief read the same typed shape. A present-but-malformed\n// field is reported by path instead of being guessed at.\n\nimport type { BriefSection } from \"../test-runner\";\nimport { formatTestDuration } from \"../test-runner\";\nimport type { VerifyNode } from \"./verify-report\";\n\nexport type StepRef = { id: string; kind: string };\n\nexport type WaitPolicy = {\n until?: string;\n failWhen?: string;\n interval?: string;\n backoff?: { factor?: number; max?: string };\n jitter?: string;\n timeout?: string;\n};\n\nexport const WAIT_OUTCOMES = [\"satisfied\", \"failed\", \"timeout\"] as const;\nexport type WaitOutcome = (typeof WAIT_OUTCOMES)[number];\n\nexport type WaitDetail = {\n policy: WaitPolicy;\n outcome: WaitOutcome;\n durationMs: number;\n /** The CEL expression that decided the outcome: policy.failWhen when it fired, else policy.until. */\n expression?: string;\n /** Domain reason the wait ended unsatisfied; may span several lines. */\n cause?: string;\n outputs?: unknown;\n error?: string;\n trace?: string;\n};\n\nexport type StepAttempt = { attempt: number; status: string; error?: string; durationMs?: number; result?: VerifyNode };\n\nexport type StepExport = { name: string; value: unknown; step: string };\n\nexport const WATCHER_EVENT_TYPES = [\"alert\", \"console\", \"pageerror\", \"response\"] as const;\nexport type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];\n\nexport type WatcherEvent = {\n type: WatcherEventType;\n text?: string;\n url?: string;\n status?: number;\n detail?: string;\n};\n\nexport type StepDetail = {\n step: StepRef;\n outputs?: unknown;\n exports: StepExport[];\n wait?: WaitDetail;\n attempts: StepAttempt[];\n events: WatcherEvent[];\n /** Whether the step runs in the background until teardown (a watcher). */\n background: boolean;\n /** Everything else in `node.detail` (cel_trace, run, recordings, …). */\n rest: Record<string, unknown>;\n};\n\nexport type StepDetailResult =\n | { kind: \"none\" }\n | { kind: \"step\"; step: StepDetail }\n | { kind: \"invalid\"; error: string };\n\nconst STEP_KEYS = new Set([\"step\", \"outputs\", \"exports\", \"wait\", \"attempts\", \"events\", \"background\"]);\n\nclass StepDetailError extends Error {}\n\nfunction fail(path: string, expectation: string): never {\n throw new StepDetailError(`${path} must be ${expectation}`);\n}\n\ntype Rec = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Rec =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nfunction record(value: unknown, path: string): Rec {\n return isRecord(value) ? value : fail(path, \"an object\");\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n return Array.isArray(value) ? value : fail(path, \"an array\");\n}\n\nfunction str(value: unknown, path: string): string {\n return typeof value === \"string\" ? value : fail(path, \"a string\");\n}\n\nfunction num(value: unknown, path: string): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fail(path, \"a number\");\n}\n\nfunction bool(value: unknown, path: string): boolean {\n return typeof value === \"boolean\" ? value : fail(path, \"a boolean\");\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n return allowed.includes(value as T)\n ? (value as T)\n : fail(path, `one of ${allowed.join(\", \")} (got ${JSON.stringify(value)})`);\n}\n\n/** `{ [key]: read(value) }` when the optional field is present, else `{}` — absent stays an absent key. */\nfunction optional<K extends string, T>(source: Rec, key: K, read: (value: unknown) => T): { [P in K]?: T } {\n return source[key] === undefined || source[key] === null ? {} : ({ [key]: read(source[key]) } as { [P in K]?: T });\n}\n\n/** Durations arrive as Go-style strings (\"15s\"); a bare number is nanoseconds like every other duration on the wire. */\nfunction durationText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return formatTestDuration(value);\n return fail(path, \"a duration string or nanosecond number\");\n}\n\nfunction scalarText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n return fail(path, \"a string or number\");\n}\n\nfunction readPolicy(value: unknown): WaitPolicy {\n const path = \"detail.wait.policy\";\n const policy = record(value, path);\n const backoff = (raw: unknown) => {\n const b = record(raw, `${path}.backoff`);\n return {\n ...optional(b, \"factor\", (v) => num(v, `${path}.backoff.factor`)),\n ...optional(b, \"max\", (v) => durationText(v, `${path}.backoff.max`)),\n };\n };\n return {\n ...optional(policy, \"until\", (v) => str(v, `${path}.until`)),\n ...optional(policy, \"failWhen\", (v) => str(v, `${path}.failWhen`)),\n ...optional(policy, \"interval\", (v) => durationText(v, `${path}.interval`)),\n ...optional(policy, \"backoff\", backoff),\n ...optional(policy, \"jitter\", (v) => scalarText(v, `${path}.jitter`)),\n ...optional(policy, \"timeout\", (v) => durationText(v, `${path}.timeout`)),\n };\n}\n\nfunction readWait(value: unknown): WaitDetail {\n const wait = record(value, \"detail.wait\");\n return {\n policy: readPolicy(wait.policy ?? {}),\n outcome: oneOf(wait.outcome, WAIT_OUTCOMES, \"detail.wait.outcome\"),\n durationMs: nonnegative(wait.durationMs, \"detail.wait.durationMs\"),\n ...(wait.outputs === undefined ? {} : { outputs: wait.outputs }),\n ...optional(wait, \"expression\", (v) => str(v, \"detail.wait.expression\")),\n ...optional(wait, \"cause\", (v) => str(v, \"detail.wait.cause\")),\n ...optional(wait, \"error\", (v) => str(v, \"detail.wait.error\")),\n ...optional(wait, \"trace\", (v) => str(v, \"detail.wait.trace\")),\n };\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n const result = num(value, path);\n return result >= 0 ? result : fail(path, \"non-negative\");\n}\n\nfunction readAttemptResult(value: unknown, path: string): VerifyNode {\n const node = record(value, path);\n str(node.name, `${path}.name`);\n for (const key of [\"framework\", \"message\", \"command\", \"work_dir\", \"stdout\", \"stderr\"]) {\n if (node[key] !== undefined) str(node[key], `${path}.${key}`);\n }\n for (const key of [\"passed\", \"failed\", \"timed_out\", \"warned\", \"skipped\", \"pending\", \"running\"]) {\n if (node[key] !== undefined) bool(node[key], `${path}.${key}`);\n }\n if (node.duration !== undefined) nonnegative(node.duration, `${path}.duration`);\n if (node.children !== undefined) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));\n return { ...node, name: str(node.name, `${path}.name`) } as VerifyNode;\n}\n\nfunction readAttempt(value: unknown, index: number): StepAttempt {\n const path = `detail.attempts[${index}]`;\n const a = record(value, path);\n return {\n attempt: num(a.attempt, `${path}.attempt`),\n status: str(a.status, `${path}.status`),\n ...optional(a, \"error\", (v) => str(v, `${path}.error`)),\n ...optional(a, \"durationMs\", (v) => nonnegative(v, `${path}.durationMs`)),\n ...optional(a, \"result\", (v) => readAttemptResult(v, `${path}.result`)),\n };\n}\n\nfunction readAttempts(value: unknown): StepAttempt[] {\n const attempts = list(value, \"detail.attempts\").map(readAttempt);\n attempts.forEach((attempt, index) => {\n if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);\n });\n return attempts;\n}\n\nfunction readExports(value: unknown): StepExport[] {\n return Object.entries(record(value, \"detail.exports\")).map(([name, raw]) => {\n const path = `detail.exports.${name}`;\n const entry = record(raw, path);\n return { name, value: entry.value, step: str(entry.step, `${path}.step`) };\n });\n}\n\nfunction readEvent(value: unknown, index: number): WatcherEvent {\n const path = `detail.events[${index}]`;\n const e = record(value, path);\n return {\n type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),\n ...optional(e, \"text\", (v) => str(v, `${path}.text`)),\n ...optional(e, \"url\", (v) => str(v, `${path}.url`)),\n ...optional(e, \"status\", (v) => num(v, `${path}.status`)),\n ...optional(e, \"detail\", (v) => str(v, `${path}.detail`)),\n };\n}\n\nfunction readStep(detail: Rec): StepDetail {\n const ref = record(detail.step, \"detail.step\");\n const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));\n return {\n step: { id: str(ref.id, \"detail.step.id\"), kind: str(ref.kind, \"detail.step.kind\") },\n ...(detail.outputs === undefined ? {} : { outputs: detail.outputs }),\n exports: detail.exports == null ? [] : readExports(detail.exports),\n ...optional(detail, \"wait\", readWait),\n attempts: readAttempts(detail.attempts ?? []),\n events: list(detail.events ?? [], \"detail.events\").map(readEvent),\n background: bool(detail.background ?? false, \"detail.background\"),\n rest,\n };\n}\n\n/**\n * Whether `node.detail` carries a typed step (`detail.step`), and if so its\n * parsed contents. A node without `detail.step` is \"none\" whatever else its\n * detail holds; a `step` whose fields violate the contract is \"invalid\" with\n * the offending path, so the view can say so rather than render a guess.\n */\nexport function readStepDetail(detail: unknown): StepDetailResult {\n if (!isRecord(detail) || detail.step === undefined) return { kind: \"none\" };\n try {\n return { kind: \"step\", step: readStep(detail) };\n } catch (error) {\n if (error instanceof StepDetailError) return { kind: \"invalid\", error: error.message };\n throw error;\n }\n}\n\n/** The step detail when there is one, for matchers that only need to know. */\nexport function hasStepDetail(detail: unknown): boolean {\n return readStepDetail(detail).kind !== \"none\";\n}\n\n/** The fixtures.ExecutionNode fields gavel puts at the top of `node.detail`, shown as a header instead of raw JSON. */\nexport type ExecutionHeader = {\n kind?: string;\n state?: string;\n file?: string;\n sectionPath?: string;\n /** Zero-based row of the step within its section. */\n rowIndex?: number;\n line?: number;\n startedAt?: string;\n finishedAt?: string;\n /** Nanoseconds. */\n durationNs?: number;\n error?: string;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n/**\n * Splits the ExecutionNode fields (name, kind, state, origin, started_at,\n * finished_at, duration, error) off `detail` into a header, dropping the\n * internal `key`. A field of an unexpected type is not consumed — it stays in\n * `rest`, so it is visible in the raw block rather than silently hidden.\n */\nexport function splitExecutionDetail(detail: unknown): { header: ExecutionHeader; rest: unknown } {\n if (!isRecord(detail)) return { header: {}, rest: detail };\n const rest: Rec = { ...detail };\n delete rest.key;\n const take = <T>(key: string, guard: (value: unknown) => value is T): T | undefined => {\n const value = rest[key];\n if (!guard(value)) return undefined;\n delete rest[key];\n return value;\n };\n const header: ExecutionHeader = {};\n const assign = <K extends keyof ExecutionHeader>(field: K, value: ExecutionHeader[K] | undefined) => {\n if (value !== undefined) header[field] = value;\n };\n take(\"name\", isString);\n assign(\"kind\", take(\"kind\", isString));\n assign(\"state\", take(\"state\", isString));\n assign(\"startedAt\", take(\"started_at\", isString));\n assign(\"finishedAt\", take(\"finished_at\", isString));\n assign(\"durationNs\", take(\"duration\", isNumber));\n assign(\"error\", take(\"error\", isString));\n const origin = take(\"origin\", isRecord);\n if (origin) {\n assign(\"file\", isString(origin.file) ? origin.file : undefined);\n assign(\"sectionPath\", isString(origin.section_path) ? origin.section_path : undefined);\n assign(\"rowIndex\", isNumber(origin.row_index) ? origin.row_index : undefined);\n assign(\"line\", isNumber(origin.line) ? origin.line : undefined);\n }\n return { header, rest: Object.keys(rest).length > 0 ? rest : undefined };\n}\n\nexport type WaitCondition = \"until\" | \"failWhen\";\n\n/** Which of the wait's two conditions decided its outcome. `expression` is authoritative; older payloads without it are inferred from the outcome. */\nexport function waitDecidedBy(wait: WaitDetail): WaitCondition {\n if (wait.expression !== undefined) return wait.expression === wait.policy.failWhen ? \"failWhen\" : \"until\";\n return wait.outcome === \"failed\" && wait.policy.failWhen ? \"failWhen\" : \"until\";\n}\n\n/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */\nexport function clockTime(at: string): string {\n return /T(\\d{2}:\\d{2}:\\d{2})/.exec(at)?.[1] ?? at;\n}\n\nexport function formatDelay(ms: number): string {\n return ms <= 0 ? \"0ms\" : formatTestDuration(ms * 1e6);\n}\n\n/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */\nexport function policySummary(policy: WaitPolicy): string {\n const backoff = [\n policy.backoff?.factor !== undefined && `×${policy.backoff.factor}`,\n policy.backoff?.max && `up to ${policy.backoff.max}`,\n ].filter(Boolean);\n return [\n policy.interval && `every ${policy.interval}`,\n backoff.length > 0 && `backoff ${backoff.join(\" \")}`,\n policy.jitter && `jitter ±${policy.jitter}`,\n policy.timeout && `timeout ${policy.timeout}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function formatExportValue(value: unknown): string {\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction waitCopy(wait: WaitDetail): BriefSection {\n const { policy } = wait;\n const lines = [\n `outcome: ${wait.outcome}`,\n `elapsed: ${formatDelay(wait.durationMs)}`,\n `policy: ${policySummary(policy)}`,\n policy.until && `until: ${policy.until}`,\n policy.failWhen && `failWhen: ${policy.failWhen}`,\n wait.expression && `decided by: ${wait.expression}`,\n wait.cause && `cause: ${wait.cause}`,\n wait.error && `error: ${wait.error}`,\n wait.trace && `trace: ${wait.trace}`,\n wait.outputs !== undefined && `outputs: ${JSON.stringify(wait.outputs)}`,\n ];\n return { title: \"Wait\", body: lines.filter(Boolean).join(\"\\n\") };\n}\n\nfunction attemptLine(a: StepAttempt): string {\n const head = [`#${a.attempt}`, a.status, a.durationMs !== undefined && formatDelay(a.durationMs)];\n return `${head.filter(Boolean).join(\" \")}${a.error ? ` — ${a.error}` : \"\"}`;\n}\n\nfunction eventLine(e: WatcherEvent): string {\n const body = [e.status, e.text, e.url].filter((part) => part !== undefined).join(\" \");\n return `[${e.type}]${body ? ` ${body}` : \"\"}${e.detail ? ` — ${e.detail}` : \"\"}`;\n}\n\n/** Brief sections for the \"Copy details\" button: wait trace, retry attempts, exports and watcher events. */\nexport function stepKindCopy(step: StepDetail): BriefSection[] {\n return [\n ...(step.outputs !== undefined ? [{ title: \"Outputs\", body: JSON.stringify(step.outputs, null, 2), lang: \"json\" }] : []),\n ...(step.wait ? [waitCopy(step.wait)] : []),\n ...(step.attempts.length > 0 ? [{ title: \"Attempts\", body: step.attempts.map(attemptLine).join(\"\\n\") }] : []),\n ...(step.exports.length > 0\n ? [{ title: \"Exports\", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join(\"\\n\") }]\n : []),\n ...(step.events.length > 0 ? [{ title: \"Events\", body: step.events.map(eventLine).join(\"\\n\") }] : []),\n ];\n}\n"],"mappings":";;AAsBA,IAAa,gBAAgB;CAAC;CAAa;CAAU;AAAS;AAoB9D,IAAa,sBAAsB;CAAC;CAAS;CAAW;CAAa;AAAU;AA6B/E,IAAM,4BAAY,IAAI,IAAI;CAAC;CAAQ;CAAW;CAAW;CAAQ;CAAY;CAAU;AAAY,CAAC;AAEpG,IAAM,kBAAN,cAA8B,MAAM,CAAC;AAErC,SAAS,KAAK,MAAc,aAA4B;CACtD,MAAM,IAAI,gBAAgB,GAAG,KAAK,WAAW,aAAa;AAC5D;AAIA,IAAM,YAAY,UAChB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAErE,SAAS,OAAO,OAAgB,MAAmB;CACjD,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAK,MAAM,WAAW;AACzD;AAEA,SAAS,KAAK,OAAgB,MAAyB;CACrD,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,KAAK,MAAM,UAAU;AAC7D;AAEA,SAAS,IAAI,OAAgB,MAAsB;CACjD,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,MAAM,UAAU;AAClE;AAEA,SAAS,IAAI,OAAgB,MAAsB;CACjD,OAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,QAAQ,KAAK,MAAM,UAAU;AAC5F;AAEA,SAAS,KAAK,OAAgB,MAAuB;CACnD,OAAO,OAAO,UAAU,YAAY,QAAQ,KAAK,MAAM,WAAW;AACpE;AAEA,SAAS,MAAwB,OAAgB,SAAuB,MAAiB;CACvF,OAAO,QAAQ,SAAS,KAAU,IAC7B,QACD,KAAK,MAAM,UAAU,QAAQ,KAAK,IAAI,EAAE,QAAQ,KAAK,UAAU,KAAK,EAAE,EAAE;AAC9E;;AAGA,SAAS,SAA8B,QAAa,KAAQ,MAA+C;CACzG,OAAO,OAAO,SAAS,KAAA,KAAa,OAAO,SAAS,OAAO,CAAC,IAAK,GAAG,MAAM,KAAK,OAAO,IAAI,EAAE;AAC9F;;AAGA,SAAS,aAAa,OAAgB,MAAsB;CAC1D,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,UAAU,OAAOA,eAAAA,mBAAmB,KAAK;CAC9D,OAAO,KAAK,MAAM,wCAAwC;AAC5D;AAEA,SAAS,WAAW,OAAgB,MAAsB;CACxD,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,IAAI,OAAO,UAAU,UAAU,OAAO,OAAO,KAAK;CAClD,OAAO,KAAK,MAAM,oBAAoB;AACxC;AAEA,SAAS,WAAW,OAA4B;CAC9C,MAAM,OAAO;CACb,MAAM,SAAS,OAAO,OAAO,IAAI;CACjC,MAAM,WAAW,QAAiB;EAChC,MAAM,IAAI,OAAO,KAAK,GAAG,KAAK,SAAS;EACvC,OAAO;GACL,GAAG,SAAS,GAAG,WAAW,MAAM,IAAI,GAAG,GAAG,KAAK,gBAAgB,CAAC;GAChE,GAAG,SAAS,GAAG,QAAQ,MAAM,aAAa,GAAG,GAAG,KAAK,aAAa,CAAC;EACrE;CACF;CACA,OAAO;EACL,GAAG,SAAS,QAAQ,UAAU,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC;EAC3D,GAAG,SAAS,QAAQ,aAAa,MAAM,IAAI,GAAG,GAAG,KAAK,UAAU,CAAC;EACjE,GAAG,SAAS,QAAQ,aAAa,MAAM,aAAa,GAAG,GAAG,KAAK,UAAU,CAAC;EAC1E,GAAG,SAAS,QAAQ,WAAW,OAAO;EACtC,GAAG,SAAS,QAAQ,WAAW,MAAM,WAAW,GAAG,GAAG,KAAK,QAAQ,CAAC;EACpE,GAAG,SAAS,QAAQ,YAAY,MAAM,aAAa,GAAG,GAAG,KAAK,SAAS,CAAC;CAC1E;AACF;AAEA,SAAS,SAAS,OAA4B;CAC5C,MAAM,OAAO,OAAO,OAAO,aAAa;CACxC,OAAO;EACL,QAAQ,WAAW,KAAK,UAAU,CAAC,CAAC;EACpC,SAAS,MAAM,KAAK,SAAS,eAAe,qBAAqB;EACjE,YAAY,YAAY,KAAK,YAAY,wBAAwB;EACjE,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;EAC9D,GAAG,SAAS,MAAM,eAAe,MAAM,IAAI,GAAG,wBAAwB,CAAC;EACvE,GAAG,SAAS,MAAM,UAAU,MAAM,IAAI,GAAG,mBAAmB,CAAC;EAC7D,GAAG,SAAS,MAAM,UAAU,MAAM,IAAI,GAAG,mBAAmB,CAAC;EAC7D,GAAG,SAAS,MAAM,UAAU,MAAM,IAAI,GAAG,mBAAmB,CAAC;CAC/D;AACF;AAEA,SAAS,YAAY,OAAgB,MAAsB;CACzD,MAAM,SAAS,IAAI,OAAO,IAAI;CAC9B,OAAO,UAAU,IAAI,SAAS,KAAK,MAAM,cAAc;AACzD;AAEA,SAAS,kBAAkB,OAAgB,MAA0B;CACnE,MAAM,OAAO,OAAO,OAAO,IAAI;CAC/B,IAAI,KAAK,MAAM,GAAG,KAAK,MAAM;CAC7B,KAAK,MAAM,OAAO;EAAC;EAAa;EAAW;EAAW;EAAY;EAAU;CAAQ,GAClF,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,KAAK,MAAM,GAAG,KAAK,GAAG,KAAK;CAE9D,KAAK,MAAM,OAAO;EAAC;EAAU;EAAU;EAAa;EAAU;EAAW;EAAW;CAAS,GAC3F,IAAI,KAAK,SAAS,KAAA,GAAW,KAAK,KAAK,MAAM,GAAG,KAAK,GAAG,KAAK;CAE/D,IAAI,KAAK,aAAa,KAAA,GAAW,YAAY,KAAK,UAAU,GAAG,KAAK,UAAU;CAC9E,IAAI,KAAK,aAAa,KAAA,GAAW,KAAK,KAAK,UAAU,GAAG,KAAK,UAAU,CAAC,CAAC,SAAS,OAAO,MAAM,kBAAkB,OAAO,GAAG,KAAK,YAAY,EAAE,EAAE,CAAC;CACjJ,OAAO;EAAE,GAAG;EAAM,MAAM,IAAI,KAAK,MAAM,GAAG,KAAK,MAAM;CAAE;AACzD;AAEA,SAAS,YAAY,OAAgB,OAA4B;CAC/D,MAAM,OAAO,mBAAmB,MAAM;CACtC,MAAM,IAAI,OAAO,OAAO,IAAI;CAC5B,OAAO;EACL,SAAS,IAAI,EAAE,SAAS,GAAG,KAAK,SAAS;EACzC,QAAQ,IAAI,EAAE,QAAQ,GAAG,KAAK,QAAQ;EACtC,GAAG,SAAS,GAAG,UAAU,MAAM,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC;EACtD,GAAG,SAAS,GAAG,eAAe,MAAM,YAAY,GAAG,GAAG,KAAK,YAAY,CAAC;EACxE,GAAG,SAAS,GAAG,WAAW,MAAM,kBAAkB,GAAG,GAAG,KAAK,QAAQ,CAAC;CACxE;AACF;AAEA,SAAS,aAAa,OAA+B;CACnD,MAAM,WAAW,KAAK,OAAO,iBAAiB,CAAC,CAAC,IAAI,WAAW;CAC/D,SAAS,SAAS,SAAS,UAAU;EACnC,IAAI,QAAQ,YAAY,QAAQ,GAAG,KAAK,mBAAmB,MAAM,YAAY,uBAAuB,QAAQ,GAAG;CACjH,CAAC;CACD,OAAO;AACT;AAEA,SAAS,YAAY,OAA8B;CACjD,OAAO,OAAO,QAAQ,OAAO,OAAO,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS;EAC1E,MAAM,OAAO,kBAAkB;EAC/B,MAAM,QAAQ,OAAO,KAAK,IAAI;EAC9B,OAAO;GAAE;GAAM,OAAO,MAAM;GAAO,MAAM,IAAI,MAAM,MAAM,GAAG,KAAK,MAAM;EAAE;CAC3E,CAAC;AACH;AAEA,SAAS,UAAU,OAAgB,OAA6B;CAC9D,MAAM,OAAO,iBAAiB,MAAM;CACpC,MAAM,IAAI,OAAO,OAAO,IAAI;CAC5B,OAAO;EACL,MAAM,MAAM,EAAE,MAAM,qBAAqB,GAAG,KAAK,MAAM;EACvD,GAAG,SAAS,GAAG,SAAS,MAAM,IAAI,GAAG,GAAG,KAAK,MAAM,CAAC;EACpD,GAAG,SAAS,GAAG,QAAQ,MAAM,IAAI,GAAG,GAAG,KAAK,KAAK,CAAC;EAClD,GAAG,SAAS,GAAG,WAAW,MAAM,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;EACxD,GAAG,SAAS,GAAG,WAAW,MAAM,IAAI,GAAG,GAAG,KAAK,QAAQ,CAAC;CAC1D;AACF;AAEA,SAAS,SAAS,QAAyB;CACzC,MAAM,MAAM,OAAO,OAAO,MAAM,aAAa;CAC7C,MAAM,OAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;CAC7F,OAAO;EACL,MAAM;GAAE,IAAI,IAAI,IAAI,IAAI,gBAAgB;GAAG,MAAM,IAAI,IAAI,MAAM,kBAAkB;EAAE;EACnF,GAAI,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ;EAClE,SAAS,OAAO,WAAW,OAAO,CAAC,IAAI,YAAY,OAAO,OAAO;EACjE,GAAG,SAAS,QAAQ,QAAQ,QAAQ;EACpC,UAAU,aAAa,OAAO,YAAY,CAAC,CAAC;EAC5C,QAAQ,KAAK,OAAO,UAAU,CAAC,GAAG,eAAe,CAAC,CAAC,IAAI,SAAS;EAChE,YAAY,KAAK,OAAO,cAAc,OAAO,mBAAmB;EAChE;CACF;AACF;;;;;;;AAQA,SAAgB,eAAe,QAAmC;CAChE,IAAI,CAAC,SAAS,MAAM,KAAK,OAAO,SAAS,KAAA,GAAW,OAAO,EAAE,MAAM,OAAO;CAC1E,IAAI;EACF,OAAO;GAAE,MAAM;GAAQ,MAAM,SAAS,MAAM;EAAE;CAChD,SAAS,OAAO;EACd,IAAI,iBAAiB,iBAAiB,OAAO;GAAE,MAAM;GAAW,OAAO,MAAM;EAAQ;EACrF,MAAM;CACR;AACF;;AAGA,SAAgB,cAAc,QAA0B;CACtD,OAAO,eAAe,MAAM,CAAC,CAAC,SAAS;AACzC;AAkBA,IAAM,YAAY,UAAoC,OAAO,UAAU;AACvE,IAAM,YAAY,UAAoC,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;;;;;;;AAQxG,SAAgB,qBAAqB,QAA6D;CAChG,IAAI,CAAC,SAAS,MAAM,GAAG,OAAO;EAAE,QAAQ,CAAC;EAAG,MAAM;CAAO;CACzD,MAAM,OAAY,EAAE,GAAG,OAAO;CAC9B,OAAO,KAAK;CACZ,MAAM,QAAW,KAAa,UAAyD;EACrF,MAAM,QAAQ,KAAK;EACnB,IAAI,CAAC,MAAM,KAAK,GAAG,OAAO,KAAA;EAC1B,OAAO,KAAK;EACZ,OAAO;CACT;CACA,MAAM,SAA0B,CAAC;CACjC,MAAM,UAA2C,OAAU,UAA0C;EACnG,IAAI,UAAU,KAAA,GAAW,OAAO,SAAS;CAC3C;CACA,KAAK,QAAQ,QAAQ;CACrB,OAAO,QAAQ,KAAK,QAAQ,QAAQ,CAAC;CACrC,OAAO,SAAS,KAAK,SAAS,QAAQ,CAAC;CACvC,OAAO,aAAa,KAAK,cAAc,QAAQ,CAAC;CAChD,OAAO,cAAc,KAAK,eAAe,QAAQ,CAAC;CAClD,OAAO,cAAc,KAAK,YAAY,QAAQ,CAAC;CAC/C,OAAO,SAAS,KAAK,SAAS,QAAQ,CAAC;CACvC,MAAM,SAAS,KAAK,UAAU,QAAQ;CACtC,IAAI,QAAQ;EACV,OAAO,QAAQ,SAAS,OAAO,IAAI,IAAI,OAAO,OAAO,KAAA,CAAS;EAC9D,OAAO,eAAe,SAAS,OAAO,YAAY,IAAI,OAAO,eAAe,KAAA,CAAS;EACrF,OAAO,YAAY,SAAS,OAAO,SAAS,IAAI,OAAO,YAAY,KAAA,CAAS;EAC5E,OAAO,QAAQ,SAAS,OAAO,IAAI,IAAI,OAAO,OAAO,KAAA,CAAS;CAChE;CACA,OAAO;EAAE;EAAQ,MAAM,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,IAAI,OAAO,KAAA;CAAU;AACzE;;AAKA,SAAgB,cAAc,MAAiC;CAC7D,IAAI,KAAK,eAAe,KAAA,GAAW,OAAO,KAAK,eAAe,KAAK,OAAO,WAAW,aAAa;CAClG,OAAO,KAAK,YAAY,YAAY,KAAK,OAAO,WAAW,aAAa;AAC1E;;AAGA,SAAgB,UAAU,IAAoB;CAC5C,OAAO,uBAAuB,KAAK,EAAE,CAAC,GAAG,MAAM;AACjD;AAEA,SAAgB,YAAY,IAAoB;CAC9C,OAAO,MAAM,IAAI,QAAQA,eAAAA,mBAAmB,KAAK,GAAG;AACtD;;AAGA,SAAgB,cAAc,QAA4B;CACxD,MAAM,UAAU,CACd,OAAO,SAAS,WAAW,KAAA,KAAa,IAAI,OAAO,QAAQ,UAC3D,OAAO,SAAS,OAAO,SAAS,OAAO,QAAQ,KACjD,CAAC,CAAC,OAAO,OAAO;CAChB,OAAO;EACL,OAAO,YAAY,SAAS,OAAO;EACnC,QAAQ,SAAS,KAAK,WAAW,QAAQ,KAAK,GAAG;EACjD,OAAO,UAAU,WAAW,OAAO;EACnC,OAAO,WAAW,WAAW,OAAO;CACtC,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,KAAK;AACf;AAEA,SAAgB,kBAAkB,OAAwB;CACxD,IAAI,UAAU,KAAA,GAAW,OAAO;CAChC,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK;AACjE;AAEA,SAAS,SAAS,MAAgC;CAChD,MAAM,EAAE,WAAW;CAanB,OAAO;EAAE,OAAO;EAAQ,MAAM;GAX5B,YAAY,KAAK;GACjB,YAAY,YAAY,KAAK,UAAU;GACvC,WAAW,cAAc,MAAM;GAC/B,OAAO,SAAS,UAAU,OAAO;GACjC,OAAO,YAAY,aAAa,OAAO;GACvC,KAAK,cAAc,eAAe,KAAK;GACvC,KAAK,SAAS,UAAU,KAAK;GAC7B,KAAK,SAAS,UAAU,KAAK;GAC7B,KAAK,SAAS,UAAU,KAAK;GAC7B,KAAK,YAAY,KAAA,KAAa,YAAY,KAAK,UAAU,KAAK,OAAO;EAEzC,CAAA,CAAM,OAAO,OAAO,CAAC,CAAC,KAAK,IAAI;CAAE;AACjE;AAEA,SAAS,YAAY,GAAwB;CAE3C,OAAO,GAAG;EADI,IAAI,EAAE;EAAW,EAAE;EAAQ,EAAE,eAAe,KAAA,KAAa,YAAY,EAAE,UAAU;CACrF,CAAA,CAAK,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,IAAI,EAAE,QAAQ,MAAM,EAAE,UAAU;AACzE;AAEA,SAAS,UAAU,GAAyB;CAC1C,MAAM,OAAO;EAAC,EAAE;EAAQ,EAAE;EAAM,EAAE;CAAG,CAAC,CAAC,QAAQ,SAAS,SAAS,KAAA,CAAS,CAAC,CAAC,KAAK,GAAG;CACpF,OAAO,IAAI,EAAE,KAAK,GAAG,OAAO,IAAI,SAAS,KAAK,EAAE,SAAS,MAAM,EAAE,WAAW;AAC9E;;AAGA,SAAgB,aAAa,MAAkC;CAC7D,OAAO;EACL,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC;GAAE,OAAO;GAAW,MAAM,KAAK,UAAU,KAAK,SAAS,MAAM,CAAC;GAAG,MAAM;EAAO,CAAC,IAAI,CAAC;EACtH,GAAI,KAAK,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC;EACzC,GAAI,KAAK,SAAS,SAAS,IAAI,CAAC;GAAE,OAAO;GAAY,MAAM,KAAK,SAAS,IAAI,WAAW,CAAC,CAAC,KAAK,IAAI;EAAE,CAAC,IAAI,CAAC;EAC3G,GAAI,KAAK,QAAQ,SAAS,IACtB,CAAC;GAAE,OAAO;GAAW,MAAM,KAAK,QAAQ,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,kBAAkB,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI;EAAE,CAAC,IAC3H,CAAC;EACL,GAAI,KAAK,OAAO,SAAS,IAAI,CAAC;GAAE,OAAO;GAAU,MAAM,KAAK,OAAO,IAAI,SAAS,CAAC,CAAC,KAAK,IAAI;EAAE,CAAC,IAAI,CAAC;CACrG;AACF"}
|
|
1
|
+
{"version":3,"file":"stepKind.cjs","names":["formatTestDuration"],"sources":["../../../src/data/verification/stepKind.ts"],"sourcesContent":["// The typed step-kind detail gavel's fixture verifier attaches to a node\n// (fixtures/verifier/report.go): `detail.step` names the kind and id, beside\n// the structured `wait`, `attempts`, `exports`, `outputs` and (for a\n// background Playwright watcher) `events`. Parsed here, once, so the detail\n// view and the copy brief read the same typed shape. A present-but-malformed\n// field is reported by path instead of being guessed at.\n\nimport type { BriefSection } from \"../test-runner\";\nimport { formatTestDuration } from \"../test-runner\";\nimport type { VerifyNode } from \"./verify-report\";\n\nexport type StepRef = { id: string; kind: string };\n\nexport type WaitPolicy = {\n until?: string;\n failWhen?: string;\n interval?: string;\n backoff?: { factor?: number; max?: string };\n jitter?: string;\n timeout?: string;\n};\n\nexport const WAIT_OUTCOMES = [\"satisfied\", \"failed\", \"timeout\"] as const;\nexport type WaitOutcome = (typeof WAIT_OUTCOMES)[number];\n\nexport type WaitDetail = {\n policy: WaitPolicy;\n outcome: WaitOutcome;\n durationMs: number;\n /** The CEL expression that decided the outcome: policy.failWhen when it fired, else policy.until. */\n expression?: string;\n /** Domain reason the wait ended unsatisfied; may span several lines. */\n cause?: string;\n outputs?: unknown;\n error?: string;\n trace?: string;\n};\n\nexport type StepAttempt = { attempt: number; status: string; error?: string; durationMs?: number; result?: VerifyNode };\n\nexport type StepExport = { name: string; value: unknown; step: string };\n\nexport const WATCHER_EVENT_TYPES = [\"alert\", \"console\", \"pageerror\", \"response\"] as const;\nexport type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];\n\nexport type WatcherEvent = {\n type: WatcherEventType;\n text?: string;\n url?: string;\n status?: number;\n detail?: string;\n};\n\nexport type StepDetail = {\n step: StepRef;\n outputs?: unknown;\n exports: StepExport[];\n wait?: WaitDetail;\n attempts: StepAttempt[];\n events: WatcherEvent[];\n /** Whether the step runs in the background until teardown (a watcher). */\n background: boolean;\n /** Everything else in `node.detail` (cel_trace, run, recordings, …). */\n rest: Record<string, unknown>;\n};\n\nexport type StepDetailResult =\n | { kind: \"none\" }\n | { kind: \"step\"; step: StepDetail }\n | { kind: \"invalid\"; error: string };\n\nconst STEP_KEYS = new Set([\"step\", \"outputs\", \"exports\", \"wait\", \"attempts\", \"events\", \"background\"]);\n\nclass StepDetailError extends Error {}\n\nfunction fail(path: string, expectation: string): never {\n throw new StepDetailError(`${path} must be ${expectation}`);\n}\n\ntype Rec = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Rec =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nfunction record(value: unknown, path: string): Rec {\n return isRecord(value) ? value : fail(path, \"an object\");\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n return Array.isArray(value) ? value : fail(path, \"an array\");\n}\n\nfunction str(value: unknown, path: string): string {\n return typeof value === \"string\" ? value : fail(path, \"a string\");\n}\n\nfunction num(value: unknown, path: string): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fail(path, \"a number\");\n}\n\nfunction bool(value: unknown, path: string): boolean {\n return typeof value === \"boolean\" ? value : fail(path, \"a boolean\");\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n return allowed.includes(value as T)\n ? (value as T)\n : fail(path, `one of ${allowed.join(\", \")} (got ${JSON.stringify(value)})`);\n}\n\n/** `{ [key]: read(value) }` when the optional field is present, else `{}` — absent stays an absent key. */\nfunction optional<K extends string, T>(source: Rec, key: K, read: (value: unknown) => T): { [P in K]?: T } {\n return source[key] === undefined || source[key] === null ? {} : ({ [key]: read(source[key]) } as { [P in K]?: T });\n}\n\n/** Durations arrive as Go-style strings (\"15s\"); a bare number is nanoseconds like every other duration on the wire. */\nfunction durationText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return formatTestDuration(value);\n return fail(path, \"a duration string or nanosecond number\");\n}\n\nfunction scalarText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n return fail(path, \"a string or number\");\n}\n\nfunction readPolicy(value: unknown): WaitPolicy {\n const path = \"detail.wait.policy\";\n const policy = record(value, path);\n const backoff = (raw: unknown) => {\n const b = record(raw, `${path}.backoff`);\n return {\n ...optional(b, \"factor\", (v) => num(v, `${path}.backoff.factor`)),\n ...optional(b, \"max\", (v) => durationText(v, `${path}.backoff.max`)),\n };\n };\n return {\n ...optional(policy, \"until\", (v) => str(v, `${path}.until`)),\n ...optional(policy, \"failWhen\", (v) => str(v, `${path}.failWhen`)),\n ...optional(policy, \"interval\", (v) => durationText(v, `${path}.interval`)),\n ...optional(policy, \"backoff\", backoff),\n ...optional(policy, \"jitter\", (v) => scalarText(v, `${path}.jitter`)),\n ...optional(policy, \"timeout\", (v) => durationText(v, `${path}.timeout`)),\n };\n}\n\nfunction readWait(value: unknown): WaitDetail {\n const wait = record(value, \"detail.wait\");\n return {\n policy: readPolicy(wait.policy ?? {}),\n outcome: oneOf(wait.outcome, WAIT_OUTCOMES, \"detail.wait.outcome\"),\n durationMs: nonnegative(wait.durationMs, \"detail.wait.durationMs\"),\n ...(wait.outputs === undefined ? {} : { outputs: wait.outputs }),\n ...optional(wait, \"expression\", (v) => str(v, \"detail.wait.expression\")),\n ...optional(wait, \"cause\", (v) => str(v, \"detail.wait.cause\")),\n ...optional(wait, \"error\", (v) => str(v, \"detail.wait.error\")),\n ...optional(wait, \"trace\", (v) => str(v, \"detail.wait.trace\")),\n };\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n const result = num(value, path);\n return result >= 0 ? result : fail(path, \"non-negative\");\n}\n\nfunction readAttemptResult(value: unknown, path: string): VerifyNode {\n const node = record(value, path);\n str(node.name, `${path}.name`);\n for (const key of [\"framework\", \"message\", \"command\", \"work_dir\", \"stdout\", \"stderr\"]) {\n if (node[key] !== undefined) str(node[key], `${path}.${key}`);\n }\n for (const key of [\"passed\", \"failed\", \"timed_out\", \"warned\", \"skipped\", \"pending\", \"running\"]) {\n if (node[key] !== undefined) bool(node[key], `${path}.${key}`);\n }\n if (node.duration !== undefined) nonnegative(node.duration, `${path}.duration`);\n if (node.detail !== undefined) record(node.detail, `${path}.detail`);\n if (node.children !== undefined) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));\n return { ...node, name: str(node.name, `${path}.name`) } as VerifyNode;\n}\n\nfunction readAttempt(value: unknown, index: number): StepAttempt {\n const path = `detail.attempts[${index}]`;\n const a = record(value, path);\n return {\n attempt: num(a.attempt, `${path}.attempt`),\n status: str(a.status, `${path}.status`),\n ...optional(a, \"error\", (v) => str(v, `${path}.error`)),\n ...optional(a, \"durationMs\", (v) => nonnegative(v, `${path}.durationMs`)),\n ...optional(a, \"result\", (v) => readAttemptResult(v, `${path}.result`)),\n };\n}\n\nfunction readAttempts(value: unknown): StepAttempt[] {\n const attempts = list(value, \"detail.attempts\").map(readAttempt);\n attempts.forEach((attempt, index) => {\n if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);\n });\n return attempts;\n}\n\nfunction readExports(value: unknown): StepExport[] {\n return Object.entries(record(value, \"detail.exports\")).map(([name, raw]) => {\n const path = `detail.exports.${name}`;\n const entry = record(raw, path);\n return { name, value: entry.value, step: str(entry.step, `${path}.step`) };\n });\n}\n\nfunction readEvent(value: unknown, index: number): WatcherEvent {\n const path = `detail.events[${index}]`;\n const e = record(value, path);\n return {\n type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),\n ...optional(e, \"text\", (v) => str(v, `${path}.text`)),\n ...optional(e, \"url\", (v) => str(v, `${path}.url`)),\n ...optional(e, \"status\", (v) => num(v, `${path}.status`)),\n ...optional(e, \"detail\", (v) => str(v, `${path}.detail`)),\n };\n}\n\nfunction readStep(detail: Rec): StepDetail {\n const ref = record(detail.step, \"detail.step\");\n const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));\n return {\n step: { id: str(ref.id, \"detail.step.id\"), kind: str(ref.kind, \"detail.step.kind\") },\n ...(detail.outputs === undefined ? {} : { outputs: detail.outputs }),\n exports: detail.exports == null ? [] : readExports(detail.exports),\n ...optional(detail, \"wait\", readWait),\n attempts: readAttempts(detail.attempts ?? []),\n events: list(detail.events ?? [], \"detail.events\").map(readEvent),\n background: bool(detail.background ?? false, \"detail.background\"),\n rest,\n };\n}\n\n/**\n * Whether `node.detail` carries a typed step (`detail.step`), and if so its\n * parsed contents. A node without `detail.step` is \"none\" whatever else its\n * detail holds; a `step` whose fields violate the contract is \"invalid\" with\n * the offending path, so the view can say so rather than render a guess.\n */\nexport function readStepDetail(detail: unknown): StepDetailResult {\n if (!isRecord(detail) || detail.step === undefined) return { kind: \"none\" };\n try {\n return { kind: \"step\", step: readStep(detail) };\n } catch (error) {\n if (error instanceof StepDetailError) return { kind: \"invalid\", error: error.message };\n throw error;\n }\n}\n\n/** The step detail when there is one, for matchers that only need to know. */\nexport function hasStepDetail(detail: unknown): boolean {\n return readStepDetail(detail).kind !== \"none\";\n}\n\n/** The fixtures.ExecutionNode fields gavel puts at the top of `node.detail`, shown as a header instead of raw JSON. */\nexport type ExecutionHeader = {\n kind?: string;\n state?: string;\n file?: string;\n sectionPath?: string;\n /** Zero-based row of the step within its section. */\n rowIndex?: number;\n line?: number;\n startedAt?: string;\n finishedAt?: string;\n /** Nanoseconds. */\n durationNs?: number;\n error?: string;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n/**\n * Splits the ExecutionNode fields (name, kind, state, origin, started_at,\n * finished_at, duration, error) off `detail` into a header, dropping the\n * internal `key`. A field of an unexpected type is not consumed — it stays in\n * `rest`, so it is visible in the raw block rather than silently hidden.\n */\nexport function splitExecutionDetail(detail: unknown): { header: ExecutionHeader; rest: unknown } {\n if (!isRecord(detail)) return { header: {}, rest: detail };\n const rest: Rec = { ...detail };\n delete rest.key;\n const take = <T>(key: string, guard: (value: unknown) => value is T): T | undefined => {\n const value = rest[key];\n if (!guard(value)) return undefined;\n delete rest[key];\n return value;\n };\n const header: ExecutionHeader = {};\n const assign = <K extends keyof ExecutionHeader>(field: K, value: ExecutionHeader[K] | undefined) => {\n if (value !== undefined) header[field] = value;\n };\n take(\"name\", isString);\n assign(\"kind\", take(\"kind\", isString));\n assign(\"state\", take(\"state\", isString));\n assign(\"startedAt\", take(\"started_at\", isString));\n assign(\"finishedAt\", take(\"finished_at\", isString));\n assign(\"durationNs\", take(\"duration\", isNumber));\n assign(\"error\", take(\"error\", isString));\n const origin = take(\"origin\", isRecord);\n if (origin) {\n assign(\"file\", isString(origin.file) ? origin.file : undefined);\n assign(\"sectionPath\", isString(origin.section_path) ? origin.section_path : undefined);\n assign(\"rowIndex\", isNumber(origin.row_index) ? origin.row_index : undefined);\n assign(\"line\", isNumber(origin.line) ? origin.line : undefined);\n }\n return { header, rest: Object.keys(rest).length > 0 ? rest : undefined };\n}\n\nexport type WaitCondition = \"until\" | \"failWhen\";\n\n/** Which of the wait's two conditions decided its outcome. `expression` is authoritative; older payloads without it are inferred from the outcome. */\nexport function waitDecidedBy(wait: WaitDetail): WaitCondition {\n if (wait.expression !== undefined) return wait.expression === wait.policy.failWhen ? \"failWhen\" : \"until\";\n return wait.outcome === \"failed\" && wait.policy.failWhen ? \"failWhen\" : \"until\";\n}\n\n/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */\nexport function clockTime(at: string): string {\n return /T(\\d{2}:\\d{2}:\\d{2})/.exec(at)?.[1] ?? at;\n}\n\nexport function formatDelay(ms: number): string {\n return ms <= 0 ? \"0ms\" : formatTestDuration(ms * 1e6);\n}\n\n/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */\nexport function policySummary(policy: WaitPolicy): string {\n const backoff = [\n policy.backoff?.factor !== undefined && `×${policy.backoff.factor}`,\n policy.backoff?.max && `up to ${policy.backoff.max}`,\n ].filter(Boolean);\n return [\n policy.interval && `every ${policy.interval}`,\n backoff.length > 0 && `backoff ${backoff.join(\" \")}`,\n policy.jitter && `jitter ±${policy.jitter}`,\n policy.timeout && `timeout ${policy.timeout}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function formatExportValue(value: unknown): string {\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction waitCopy(wait: WaitDetail): BriefSection {\n const { policy } = wait;\n const lines = [\n `outcome: ${wait.outcome}`,\n `elapsed: ${formatDelay(wait.durationMs)}`,\n `policy: ${policySummary(policy)}`,\n policy.until && `until: ${policy.until}`,\n policy.failWhen && `failWhen: ${policy.failWhen}`,\n wait.expression && `decided by: ${wait.expression}`,\n wait.cause && `cause: ${wait.cause}`,\n wait.error && `error: ${wait.error}`,\n wait.trace && `trace: ${wait.trace}`,\n wait.outputs !== undefined && `outputs: ${JSON.stringify(wait.outputs)}`,\n ];\n return { title: \"Wait\", body: lines.filter(Boolean).join(\"\\n\") };\n}\n\nfunction attemptLine(a: StepAttempt): string {\n const head = [`#${a.attempt}`, a.status, a.durationMs !== undefined && formatDelay(a.durationMs)];\n return `${head.filter(Boolean).join(\" \")}${a.error ? ` — ${a.error}` : \"\"}`;\n}\n\nfunction eventLine(e: WatcherEvent): string {\n const body = [e.status, e.text, e.url].filter((part) => part !== undefined).join(\" \");\n return `[${e.type}]${body ? ` ${body}` : \"\"}${e.detail ? ` — ${e.detail}` : \"\"}`;\n}\n\n/** Brief sections for the \"Copy details\" button: wait trace, retry attempts, exports and watcher events. */\nexport function stepKindCopy(step: StepDetail): BriefSection[] {\n return [\n ...(step.outputs !== undefined ? [{ title: \"Outputs\", body: JSON.stringify(step.outputs, null, 2), lang: \"json\" }] : []),\n ...(step.wait ? [waitCopy(step.wait)] : []),\n ...(step.attempts.length > 0 ? [{ title: \"Attempts\", body: step.attempts.map(attemptLine).join(\"\\n\") }] : []),\n ...(step.exports.length > 0\n ? [{ title: \"Exports\", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join(\"\\n\") }]\n : []),\n ...(step.events.length > 0 ? [{ title: \"Events\", body: step.events.map(eventLine).join(\"\\n\") }] : []),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepKind.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKind.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,aAAa,6CAA8C,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,qGAAqG;IACrG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,UAAU,CAAA;CAAE,CAAC;AAExH,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,eAAO,MAAM,mBAAmB,wDAAyD,CAAC;AAC1F,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,0EAA0E;IAC1E,UAAU,EAAE,OAAO,CAAC;IACpB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"stepKind.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKind.ts"],"names":[],"mappings":"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"}
|
|
@@ -115,6 +115,7 @@ function readAttemptResult(value, path) {
|
|
|
115
115
|
"running"
|
|
116
116
|
]) if (node[key] !== void 0) bool(node[key], `${path}.${key}`);
|
|
117
117
|
if (node.duration !== void 0) nonnegative(node.duration, `${path}.duration`);
|
|
118
|
+
if (node.detail !== void 0) record(node.detail, `${path}.detail`);
|
|
118
119
|
if (node.children !== void 0) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));
|
|
119
120
|
return {
|
|
120
121
|
...node,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepKind.js","names":[],"sources":["../../../src/data/verification/stepKind.ts"],"sourcesContent":["// The typed step-kind detail gavel's fixture verifier attaches to a node\n// (fixtures/verifier/report.go): `detail.step` names the kind and id, beside\n// the structured `wait`, `attempts`, `exports`, `outputs` and (for a\n// background Playwright watcher) `events`. Parsed here, once, so the detail\n// view and the copy brief read the same typed shape. A present-but-malformed\n// field is reported by path instead of being guessed at.\n\nimport type { BriefSection } from \"../test-runner\";\nimport { formatTestDuration } from \"../test-runner\";\nimport type { VerifyNode } from \"./verify-report\";\n\nexport type StepRef = { id: string; kind: string };\n\nexport type WaitPolicy = {\n until?: string;\n failWhen?: string;\n interval?: string;\n backoff?: { factor?: number; max?: string };\n jitter?: string;\n timeout?: string;\n};\n\nexport const WAIT_OUTCOMES = [\"satisfied\", \"failed\", \"timeout\"] as const;\nexport type WaitOutcome = (typeof WAIT_OUTCOMES)[number];\n\nexport type WaitDetail = {\n policy: WaitPolicy;\n outcome: WaitOutcome;\n durationMs: number;\n /** The CEL expression that decided the outcome: policy.failWhen when it fired, else policy.until. */\n expression?: string;\n /** Domain reason the wait ended unsatisfied; may span several lines. */\n cause?: string;\n outputs?: unknown;\n error?: string;\n trace?: string;\n};\n\nexport type StepAttempt = { attempt: number; status: string; error?: string; durationMs?: number; result?: VerifyNode };\n\nexport type StepExport = { name: string; value: unknown; step: string };\n\nexport const WATCHER_EVENT_TYPES = [\"alert\", \"console\", \"pageerror\", \"response\"] as const;\nexport type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];\n\nexport type WatcherEvent = {\n type: WatcherEventType;\n text?: string;\n url?: string;\n status?: number;\n detail?: string;\n};\n\nexport type StepDetail = {\n step: StepRef;\n outputs?: unknown;\n exports: StepExport[];\n wait?: WaitDetail;\n attempts: StepAttempt[];\n events: WatcherEvent[];\n /** Whether the step runs in the background until teardown (a watcher). */\n background: boolean;\n /** Everything else in `node.detail` (cel_trace, run, recordings, …). */\n rest: Record<string, unknown>;\n};\n\nexport type StepDetailResult =\n | { kind: \"none\" }\n | { kind: \"step\"; step: StepDetail }\n | { kind: \"invalid\"; error: string };\n\nconst STEP_KEYS = new Set([\"step\", \"outputs\", \"exports\", \"wait\", \"attempts\", \"events\", \"background\"]);\n\nclass StepDetailError extends Error {}\n\nfunction fail(path: string, expectation: string): never {\n throw new StepDetailError(`${path} must be ${expectation}`);\n}\n\ntype Rec = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Rec =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nfunction record(value: unknown, path: string): Rec {\n return isRecord(value) ? value : fail(path, \"an object\");\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n return Array.isArray(value) ? value : fail(path, \"an array\");\n}\n\nfunction str(value: unknown, path: string): string {\n return typeof value === \"string\" ? value : fail(path, \"a string\");\n}\n\nfunction num(value: unknown, path: string): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fail(path, \"a number\");\n}\n\nfunction bool(value: unknown, path: string): boolean {\n return typeof value === \"boolean\" ? value : fail(path, \"a boolean\");\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n return allowed.includes(value as T)\n ? (value as T)\n : fail(path, `one of ${allowed.join(\", \")} (got ${JSON.stringify(value)})`);\n}\n\n/** `{ [key]: read(value) }` when the optional field is present, else `{}` — absent stays an absent key. */\nfunction optional<K extends string, T>(source: Rec, key: K, read: (value: unknown) => T): { [P in K]?: T } {\n return source[key] === undefined || source[key] === null ? {} : ({ [key]: read(source[key]) } as { [P in K]?: T });\n}\n\n/** Durations arrive as Go-style strings (\"15s\"); a bare number is nanoseconds like every other duration on the wire. */\nfunction durationText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return formatTestDuration(value);\n return fail(path, \"a duration string or nanosecond number\");\n}\n\nfunction scalarText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n return fail(path, \"a string or number\");\n}\n\nfunction readPolicy(value: unknown): WaitPolicy {\n const path = \"detail.wait.policy\";\n const policy = record(value, path);\n const backoff = (raw: unknown) => {\n const b = record(raw, `${path}.backoff`);\n return {\n ...optional(b, \"factor\", (v) => num(v, `${path}.backoff.factor`)),\n ...optional(b, \"max\", (v) => durationText(v, `${path}.backoff.max`)),\n };\n };\n return {\n ...optional(policy, \"until\", (v) => str(v, `${path}.until`)),\n ...optional(policy, \"failWhen\", (v) => str(v, `${path}.failWhen`)),\n ...optional(policy, \"interval\", (v) => durationText(v, `${path}.interval`)),\n ...optional(policy, \"backoff\", backoff),\n ...optional(policy, \"jitter\", (v) => scalarText(v, `${path}.jitter`)),\n ...optional(policy, \"timeout\", (v) => durationText(v, `${path}.timeout`)),\n };\n}\n\nfunction readWait(value: unknown): WaitDetail {\n const wait = record(value, \"detail.wait\");\n return {\n policy: readPolicy(wait.policy ?? {}),\n outcome: oneOf(wait.outcome, WAIT_OUTCOMES, \"detail.wait.outcome\"),\n durationMs: nonnegative(wait.durationMs, \"detail.wait.durationMs\"),\n ...(wait.outputs === undefined ? {} : { outputs: wait.outputs }),\n ...optional(wait, \"expression\", (v) => str(v, \"detail.wait.expression\")),\n ...optional(wait, \"cause\", (v) => str(v, \"detail.wait.cause\")),\n ...optional(wait, \"error\", (v) => str(v, \"detail.wait.error\")),\n ...optional(wait, \"trace\", (v) => str(v, \"detail.wait.trace\")),\n };\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n const result = num(value, path);\n return result >= 0 ? result : fail(path, \"non-negative\");\n}\n\nfunction readAttemptResult(value: unknown, path: string): VerifyNode {\n const node = record(value, path);\n str(node.name, `${path}.name`);\n for (const key of [\"framework\", \"message\", \"command\", \"work_dir\", \"stdout\", \"stderr\"]) {\n if (node[key] !== undefined) str(node[key], `${path}.${key}`);\n }\n for (const key of [\"passed\", \"failed\", \"timed_out\", \"warned\", \"skipped\", \"pending\", \"running\"]) {\n if (node[key] !== undefined) bool(node[key], `${path}.${key}`);\n }\n if (node.duration !== undefined) nonnegative(node.duration, `${path}.duration`);\n if (node.children !== undefined) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));\n return { ...node, name: str(node.name, `${path}.name`) } as VerifyNode;\n}\n\nfunction readAttempt(value: unknown, index: number): StepAttempt {\n const path = `detail.attempts[${index}]`;\n const a = record(value, path);\n return {\n attempt: num(a.attempt, `${path}.attempt`),\n status: str(a.status, `${path}.status`),\n ...optional(a, \"error\", (v) => str(v, `${path}.error`)),\n ...optional(a, \"durationMs\", (v) => nonnegative(v, `${path}.durationMs`)),\n ...optional(a, \"result\", (v) => readAttemptResult(v, `${path}.result`)),\n };\n}\n\nfunction readAttempts(value: unknown): StepAttempt[] {\n const attempts = list(value, \"detail.attempts\").map(readAttempt);\n attempts.forEach((attempt, index) => {\n if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);\n });\n return attempts;\n}\n\nfunction readExports(value: unknown): StepExport[] {\n return Object.entries(record(value, \"detail.exports\")).map(([name, raw]) => {\n const path = `detail.exports.${name}`;\n const entry = record(raw, path);\n return { name, value: entry.value, step: str(entry.step, `${path}.step`) };\n });\n}\n\nfunction readEvent(value: unknown, index: number): WatcherEvent {\n const path = `detail.events[${index}]`;\n const e = record(value, path);\n return {\n type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),\n ...optional(e, \"text\", (v) => str(v, `${path}.text`)),\n ...optional(e, \"url\", (v) => str(v, `${path}.url`)),\n ...optional(e, \"status\", (v) => num(v, `${path}.status`)),\n ...optional(e, \"detail\", (v) => str(v, `${path}.detail`)),\n };\n}\n\nfunction readStep(detail: Rec): StepDetail {\n const ref = record(detail.step, \"detail.step\");\n const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));\n return {\n step: { id: str(ref.id, \"detail.step.id\"), kind: str(ref.kind, \"detail.step.kind\") },\n ...(detail.outputs === undefined ? {} : { outputs: detail.outputs }),\n exports: detail.exports == null ? [] : readExports(detail.exports),\n ...optional(detail, \"wait\", readWait),\n attempts: readAttempts(detail.attempts ?? []),\n events: list(detail.events ?? [], \"detail.events\").map(readEvent),\n background: bool(detail.background ?? false, \"detail.background\"),\n rest,\n };\n}\n\n/**\n * Whether `node.detail` carries a typed step (`detail.step`), and if so its\n * parsed contents. A node without `detail.step` is \"none\" whatever else its\n * detail holds; a `step` whose fields violate the contract is \"invalid\" with\n * the offending path, so the view can say so rather than render a guess.\n */\nexport function readStepDetail(detail: unknown): StepDetailResult {\n if (!isRecord(detail) || detail.step === undefined) return { kind: \"none\" };\n try {\n return { kind: \"step\", step: readStep(detail) };\n } catch (error) {\n if (error instanceof StepDetailError) return { kind: \"invalid\", error: error.message };\n throw error;\n }\n}\n\n/** The step detail when there is one, for matchers that only need to know. */\nexport function hasStepDetail(detail: unknown): boolean {\n return readStepDetail(detail).kind !== \"none\";\n}\n\n/** The fixtures.ExecutionNode fields gavel puts at the top of `node.detail`, shown as a header instead of raw JSON. */\nexport type ExecutionHeader = {\n kind?: string;\n state?: string;\n file?: string;\n sectionPath?: string;\n /** Zero-based row of the step within its section. */\n rowIndex?: number;\n line?: number;\n startedAt?: string;\n finishedAt?: string;\n /** Nanoseconds. */\n durationNs?: number;\n error?: string;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n/**\n * Splits the ExecutionNode fields (name, kind, state, origin, started_at,\n * finished_at, duration, error) off `detail` into a header, dropping the\n * internal `key`. A field of an unexpected type is not consumed — it stays in\n * `rest`, so it is visible in the raw block rather than silently hidden.\n */\nexport function splitExecutionDetail(detail: unknown): { header: ExecutionHeader; rest: unknown } {\n if (!isRecord(detail)) return { header: {}, rest: detail };\n const rest: Rec = { ...detail };\n delete rest.key;\n const take = <T>(key: string, guard: (value: unknown) => value is T): T | undefined => {\n const value = rest[key];\n if (!guard(value)) return undefined;\n delete rest[key];\n return value;\n };\n const header: ExecutionHeader = {};\n const assign = <K extends keyof ExecutionHeader>(field: K, value: ExecutionHeader[K] | undefined) => {\n if (value !== undefined) header[field] = value;\n };\n take(\"name\", isString);\n assign(\"kind\", take(\"kind\", isString));\n assign(\"state\", take(\"state\", isString));\n assign(\"startedAt\", take(\"started_at\", isString));\n assign(\"finishedAt\", take(\"finished_at\", isString));\n assign(\"durationNs\", take(\"duration\", isNumber));\n assign(\"error\", take(\"error\", isString));\n const origin = take(\"origin\", isRecord);\n if (origin) {\n assign(\"file\", isString(origin.file) ? origin.file : undefined);\n assign(\"sectionPath\", isString(origin.section_path) ? origin.section_path : undefined);\n assign(\"rowIndex\", isNumber(origin.row_index) ? origin.row_index : undefined);\n assign(\"line\", isNumber(origin.line) ? origin.line : undefined);\n }\n return { header, rest: Object.keys(rest).length > 0 ? rest : undefined };\n}\n\nexport type WaitCondition = \"until\" | \"failWhen\";\n\n/** Which of the wait's two conditions decided its outcome. `expression` is authoritative; older payloads without it are inferred from the outcome. */\nexport function waitDecidedBy(wait: WaitDetail): WaitCondition {\n if (wait.expression !== undefined) return wait.expression === wait.policy.failWhen ? \"failWhen\" : \"until\";\n return wait.outcome === \"failed\" && wait.policy.failWhen ? \"failWhen\" : \"until\";\n}\n\n/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */\nexport function clockTime(at: string): string {\n return /T(\\d{2}:\\d{2}:\\d{2})/.exec(at)?.[1] ?? at;\n}\n\nexport function formatDelay(ms: number): string {\n return ms <= 0 ? \"0ms\" : formatTestDuration(ms * 1e6);\n}\n\n/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */\nexport function policySummary(policy: WaitPolicy): string {\n const backoff = [\n policy.backoff?.factor !== undefined && `×${policy.backoff.factor}`,\n policy.backoff?.max && `up to ${policy.backoff.max}`,\n ].filter(Boolean);\n return [\n policy.interval && `every ${policy.interval}`,\n backoff.length > 0 && `backoff ${backoff.join(\" \")}`,\n policy.jitter && `jitter ±${policy.jitter}`,\n policy.timeout && `timeout ${policy.timeout}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function formatExportValue(value: unknown): string {\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction waitCopy(wait: WaitDetail): BriefSection {\n const { policy } = wait;\n const lines = [\n `outcome: ${wait.outcome}`,\n `elapsed: ${formatDelay(wait.durationMs)}`,\n `policy: ${policySummary(policy)}`,\n policy.until && `until: ${policy.until}`,\n policy.failWhen && `failWhen: ${policy.failWhen}`,\n wait.expression && `decided by: ${wait.expression}`,\n wait.cause && `cause: ${wait.cause}`,\n wait.error && `error: ${wait.error}`,\n wait.trace && `trace: ${wait.trace}`,\n wait.outputs !== undefined && `outputs: ${JSON.stringify(wait.outputs)}`,\n ];\n return { title: \"Wait\", body: lines.filter(Boolean).join(\"\\n\") };\n}\n\nfunction attemptLine(a: StepAttempt): string {\n const head = [`#${a.attempt}`, a.status, a.durationMs !== undefined && formatDelay(a.durationMs)];\n return `${head.filter(Boolean).join(\" \")}${a.error ? ` — ${a.error}` : \"\"}`;\n}\n\nfunction eventLine(e: WatcherEvent): string {\n const body = [e.status, e.text, e.url].filter((part) => part !== undefined).join(\" \");\n return `[${e.type}]${body ? ` ${body}` : \"\"}${e.detail ? ` — ${e.detail}` : \"\"}`;\n}\n\n/** Brief sections for the \"Copy details\" button: wait trace, retry attempts, exports and watcher events. */\nexport function stepKindCopy(step: StepDetail): BriefSection[] {\n return [\n ...(step.outputs !== undefined ? [{ title: \"Outputs\", body: JSON.stringify(step.outputs, null, 2), lang: \"json\" }] : []),\n ...(step.wait ? [waitCopy(step.wait)] : []),\n ...(step.attempts.length > 0 ? [{ title: \"Attempts\", body: step.attempts.map(attemptLine).join(\"\\n\") }] : []),\n ...(step.exports.length > 0\n ? [{ title: \"Exports\", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join(\"\\n\") }]\n : []),\n ...(step.events.length > 0 ? [{ title: \"Events\", body: step.events.map(eventLine).join(\"\\n\") }] : []),\n ];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stepKind.js","names":[],"sources":["../../../src/data/verification/stepKind.ts"],"sourcesContent":["// The typed step-kind detail gavel's fixture verifier attaches to a node\n// (fixtures/verifier/report.go): `detail.step` names the kind and id, beside\n// the structured `wait`, `attempts`, `exports`, `outputs` and (for a\n// background Playwright watcher) `events`. Parsed here, once, so the detail\n// view and the copy brief read the same typed shape. A present-but-malformed\n// field is reported by path instead of being guessed at.\n\nimport type { BriefSection } from \"../test-runner\";\nimport { formatTestDuration } from \"../test-runner\";\nimport type { VerifyNode } from \"./verify-report\";\n\nexport type StepRef = { id: string; kind: string };\n\nexport type WaitPolicy = {\n until?: string;\n failWhen?: string;\n interval?: string;\n backoff?: { factor?: number; max?: string };\n jitter?: string;\n timeout?: string;\n};\n\nexport const WAIT_OUTCOMES = [\"satisfied\", \"failed\", \"timeout\"] as const;\nexport type WaitOutcome = (typeof WAIT_OUTCOMES)[number];\n\nexport type WaitDetail = {\n policy: WaitPolicy;\n outcome: WaitOutcome;\n durationMs: number;\n /** The CEL expression that decided the outcome: policy.failWhen when it fired, else policy.until. */\n expression?: string;\n /** Domain reason the wait ended unsatisfied; may span several lines. */\n cause?: string;\n outputs?: unknown;\n error?: string;\n trace?: string;\n};\n\nexport type StepAttempt = { attempt: number; status: string; error?: string; durationMs?: number; result?: VerifyNode };\n\nexport type StepExport = { name: string; value: unknown; step: string };\n\nexport const WATCHER_EVENT_TYPES = [\"alert\", \"console\", \"pageerror\", \"response\"] as const;\nexport type WatcherEventType = (typeof WATCHER_EVENT_TYPES)[number];\n\nexport type WatcherEvent = {\n type: WatcherEventType;\n text?: string;\n url?: string;\n status?: number;\n detail?: string;\n};\n\nexport type StepDetail = {\n step: StepRef;\n outputs?: unknown;\n exports: StepExport[];\n wait?: WaitDetail;\n attempts: StepAttempt[];\n events: WatcherEvent[];\n /** Whether the step runs in the background until teardown (a watcher). */\n background: boolean;\n /** Everything else in `node.detail` (cel_trace, run, recordings, …). */\n rest: Record<string, unknown>;\n};\n\nexport type StepDetailResult =\n | { kind: \"none\" }\n | { kind: \"step\"; step: StepDetail }\n | { kind: \"invalid\"; error: string };\n\nconst STEP_KEYS = new Set([\"step\", \"outputs\", \"exports\", \"wait\", \"attempts\", \"events\", \"background\"]);\n\nclass StepDetailError extends Error {}\n\nfunction fail(path: string, expectation: string): never {\n throw new StepDetailError(`${path} must be ${expectation}`);\n}\n\ntype Rec = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Rec =>\n value !== null && typeof value === \"object\" && !Array.isArray(value);\n\nfunction record(value: unknown, path: string): Rec {\n return isRecord(value) ? value : fail(path, \"an object\");\n}\n\nfunction list(value: unknown, path: string): unknown[] {\n return Array.isArray(value) ? value : fail(path, \"an array\");\n}\n\nfunction str(value: unknown, path: string): string {\n return typeof value === \"string\" ? value : fail(path, \"a string\");\n}\n\nfunction num(value: unknown, path: string): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fail(path, \"a number\");\n}\n\nfunction bool(value: unknown, path: string): boolean {\n return typeof value === \"boolean\" ? value : fail(path, \"a boolean\");\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], path: string): T {\n return allowed.includes(value as T)\n ? (value as T)\n : fail(path, `one of ${allowed.join(\", \")} (got ${JSON.stringify(value)})`);\n}\n\n/** `{ [key]: read(value) }` when the optional field is present, else `{}` — absent stays an absent key. */\nfunction optional<K extends string, T>(source: Rec, key: K, read: (value: unknown) => T): { [P in K]?: T } {\n return source[key] === undefined || source[key] === null ? {} : ({ [key]: read(source[key]) } as { [P in K]?: T });\n}\n\n/** Durations arrive as Go-style strings (\"15s\"); a bare number is nanoseconds like every other duration on the wire. */\nfunction durationText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return formatTestDuration(value);\n return fail(path, \"a duration string or nanosecond number\");\n}\n\nfunction scalarText(value: unknown, path: string): string {\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n return fail(path, \"a string or number\");\n}\n\nfunction readPolicy(value: unknown): WaitPolicy {\n const path = \"detail.wait.policy\";\n const policy = record(value, path);\n const backoff = (raw: unknown) => {\n const b = record(raw, `${path}.backoff`);\n return {\n ...optional(b, \"factor\", (v) => num(v, `${path}.backoff.factor`)),\n ...optional(b, \"max\", (v) => durationText(v, `${path}.backoff.max`)),\n };\n };\n return {\n ...optional(policy, \"until\", (v) => str(v, `${path}.until`)),\n ...optional(policy, \"failWhen\", (v) => str(v, `${path}.failWhen`)),\n ...optional(policy, \"interval\", (v) => durationText(v, `${path}.interval`)),\n ...optional(policy, \"backoff\", backoff),\n ...optional(policy, \"jitter\", (v) => scalarText(v, `${path}.jitter`)),\n ...optional(policy, \"timeout\", (v) => durationText(v, `${path}.timeout`)),\n };\n}\n\nfunction readWait(value: unknown): WaitDetail {\n const wait = record(value, \"detail.wait\");\n return {\n policy: readPolicy(wait.policy ?? {}),\n outcome: oneOf(wait.outcome, WAIT_OUTCOMES, \"detail.wait.outcome\"),\n durationMs: nonnegative(wait.durationMs, \"detail.wait.durationMs\"),\n ...(wait.outputs === undefined ? {} : { outputs: wait.outputs }),\n ...optional(wait, \"expression\", (v) => str(v, \"detail.wait.expression\")),\n ...optional(wait, \"cause\", (v) => str(v, \"detail.wait.cause\")),\n ...optional(wait, \"error\", (v) => str(v, \"detail.wait.error\")),\n ...optional(wait, \"trace\", (v) => str(v, \"detail.wait.trace\")),\n };\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n const result = num(value, path);\n return result >= 0 ? result : fail(path, \"non-negative\");\n}\n\nfunction readAttemptResult(value: unknown, path: string): VerifyNode {\n const node = record(value, path);\n str(node.name, `${path}.name`);\n for (const key of [\"framework\", \"message\", \"command\", \"work_dir\", \"stdout\", \"stderr\"]) {\n if (node[key] !== undefined) str(node[key], `${path}.${key}`);\n }\n for (const key of [\"passed\", \"failed\", \"timed_out\", \"warned\", \"skipped\", \"pending\", \"running\"]) {\n if (node[key] !== undefined) bool(node[key], `${path}.${key}`);\n }\n if (node.duration !== undefined) nonnegative(node.duration, `${path}.duration`);\n if (node.detail !== undefined) record(node.detail, `${path}.detail`);\n if (node.children !== undefined) list(node.children, `${path}.children`).forEach((child, i) => readAttemptResult(child, `${path}.children[${i}]`));\n return { ...node, name: str(node.name, `${path}.name`) } as VerifyNode;\n}\n\nfunction readAttempt(value: unknown, index: number): StepAttempt {\n const path = `detail.attempts[${index}]`;\n const a = record(value, path);\n return {\n attempt: num(a.attempt, `${path}.attempt`),\n status: str(a.status, `${path}.status`),\n ...optional(a, \"error\", (v) => str(v, `${path}.error`)),\n ...optional(a, \"durationMs\", (v) => nonnegative(v, `${path}.durationMs`)),\n ...optional(a, \"result\", (v) => readAttemptResult(v, `${path}.result`)),\n };\n}\n\nfunction readAttempts(value: unknown): StepAttempt[] {\n const attempts = list(value, \"detail.attempts\").map(readAttempt);\n attempts.forEach((attempt, index) => {\n if (attempt.attempt !== index + 1) fail(`detail.attempts[${index}].attempt`, `the sequence number ${index + 1}`);\n });\n return attempts;\n}\n\nfunction readExports(value: unknown): StepExport[] {\n return Object.entries(record(value, \"detail.exports\")).map(([name, raw]) => {\n const path = `detail.exports.${name}`;\n const entry = record(raw, path);\n return { name, value: entry.value, step: str(entry.step, `${path}.step`) };\n });\n}\n\nfunction readEvent(value: unknown, index: number): WatcherEvent {\n const path = `detail.events[${index}]`;\n const e = record(value, path);\n return {\n type: oneOf(e.type, WATCHER_EVENT_TYPES, `${path}.type`),\n ...optional(e, \"text\", (v) => str(v, `${path}.text`)),\n ...optional(e, \"url\", (v) => str(v, `${path}.url`)),\n ...optional(e, \"status\", (v) => num(v, `${path}.status`)),\n ...optional(e, \"detail\", (v) => str(v, `${path}.detail`)),\n };\n}\n\nfunction readStep(detail: Rec): StepDetail {\n const ref = record(detail.step, \"detail.step\");\n const rest = Object.fromEntries(Object.entries(detail).filter(([key]) => !STEP_KEYS.has(key)));\n return {\n step: { id: str(ref.id, \"detail.step.id\"), kind: str(ref.kind, \"detail.step.kind\") },\n ...(detail.outputs === undefined ? {} : { outputs: detail.outputs }),\n exports: detail.exports == null ? [] : readExports(detail.exports),\n ...optional(detail, \"wait\", readWait),\n attempts: readAttempts(detail.attempts ?? []),\n events: list(detail.events ?? [], \"detail.events\").map(readEvent),\n background: bool(detail.background ?? false, \"detail.background\"),\n rest,\n };\n}\n\n/**\n * Whether `node.detail` carries a typed step (`detail.step`), and if so its\n * parsed contents. A node without `detail.step` is \"none\" whatever else its\n * detail holds; a `step` whose fields violate the contract is \"invalid\" with\n * the offending path, so the view can say so rather than render a guess.\n */\nexport function readStepDetail(detail: unknown): StepDetailResult {\n if (!isRecord(detail) || detail.step === undefined) return { kind: \"none\" };\n try {\n return { kind: \"step\", step: readStep(detail) };\n } catch (error) {\n if (error instanceof StepDetailError) return { kind: \"invalid\", error: error.message };\n throw error;\n }\n}\n\n/** The step detail when there is one, for matchers that only need to know. */\nexport function hasStepDetail(detail: unknown): boolean {\n return readStepDetail(detail).kind !== \"none\";\n}\n\n/** The fixtures.ExecutionNode fields gavel puts at the top of `node.detail`, shown as a header instead of raw JSON. */\nexport type ExecutionHeader = {\n kind?: string;\n state?: string;\n file?: string;\n sectionPath?: string;\n /** Zero-based row of the step within its section. */\n rowIndex?: number;\n line?: number;\n startedAt?: string;\n finishedAt?: string;\n /** Nanoseconds. */\n durationNs?: number;\n error?: string;\n};\n\nconst isString = (value: unknown): value is string => typeof value === \"string\";\nconst isNumber = (value: unknown): value is number => typeof value === \"number\" && Number.isFinite(value);\n\n/**\n * Splits the ExecutionNode fields (name, kind, state, origin, started_at,\n * finished_at, duration, error) off `detail` into a header, dropping the\n * internal `key`. A field of an unexpected type is not consumed — it stays in\n * `rest`, so it is visible in the raw block rather than silently hidden.\n */\nexport function splitExecutionDetail(detail: unknown): { header: ExecutionHeader; rest: unknown } {\n if (!isRecord(detail)) return { header: {}, rest: detail };\n const rest: Rec = { ...detail };\n delete rest.key;\n const take = <T>(key: string, guard: (value: unknown) => value is T): T | undefined => {\n const value = rest[key];\n if (!guard(value)) return undefined;\n delete rest[key];\n return value;\n };\n const header: ExecutionHeader = {};\n const assign = <K extends keyof ExecutionHeader>(field: K, value: ExecutionHeader[K] | undefined) => {\n if (value !== undefined) header[field] = value;\n };\n take(\"name\", isString);\n assign(\"kind\", take(\"kind\", isString));\n assign(\"state\", take(\"state\", isString));\n assign(\"startedAt\", take(\"started_at\", isString));\n assign(\"finishedAt\", take(\"finished_at\", isString));\n assign(\"durationNs\", take(\"duration\", isNumber));\n assign(\"error\", take(\"error\", isString));\n const origin = take(\"origin\", isRecord);\n if (origin) {\n assign(\"file\", isString(origin.file) ? origin.file : undefined);\n assign(\"sectionPath\", isString(origin.section_path) ? origin.section_path : undefined);\n assign(\"rowIndex\", isNumber(origin.row_index) ? origin.row_index : undefined);\n assign(\"line\", isNumber(origin.line) ? origin.line : undefined);\n }\n return { header, rest: Object.keys(rest).length > 0 ? rest : undefined };\n}\n\nexport type WaitCondition = \"until\" | \"failWhen\";\n\n/** Which of the wait's two conditions decided its outcome. `expression` is authoritative; older payloads without it are inferred from the outcome. */\nexport function waitDecidedBy(wait: WaitDetail): WaitCondition {\n if (wait.expression !== undefined) return wait.expression === wait.policy.failWhen ? \"failWhen\" : \"until\";\n return wait.outcome === \"failed\" && wait.policy.failWhen ? \"failWhen\" : \"until\";\n}\n\n/** `09:00:04` from an RFC 3339 timestamp, as written (no timezone conversion); anything else verbatim. */\nexport function clockTime(at: string): string {\n return /T(\\d{2}:\\d{2}:\\d{2})/.exec(at)?.[1] ?? at;\n}\n\nexport function formatDelay(ms: number): string {\n return ms <= 0 ? \"0ms\" : formatTestDuration(ms * 1e6);\n}\n\n/** `every 1s · backoff ×1.5 up to 10s · jitter ±20% · timeout 3m`, skipping what the policy leaves unset. */\nexport function policySummary(policy: WaitPolicy): string {\n const backoff = [\n policy.backoff?.factor !== undefined && `×${policy.backoff.factor}`,\n policy.backoff?.max && `up to ${policy.backoff.max}`,\n ].filter(Boolean);\n return [\n policy.interval && `every ${policy.interval}`,\n backoff.length > 0 && `backoff ${backoff.join(\" \")}`,\n policy.jitter && `jitter ±${policy.jitter}`,\n policy.timeout && `timeout ${policy.timeout}`,\n ]\n .filter(Boolean)\n .join(\" · \");\n}\n\nexport function formatExportValue(value: unknown): string {\n if (value === undefined) return \"\";\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n\nfunction waitCopy(wait: WaitDetail): BriefSection {\n const { policy } = wait;\n const lines = [\n `outcome: ${wait.outcome}`,\n `elapsed: ${formatDelay(wait.durationMs)}`,\n `policy: ${policySummary(policy)}`,\n policy.until && `until: ${policy.until}`,\n policy.failWhen && `failWhen: ${policy.failWhen}`,\n wait.expression && `decided by: ${wait.expression}`,\n wait.cause && `cause: ${wait.cause}`,\n wait.error && `error: ${wait.error}`,\n wait.trace && `trace: ${wait.trace}`,\n wait.outputs !== undefined && `outputs: ${JSON.stringify(wait.outputs)}`,\n ];\n return { title: \"Wait\", body: lines.filter(Boolean).join(\"\\n\") };\n}\n\nfunction attemptLine(a: StepAttempt): string {\n const head = [`#${a.attempt}`, a.status, a.durationMs !== undefined && formatDelay(a.durationMs)];\n return `${head.filter(Boolean).join(\" \")}${a.error ? ` — ${a.error}` : \"\"}`;\n}\n\nfunction eventLine(e: WatcherEvent): string {\n const body = [e.status, e.text, e.url].filter((part) => part !== undefined).join(\" \");\n return `[${e.type}]${body ? ` ${body}` : \"\"}${e.detail ? ` — ${e.detail}` : \"\"}`;\n}\n\n/** Brief sections for the \"Copy details\" button: wait trace, retry attempts, exports and watcher events. */\nexport function stepKindCopy(step: StepDetail): BriefSection[] {\n return [\n ...(step.outputs !== undefined ? [{ title: \"Outputs\", body: JSON.stringify(step.outputs, null, 2), lang: \"json\" }] : []),\n ...(step.wait ? [waitCopy(step.wait)] : []),\n ...(step.attempts.length > 0 ? [{ title: \"Attempts\", body: step.attempts.map(attemptLine).join(\"\\n\") }] : []),\n ...(step.exports.length > 0\n ? [{ title: \"Exports\", body: step.exports.map((e) => `${e.name}=${formatExportValue(e.value)} (from ${e.step})`).join(\"\\n\") }]\n : []),\n ...(step.events.length > 0 ? [{ title: \"Events\", body: step.events.map(eventLine).join(\"\\n\") }] : []),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const require_utils = require("../../lib/utils.cjs");
|
|
2
|
+
const require_UiHourglass = require("../../icons/components/UiHourglass.cjs");
|
|
2
3
|
const require_button = require("../../components/button.cjs");
|
|
3
4
|
const require_Badge = require("../Badge.cjs");
|
|
4
5
|
const require_JsonView = require("../JsonView.cjs");
|
|
@@ -22,6 +23,21 @@ function Section({ name, title, aside, children }) {
|
|
|
22
23
|
}), children]
|
|
23
24
|
});
|
|
24
25
|
}
|
|
26
|
+
/** The host's answerable form for a step waiting on a person. */
|
|
27
|
+
function StepPendingFormSection({ children }) {
|
|
28
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Section, {
|
|
29
|
+
name: "pending-form",
|
|
30
|
+
title: "Form",
|
|
31
|
+
aside: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
|
|
32
|
+
tone: "warning",
|
|
33
|
+
size: "xs",
|
|
34
|
+
icon: require_UiHourglass.UiHourglass,
|
|
35
|
+
clickToCopy: false,
|
|
36
|
+
children: "Awaiting answer"
|
|
37
|
+
}),
|
|
38
|
+
children
|
|
39
|
+
});
|
|
40
|
+
}
|
|
25
41
|
var OUTCOME_BADGE = {
|
|
26
42
|
satisfied: {
|
|
27
43
|
label: "Satisfied",
|
|
@@ -405,6 +421,7 @@ exports.FailureCallout = FailureCallout;
|
|
|
405
421
|
exports.MalformedStepDetail = MalformedStepDetail;
|
|
406
422
|
exports.StepKindSections = StepKindSections;
|
|
407
423
|
exports.StepOutputs = StepOutputs;
|
|
424
|
+
exports.StepPendingFormSection = StepPendingFormSection;
|
|
408
425
|
exports.StepSourceSection = StepSourceSection;
|
|
409
426
|
exports.StepWait = StepWait;
|
|
410
427
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepKindViews.cjs","names":["Badge","policySummary","waitDecidedBy","formatDelay","Button","JsonView","clockTime","formatTestDuration","cn","formatExportValue","useSelectDetailTab","_Fragment","CodeBlock"],"sources":["../../../src/data/verification/stepKindViews.tsx"],"sourcesContent":["// Detail sections for a typed fixture step (see stepKind.ts): the wait\n// timeline, retry attempts, exported variables, outputs and a background\n// watcher's events. Rendered inside FixtureDetail; split out so adapterViews.tsx\n// stays focused on the command/CEL body.\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Badge, type BadgeTone } from \"../Badge\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { JsonView } from \"../JsonView\";\nimport type { StepSourceResult } from \"./stepSource\";\nimport { formatTestDuration, useSelectDetailTab } from \"../test-runner\";\nimport {\n clockTime,\n formatDelay,\n formatExportValue,\n policySummary,\n waitDecidedBy,\n type ExecutionHeader,\n type StepDetail,\n type StepExport,\n type WaitCondition,\n type WaitDetail,\n type WaitOutcome,\n type WatcherEvent,\n} from \"./stepKind\";\n\nconst ALERT_ROW = \"border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400\";\n\nfunction Section({ name, title, aside, children }: { name: string; title: string; aside?: ReactNode; children: ReactNode }) {\n return (\n <section className=\"min-w-0 space-y-1.5\" data-step-section={name}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{title}</div>\n {aside}\n </div>\n {children}\n </section>\n );\n}\n\n// ── Wait ────────────────────────────────────────────────────────────────────\n\nconst OUTCOME_BADGE: Record<WaitOutcome, { label: string; tone: BadgeTone }> = {\n satisfied: { label: \"Satisfied\", tone: \"success\" },\n failed: { label: \"Failed\", tone: \"danger\" },\n timeout: { label: \"Timed out\", tone: \"warning\" },\n};\n\nfunction WaitConditionRow({ condition, expression, decisive, wait }: { condition: WaitCondition; expression: string; decisive: boolean; wait: WaitDetail }) {\n const { label, tone } = OUTCOME_BADGE[wait.outcome];\n return (\n <li className=\"flex min-w-0 items-center gap-2\" data-wait-condition={condition} {...(decisive ? { \"data-wait-decisive\": \"\" } : {})}>\n <span className=\"w-14 shrink-0 text-muted-foreground\">{condition}</span>\n <code className=\"min-w-0 shrink break-words font-mono\">{expression}</code>\n {decisive && <Badge size=\"xs\" clickToCopy={false} tone={tone}>{label}</Badge>}\n </li>\n );\n}\n\n/**\n * The wait's conditions (the deciding one carries the outcome), elapsed time and\n * schedule. `onViewOutputs` links to the host's Outputs tab; without it the\n * observed outputs render inline, collapsed to depth 1, inside the details.\n */\nexport function StepWait({ wait, onViewOutputs }: { wait: WaitDetail; onViewOutputs?: () => void }) {\n const { policy } = wait;\n const schedule = policySummary(policy);\n const decidedBy = waitDecidedBy(wait);\n const inlineOutputs = wait.outputs !== undefined && !onViewOutputs;\n return (\n <section className=\"min-w-0 text-[11px]\" data-step-section=\"wait\">\n <div className=\"flex min-w-0 items-center gap-2\" data-wait-summary=\"\">\n <span className=\"shrink-0 text-muted-foreground\">Wait</span>\n <Badge size=\"xs\" clickToCopy={false}>{formatDelay(wait.durationMs)}</Badge>\n {wait.outputs !== undefined && onViewOutputs && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto px-0 text-[11px]\" onClick={onViewOutputs}>View outputs</Button>\n )}\n </div>\n <ul className=\"mt-1 space-y-0.5\" data-wait-conditions=\"\">\n <WaitConditionRow condition=\"until\" expression={policy.until ?? \"Service readiness\"} decisive={decidedBy === \"until\"} wait={wait} />\n {policy.failWhen && <WaitConditionRow condition=\"failWhen\" expression={policy.failWhen} decisive={decidedBy === \"failWhen\"} wait={wait} />}\n </ul>\n {(schedule || wait.error || wait.trace || inlineOutputs) && (\n <details className=\"mt-1 text-muted-foreground\" open={wait.outcome !== \"satisfied\"}>\n <summary className=\"cursor-pointer\">Wait details</summary>\n <div className=\"mt-1 space-y-1 break-words\">\n {schedule && <p>{schedule}</p>}\n {wait.error && <p className=\"text-destructive\">{wait.error}</p>}\n {wait.trace && <pre className=\"whitespace-pre-wrap\">{wait.trace}</pre>}\n {inlineOutputs && (\n <div className=\"min-w-0\" data-wait-outputs=\"\">\n <div className=\"text-[10px] uppercase tracking-wide\">Outputs</div>\n <JsonView data={wait.outputs} defaultOpenDepth={1} />\n </div>\n )}\n </div>\n </details>\n )}\n </section>\n );\n}\n\n// ── Execution header ────────────────────────────────────────────────────────\n\nconst STATE_TONE: Record<string, BadgeTone> = { passed: \"success\", failed: \"danger\", warned: \"warning\", timedout: \"warning\", running: \"info\" };\n\nfunction basename(path: string): string {\n return path.split(\"/\").filter(Boolean).at(-1) ?? path;\n}\n\nfunction stepPosition({ rowIndex, line }: ExecutionHeader): string | undefined {\n // gavel numbers steps and table rows from 1.\n if (rowIndex !== undefined) return `step #${rowIndex}`;\n return line !== undefined ? `line ${line}` : undefined;\n}\n\n/** Where a fixture step came from (file · step · section), its kind and state, and when it ran. */\nexport function ExecutionHeaderView({ header, stepKind }: { header: ExecutionHeader; stepKind?: string }) {\n const place = [stepPosition(header), header.sectionPath].filter(Boolean).join(\" · \");\n const kinds = [header.kind, stepKind].filter((kind, i, all): kind is string => !!kind && all.indexOf(kind) === i);\n const window = header.startedAt && header.finishedAt ? `${clockTime(header.startedAt)} → ${clockTime(header.finishedAt)}` : header.startedAt ? `started ${clockTime(header.startedAt)}` : undefined;\n if (!header.file && !place && kinds.length === 0 && !header.state && !window && header.durationNs === undefined) return null;\n return (\n <div className=\"min-w-0 space-y-1\" data-execution-header=\"\">\n {(header.file || place) && (\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-1.5 text-xs\">\n {header.file && <span className=\"font-medium\" title={header.file}>{basename(header.file)}</span>}\n {header.file && place && <span className=\"text-muted-foreground\">·</span>}\n {place && <span className=\"min-w-0 break-words text-muted-foreground\">{place}</span>}\n </div>\n )}\n <div className=\"flex min-w-0 flex-wrap items-center gap-2 text-[11px] text-muted-foreground\">\n {kinds.map((kind) => <Badge key={kind} size=\"xs\" clickToCopy={false}>{kind}</Badge>)}\n {header.state && <Badge size=\"xs\" clickToCopy={false} tone={STATE_TONE[header.state] ?? \"neutral\"}>{header.state}</Badge>}\n {window && <span className=\"font-mono\">{window}</span>}\n {header.durationNs !== undefined && <span>{formatTestDuration(header.durationNs)}</span>}\n </div>\n </div>\n );\n}\n\n/** A failure message as a red bordered block that keeps the line breaks of multi-line causes. */\nexport function FailureCallout({ children }: { children: ReactNode }) {\n return (\n <div className={cn(\"whitespace-pre-wrap break-words rounded border px-2 py-1.5 text-sm\", ALERT_ROW)} data-failure-callout=\"\">\n {children}\n </div>\n );\n}\n\n// ── Exports ─────────────────────────────────────────────────────────────────\n\nfunction ExportsTable({ exports }: { exports: StepExport[] }) {\n return (\n <table className=\"w-full table-fixed border-collapse text-left text-[11px]\">\n <thead className=\"text-muted-foreground\">\n <tr className=\"border-b border-border\">\n <th className=\"w-[28%] py-1 pr-2 font-medium\">Name</th>\n <th className=\"py-1 pr-2 font-medium\">Value</th>\n <th className=\"w-[18%] py-1 font-medium\">Step</th>\n </tr>\n </thead>\n <tbody className=\"font-mono\">\n {exports.map((entry) => (\n <tr key={entry.name} className=\"border-b border-border/60 align-top last:border-0\">\n <td className=\"break-words py-1 pr-2\">{entry.name}</td>\n <td className=\"break-all py-1 pr-2\">{formatExportValue(entry.value)}</td>\n <td className=\"break-words py-1 text-muted-foreground\">{entry.step}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n// ── Watcher events ──────────────────────────────────────────────────────────\n\nfunction isAlarming(event: WatcherEvent): boolean {\n return event.type === \"alert\" || event.type === \"pageerror\" || (event.type === \"response\" && (event.status ?? 0) >= 400);\n}\n\nfunction EventRow({ event }: { event: WatcherEvent }) {\n const alarming = isAlarming(event);\n return (\n <li\n className={cn(\"space-y-0.5 rounded border px-2 py-1 text-[11px]\", alarming ? ALERT_ROW : \"border-border\")}\n data-event-type={event.type}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge size=\"xs\" clickToCopy={false} tone={alarming ? \"danger\" : \"neutral\"}>{event.type}</Badge>\n {event.status !== undefined && <span className=\"font-mono\">{event.status}</span>}\n {event.text && <span className={cn(\"min-w-0 break-words\", event.type === \"alert\" && \"font-medium\")}>{event.text}</span>}\n </div>\n {event.url && <div className=\"break-all font-mono text-[10px] opacity-80\">{event.url}</div>}\n {event.detail && <p className=\"whitespace-pre-wrap break-words\">{event.detail}</p>}\n </li>\n );\n}\n\n// ── Whole step ──────────────────────────────────────────────────────────────\n\n/** Execution sections for a typed fixture step; final outputs render separately. */\nexport function StepKindSections({ step, renderWait }: { step: StepDetail; renderWait?: (wait: WaitDetail) => ReactNode }) {\n const selectTab = useSelectDetailTab();\n const viewOutputs = selectTab && step.outputs !== undefined ? () => selectTab(\"outputs\") : undefined;\n return (\n <>\n <div className=\"text-[11px] text-muted-foreground\" data-step-ref=\"\">\n {step.step.kind} · {step.step.id}\n {step.background && \" · background\"}\n </div>\n {step.wait && (renderWait ? renderWait(step.wait) : <StepWait wait={step.wait} {...(viewOutputs ? { onViewOutputs: viewOutputs } : {})} />)}\n {step.events.length > 0 && (\n <Section name=\"events\" title=\"Events\">\n <ul className=\"space-y-1\">\n {step.events.map((event, index) => (\n <EventRow key={index} event={event} />\n ))}\n </ul>\n </Section>\n )}\n {step.exports.length > 0 && (\n <Section name=\"exports\" title=\"Exports\">\n <ExportsTable exports={step.exports} />\n </Section>\n )}\n </>\n );\n}\n\nexport function StepOutputs({ outputs }: { outputs: unknown }) {\n return (\n <div className=\"min-w-0 p-density-4\" data-step-section=\"outputs\">\n <JsonView data={outputs} />\n </div>\n );\n}\n\n/** Shown in place of the sections when `detail.step` is present but breaks the contract. */\n// ── Source ──────────────────────────────────────────────────────────────────\n\n/** The YAML or markdown lines a failed step was written as, under its file and line range. */\nexport function StepSourceSection({ result }: { result: StepSourceResult }) {\n if (result.kind === \"none\") return null;\n if (result.kind === \"invalid\") {\n return (\n <div data-step-source=\"\">\n <Section name=\"source\" title=\"Source\">\n <MalformedNotice>Malformed source detail: {result.error}</MalformedNotice>\n </Section>\n </div>\n );\n }\n const { source } = result;\n const location = <span className=\"font-mono text-[11px] text-muted-foreground\" title={source.file}>{basename(source.file)}:{source.line}-{source.endLine}</span>;\n return (\n <div data-step-source=\"\">\n <Section name=\"source\" title=\"Source\" aside={location}>\n {source.error ? (\n <div className={cn(\"rounded border px-2 py-1 text-xs\", ALERT_ROW)}>Source unavailable: {source.error}</div>\n ) : (\n <CodeBlock language={source.language} source={source.text ?? \"\"} copyable />\n )}\n {source.moreLines ? <div className=\"text-[11px] text-muted-foreground\">… {source.moreLines} more lines</div> : null}\n </Section>\n </div>\n );\n}\n\nfunction MalformedNotice({ children }: { children: ReactNode }) {\n return (\n <div role=\"alert\" className=\"rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400\">\n {children}\n </div>\n );\n}\n\nexport function MalformedStepDetail({ error }: { error: string }) {\n return <MalformedNotice>Malformed step detail: {error}</MalformedNotice>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stepKindViews.cjs","names":["Badge","UiHourglass","policySummary","waitDecidedBy","formatDelay","Button","JsonView","clockTime","formatTestDuration","cn","formatExportValue","useSelectDetailTab","_Fragment","CodeBlock"],"sources":["../../../src/data/verification/stepKindViews.tsx"],"sourcesContent":["// Detail sections for a typed fixture step (see stepKind.ts): the wait\n// timeline, retry attempts, exported variables, outputs and a background\n// watcher's events. Rendered inside FixtureDetail; split out so adapterViews.tsx\n// stays focused on the command/CEL body.\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../../components/button\";\nimport { Badge, type BadgeTone } from \"../Badge\";\nimport { CodeBlock } from \"../CodeBlock\";\nimport { JsonView } from \"../JsonView\";\nimport type { StepSourceResult } from \"./stepSource\";\nimport { formatTestDuration, useSelectDetailTab } from \"../test-runner\";\nimport { UiHourglass } from \"../../icons\";\nimport {\n clockTime,\n formatDelay,\n formatExportValue,\n policySummary,\n waitDecidedBy,\n type ExecutionHeader,\n type StepDetail,\n type StepExport,\n type WaitCondition,\n type WaitDetail,\n type WaitOutcome,\n type WatcherEvent,\n} from \"./stepKind\";\n\nconst ALERT_ROW = \"border-red-500/60 bg-red-500/10 text-red-700 dark:text-red-400\";\n\nfunction Section({ name, title, aside, children }: { name: string; title: string; aside?: ReactNode; children: ReactNode }) {\n return (\n <section className=\"min-w-0 space-y-1.5\" data-step-section={name}>\n <div className=\"flex items-center gap-2\">\n <div className=\"text-[10px] uppercase tracking-wide text-muted-foreground\">{title}</div>\n {aside}\n </div>\n {children}\n </section>\n );\n}\n\n/** The host's answerable form for a step waiting on a person. */\nexport function StepPendingFormSection({ children }: { children: ReactNode }) {\n return (\n <Section\n name=\"pending-form\"\n title=\"Form\"\n aside={<Badge tone=\"warning\" size=\"xs\" icon={UiHourglass} clickToCopy={false}>Awaiting answer</Badge>}\n >\n {children}\n </Section>\n );\n}\n\n// ── Wait ────────────────────────────────────────────────────────────────────\n\nconst OUTCOME_BADGE: Record<WaitOutcome, { label: string; tone: BadgeTone }> = {\n satisfied: { label: \"Satisfied\", tone: \"success\" },\n failed: { label: \"Failed\", tone: \"danger\" },\n timeout: { label: \"Timed out\", tone: \"warning\" },\n};\n\nfunction WaitConditionRow({ condition, expression, decisive, wait }: { condition: WaitCondition; expression: string; decisive: boolean; wait: WaitDetail }) {\n const { label, tone } = OUTCOME_BADGE[wait.outcome];\n return (\n <li className=\"flex min-w-0 items-center gap-2\" data-wait-condition={condition} {...(decisive ? { \"data-wait-decisive\": \"\" } : {})}>\n <span className=\"w-14 shrink-0 text-muted-foreground\">{condition}</span>\n <code className=\"min-w-0 shrink break-words font-mono\">{expression}</code>\n {decisive && <Badge size=\"xs\" clickToCopy={false} tone={tone}>{label}</Badge>}\n </li>\n );\n}\n\n/**\n * The wait's conditions (the deciding one carries the outcome), elapsed time and\n * schedule. `onViewOutputs` links to the host's Outputs tab; without it the\n * observed outputs render inline, collapsed to depth 1, inside the details.\n */\nexport function StepWait({ wait, onViewOutputs }: { wait: WaitDetail; onViewOutputs?: () => void }) {\n const { policy } = wait;\n const schedule = policySummary(policy);\n const decidedBy = waitDecidedBy(wait);\n const inlineOutputs = wait.outputs !== undefined && !onViewOutputs;\n return (\n <section className=\"min-w-0 text-[11px]\" data-step-section=\"wait\">\n <div className=\"flex min-w-0 items-center gap-2\" data-wait-summary=\"\">\n <span className=\"shrink-0 text-muted-foreground\">Wait</span>\n <Badge size=\"xs\" clickToCopy={false}>{formatDelay(wait.durationMs)}</Badge>\n {wait.outputs !== undefined && onViewOutputs && (\n <Button type=\"button\" variant=\"link\" size=\"sm\" className=\"h-auto px-0 text-[11px]\" onClick={onViewOutputs}>View outputs</Button>\n )}\n </div>\n <ul className=\"mt-1 space-y-0.5\" data-wait-conditions=\"\">\n <WaitConditionRow condition=\"until\" expression={policy.until ?? \"Service readiness\"} decisive={decidedBy === \"until\"} wait={wait} />\n {policy.failWhen && <WaitConditionRow condition=\"failWhen\" expression={policy.failWhen} decisive={decidedBy === \"failWhen\"} wait={wait} />}\n </ul>\n {(schedule || wait.error || wait.trace || inlineOutputs) && (\n <details className=\"mt-1 text-muted-foreground\" open={wait.outcome !== \"satisfied\"}>\n <summary className=\"cursor-pointer\">Wait details</summary>\n <div className=\"mt-1 space-y-1 break-words\">\n {schedule && <p>{schedule}</p>}\n {wait.error && <p className=\"text-destructive\">{wait.error}</p>}\n {wait.trace && <pre className=\"whitespace-pre-wrap\">{wait.trace}</pre>}\n {inlineOutputs && (\n <div className=\"min-w-0\" data-wait-outputs=\"\">\n <div className=\"text-[10px] uppercase tracking-wide\">Outputs</div>\n <JsonView data={wait.outputs} defaultOpenDepth={1} />\n </div>\n )}\n </div>\n </details>\n )}\n </section>\n );\n}\n\n// ── Execution header ────────────────────────────────────────────────────────\n\nconst STATE_TONE: Record<string, BadgeTone> = { passed: \"success\", failed: \"danger\", warned: \"warning\", timedout: \"warning\", running: \"info\" };\n\nfunction basename(path: string): string {\n return path.split(\"/\").filter(Boolean).at(-1) ?? path;\n}\n\nfunction stepPosition({ rowIndex, line }: ExecutionHeader): string | undefined {\n // gavel numbers steps and table rows from 1.\n if (rowIndex !== undefined) return `step #${rowIndex}`;\n return line !== undefined ? `line ${line}` : undefined;\n}\n\n/** Where a fixture step came from (file · step · section), its kind and state, and when it ran. */\nexport function ExecutionHeaderView({ header, stepKind }: { header: ExecutionHeader; stepKind?: string }) {\n const place = [stepPosition(header), header.sectionPath].filter(Boolean).join(\" · \");\n const kinds = [header.kind, stepKind].filter((kind, i, all): kind is string => !!kind && all.indexOf(kind) === i);\n const window = header.startedAt && header.finishedAt ? `${clockTime(header.startedAt)} → ${clockTime(header.finishedAt)}` : header.startedAt ? `started ${clockTime(header.startedAt)}` : undefined;\n if (!header.file && !place && kinds.length === 0 && !header.state && !window && header.durationNs === undefined) return null;\n return (\n <div className=\"min-w-0 space-y-1\" data-execution-header=\"\">\n {(header.file || place) && (\n <div className=\"flex min-w-0 flex-wrap items-baseline gap-x-1.5 text-xs\">\n {header.file && <span className=\"font-medium\" title={header.file}>{basename(header.file)}</span>}\n {header.file && place && <span className=\"text-muted-foreground\">·</span>}\n {place && <span className=\"min-w-0 break-words text-muted-foreground\">{place}</span>}\n </div>\n )}\n <div className=\"flex min-w-0 flex-wrap items-center gap-2 text-[11px] text-muted-foreground\">\n {kinds.map((kind) => <Badge key={kind} size=\"xs\" clickToCopy={false}>{kind}</Badge>)}\n {header.state && <Badge size=\"xs\" clickToCopy={false} tone={STATE_TONE[header.state] ?? \"neutral\"}>{header.state}</Badge>}\n {window && <span className=\"font-mono\">{window}</span>}\n {header.durationNs !== undefined && <span>{formatTestDuration(header.durationNs)}</span>}\n </div>\n </div>\n );\n}\n\n/** A failure message as a red bordered block that keeps the line breaks of multi-line causes. */\nexport function FailureCallout({ children }: { children: ReactNode }) {\n return (\n <div className={cn(\"whitespace-pre-wrap break-words rounded border px-2 py-1.5 text-sm\", ALERT_ROW)} data-failure-callout=\"\">\n {children}\n </div>\n );\n}\n\n// ── Exports ─────────────────────────────────────────────────────────────────\n\nfunction ExportsTable({ exports }: { exports: StepExport[] }) {\n return (\n <table className=\"w-full table-fixed border-collapse text-left text-[11px]\">\n <thead className=\"text-muted-foreground\">\n <tr className=\"border-b border-border\">\n <th className=\"w-[28%] py-1 pr-2 font-medium\">Name</th>\n <th className=\"py-1 pr-2 font-medium\">Value</th>\n <th className=\"w-[18%] py-1 font-medium\">Step</th>\n </tr>\n </thead>\n <tbody className=\"font-mono\">\n {exports.map((entry) => (\n <tr key={entry.name} className=\"border-b border-border/60 align-top last:border-0\">\n <td className=\"break-words py-1 pr-2\">{entry.name}</td>\n <td className=\"break-all py-1 pr-2\">{formatExportValue(entry.value)}</td>\n <td className=\"break-words py-1 text-muted-foreground\">{entry.step}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n// ── Watcher events ──────────────────────────────────────────────────────────\n\nfunction isAlarming(event: WatcherEvent): boolean {\n return event.type === \"alert\" || event.type === \"pageerror\" || (event.type === \"response\" && (event.status ?? 0) >= 400);\n}\n\nfunction EventRow({ event }: { event: WatcherEvent }) {\n const alarming = isAlarming(event);\n return (\n <li\n className={cn(\"space-y-0.5 rounded border px-2 py-1 text-[11px]\", alarming ? ALERT_ROW : \"border-border\")}\n data-event-type={event.type}\n >\n <div className=\"flex min-w-0 items-center gap-2\">\n <Badge size=\"xs\" clickToCopy={false} tone={alarming ? \"danger\" : \"neutral\"}>{event.type}</Badge>\n {event.status !== undefined && <span className=\"font-mono\">{event.status}</span>}\n {event.text && <span className={cn(\"min-w-0 break-words\", event.type === \"alert\" && \"font-medium\")}>{event.text}</span>}\n </div>\n {event.url && <div className=\"break-all font-mono text-[10px] opacity-80\">{event.url}</div>}\n {event.detail && <p className=\"whitespace-pre-wrap break-words\">{event.detail}</p>}\n </li>\n );\n}\n\n// ── Whole step ──────────────────────────────────────────────────────────────\n\n/** Execution sections for a typed fixture step; final outputs render separately. */\nexport function StepKindSections({ step, renderWait }: { step: StepDetail; renderWait?: (wait: WaitDetail) => ReactNode }) {\n const selectTab = useSelectDetailTab();\n const viewOutputs = selectTab && step.outputs !== undefined ? () => selectTab(\"outputs\") : undefined;\n return (\n <>\n <div className=\"text-[11px] text-muted-foreground\" data-step-ref=\"\">\n {step.step.kind} · {step.step.id}\n {step.background && \" · background\"}\n </div>\n {step.wait && (renderWait ? renderWait(step.wait) : <StepWait wait={step.wait} {...(viewOutputs ? { onViewOutputs: viewOutputs } : {})} />)}\n {step.events.length > 0 && (\n <Section name=\"events\" title=\"Events\">\n <ul className=\"space-y-1\">\n {step.events.map((event, index) => (\n <EventRow key={index} event={event} />\n ))}\n </ul>\n </Section>\n )}\n {step.exports.length > 0 && (\n <Section name=\"exports\" title=\"Exports\">\n <ExportsTable exports={step.exports} />\n </Section>\n )}\n </>\n );\n}\n\nexport function StepOutputs({ outputs }: { outputs: unknown }) {\n return (\n <div className=\"min-w-0 p-density-4\" data-step-section=\"outputs\">\n <JsonView data={outputs} />\n </div>\n );\n}\n\n/** Shown in place of the sections when `detail.step` is present but breaks the contract. */\n// ── Source ──────────────────────────────────────────────────────────────────\n\n/** The YAML or markdown lines a failed step was written as, under its file and line range. */\nexport function StepSourceSection({ result }: { result: StepSourceResult }) {\n if (result.kind === \"none\") return null;\n if (result.kind === \"invalid\") {\n return (\n <div data-step-source=\"\">\n <Section name=\"source\" title=\"Source\">\n <MalformedNotice>Malformed source detail: {result.error}</MalformedNotice>\n </Section>\n </div>\n );\n }\n const { source } = result;\n const location = <span className=\"font-mono text-[11px] text-muted-foreground\" title={source.file}>{basename(source.file)}:{source.line}-{source.endLine}</span>;\n return (\n <div data-step-source=\"\">\n <Section name=\"source\" title=\"Source\" aside={location}>\n {source.error ? (\n <div className={cn(\"rounded border px-2 py-1 text-xs\", ALERT_ROW)}>Source unavailable: {source.error}</div>\n ) : (\n <CodeBlock language={source.language} source={source.text ?? \"\"} copyable />\n )}\n {source.moreLines ? <div className=\"text-[11px] text-muted-foreground\">… {source.moreLines} more lines</div> : null}\n </Section>\n </div>\n );\n}\n\nfunction MalformedNotice({ children }: { children: ReactNode }) {\n return (\n <div role=\"alert\" className=\"rounded border border-red-500/60 bg-red-500/10 px-2 py-1 text-xs text-red-700 dark:text-red-400\">\n {children}\n </div>\n );\n}\n\nexport function MalformedStepDetail({ error }: { error: string }) {\n return <MalformedNotice>Malformed step detail: {error}</MalformedNotice>;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { StepSourceResult } from './stepSource.js';
|
|
3
3
|
import { ExecutionHeader, StepDetail, WaitDetail } from './stepKind.js';
|
|
4
|
+
/** The host's answerable form for a step waiting on a person. */
|
|
5
|
+
export declare function StepPendingFormSection({ children }: {
|
|
6
|
+
children: ReactNode;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
4
8
|
/**
|
|
5
9
|
* The wait's conditions (the deciding one carries the outcome), elapsed time and
|
|
6
10
|
* schedule. `onViewOutputs` links to the host's Outputs tab; without it the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepKindViews.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKindViews.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"stepKindViews.d.ts","sourceRoot":"","sources":["../../../src/data/verification/stepKindViews.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,UAAU,EAGf,KAAK,UAAU,EAGhB,MAAM,YAAY,CAAC;AAgBpB,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAU3E;AAqBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,+BAoCjG;AAgBD,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,sCAsBvG;AAED,iGAAiG;AACjG,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAMnE;AAqDD,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,SAAS,CAAA;CAAE,+BA0BxH;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,+BAM5D;AAED,4FAA4F;AAG5F,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,sCAyBzE;AAUD,wBAAgB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,+BAE/D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { cn } from "../../lib/utils.js";
|
|
2
|
+
import { UiHourglass } from "../../icons/components/UiHourglass.js";
|
|
2
3
|
import { Button } from "../../components/button.js";
|
|
3
4
|
import { Badge } from "../Badge.js";
|
|
4
5
|
import { JsonView } from "../JsonView.js";
|
|
@@ -22,6 +23,21 @@ function Section({ name, title, aside, children }) {
|
|
|
22
23
|
}), children]
|
|
23
24
|
});
|
|
24
25
|
}
|
|
26
|
+
/** The host's answerable form for a step waiting on a person. */
|
|
27
|
+
function StepPendingFormSection({ children }) {
|
|
28
|
+
return /* @__PURE__ */ jsx(Section, {
|
|
29
|
+
name: "pending-form",
|
|
30
|
+
title: "Form",
|
|
31
|
+
aside: /* @__PURE__ */ jsx(Badge, {
|
|
32
|
+
tone: "warning",
|
|
33
|
+
size: "xs",
|
|
34
|
+
icon: UiHourglass,
|
|
35
|
+
clickToCopy: false,
|
|
36
|
+
children: "Awaiting answer"
|
|
37
|
+
}),
|
|
38
|
+
children
|
|
39
|
+
});
|
|
40
|
+
}
|
|
25
41
|
var OUTCOME_BADGE = {
|
|
26
42
|
satisfied: {
|
|
27
43
|
label: "Satisfied",
|
|
@@ -400,6 +416,6 @@ function MalformedNotice({ children }) {
|
|
|
400
416
|
function MalformedStepDetail({ error }) {
|
|
401
417
|
return /* @__PURE__ */ jsxs(MalformedNotice, { children: ["Malformed step detail: ", error] });
|
|
402
418
|
}
|
|
403
|
-
export { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepOutputs, StepSourceSection, StepWait };
|
|
419
|
+
export { ExecutionHeaderView, FailureCallout, MalformedStepDetail, StepKindSections, StepOutputs, StepPendingFormSection, StepSourceSection, StepWait };
|
|
404
420
|
|
|
405
421
|
//# sourceMappingURL=stepKindViews.js.map
|