@flanksource/clicky-ui 0.3.59 → 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/data/Clicky.cjs +2 -1
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +2 -0
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +2 -1
- 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/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/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 +114 -0
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +51 -1
- 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 +114 -0
- package/dist/index.js +51 -1
- 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/styles.css +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/data/git/git-links.ts
|
|
2
|
+
function escapePath(path) {
|
|
3
|
+
return path.split("/").map(encodeURIComponent).join("/");
|
|
4
|
+
}
|
|
5
|
+
function refVersion(ref) {
|
|
6
|
+
const [, kind, name] = ref.match(/^refs\/(heads|tags)\/(.+)$/) ?? [];
|
|
7
|
+
if (!kind || !name) throw new Error(`Git ref "${ref}" must be refs/heads/<branch> or refs/tags/<tag>`);
|
|
8
|
+
return {
|
|
9
|
+
name,
|
|
10
|
+
kind,
|
|
11
|
+
azurePrefix: kind === "heads" ? "GB" : "GT"
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function gitWebLink(repo, target) {
|
|
15
|
+
if (/\/$|\.git$/.test(repo.web)) throw new Error(`Repository web URL "${repo.web}" must have no trailing slash or .git suffix`);
|
|
16
|
+
const sub = {
|
|
17
|
+
github: "",
|
|
18
|
+
gitlab: "/-",
|
|
19
|
+
azure_devops: ""
|
|
20
|
+
}[repo.provider];
|
|
21
|
+
if ("pullRequest" in target) {
|
|
22
|
+
if (!Number.isSafeInteger(target.pullRequest) || target.pullRequest <= 0) throw new Error("A pull request link needs a positive integer");
|
|
23
|
+
return `${repo.web}${{
|
|
24
|
+
github: "/pull/",
|
|
25
|
+
gitlab: "/-/merge_requests/",
|
|
26
|
+
azure_devops: "/pullrequest/"
|
|
27
|
+
}[repo.provider]}${target.pullRequest}`;
|
|
28
|
+
}
|
|
29
|
+
if ("ref" in target) {
|
|
30
|
+
const version = refVersion(target.ref);
|
|
31
|
+
if (repo.provider === "azure_devops") return `${repo.web}?${new URLSearchParams({ version: version.azurePrefix + version.name })}`;
|
|
32
|
+
const tree = `${repo.web}${sub}/tree/${escapePath(version.name)}`;
|
|
33
|
+
return repo.provider === "gitlab" ? `${tree}?${new URLSearchParams({ ref_type: version.kind })}` : tree;
|
|
34
|
+
}
|
|
35
|
+
if (!/^[0-9a-f]{40}$/i.test(target.commit)) throw new Error(`Commit "${target.commit}" must be a full 40-character SHA to link to it`);
|
|
36
|
+
if (target.file !== void 0) {
|
|
37
|
+
const path = target.file;
|
|
38
|
+
if (path.includes("\\") || path.split("/").some((part) => !part || part === "." || part === "..")) throw new Error("A file link needs a repository-relative path");
|
|
39
|
+
if (repo.provider === "azure_devops") return `${repo.web}?${new URLSearchParams({
|
|
40
|
+
path: `/${path}`,
|
|
41
|
+
version: `GC${target.commit}`
|
|
42
|
+
})}`;
|
|
43
|
+
return `${repo.web}${sub}/blob/${encodeURIComponent(target.commit)}/${escapePath(path)}`;
|
|
44
|
+
}
|
|
45
|
+
return `${repo.web}${sub}/commit/${encodeURIComponent(target.commit)}`;
|
|
46
|
+
}
|
|
47
|
+
function shortSha(sha) {
|
|
48
|
+
if (!/^[0-9a-f]{7,40}$/i.test(sha)) throw new Error(`Commit "${sha}" is not a 7–40 character hexadecimal SHA`);
|
|
49
|
+
return sha.slice(0, 7);
|
|
50
|
+
}
|
|
51
|
+
export { gitWebLink, shortSha };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=git-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-links.js","names":[],"sources":["../../../src/data/git/git-links.ts"],"sourcesContent":["import type { GitWebRepository, GitTarget } from \"./types\";\n\nfunction escapePath(path: string) {\n return path.split(\"/\").map(encodeURIComponent).join(\"/\");\n}\n\n// A branch or tag from a fully qualified ref; the diff's side grammar always qualifies them.\nfunction refVersion(ref: string) {\n const [, kind, name] = ref.match(/^refs\\/(heads|tags)\\/(.+)$/) ?? [];\n if (!kind || !name)\n throw new Error(\n `Git ref \"${ref}\" must be refs/heads/<branch> or refs/tags/<tag>`,\n );\n return { name, kind, azurePrefix: kind === \"heads\" ? \"GB\" : \"GT\" };\n}\n\nexport function gitWebLink(repo: GitWebRepository, target: GitTarget): string {\n if (/\\/$|\\.git$/.test(repo.web))\n throw new Error(\n `Repository web URL \"${repo.web}\" must have no trailing slash or .git suffix`,\n );\n const sub = { github: \"\", gitlab: \"/-\", azure_devops: \"\" }[repo.provider];\n if (\"pullRequest\" in target) {\n if (!Number.isSafeInteger(target.pullRequest) || target.pullRequest <= 0)\n throw new Error(\"A pull request link needs a positive integer\");\n return `${repo.web}${{ github: \"/pull/\", gitlab: \"/-/merge_requests/\", azure_devops: \"/pullrequest/\" }[repo.provider]}${target.pullRequest}`;\n }\n if (\"ref\" in target) {\n const version = refVersion(target.ref);\n if (repo.provider === \"azure_devops\")\n return `${repo.web}?${new URLSearchParams({ version: version.azurePrefix + version.name })}`;\n const tree = `${repo.web}${sub}/tree/${escapePath(version.name)}`;\n return repo.provider === \"gitlab\"\n ? `${tree}?${new URLSearchParams({ ref_type: version.kind })}`\n : tree;\n }\n if (!/^[0-9a-f]{40}$/i.test(target.commit))\n throw new Error(\n `Commit \"${target.commit}\" must be a full 40-character SHA to link to it`,\n );\n if (target.file !== undefined) {\n const path = target.file;\n if (\n path.includes(\"\\\\\") ||\n path.split(\"/\").some((part) => !part || part === \".\" || part === \"..\")\n )\n throw new Error(\"A file link needs a repository-relative path\");\n if (repo.provider === \"azure_devops\")\n return `${repo.web}?${new URLSearchParams({ path: `/${path}`, version: `GC${target.commit}` })}`;\n return `${repo.web}${sub}/blob/${encodeURIComponent(target.commit)}/${escapePath(path)}`;\n }\n return `${repo.web}${sub}/commit/${encodeURIComponent(target.commit)}`;\n}\n\nexport function shortSha(sha: string) {\n if (!/^[0-9a-f]{7,40}$/i.test(sha))\n throw new Error(`Commit \"${sha}\" is not a 7–40 character hexadecimal SHA`);\n return sha.slice(0, 7);\n}\n"],"mappings":";AAEA,SAAS,WAAW,MAAc;CAChC,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,KAAK,GAAG;AACzD;AAGA,SAAS,WAAW,KAAa;CAC/B,MAAM,GAAG,MAAM,QAAQ,IAAI,MAAM,4BAA4B,KAAK,CAAC;CACnE,IAAI,CAAC,QAAQ,CAAC,MACZ,MAAM,IAAI,MACR,YAAY,IAAI,iDAClB;CACF,OAAO;EAAE;EAAM;EAAM,aAAa,SAAS,UAAU,OAAO;CAAK;AACnE;AAEA,SAAgB,WAAW,MAAwB,QAA2B;CAC5E,IAAI,aAAa,KAAK,KAAK,GAAG,GAC5B,MAAM,IAAI,MACR,uBAAuB,KAAK,IAAI,6CAClC;CACF,MAAM,MAAM;EAAE,QAAQ;EAAI,QAAQ;EAAM,cAAc;CAAG,EAAE,KAAK;CAChE,IAAI,iBAAiB,QAAQ;EAC3B,IAAI,CAAC,OAAO,cAAc,OAAO,WAAW,KAAK,OAAO,eAAe,GACrE,MAAM,IAAI,MAAM,8CAA8C;EAChE,OAAO,GAAG,KAAK,MAAM;GAAE,QAAQ;GAAU,QAAQ;GAAsB,cAAc;EAAgB,EAAE,KAAK,YAAY,OAAO;CACjI;CACA,IAAI,SAAS,QAAQ;EACnB,MAAM,UAAU,WAAW,OAAO,GAAG;EACrC,IAAI,KAAK,aAAa,gBACpB,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,gBAAgB,EAAE,SAAS,QAAQ,cAAc,QAAQ,KAAK,CAAC;EAC3F,MAAM,OAAO,GAAG,KAAK,MAAM,IAAI,QAAQ,WAAW,QAAQ,IAAI;EAC9D,OAAO,KAAK,aAAa,WACrB,GAAG,KAAK,GAAG,IAAI,gBAAgB,EAAE,UAAU,QAAQ,KAAK,CAAC,MACzD;CACN;CACA,IAAI,CAAC,kBAAkB,KAAK,OAAO,MAAM,GACvC,MAAM,IAAI,MACR,WAAW,OAAO,OAAO,gDAC3B;CACF,IAAI,OAAO,SAAS,KAAA,GAAW;EAC7B,MAAM,OAAO,OAAO;EACpB,IACE,KAAK,SAAS,IAAI,KAClB,KAAK,MAAM,GAAG,CAAC,CAAC,MAAM,SAAS,CAAC,QAAQ,SAAS,OAAO,SAAS,IAAI,GAErE,MAAM,IAAI,MAAM,8CAA8C;EAChE,IAAI,KAAK,aAAa,gBACpB,OAAO,GAAG,KAAK,IAAI,GAAG,IAAI,gBAAgB;GAAE,MAAM,IAAI;GAAQ,SAAS,KAAK,OAAO;EAAS,CAAC;EAC/F,OAAO,GAAG,KAAK,MAAM,IAAI,QAAQ,mBAAmB,OAAO,MAAM,EAAE,GAAG,WAAW,IAAI;CACvF;CACA,OAAO,GAAG,KAAK,MAAM,IAAI,UAAU,mBAAmB,OAAO,MAAM;AACrE;AAEA,SAAgB,SAAS,KAAa;CACpC,IAAI,CAAC,oBAAoB,KAAK,GAAG,GAC/B,MAAM,IAAI,MAAM,WAAW,IAAI,0CAA0C;CAC3E,OAAO,IAAI,MAAM,GAAG,CAAC;AACvB"}
|
package/dist/data/git/index.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { GitChangedFilesSummary, GitCommitList, GitDiffPanel, GitFileList, type GitCommitItem, type GitCommitListProps, type GitDiffLoader, type GitDiffPanelProps, type GitDiffPayload, type GitFileChangeItem, type GitFileChangeStatus, type GitFileListProps, } from './GitChangeList.js';
|
|
2
2
|
export { formatGitCommitDateHeader } from './git-dates.js';
|
|
3
|
+
export * from './types.js';
|
|
4
|
+
export { gitWebLink, shortSha } from './git-links.js';
|
|
5
|
+
export { GitLink, type GitLinkProps } from './GitLink.js';
|
|
3
6
|
export * from './pickers/types.js';
|
|
4
7
|
export * from './pickers/GitPickers.js';
|
|
5
8
|
export * from './pickers/GitSourcePicker.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/git/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/git/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAC;AACvD,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export type GitProvider = "github" | "gitlab" | "azure_devops";
|
|
2
|
+
export type GitWebRepository = {
|
|
3
|
+
provider: GitProvider;
|
|
4
|
+
web: string;
|
|
5
|
+
};
|
|
6
|
+
export type GitTarget = {
|
|
7
|
+
commit: string;
|
|
8
|
+
file?: undefined;
|
|
9
|
+
} | {
|
|
10
|
+
ref: string;
|
|
11
|
+
} | {
|
|
12
|
+
pullRequest: number;
|
|
13
|
+
} | {
|
|
14
|
+
file: string;
|
|
15
|
+
commit: string;
|
|
16
|
+
};
|
|
17
|
+
export type GitDiffPayload = {
|
|
18
|
+
diff: string;
|
|
19
|
+
truncated?: boolean;
|
|
20
|
+
binary?: boolean;
|
|
21
|
+
path?: string;
|
|
22
|
+
commit?: string;
|
|
23
|
+
};
|
|
24
|
+
export type GitDiffLoader<T> = (item: T) => Promise<GitDiffPayload>;
|
|
25
|
+
export type GitCommitItem = {
|
|
26
|
+
id?: string;
|
|
27
|
+
sha: string;
|
|
28
|
+
shortSha?: string;
|
|
29
|
+
title: string;
|
|
30
|
+
body?: string;
|
|
31
|
+
authorName?: string;
|
|
32
|
+
authorLogin?: string;
|
|
33
|
+
authorAvatarUrl?: string;
|
|
34
|
+
committedAt?: string;
|
|
35
|
+
additions?: number;
|
|
36
|
+
deletions?: number;
|
|
37
|
+
changedFiles?: number;
|
|
38
|
+
href?: string;
|
|
39
|
+
repository?: GitWebRepository;
|
|
40
|
+
};
|
|
41
|
+
export type GitFileChangeStatus = "added" | "modified" | "deleted" | "renamed" | "copied" | string;
|
|
42
|
+
export type GitFileChangeItem = {
|
|
43
|
+
id?: string;
|
|
44
|
+
path: string;
|
|
45
|
+
previousPath?: string;
|
|
46
|
+
status?: GitFileChangeStatus;
|
|
47
|
+
additions?: number;
|
|
48
|
+
deletions?: number;
|
|
49
|
+
href?: string;
|
|
50
|
+
binary?: boolean;
|
|
51
|
+
repository?: GitWebRepository;
|
|
52
|
+
commit?: string;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/data/git/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,cAAc,CAAC;AAC/D,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AACtE,MAAM,MAAM,SAAS,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,CAAA;CAAE,GACpC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GACf;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAEpE,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,QAAQ,GACR,MAAM,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -67,12 +67,13 @@ function MatrixHeatmap({ ticks, unit, static: isStatic = false }) {
|
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* A plan with no run in an environment: pending while queued, error when it
|
|
70
|
-
* never started, hollow when not part of that run
|
|
70
|
+
* never started, hollow when not part of that run, N/A when its country does
|
|
71
|
+
* not apply there.
|
|
71
72
|
*/
|
|
72
73
|
function EmptyMatrixCell({ outcome, detail, title, bare = false }) {
|
|
73
74
|
const neverStarted = detail === "never started";
|
|
74
|
-
if (!neverStarted && outcome !== "queued" && outcome !== "absent") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);
|
|
75
|
-
const mark = neverStarted ? "error" : outcome === "queued" ? "pending" : "absent";
|
|
75
|
+
if (!neverStarted && outcome !== "queued" && outcome !== "absent" && outcome !== "na") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);
|
|
76
|
+
const mark = neverStarted ? "error" : outcome === "queued" ? "pending" : outcome === "na" ? "na" : "absent";
|
|
76
77
|
const label = neverStarted ? "never started" : require_matrix_marks.MATRIX_MARKS[mark].label;
|
|
77
78
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
78
79
|
title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixMarks.cjs","names":["MATRIX_MARKS","cn","MATRIX_ORDER","UiClock","formatMatrixDuration","matrixBarClass","UiServer"],"sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"sourcesContent":["// Renders the matrix-marks.ts vocabulary: one outcome's glyph, outcome mixes,\n// durations, empty cells, the legend, environment chips and the environment\n// column header. Props-only, so a live web matrix and a static print template\n// draw the same marks; `static` drops animation and links for print.\n\nimport type { ReactNode } from \"react\";\nimport { UiClock, UiServer } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n MATRIX_MARKS,\n MATRIX_ORDER,\n formatMatrixDuration,\n matrixBarClass,\n type MatrixCounts,\n type MatrixEnvCounts,\n type MatrixMarkKey,\n type MatrixMarkToken,\n} from \"./matrix-marks\";\n\nexport type MatrixMarkProps = {\n mark: MatrixMarkKey;\n /** Hover title; \"\" leaves the glyph untitled where the surrounding element already names it. */\n label?: string;\n className?: string;\n /** Print: never spins. */\n static?: boolean;\n};\n\nexport function MatrixMark({ mark, label, className, static: isStatic = false }: MatrixMarkProps) {\n const token: MatrixMarkToken = MATRIX_MARKS[mark];\n const Glyph = token.icon;\n return (\n <Glyph\n {...(label === \"\" ? {} : { title: label ?? token.label })}\n className={cn(\"size-3.5 shrink-0\", token.tone, token.spin && !isStatic && \"animate-spin\", className)}\n data-mark={mark}\n />\n );\n}\n\nexport type MatrixMixProps = {\n counts: MatrixCounts;\n unit: \"steps\" | \"plans\";\n /** Outcomes drawn even at zero; every other zero count is dropped. */\n always?: readonly MatrixMarkKey[];\n static?: boolean;\n};\n\n/** Outcome counts as glyph + number, in matrix order. */\nexport function MatrixMix({ counts, unit, always = [], static: isStatic = false }: MatrixMixProps) {\n return (\n <span role=\"group\" aria-label={`${unit} by outcome`} className=\"flex shrink-0 items-center gap-2 text-xs tabular-nums\" data-mix={unit}>\n {MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0 || always.includes(key)).map((key) => {\n const text = `${counts[key] ?? 0} ${MATRIX_MARKS[key].label} ${unit}`;\n return (\n <span key={key} role=\"img\" aria-label={text} title={text} className={cn(\"inline-flex items-center gap-0.5\", MATRIX_MARKS[key].tone)} data-mix-outcome={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {counts[key] ?? 0}\n </span>\n );\n })}\n </span>\n );\n}\n\nexport type MatrixElapsedProps = {\n ms: number;\n /** Still counting: drawn blue and titled \"elapsed so far\". */\n running: boolean;\n /** Prefix a clock glyph. */\n clock?: boolean;\n};\n\nexport function MatrixElapsed({ ms, running, clock = false }: MatrixElapsedProps) {\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px] tabular-nums\", running ? \"text-blue-700 dark:text-blue-300\" : \"text-muted-foreground\")}\n title={running ? \"elapsed so far\" : \"total duration\"}\n data-duration=\"\"\n >\n {clock && <UiClock className=\"size-3\" aria-hidden=\"true\" />}\n {formatMatrixDuration(ms)}\n </span>\n );\n}\n\n/** One heatmap tick: an item (a plan, a step) and its outcome. */\nexport type MatrixTick = { label: string; mark: MatrixMarkKey };\n\nexport type MatrixHeatmapProps = {\n /** In run order: where a run is and where it broke read left to right. */\n ticks: readonly MatrixTick[];\n unit: \"steps\" | \"plans\";\n static?: boolean;\n};\n\n/** One tick per item, filled with its outcome's bar colour. */\nexport function MatrixHeatmap({ ticks, unit, static: isStatic = false }: MatrixHeatmapProps) {\n return (\n <span role=\"list\" {...(ticks.length > 0 ? { tabIndex: 0 } : {})} className=\"flex h-3 min-w-10 flex-1 items-stretch [contain:inline-size] gap-px overflow-x-auto [scrollbar-width:none] print:[print-color-adjust:exact] print:[-webkit-print-color-adjust:exact]\" aria-label={`${ticks.length} ${unit}`} data-heatmap={unit}>\n {ticks.map((tick, i) => (\n <span\n key={i}\n role=\"listitem\"\n aria-label={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n title={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n className={cn(\"min-w-[3px] max-w-4 flex-1 rounded-[1px]\", matrixBarClass(tick.mark, isStatic))}\n data-tick-outcome={tick.mark}\n />\n ))}\n </span>\n );\n}\n\nexport type EmptyMatrixCellProps = {\n /** The cell outcome: \"queued\", \"absent\", or \"error\" with detail \"never started\". Anything else throws. */\n outcome: string;\n /** Why a cell has no run: \"never started\". */\n detail?: string;\n /** Hover title of the cell. */\n title: string;\n /** The glyph alone (sub-step rows), its meaning on hover. */\n bare?: boolean;\n};\n\n/**\n * A plan with no run in an environment: pending while queued, error when it\n * never started, hollow when not part of that run.\n */\nexport function EmptyMatrixCell({ outcome, detail, title, bare = false }: EmptyMatrixCellProps) {\n const neverStarted = detail === \"never started\";\n if (!neverStarted && outcome !== \"queued\" && outcome !== \"absent\") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);\n const mark: MatrixMarkKey = neverStarted ? \"error\" : outcome === \"queued\" ? \"pending\" : \"absent\";\n const label = neverStarted ? \"never started\" : MATRIX_MARKS[mark].label;\n return (\n <span title={title} className=\"flex h-5 min-w-0 items-center gap-1.5 text-xs\" data-empty-cell={mark}>\n <MatrixMark mark={mark} label={label} />\n {!bare && <span className={MATRIX_MARKS[mark].tone}>{label}</span>}\n </span>\n );\n}\n\nexport type MatrixLegendProps = { static?: boolean };\n\nexport function MatrixLegend({ static: isStatic = false }: MatrixLegendProps) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\" data-batch-legend=\"\">\n {MATRIX_ORDER.map((key) => {\n const token: MatrixMarkToken = MATRIX_MARKS[key];\n return (\n <span key={key} className=\"inline-flex items-center gap-1\" data-legend-mark={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {token.legend ?? token.label}\n </span>\n );\n })}\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"size-3\" aria-hidden=\"true\" />\n elapsed · total duration\n </span>\n </div>\n );\n}\n\nexport type EnvChipProps = { context: string; className?: string };\n\n/** A context name, always in the same chip, so an environment never reads as a plan or a status. */\nexport function EnvChip({ context, className }: EnvChipProps) {\n return (\n <span\n className={cn(\"inline-flex items-center gap-1 rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[11px] text-foreground\", className)}\n data-env-chip={context}\n >\n <UiServer className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n {context}\n </span>\n );\n}\n\nconst HEADER_LINE = \"flex h-6 w-full items-center gap-3 whitespace-nowrap\";\nconst HEADER_GROUP = \"flex shrink-0 items-center gap-2\";\n\nexport type MatrixEnvHeaderProps = {\n context: string;\n counts: MatrixEnvCounts;\n /** Every plan the counts total, in row order, drawn as the progress heatmap. */\n plans: readonly MatrixTick[];\n durationMs: number;\n /** The environment's run is still running: its elapsed time is still counting. */\n running: boolean;\n /** Wraps the chip, e.g. in the host router's link to the member run. Never called when static. */\n renderChip?: (chip: ReactNode) => ReactNode;\n /** Drawn beside the chip, e.g. how often the member was retried. */\n aside?: ReactNode;\n static?: boolean;\n};\n\n/**\n * One environment's column head on one line that never wraps: its chip, the\n * plans' progress as a heatmap with the elapsed time, and the plan verdict\n * naming its units.\n */\nexport function MatrixEnvHeader({ context, counts, plans, durationMs, running, renderChip, aside, static: isStatic = false }: MatrixEnvHeaderProps) {\n if (plans.length !== counts.total) throw new Error(`${context} header has ${plans.length} plan ticks but counts ${counts.total} plans`);\n const done = counts.passed + counts.warned + counts.failed + counts.error;\n const chip = <EnvChip context={context} />;\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <div className={HEADER_GROUP}>\n {renderChip && !isStatic ? renderChip(chip) : chip}\n {aside}\n </div>\n <div className={`${HEADER_GROUP} flex-1`} title={`${done} of ${counts.total} plans finished`} data-env-progress=\"\">\n <MatrixHeatmap ticks={plans} unit=\"plans\" static={isStatic} />\n <span className=\"shrink-0 whitespace-nowrap text-[11px] tabular-nums text-foreground\">\n {done}/{counts.total} plans\n </span>\n <MatrixElapsed ms={durationMs} running={running} clock />\n </div>\n <div className={HEADER_GROUP} data-env-verdict=\"\">\n <MatrixMix\n counts={{ passed: counts.passed, warned: counts.warned, running: counts.running, pending: counts.queued, failed: counts.failed, error: counts.error }}\n unit=\"plans\"\n always={[\"failed\"]}\n static={isStatic}\n />\n </div>\n </div>\n );\n}\n\nexport type MatrixUnavailableEnvHeaderProps = { context: string };\n\n/** An environment whose member run did not load, on the same single line as MatrixEnvHeader. */\nexport function MatrixUnavailableEnvHeader({ context }: MatrixUnavailableEnvHeaderProps) {\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <EnvChip context={context} />\n <div className={`${HEADER_GROUP} text-[11px] font-medium ${MATRIX_MARKS.error.tone}`}>\n <MatrixMark mark=\"error\" label=\"\" />\n did not load\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MatrixMarks.cjs","names":["MATRIX_MARKS","cn","MATRIX_ORDER","UiClock","formatMatrixDuration","matrixBarClass","UiServer"],"sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"sourcesContent":["// Renders the matrix-marks.ts vocabulary: one outcome's glyph, outcome mixes,\n// durations, empty cells, the legend, environment chips and the environment\n// column header. Props-only, so a live web matrix and a static print template\n// draw the same marks; `static` drops animation and links for print.\n\nimport type { ReactNode } from \"react\";\nimport { UiClock, UiServer } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n MATRIX_MARKS,\n MATRIX_ORDER,\n formatMatrixDuration,\n matrixBarClass,\n type MatrixCounts,\n type MatrixEnvCounts,\n type MatrixMarkKey,\n type MatrixMarkToken,\n} from \"./matrix-marks\";\n\nexport type MatrixMarkProps = {\n mark: MatrixMarkKey;\n /** Hover title; \"\" leaves the glyph untitled where the surrounding element already names it. */\n label?: string;\n className?: string;\n /** Print: never spins. */\n static?: boolean;\n};\n\nexport function MatrixMark({ mark, label, className, static: isStatic = false }: MatrixMarkProps) {\n const token: MatrixMarkToken = MATRIX_MARKS[mark];\n const Glyph = token.icon;\n return (\n <Glyph\n {...(label === \"\" ? {} : { title: label ?? token.label })}\n className={cn(\"size-3.5 shrink-0\", token.tone, token.spin && !isStatic && \"animate-spin\", className)}\n data-mark={mark}\n />\n );\n}\n\n/** What a mix or heatmap counts, as its labels name them. */\nexport type MatrixUnit = \"steps\" | \"plans\" | \"cases\";\n\nexport type MatrixMixProps = {\n counts: MatrixCounts;\n unit: MatrixUnit;\n /** Outcomes drawn even at zero; every other zero count is dropped. */\n always?: readonly MatrixMarkKey[];\n static?: boolean;\n};\n\n/** Outcome counts as glyph + number, in matrix order. */\nexport function MatrixMix({ counts, unit, always = [], static: isStatic = false }: MatrixMixProps) {\n return (\n <span role=\"group\" aria-label={`${unit} by outcome`} className=\"flex shrink-0 items-center gap-2 text-xs tabular-nums\" data-mix={unit}>\n {MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0 || always.includes(key)).map((key) => {\n const text = `${counts[key] ?? 0} ${MATRIX_MARKS[key].label} ${unit}`;\n return (\n <span key={key} role=\"img\" aria-label={text} title={text} className={cn(\"inline-flex items-center gap-0.5\", MATRIX_MARKS[key].tone)} data-mix-outcome={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {counts[key] ?? 0}\n </span>\n );\n })}\n </span>\n );\n}\n\nexport type MatrixElapsedProps = {\n ms: number;\n /** Still counting: drawn blue and titled \"elapsed so far\". */\n running: boolean;\n /** Prefix a clock glyph. */\n clock?: boolean;\n};\n\nexport function MatrixElapsed({ ms, running, clock = false }: MatrixElapsedProps) {\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px] tabular-nums\", running ? \"text-blue-700 dark:text-blue-300\" : \"text-muted-foreground\")}\n title={running ? \"elapsed so far\" : \"total duration\"}\n data-duration=\"\"\n >\n {clock && <UiClock className=\"size-3\" aria-hidden=\"true\" />}\n {formatMatrixDuration(ms)}\n </span>\n );\n}\n\n/** One heatmap tick: an item (a plan, a step) and its outcome. */\nexport type MatrixTick = { label: string; mark: MatrixMarkKey };\n\nexport type MatrixHeatmapProps = {\n /** In run order: where a run is and where it broke read left to right. */\n ticks: readonly MatrixTick[];\n unit: MatrixUnit;\n static?: boolean;\n};\n\n/** One tick per item, filled with its outcome's bar colour. */\nexport function MatrixHeatmap({ ticks, unit, static: isStatic = false }: MatrixHeatmapProps) {\n return (\n <span role=\"list\" {...(ticks.length > 0 ? { tabIndex: 0 } : {})} className=\"flex h-3 min-w-10 flex-1 items-stretch [contain:inline-size] gap-px overflow-x-auto [scrollbar-width:none] print:[print-color-adjust:exact] print:[-webkit-print-color-adjust:exact]\" aria-label={`${ticks.length} ${unit}`} data-heatmap={unit}>\n {ticks.map((tick, i) => (\n <span\n key={i}\n role=\"listitem\"\n aria-label={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n title={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n className={cn(\"min-w-[3px] max-w-4 flex-1 rounded-[1px]\", matrixBarClass(tick.mark, isStatic))}\n data-tick-outcome={tick.mark}\n />\n ))}\n </span>\n );\n}\n\nexport type EmptyMatrixCellProps = {\n /** The cell outcome: \"queued\", \"absent\", \"na\", or \"error\" with detail \"never started\". Anything else throws. */\n outcome: string;\n /** Why a cell has no run: \"never started\". */\n detail?: string;\n /** Hover title of the cell. */\n title: string;\n /** The glyph alone (sub-step rows), its meaning on hover. */\n bare?: boolean;\n};\n\n/**\n * A plan with no run in an environment: pending while queued, error when it\n * never started, hollow when not part of that run, N/A when its country does\n * not apply there.\n */\nexport function EmptyMatrixCell({ outcome, detail, title, bare = false }: EmptyMatrixCellProps) {\n const neverStarted = detail === \"never started\";\n if (!neverStarted && outcome !== \"queued\" && outcome !== \"absent\" && outcome !== \"na\") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);\n const mark: MatrixMarkKey = neverStarted ? \"error\" : outcome === \"queued\" ? \"pending\" : outcome === \"na\" ? \"na\" : \"absent\";\n const label = neverStarted ? \"never started\" : MATRIX_MARKS[mark].label;\n return (\n <span title={title} className=\"flex h-5 min-w-0 items-center gap-1.5 text-xs\" data-empty-cell={mark}>\n <MatrixMark mark={mark} label={label} />\n {!bare && <span className={MATRIX_MARKS[mark].tone}>{label}</span>}\n </span>\n );\n}\n\nexport type MatrixLegendProps = { static?: boolean };\n\nexport function MatrixLegend({ static: isStatic = false }: MatrixLegendProps) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\" data-batch-legend=\"\">\n {MATRIX_ORDER.map((key) => {\n const token: MatrixMarkToken = MATRIX_MARKS[key];\n return (\n <span key={key} className=\"inline-flex items-center gap-1\" data-legend-mark={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {token.legend ?? token.label}\n </span>\n );\n })}\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"size-3\" aria-hidden=\"true\" />\n elapsed · total duration\n </span>\n </div>\n );\n}\n\nexport type EnvChipProps = { context: string; className?: string };\n\n/** A context name, always in the same chip, so an environment never reads as a plan or a status. */\nexport function EnvChip({ context, className }: EnvChipProps) {\n return (\n <span\n className={cn(\"inline-flex items-center gap-1 rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[11px] text-foreground\", className)}\n data-env-chip={context}\n >\n <UiServer className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n {context}\n </span>\n );\n}\n\nconst HEADER_LINE = \"flex h-6 w-full items-center gap-3 whitespace-nowrap\";\nconst HEADER_GROUP = \"flex shrink-0 items-center gap-2\";\n\nexport type MatrixEnvHeaderProps = {\n context: string;\n counts: MatrixEnvCounts;\n /** Every plan the counts total, in row order, drawn as the progress heatmap. */\n plans: readonly MatrixTick[];\n durationMs: number;\n /** The environment's run is still running: its elapsed time is still counting. */\n running: boolean;\n /** Wraps the chip, e.g. in the host router's link to the member run. Never called when static. */\n renderChip?: (chip: ReactNode) => ReactNode;\n /** Drawn beside the chip, e.g. how often the member was retried. */\n aside?: ReactNode;\n static?: boolean;\n};\n\n/**\n * One environment's column head on one line that never wraps: its chip, the\n * plans' progress as a heatmap with the elapsed time, and the plan verdict\n * naming its units.\n */\nexport function MatrixEnvHeader({ context, counts, plans, durationMs, running, renderChip, aside, static: isStatic = false }: MatrixEnvHeaderProps) {\n if (plans.length !== counts.total) throw new Error(`${context} header has ${plans.length} plan ticks but counts ${counts.total} plans`);\n const done = counts.passed + counts.warned + counts.failed + counts.error;\n const chip = <EnvChip context={context} />;\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <div className={HEADER_GROUP}>\n {renderChip && !isStatic ? renderChip(chip) : chip}\n {aside}\n </div>\n <div className={`${HEADER_GROUP} flex-1`} title={`${done} of ${counts.total} plans finished`} data-env-progress=\"\">\n <MatrixHeatmap ticks={plans} unit=\"plans\" static={isStatic} />\n <span className=\"shrink-0 whitespace-nowrap text-[11px] tabular-nums text-foreground\">\n {done}/{counts.total} plans\n </span>\n <MatrixElapsed ms={durationMs} running={running} clock />\n </div>\n <div className={HEADER_GROUP} data-env-verdict=\"\">\n <MatrixMix\n counts={{ passed: counts.passed, warned: counts.warned, running: counts.running, pending: counts.queued, failed: counts.failed, error: counts.error }}\n unit=\"plans\"\n always={[\"failed\"]}\n static={isStatic}\n />\n </div>\n </div>\n );\n}\n\nexport type MatrixUnavailableEnvHeaderProps = { context: string };\n\n/** An environment whose member run did not load, on the same single line as MatrixEnvHeader. */\nexport function MatrixUnavailableEnvHeader({ context }: MatrixUnavailableEnvHeaderProps) {\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <EnvChip context={context} />\n <div className={`${HEADER_GROUP} text-[11px] font-medium ${MATRIX_MARKS.error.tone}`}>\n <MatrixMark mark=\"error\" label=\"\" />\n did not load\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -9,9 +9,11 @@ export type MatrixMarkProps = {
|
|
|
9
9
|
static?: boolean;
|
|
10
10
|
};
|
|
11
11
|
export declare function MatrixMark({ mark, label, className, static: isStatic }: MatrixMarkProps): import("react").JSX.Element;
|
|
12
|
+
/** What a mix or heatmap counts, as its labels name them. */
|
|
13
|
+
export type MatrixUnit = "steps" | "plans" | "cases";
|
|
12
14
|
export type MatrixMixProps = {
|
|
13
15
|
counts: MatrixCounts;
|
|
14
|
-
unit:
|
|
16
|
+
unit: MatrixUnit;
|
|
15
17
|
/** Outcomes drawn even at zero; every other zero count is dropped. */
|
|
16
18
|
always?: readonly MatrixMarkKey[];
|
|
17
19
|
static?: boolean;
|
|
@@ -34,13 +36,13 @@ export type MatrixTick = {
|
|
|
34
36
|
export type MatrixHeatmapProps = {
|
|
35
37
|
/** In run order: where a run is and where it broke read left to right. */
|
|
36
38
|
ticks: readonly MatrixTick[];
|
|
37
|
-
unit:
|
|
39
|
+
unit: MatrixUnit;
|
|
38
40
|
static?: boolean;
|
|
39
41
|
};
|
|
40
42
|
/** One tick per item, filled with its outcome's bar colour. */
|
|
41
43
|
export declare function MatrixHeatmap({ ticks, unit, static: isStatic }: MatrixHeatmapProps): import("react").JSX.Element;
|
|
42
44
|
export type EmptyMatrixCellProps = {
|
|
43
|
-
/** The cell outcome: "queued", "absent", or "error" with detail "never started". Anything else throws. */
|
|
45
|
+
/** The cell outcome: "queued", "absent", "na", or "error" with detail "never started". Anything else throws. */
|
|
44
46
|
outcome: string;
|
|
45
47
|
/** Why a cell has no run: "never started". */
|
|
46
48
|
detail?: string;
|
|
@@ -51,7 +53,8 @@ export type EmptyMatrixCellProps = {
|
|
|
51
53
|
};
|
|
52
54
|
/**
|
|
53
55
|
* A plan with no run in an environment: pending while queued, error when it
|
|
54
|
-
* never started, hollow when not part of that run
|
|
56
|
+
* never started, hollow when not part of that run, N/A when its country does
|
|
57
|
+
* not apply there.
|
|
55
58
|
*/
|
|
56
59
|
export declare function EmptyMatrixCell({ outcome, detail, title, bare }: EmptyMatrixCellProps): import("react").JSX.Element;
|
|
57
60
|
export type MatrixLegendProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixMarks.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,EAKL,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAExB,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,gGAAgG;IAChG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAgB,EAAE,EAAE,eAAe,+BAU/F;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"MatrixMarks.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"names":[],"mappings":"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"}
|
|
@@ -67,12 +67,13 @@ function MatrixHeatmap({ ticks, unit, static: isStatic = false }) {
|
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
69
|
* A plan with no run in an environment: pending while queued, error when it
|
|
70
|
-
* never started, hollow when not part of that run
|
|
70
|
+
* never started, hollow when not part of that run, N/A when its country does
|
|
71
|
+
* not apply there.
|
|
71
72
|
*/
|
|
72
73
|
function EmptyMatrixCell({ outcome, detail, title, bare = false }) {
|
|
73
74
|
const neverStarted = detail === "never started";
|
|
74
|
-
if (!neverStarted && outcome !== "queued" && outcome !== "absent") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);
|
|
75
|
-
const mark = neverStarted ? "error" : outcome === "queued" ? "pending" : "absent";
|
|
75
|
+
if (!neverStarted && outcome !== "queued" && outcome !== "absent" && outcome !== "na") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);
|
|
76
|
+
const mark = neverStarted ? "error" : outcome === "queued" ? "pending" : outcome === "na" ? "na" : "absent";
|
|
76
77
|
const label = neverStarted ? "never started" : MATRIX_MARKS[mark].label;
|
|
77
78
|
return /* @__PURE__ */ jsxs("span", {
|
|
78
79
|
title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatrixMarks.js","names":[],"sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"sourcesContent":["// Renders the matrix-marks.ts vocabulary: one outcome's glyph, outcome mixes,\n// durations, empty cells, the legend, environment chips and the environment\n// column header. Props-only, so a live web matrix and a static print template\n// draw the same marks; `static` drops animation and links for print.\n\nimport type { ReactNode } from \"react\";\nimport { UiClock, UiServer } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n MATRIX_MARKS,\n MATRIX_ORDER,\n formatMatrixDuration,\n matrixBarClass,\n type MatrixCounts,\n type MatrixEnvCounts,\n type MatrixMarkKey,\n type MatrixMarkToken,\n} from \"./matrix-marks\";\n\nexport type MatrixMarkProps = {\n mark: MatrixMarkKey;\n /** Hover title; \"\" leaves the glyph untitled where the surrounding element already names it. */\n label?: string;\n className?: string;\n /** Print: never spins. */\n static?: boolean;\n};\n\nexport function MatrixMark({ mark, label, className, static: isStatic = false }: MatrixMarkProps) {\n const token: MatrixMarkToken = MATRIX_MARKS[mark];\n const Glyph = token.icon;\n return (\n <Glyph\n {...(label === \"\" ? {} : { title: label ?? token.label })}\n className={cn(\"size-3.5 shrink-0\", token.tone, token.spin && !isStatic && \"animate-spin\", className)}\n data-mark={mark}\n />\n );\n}\n\nexport type MatrixMixProps = {\n counts: MatrixCounts;\n unit: \"steps\" | \"plans\";\n /** Outcomes drawn even at zero; every other zero count is dropped. */\n always?: readonly MatrixMarkKey[];\n static?: boolean;\n};\n\n/** Outcome counts as glyph + number, in matrix order. */\nexport function MatrixMix({ counts, unit, always = [], static: isStatic = false }: MatrixMixProps) {\n return (\n <span role=\"group\" aria-label={`${unit} by outcome`} className=\"flex shrink-0 items-center gap-2 text-xs tabular-nums\" data-mix={unit}>\n {MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0 || always.includes(key)).map((key) => {\n const text = `${counts[key] ?? 0} ${MATRIX_MARKS[key].label} ${unit}`;\n return (\n <span key={key} role=\"img\" aria-label={text} title={text} className={cn(\"inline-flex items-center gap-0.5\", MATRIX_MARKS[key].tone)} data-mix-outcome={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {counts[key] ?? 0}\n </span>\n );\n })}\n </span>\n );\n}\n\nexport type MatrixElapsedProps = {\n ms: number;\n /** Still counting: drawn blue and titled \"elapsed so far\". */\n running: boolean;\n /** Prefix a clock glyph. */\n clock?: boolean;\n};\n\nexport function MatrixElapsed({ ms, running, clock = false }: MatrixElapsedProps) {\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px] tabular-nums\", running ? \"text-blue-700 dark:text-blue-300\" : \"text-muted-foreground\")}\n title={running ? \"elapsed so far\" : \"total duration\"}\n data-duration=\"\"\n >\n {clock && <UiClock className=\"size-3\" aria-hidden=\"true\" />}\n {formatMatrixDuration(ms)}\n </span>\n );\n}\n\n/** One heatmap tick: an item (a plan, a step) and its outcome. */\nexport type MatrixTick = { label: string; mark: MatrixMarkKey };\n\nexport type MatrixHeatmapProps = {\n /** In run order: where a run is and where it broke read left to right. */\n ticks: readonly MatrixTick[];\n unit: \"steps\" | \"plans\";\n static?: boolean;\n};\n\n/** One tick per item, filled with its outcome's bar colour. */\nexport function MatrixHeatmap({ ticks, unit, static: isStatic = false }: MatrixHeatmapProps) {\n return (\n <span role=\"list\" {...(ticks.length > 0 ? { tabIndex: 0 } : {})} className=\"flex h-3 min-w-10 flex-1 items-stretch [contain:inline-size] gap-px overflow-x-auto [scrollbar-width:none] print:[print-color-adjust:exact] print:[-webkit-print-color-adjust:exact]\" aria-label={`${ticks.length} ${unit}`} data-heatmap={unit}>\n {ticks.map((tick, i) => (\n <span\n key={i}\n role=\"listitem\"\n aria-label={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n title={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n className={cn(\"min-w-[3px] max-w-4 flex-1 rounded-[1px]\", matrixBarClass(tick.mark, isStatic))}\n data-tick-outcome={tick.mark}\n />\n ))}\n </span>\n );\n}\n\nexport type EmptyMatrixCellProps = {\n /** The cell outcome: \"queued\", \"absent\", or \"error\" with detail \"never started\". Anything else throws. */\n outcome: string;\n /** Why a cell has no run: \"never started\". */\n detail?: string;\n /** Hover title of the cell. */\n title: string;\n /** The glyph alone (sub-step rows), its meaning on hover. */\n bare?: boolean;\n};\n\n/**\n * A plan with no run in an environment: pending while queued, error when it\n * never started, hollow when not part of that run.\n */\nexport function EmptyMatrixCell({ outcome, detail, title, bare = false }: EmptyMatrixCellProps) {\n const neverStarted = detail === \"never started\";\n if (!neverStarted && outcome !== \"queued\" && outcome !== \"absent\") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);\n const mark: MatrixMarkKey = neverStarted ? \"error\" : outcome === \"queued\" ? \"pending\" : \"absent\";\n const label = neverStarted ? \"never started\" : MATRIX_MARKS[mark].label;\n return (\n <span title={title} className=\"flex h-5 min-w-0 items-center gap-1.5 text-xs\" data-empty-cell={mark}>\n <MatrixMark mark={mark} label={label} />\n {!bare && <span className={MATRIX_MARKS[mark].tone}>{label}</span>}\n </span>\n );\n}\n\nexport type MatrixLegendProps = { static?: boolean };\n\nexport function MatrixLegend({ static: isStatic = false }: MatrixLegendProps) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\" data-batch-legend=\"\">\n {MATRIX_ORDER.map((key) => {\n const token: MatrixMarkToken = MATRIX_MARKS[key];\n return (\n <span key={key} className=\"inline-flex items-center gap-1\" data-legend-mark={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {token.legend ?? token.label}\n </span>\n );\n })}\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"size-3\" aria-hidden=\"true\" />\n elapsed · total duration\n </span>\n </div>\n );\n}\n\nexport type EnvChipProps = { context: string; className?: string };\n\n/** A context name, always in the same chip, so an environment never reads as a plan or a status. */\nexport function EnvChip({ context, className }: EnvChipProps) {\n return (\n <span\n className={cn(\"inline-flex items-center gap-1 rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[11px] text-foreground\", className)}\n data-env-chip={context}\n >\n <UiServer className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n {context}\n </span>\n );\n}\n\nconst HEADER_LINE = \"flex h-6 w-full items-center gap-3 whitespace-nowrap\";\nconst HEADER_GROUP = \"flex shrink-0 items-center gap-2\";\n\nexport type MatrixEnvHeaderProps = {\n context: string;\n counts: MatrixEnvCounts;\n /** Every plan the counts total, in row order, drawn as the progress heatmap. */\n plans: readonly MatrixTick[];\n durationMs: number;\n /** The environment's run is still running: its elapsed time is still counting. */\n running: boolean;\n /** Wraps the chip, e.g. in the host router's link to the member run. Never called when static. */\n renderChip?: (chip: ReactNode) => ReactNode;\n /** Drawn beside the chip, e.g. how often the member was retried. */\n aside?: ReactNode;\n static?: boolean;\n};\n\n/**\n * One environment's column head on one line that never wraps: its chip, the\n * plans' progress as a heatmap with the elapsed time, and the plan verdict\n * naming its units.\n */\nexport function MatrixEnvHeader({ context, counts, plans, durationMs, running, renderChip, aside, static: isStatic = false }: MatrixEnvHeaderProps) {\n if (plans.length !== counts.total) throw new Error(`${context} header has ${plans.length} plan ticks but counts ${counts.total} plans`);\n const done = counts.passed + counts.warned + counts.failed + counts.error;\n const chip = <EnvChip context={context} />;\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <div className={HEADER_GROUP}>\n {renderChip && !isStatic ? renderChip(chip) : chip}\n {aside}\n </div>\n <div className={`${HEADER_GROUP} flex-1`} title={`${done} of ${counts.total} plans finished`} data-env-progress=\"\">\n <MatrixHeatmap ticks={plans} unit=\"plans\" static={isStatic} />\n <span className=\"shrink-0 whitespace-nowrap text-[11px] tabular-nums text-foreground\">\n {done}/{counts.total} plans\n </span>\n <MatrixElapsed ms={durationMs} running={running} clock />\n </div>\n <div className={HEADER_GROUP} data-env-verdict=\"\">\n <MatrixMix\n counts={{ passed: counts.passed, warned: counts.warned, running: counts.running, pending: counts.queued, failed: counts.failed, error: counts.error }}\n unit=\"plans\"\n always={[\"failed\"]}\n static={isStatic}\n />\n </div>\n </div>\n );\n}\n\nexport type MatrixUnavailableEnvHeaderProps = { context: string };\n\n/** An environment whose member run did not load, on the same single line as MatrixEnvHeader. */\nexport function MatrixUnavailableEnvHeader({ context }: MatrixUnavailableEnvHeaderProps) {\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <EnvChip context={context} />\n <div className={`${HEADER_GROUP} text-[11px] font-medium ${MATRIX_MARKS.error.tone}`}>\n <MatrixMark mark=\"error\" label=\"\" />\n did not load\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MatrixMarks.js","names":[],"sources":["../../../src/data/test-runner/MatrixMarks.tsx"],"sourcesContent":["// Renders the matrix-marks.ts vocabulary: one outcome's glyph, outcome mixes,\n// durations, empty cells, the legend, environment chips and the environment\n// column header. Props-only, so a live web matrix and a static print template\n// draw the same marks; `static` drops animation and links for print.\n\nimport type { ReactNode } from \"react\";\nimport { UiClock, UiServer } from \"../../icons\";\nimport { cn } from \"../../lib/utils\";\nimport {\n MATRIX_MARKS,\n MATRIX_ORDER,\n formatMatrixDuration,\n matrixBarClass,\n type MatrixCounts,\n type MatrixEnvCounts,\n type MatrixMarkKey,\n type MatrixMarkToken,\n} from \"./matrix-marks\";\n\nexport type MatrixMarkProps = {\n mark: MatrixMarkKey;\n /** Hover title; \"\" leaves the glyph untitled where the surrounding element already names it. */\n label?: string;\n className?: string;\n /** Print: never spins. */\n static?: boolean;\n};\n\nexport function MatrixMark({ mark, label, className, static: isStatic = false }: MatrixMarkProps) {\n const token: MatrixMarkToken = MATRIX_MARKS[mark];\n const Glyph = token.icon;\n return (\n <Glyph\n {...(label === \"\" ? {} : { title: label ?? token.label })}\n className={cn(\"size-3.5 shrink-0\", token.tone, token.spin && !isStatic && \"animate-spin\", className)}\n data-mark={mark}\n />\n );\n}\n\n/** What a mix or heatmap counts, as its labels name them. */\nexport type MatrixUnit = \"steps\" | \"plans\" | \"cases\";\n\nexport type MatrixMixProps = {\n counts: MatrixCounts;\n unit: MatrixUnit;\n /** Outcomes drawn even at zero; every other zero count is dropped. */\n always?: readonly MatrixMarkKey[];\n static?: boolean;\n};\n\n/** Outcome counts as glyph + number, in matrix order. */\nexport function MatrixMix({ counts, unit, always = [], static: isStatic = false }: MatrixMixProps) {\n return (\n <span role=\"group\" aria-label={`${unit} by outcome`} className=\"flex shrink-0 items-center gap-2 text-xs tabular-nums\" data-mix={unit}>\n {MATRIX_ORDER.filter((key) => (counts[key] ?? 0) > 0 || always.includes(key)).map((key) => {\n const text = `${counts[key] ?? 0} ${MATRIX_MARKS[key].label} ${unit}`;\n return (\n <span key={key} role=\"img\" aria-label={text} title={text} className={cn(\"inline-flex items-center gap-0.5\", MATRIX_MARKS[key].tone)} data-mix-outcome={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {counts[key] ?? 0}\n </span>\n );\n })}\n </span>\n );\n}\n\nexport type MatrixElapsedProps = {\n ms: number;\n /** Still counting: drawn blue and titled \"elapsed so far\". */\n running: boolean;\n /** Prefix a clock glyph. */\n clock?: boolean;\n};\n\nexport function MatrixElapsed({ ms, running, clock = false }: MatrixElapsedProps) {\n return (\n <span\n className={cn(\"inline-flex shrink-0 items-center gap-1 whitespace-nowrap text-[11px] tabular-nums\", running ? \"text-blue-700 dark:text-blue-300\" : \"text-muted-foreground\")}\n title={running ? \"elapsed so far\" : \"total duration\"}\n data-duration=\"\"\n >\n {clock && <UiClock className=\"size-3\" aria-hidden=\"true\" />}\n {formatMatrixDuration(ms)}\n </span>\n );\n}\n\n/** One heatmap tick: an item (a plan, a step) and its outcome. */\nexport type MatrixTick = { label: string; mark: MatrixMarkKey };\n\nexport type MatrixHeatmapProps = {\n /** In run order: where a run is and where it broke read left to right. */\n ticks: readonly MatrixTick[];\n unit: MatrixUnit;\n static?: boolean;\n};\n\n/** One tick per item, filled with its outcome's bar colour. */\nexport function MatrixHeatmap({ ticks, unit, static: isStatic = false }: MatrixHeatmapProps) {\n return (\n <span role=\"list\" {...(ticks.length > 0 ? { tabIndex: 0 } : {})} className=\"flex h-3 min-w-10 flex-1 items-stretch [contain:inline-size] gap-px overflow-x-auto [scrollbar-width:none] print:[print-color-adjust:exact] print:[-webkit-print-color-adjust:exact]\" aria-label={`${ticks.length} ${unit}`} data-heatmap={unit}>\n {ticks.map((tick, i) => (\n <span\n key={i}\n role=\"listitem\"\n aria-label={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n title={`${i + 1}. ${tick.label} · ${MATRIX_MARKS[tick.mark].label}`}\n className={cn(\"min-w-[3px] max-w-4 flex-1 rounded-[1px]\", matrixBarClass(tick.mark, isStatic))}\n data-tick-outcome={tick.mark}\n />\n ))}\n </span>\n );\n}\n\nexport type EmptyMatrixCellProps = {\n /** The cell outcome: \"queued\", \"absent\", \"na\", or \"error\" with detail \"never started\". Anything else throws. */\n outcome: string;\n /** Why a cell has no run: \"never started\". */\n detail?: string;\n /** Hover title of the cell. */\n title: string;\n /** The glyph alone (sub-step rows), its meaning on hover. */\n bare?: boolean;\n};\n\n/**\n * A plan with no run in an environment: pending while queued, error when it\n * never started, hollow when not part of that run, N/A when its country does\n * not apply there.\n */\nexport function EmptyMatrixCell({ outcome, detail, title, bare = false }: EmptyMatrixCellProps) {\n const neverStarted = detail === \"never started\";\n if (!neverStarted && outcome !== \"queued\" && outcome !== \"absent\" && outcome !== \"na\") throw new Error(`unexpected empty matrix cell ${outcome}: ${title}`);\n const mark: MatrixMarkKey = neverStarted ? \"error\" : outcome === \"queued\" ? \"pending\" : outcome === \"na\" ? \"na\" : \"absent\";\n const label = neverStarted ? \"never started\" : MATRIX_MARKS[mark].label;\n return (\n <span title={title} className=\"flex h-5 min-w-0 items-center gap-1.5 text-xs\" data-empty-cell={mark}>\n <MatrixMark mark={mark} label={label} />\n {!bare && <span className={MATRIX_MARKS[mark].tone}>{label}</span>}\n </span>\n );\n}\n\nexport type MatrixLegendProps = { static?: boolean };\n\nexport function MatrixLegend({ static: isStatic = false }: MatrixLegendProps) {\n return (\n <div className=\"flex flex-wrap items-center gap-x-4 gap-y-1 text-xs text-muted-foreground\" data-batch-legend=\"\">\n {MATRIX_ORDER.map((key) => {\n const token: MatrixMarkToken = MATRIX_MARKS[key];\n return (\n <span key={key} className=\"inline-flex items-center gap-1\" data-legend-mark={key}>\n <MatrixMark mark={key} label=\"\" static={isStatic} />\n {token.legend ?? token.label}\n </span>\n );\n })}\n <span className=\"inline-flex items-center gap-1\">\n <UiClock className=\"size-3\" aria-hidden=\"true\" />\n elapsed · total duration\n </span>\n </div>\n );\n}\n\nexport type EnvChipProps = { context: string; className?: string };\n\n/** A context name, always in the same chip, so an environment never reads as a plan or a status. */\nexport function EnvChip({ context, className }: EnvChipProps) {\n return (\n <span\n className={cn(\"inline-flex items-center gap-1 rounded border border-border bg-muted/50 px-1.5 py-0.5 font-mono text-[11px] text-foreground\", className)}\n data-env-chip={context}\n >\n <UiServer className=\"size-3 text-muted-foreground\" aria-hidden=\"true\" />\n {context}\n </span>\n );\n}\n\nconst HEADER_LINE = \"flex h-6 w-full items-center gap-3 whitespace-nowrap\";\nconst HEADER_GROUP = \"flex shrink-0 items-center gap-2\";\n\nexport type MatrixEnvHeaderProps = {\n context: string;\n counts: MatrixEnvCounts;\n /** Every plan the counts total, in row order, drawn as the progress heatmap. */\n plans: readonly MatrixTick[];\n durationMs: number;\n /** The environment's run is still running: its elapsed time is still counting. */\n running: boolean;\n /** Wraps the chip, e.g. in the host router's link to the member run. Never called when static. */\n renderChip?: (chip: ReactNode) => ReactNode;\n /** Drawn beside the chip, e.g. how often the member was retried. */\n aside?: ReactNode;\n static?: boolean;\n};\n\n/**\n * One environment's column head on one line that never wraps: its chip, the\n * plans' progress as a heatmap with the elapsed time, and the plan verdict\n * naming its units.\n */\nexport function MatrixEnvHeader({ context, counts, plans, durationMs, running, renderChip, aside, static: isStatic = false }: MatrixEnvHeaderProps) {\n if (plans.length !== counts.total) throw new Error(`${context} header has ${plans.length} plan ticks but counts ${counts.total} plans`);\n const done = counts.passed + counts.warned + counts.failed + counts.error;\n const chip = <EnvChip context={context} />;\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <div className={HEADER_GROUP}>\n {renderChip && !isStatic ? renderChip(chip) : chip}\n {aside}\n </div>\n <div className={`${HEADER_GROUP} flex-1`} title={`${done} of ${counts.total} plans finished`} data-env-progress=\"\">\n <MatrixHeatmap ticks={plans} unit=\"plans\" static={isStatic} />\n <span className=\"shrink-0 whitespace-nowrap text-[11px] tabular-nums text-foreground\">\n {done}/{counts.total} plans\n </span>\n <MatrixElapsed ms={durationMs} running={running} clock />\n </div>\n <div className={HEADER_GROUP} data-env-verdict=\"\">\n <MatrixMix\n counts={{ passed: counts.passed, warned: counts.warned, running: counts.running, pending: counts.queued, failed: counts.failed, error: counts.error }}\n unit=\"plans\"\n always={[\"failed\"]}\n static={isStatic}\n />\n </div>\n </div>\n );\n}\n\nexport type MatrixUnavailableEnvHeaderProps = { context: string };\n\n/** An environment whose member run did not load, on the same single line as MatrixEnvHeader. */\nexport function MatrixUnavailableEnvHeader({ context }: MatrixUnavailableEnvHeaderProps) {\n return (\n <div className={HEADER_LINE} data-env-header={context}>\n <EnvChip context={context} />\n <div className={`${HEADER_GROUP} text-[11px] font-medium ${MATRIX_MARKS.error.tone}`}>\n <MatrixMark mark=\"error\" label=\"\" />\n did not load\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestRunSummary.cjs","names":["aggregateStatusCounts","cn","TEST_OUTCOMES","OutcomeIcon","_Fragment","Icon","UiClock","ProgressBar","UiLoader"],"sources":["../../../src/data/test-runner/TestRunSummary.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { ProgressBar, type ProgressSegment } from \"../ProgressBar\";\nimport { cn } from \"../../lib/utils\";\nimport { UiClock, UiLoader } from \"../../icons\";\nimport type { RunMeta, Test } from \"./types\";\nimport { aggregateStatusCounts, type TestOutcome } from \"./status\";\nimport { TEST_OUTCOMES } from \"./marks\";\nimport { OutcomeIcon } from \"./MarkIcons\";\n\nexport type TestRunSummaryProps = {\n tests: Test[];\n /** Run start, epoch ms (host-provided). */\n startTime?: number | null | undefined;\n /** Run end, epoch ms; falls back to `now` while running. */\n endTime?: number | null | undefined;\n done: boolean;\n /** Injected clock (epoch ms) so the component stays pure. */\n now?: number | undefined;\n runMeta?: RunMeta | undefined;\n /**\n * Single-line layout for embedding in a host header (e.g. a dialog header):\n * counts + a short inline progress bar on one row, instead of the default\n * two-line right-aligned column.\n */\n compact?: boolean | undefined;\n className?: string | undefined;\n};\n\nfunction pct(part: number, total: number): number {\n return total > 0 ? Math.round((part / total) * 100) : 0;\n}\n\n/**\n * Header summary: per-status counts, elapsed time, a stacked progress bar, and\n * pass/fail/pending gauge cards. Pure — elapsed time comes from injected `now`.\n */\nexport function TestRunSummary({\n tests,\n startTime,\n endTime,\n done,\n now,\n runMeta,\n compact = false,\n className,\n}: TestRunSummaryProps) {\n const t = aggregateStatusCounts(tests);\n const clock = now ?? 0;\n const end = done && endTime ? endTime : clock;\n const elapsed = startTime && end >= startTime ? `${((end - startTime) / 1000).toFixed(1)}s` : \"\";\n\n const segments: ProgressSegment[] = [\n { count: t.passed, color: \"bg-green-500\", label: \"passed\" },\n { count: t.skipped, color: \"bg-slate-400\", label: \"skipped\" },\n { count: t.failed, color: \"bg-red-500\", label: \"failed\" },\n { count: t.warned, color: \"bg-amber-400\", label: \"warned\" },\n { count: t.aborted, color: \"bg-red-300\", label: \"aborted\" },\n { count: t.timedout, color: \"bg-amber-500\", label: \"timed out\" },\n { count: t.running, color: \"bg-blue-400\", label: \"running\" },\n { count: t.pending, color: \"bg-muted-foreground/40\", label: \"queued\" },\n ];\n\n // Each status appears once, as its outcome mark and a count — the same\n // glyphs the tree uses, so the header reads in the tree's vocabulary.\n const chips: { n: number; label: string; outcome: TestOutcome }[] = [\n { n: t.passed, label: \"passed\", outcome: \"passed\" },\n { n: t.failed, label: \"failed\", outcome: \"failed\" },\n { n: t.warned, label: \"warned\", outcome: \"warned\" },\n { n: t.aborted, label: \"aborted\", outcome: \"aborted\" },\n { n: t.timedout, label: \"timed out\", outcome: \"timedout\" },\n { n: t.skipped, label: \"skipped\", outcome: \"skipped\" },\n { n: t.running, label: \"running\", outcome: \"running\" },\n { n: t.pending, label: \"queued\", outcome: \"pending\" },\n ];\n const chipRow = chips\n .filter((c) => c.n > 0)\n .map((c) => (\n <span\n key={c.label}\n className={cn(\n \"inline-flex items-center gap-0.5 tabular-nums\",\n TEST_OUTCOMES[c.outcome].className,\n )}\n aria-label={`${c.n} ${c.label}`}\n title={`${c.n} ${c.label}`}\n data-summary-outcome={c.outcome}\n >\n <OutcomeIcon outcome={c.outcome} />\n {c.n}\n </span>\n ));\n\n const runChips = (\n <>\n {runMeta?.timed_out && (\n <span\n className={cn(\"inline-flex items-center gap-0.5\", TEST_OUTCOMES.timedout.className)}\n title=\"The run hit its timeout\"\n data-summary-run=\"timed-out\"\n >\n <OutcomeIcon outcome=\"timedout\" />\n Timed out\n </span>\n )}\n {runMeta?.exit_code !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center tabular-nums\",\n runMeta.exit_code === 0 ? \"text-muted-foreground\" : TEST_OUTCOMES.failed.className,\n )}\n title={`Exit code ${runMeta.exit_code}`}\n data-summary-run=\"exit-code\"\n >\n exit {runMeta.exit_code}\n </span>\n )}\n </>\n );\n\n if (compact) {\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-x-3 gap-y-0.5 text-sm text-muted-foreground\",\n className,\n )}\n >\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {t.total > 0 && (\n <span className=\"inline-flex items-center gap-1.5\">\n <ProgressBar className=\"w-24\" segments={segments} total={t.total} height=\"h-1.5\" />\n <span className=\"text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex min-w-[18rem] flex-col items-end gap-1.5\", className)}>\n <div className=\"flex flex-wrap items-center justify-end gap-x-3 gap-y-0.5 text-sm text-muted-foreground\">\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n\n {t.total > 0 && (\n <div className=\"flex w-72 items-center gap-2\">\n <ProgressBar className=\"flex-1\" segments={segments} total={t.total} height=\"h-2\" />\n <span className=\"shrink-0 text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TestRunSummary.cjs","names":["aggregateStatusCounts","cn","TEST_OUTCOMES","OutcomeIcon","_Fragment","Icon","UiClock","ProgressBar","UiLoader"],"sources":["../../../src/data/test-runner/TestRunSummary.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { ProgressBar, type ProgressSegment } from \"../ProgressBar\";\nimport { cn } from \"../../lib/utils\";\nimport { UiClock, UiLoader } from \"../../icons\";\nimport type { RunMeta, Test } from \"./types\";\nimport { aggregateStatusCounts, type TestOutcome } from \"./status\";\nimport { TEST_OUTCOMES } from \"./marks\";\nimport { OutcomeIcon } from \"./MarkIcons\";\n\nexport type TestRunSummaryProps = {\n tests: Test[];\n /** Run start, epoch ms (host-provided). */\n startTime?: number | null | undefined;\n /** Run end, epoch ms; falls back to `now` while running. */\n endTime?: number | null | undefined;\n done: boolean;\n /** Injected clock (epoch ms) so the component stays pure. */\n now?: number | undefined;\n runMeta?: RunMeta | undefined;\n /**\n * Single-line layout for embedding in a host header (e.g. a dialog header):\n * counts + a short inline progress bar on one row, instead of the default\n * two-line right-aligned column.\n */\n compact?: boolean | undefined;\n className?: string | undefined;\n};\n\nfunction pct(part: number, total: number): number {\n return total > 0 ? Math.round((part / total) * 100) : 0;\n}\n\n/**\n * Header summary: per-status counts, elapsed time, a stacked progress bar, and\n * pass/fail/pending gauge cards. Pure — elapsed time comes from injected `now`.\n */\nexport function TestRunSummary({\n tests,\n startTime,\n endTime,\n done,\n now,\n runMeta,\n compact = false,\n className,\n}: TestRunSummaryProps) {\n const t = aggregateStatusCounts(tests);\n const clock = now ?? 0;\n const end = done && endTime ? endTime : clock;\n const elapsed = startTime && end >= startTime ? `${((end - startTime) / 1000).toFixed(1)}s` : \"\";\n\n const segments: ProgressSegment[] = [\n { count: t.passed, color: \"bg-green-500\", label: \"passed\" },\n { count: t.skipped, color: \"bg-slate-400\", label: \"skipped\" },\n { count: t.failed, color: \"bg-red-500\", label: \"failed\" },\n { count: t.warned, color: \"bg-amber-400\", label: \"warned\" },\n { count: t.aborted, color: \"bg-slate-400\", label: \"aborted\" },\n { count: t.timedout, color: \"bg-amber-500\", label: \"timed out\" },\n { count: t.running, color: \"bg-blue-400\", label: \"running\" },\n { count: t.pending, color: \"bg-muted-foreground/40\", label: \"queued\" },\n ];\n\n // Each status appears once, as its outcome mark and a count — the same\n // glyphs the tree uses, so the header reads in the tree's vocabulary.\n const chips: { n: number; label: string; outcome: TestOutcome }[] = [\n { n: t.passed, label: \"passed\", outcome: \"passed\" },\n { n: t.failed, label: \"failed\", outcome: \"failed\" },\n { n: t.warned, label: \"warned\", outcome: \"warned\" },\n { n: t.aborted, label: \"aborted\", outcome: \"aborted\" },\n { n: t.timedout, label: \"timed out\", outcome: \"timedout\" },\n { n: t.skipped, label: \"skipped\", outcome: \"skipped\" },\n { n: t.running, label: \"running\", outcome: \"running\" },\n { n: t.pending, label: \"queued\", outcome: \"pending\" },\n ];\n const chipRow = chips\n .filter((c) => c.n > 0)\n .map((c) => (\n <span\n key={c.label}\n className={cn(\n \"inline-flex items-center gap-0.5 tabular-nums\",\n TEST_OUTCOMES[c.outcome].className,\n )}\n aria-label={`${c.n} ${c.label}`}\n title={`${c.n} ${c.label}`}\n data-summary-outcome={c.outcome}\n >\n <OutcomeIcon outcome={c.outcome} />\n {c.n}\n </span>\n ));\n\n const runChips = (\n <>\n {runMeta?.timed_out && (\n <span\n className={cn(\"inline-flex items-center gap-0.5\", TEST_OUTCOMES.timedout.className)}\n title=\"The run hit its timeout\"\n data-summary-run=\"timed-out\"\n >\n <OutcomeIcon outcome=\"timedout\" />\n Timed out\n </span>\n )}\n {runMeta?.exit_code !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center tabular-nums\",\n runMeta.exit_code === 0 ? \"text-muted-foreground\" : TEST_OUTCOMES.failed.className,\n )}\n title={`Exit code ${runMeta.exit_code}`}\n data-summary-run=\"exit-code\"\n >\n exit {runMeta.exit_code}\n </span>\n )}\n </>\n );\n\n if (compact) {\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-x-3 gap-y-0.5 text-sm text-muted-foreground\",\n className,\n )}\n >\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {t.total > 0 && (\n <span className=\"inline-flex items-center gap-1.5\">\n <ProgressBar className=\"w-24\" segments={segments} total={t.total} height=\"h-1.5\" />\n <span className=\"text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex min-w-[18rem] flex-col items-end gap-1.5\", className)}>\n <div className=\"flex flex-wrap items-center justify-end gap-x-3 gap-y-0.5 text-sm text-muted-foreground\">\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n\n {t.total > 0 && (\n <div className=\"flex w-72 items-center gap-2\">\n <ProgressBar className=\"flex-1\" segments={segments} total={t.total} height=\"h-2\" />\n <span className=\"shrink-0 text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestRunSummary.js","names":["_Fragment"],"sources":["../../../src/data/test-runner/TestRunSummary.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { ProgressBar, type ProgressSegment } from \"../ProgressBar\";\nimport { cn } from \"../../lib/utils\";\nimport { UiClock, UiLoader } from \"../../icons\";\nimport type { RunMeta, Test } from \"./types\";\nimport { aggregateStatusCounts, type TestOutcome } from \"./status\";\nimport { TEST_OUTCOMES } from \"./marks\";\nimport { OutcomeIcon } from \"./MarkIcons\";\n\nexport type TestRunSummaryProps = {\n tests: Test[];\n /** Run start, epoch ms (host-provided). */\n startTime?: number | null | undefined;\n /** Run end, epoch ms; falls back to `now` while running. */\n endTime?: number | null | undefined;\n done: boolean;\n /** Injected clock (epoch ms) so the component stays pure. */\n now?: number | undefined;\n runMeta?: RunMeta | undefined;\n /**\n * Single-line layout for embedding in a host header (e.g. a dialog header):\n * counts + a short inline progress bar on one row, instead of the default\n * two-line right-aligned column.\n */\n compact?: boolean | undefined;\n className?: string | undefined;\n};\n\nfunction pct(part: number, total: number): number {\n return total > 0 ? Math.round((part / total) * 100) : 0;\n}\n\n/**\n * Header summary: per-status counts, elapsed time, a stacked progress bar, and\n * pass/fail/pending gauge cards. Pure — elapsed time comes from injected `now`.\n */\nexport function TestRunSummary({\n tests,\n startTime,\n endTime,\n done,\n now,\n runMeta,\n compact = false,\n className,\n}: TestRunSummaryProps) {\n const t = aggregateStatusCounts(tests);\n const clock = now ?? 0;\n const end = done && endTime ? endTime : clock;\n const elapsed = startTime && end >= startTime ? `${((end - startTime) / 1000).toFixed(1)}s` : \"\";\n\n const segments: ProgressSegment[] = [\n { count: t.passed, color: \"bg-green-500\", label: \"passed\" },\n { count: t.skipped, color: \"bg-slate-400\", label: \"skipped\" },\n { count: t.failed, color: \"bg-red-500\", label: \"failed\" },\n { count: t.warned, color: \"bg-amber-400\", label: \"warned\" },\n { count: t.aborted, color: \"bg-
|
|
1
|
+
{"version":3,"file":"TestRunSummary.js","names":["_Fragment"],"sources":["../../../src/data/test-runner/TestRunSummary.tsx"],"sourcesContent":["import { Icon } from \"../Icon\";\nimport { ProgressBar, type ProgressSegment } from \"../ProgressBar\";\nimport { cn } from \"../../lib/utils\";\nimport { UiClock, UiLoader } from \"../../icons\";\nimport type { RunMeta, Test } from \"./types\";\nimport { aggregateStatusCounts, type TestOutcome } from \"./status\";\nimport { TEST_OUTCOMES } from \"./marks\";\nimport { OutcomeIcon } from \"./MarkIcons\";\n\nexport type TestRunSummaryProps = {\n tests: Test[];\n /** Run start, epoch ms (host-provided). */\n startTime?: number | null | undefined;\n /** Run end, epoch ms; falls back to `now` while running. */\n endTime?: number | null | undefined;\n done: boolean;\n /** Injected clock (epoch ms) so the component stays pure. */\n now?: number | undefined;\n runMeta?: RunMeta | undefined;\n /**\n * Single-line layout for embedding in a host header (e.g. a dialog header):\n * counts + a short inline progress bar on one row, instead of the default\n * two-line right-aligned column.\n */\n compact?: boolean | undefined;\n className?: string | undefined;\n};\n\nfunction pct(part: number, total: number): number {\n return total > 0 ? Math.round((part / total) * 100) : 0;\n}\n\n/**\n * Header summary: per-status counts, elapsed time, a stacked progress bar, and\n * pass/fail/pending gauge cards. Pure — elapsed time comes from injected `now`.\n */\nexport function TestRunSummary({\n tests,\n startTime,\n endTime,\n done,\n now,\n runMeta,\n compact = false,\n className,\n}: TestRunSummaryProps) {\n const t = aggregateStatusCounts(tests);\n const clock = now ?? 0;\n const end = done && endTime ? endTime : clock;\n const elapsed = startTime && end >= startTime ? `${((end - startTime) / 1000).toFixed(1)}s` : \"\";\n\n const segments: ProgressSegment[] = [\n { count: t.passed, color: \"bg-green-500\", label: \"passed\" },\n { count: t.skipped, color: \"bg-slate-400\", label: \"skipped\" },\n { count: t.failed, color: \"bg-red-500\", label: \"failed\" },\n { count: t.warned, color: \"bg-amber-400\", label: \"warned\" },\n { count: t.aborted, color: \"bg-slate-400\", label: \"aborted\" },\n { count: t.timedout, color: \"bg-amber-500\", label: \"timed out\" },\n { count: t.running, color: \"bg-blue-400\", label: \"running\" },\n { count: t.pending, color: \"bg-muted-foreground/40\", label: \"queued\" },\n ];\n\n // Each status appears once, as its outcome mark and a count — the same\n // glyphs the tree uses, so the header reads in the tree's vocabulary.\n const chips: { n: number; label: string; outcome: TestOutcome }[] = [\n { n: t.passed, label: \"passed\", outcome: \"passed\" },\n { n: t.failed, label: \"failed\", outcome: \"failed\" },\n { n: t.warned, label: \"warned\", outcome: \"warned\" },\n { n: t.aborted, label: \"aborted\", outcome: \"aborted\" },\n { n: t.timedout, label: \"timed out\", outcome: \"timedout\" },\n { n: t.skipped, label: \"skipped\", outcome: \"skipped\" },\n { n: t.running, label: \"running\", outcome: \"running\" },\n { n: t.pending, label: \"queued\", outcome: \"pending\" },\n ];\n const chipRow = chips\n .filter((c) => c.n > 0)\n .map((c) => (\n <span\n key={c.label}\n className={cn(\n \"inline-flex items-center gap-0.5 tabular-nums\",\n TEST_OUTCOMES[c.outcome].className,\n )}\n aria-label={`${c.n} ${c.label}`}\n title={`${c.n} ${c.label}`}\n data-summary-outcome={c.outcome}\n >\n <OutcomeIcon outcome={c.outcome} />\n {c.n}\n </span>\n ));\n\n const runChips = (\n <>\n {runMeta?.timed_out && (\n <span\n className={cn(\"inline-flex items-center gap-0.5\", TEST_OUTCOMES.timedout.className)}\n title=\"The run hit its timeout\"\n data-summary-run=\"timed-out\"\n >\n <OutcomeIcon outcome=\"timedout\" />\n Timed out\n </span>\n )}\n {runMeta?.exit_code !== undefined && (\n <span\n className={cn(\n \"inline-flex items-center tabular-nums\",\n runMeta.exit_code === 0 ? \"text-muted-foreground\" : TEST_OUTCOMES.failed.className,\n )}\n title={`Exit code ${runMeta.exit_code}`}\n data-summary-run=\"exit-code\"\n >\n exit {runMeta.exit_code}\n </span>\n )}\n </>\n );\n\n if (compact) {\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-x-3 gap-y-0.5 text-sm text-muted-foreground\",\n className,\n )}\n >\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {t.total > 0 && (\n <span className=\"inline-flex items-center gap-1.5\">\n <ProgressBar className=\"w-24\" segments={segments} total={t.total} height=\"h-1.5\" />\n <span className=\"text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n );\n }\n\n return (\n <div className={cn(\"flex min-w-[18rem] flex-col items-end gap-1.5\", className)}>\n <div className=\"flex flex-wrap items-center justify-end gap-x-3 gap-y-0.5 text-sm text-muted-foreground\">\n <span className=\"font-medium text-foreground\">\n {t.total} {t.total === 1 ? \"test\" : \"tests\"}\n {runMeta?.kind === \"rerun\" ? ` · rerun #${runMeta.sequence}` : \"\"}\n </span>\n {chipRow}\n {runChips}\n {elapsed && (\n <span className=\"inline-flex items-center gap-1\">\n <Icon icon={UiClock} className=\"text-xs\" />\n {elapsed}\n </span>\n )}\n {!done && <Icon icon={UiLoader} className=\"animate-spin text-blue-500\" />}\n </div>\n\n {t.total > 0 && (\n <div className=\"flex w-72 items-center gap-2\">\n <ProgressBar className=\"flex-1\" segments={segments} total={t.total} height=\"h-2\" />\n <span className=\"shrink-0 text-xs font-medium text-green-600 dark:text-green-400\">\n {pct(t.passed, t.total)}%\n </span>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -30,7 +30,7 @@ function TestTree({ className, actions }) {
|
|
|
30
30
|
className: require_utils.cn("min-h-0", className),
|
|
31
31
|
roots: runner.tests,
|
|
32
32
|
getKey: nodeKey,
|
|
33
|
-
getChildren: (node) => node
|
|
33
|
+
getChildren: (node) => runner.adapters.resolveTreeChildren(node, runner),
|
|
34
34
|
selected: runner.selected,
|
|
35
35
|
onSelect: (node) => runner.onSelect(node === runner.selected ? null : node),
|
|
36
36
|
expandAll: runner.expandAll,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestTree.cjs","names":["useTestRunner","Tree","cn","hasFailed","TestTreeNode","testStatus"],"sources":["../../../src/data/test-runner/TestTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"../Tree\";\nimport { cn } from \"../../lib/utils\";\nimport type { Test } from \"./types\";\nimport { useTestRunner } from \"./context\";\nimport { hasFailed, testStatus } from \"./status\";\nimport { TestTreeNode } from \"./TestTreeNode\";\n\nconst nodeKey = (() => {\n // Tests carry no guaranteed id; derive a stable per-render key from route_path\n // when present, else the node's name path. A WeakMap keeps keys stable across\n // re-renders for the same object identity.\n const cache = new WeakMap<Test, string>();\n let counter = 0;\n return (node: Test): string => {\n if (node.route_path) return node.route_path;\n let key = cache.get(node);\n if (!key) {\n key = `tn-${counter++}-${node.name}`;\n cache.set(node, key);\n }\n return key;\n };\n})();\n\n/**\n * The left pane: the test forest rendered through the clicky `Tree`. Selection,\n * handlers and adapters all come from the runner context; failing branches and\n * the top level open by default. A name filter is always shown, and `actions`\n * sit in the tree toolbar beside it and Expand all / Collapse all.\n */\nexport function TestTree({ className, actions }: { className?: string; actions?: ReactNode }) {\n const runner = useTestRunner();\n return (\n <Tree<Test>\n className={cn(\"min-h-0\", className)}\n roots={runner.tests}\n getKey={nodeKey}\n getChildren={(node) => node
|
|
1
|
+
{"version":3,"file":"TestTree.cjs","names":["useTestRunner","Tree","cn","hasFailed","TestTreeNode","testStatus"],"sources":["../../../src/data/test-runner/TestTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"../Tree\";\nimport { cn } from \"../../lib/utils\";\nimport type { Test } from \"./types\";\nimport { useTestRunner } from \"./context\";\nimport { hasFailed, testStatus } from \"./status\";\nimport { TestTreeNode } from \"./TestTreeNode\";\n\nconst nodeKey = (() => {\n // Tests carry no guaranteed id; derive a stable per-render key from route_path\n // when present, else the node's name path. A WeakMap keeps keys stable across\n // re-renders for the same object identity.\n const cache = new WeakMap<Test, string>();\n let counter = 0;\n return (node: Test): string => {\n if (node.route_path) return node.route_path;\n let key = cache.get(node);\n if (!key) {\n key = `tn-${counter++}-${node.name}`;\n cache.set(node, key);\n }\n return key;\n };\n})();\n\n/**\n * The left pane: the test forest rendered through the clicky `Tree`. Selection,\n * handlers and adapters all come from the runner context; failing branches and\n * the top level open by default. A name filter is always shown, and `actions`\n * sit in the tree toolbar beside it and Expand all / Collapse all.\n */\nexport function TestTree({ className, actions }: { className?: string; actions?: ReactNode }) {\n const runner = useTestRunner();\n return (\n <Tree<Test>\n className={cn(\"min-h-0\", className)}\n roots={runner.tests}\n getKey={nodeKey}\n getChildren={(node) => runner.adapters.resolveTreeChildren(node, runner)}\n selected={runner.selected}\n onSelect={(node) => runner.onSelect(node === runner.selected ? null : node)}\n expandAll={runner.expandAll}\n onExpandAllChange={runner.onExpandAllChange}\n defaultOpen={(node, depth) => depth < 1 || hasFailed(node)}\n showSearch\n searchLabel=\"Filter tests\"\n getSearchText={(node) => `${node.name} ${node.framework ?? \"\"}`}\n renderRow={({ node, selected }) => <TestTreeNode node={node} selected={selected} />}\n rowClass={(node, selected) => cn(\n \"hover:bg-accent\",\n testStatus(node) === \"running\" && \"border-l-2 border-primary bg-primary/10 font-semibold hover:bg-primary/15\",\n selected && \"border-l-2 border-primary bg-primary/20\",\n )}\n actions={actions}\n />\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,iBAAiB;CAIrB,MAAM,wBAAQ,IAAI,QAAsB;CACxC,IAAI,UAAU;CACd,QAAQ,SAAuB;EAC7B,IAAI,KAAK,YAAY,OAAO,KAAK;EACjC,IAAI,MAAM,MAAM,IAAI,IAAI;EACxB,IAAI,CAAC,KAAK;GACR,MAAM,MAAM,UAAU,GAAG,KAAK;GAC9B,MAAM,IAAI,MAAM,GAAG;EACrB;EACA,OAAO;CACT;AACF,EAAA,CAAG;;;;;;;AAQH,SAAgB,SAAS,EAAE,WAAW,WAAwD;CAC5F,MAAM,SAASA,gBAAAA,cAAc;CAC7B,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,aAAAA,MAAD;EACE,WAAWC,cAAAA,GAAG,WAAW,SAAS;EAClC,OAAO,OAAO;EACd,QAAQ;EACR,cAAc,SAAS,OAAO,SAAS,oBAAoB,MAAM,MAAM;EACvE,UAAU,OAAO;EACjB,WAAW,SAAS,OAAO,SAAS,SAAS,OAAO,WAAW,OAAO,IAAI;EAC1E,WAAW,OAAO;EAClB,mBAAmB,OAAO;EAC1B,cAAc,MAAM,UAAU,QAAQ,KAAKC,eAAAA,UAAU,IAAI;EACzD,YAAA;EACA,aAAY;EACZ,gBAAgB,SAAS,GAAG,KAAK,KAAK,GAAG,KAAK,aAAa;EAC3D,YAAY,EAAE,MAAM,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAACC,qBAAAA,cAAD;GAAoB;GAAgB;EAAW,CAAA;EAClF,WAAW,MAAM,aAAaF,cAAAA,GAC5B,mBACAG,eAAAA,WAAW,IAAI,MAAM,aAAa,6EAClC,YAAY,yCACd;EACS;CACV,CAAA;AAEL"}
|
|
@@ -30,7 +30,7 @@ function TestTree({ className, actions }) {
|
|
|
30
30
|
className: cn("min-h-0", className),
|
|
31
31
|
roots: runner.tests,
|
|
32
32
|
getKey: nodeKey,
|
|
33
|
-
getChildren: (node) => node
|
|
33
|
+
getChildren: (node) => runner.adapters.resolveTreeChildren(node, runner),
|
|
34
34
|
selected: runner.selected,
|
|
35
35
|
onSelect: (node) => runner.onSelect(node === runner.selected ? null : node),
|
|
36
36
|
expandAll: runner.expandAll,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestTree.js","names":[],"sources":["../../../src/data/test-runner/TestTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"../Tree\";\nimport { cn } from \"../../lib/utils\";\nimport type { Test } from \"./types\";\nimport { useTestRunner } from \"./context\";\nimport { hasFailed, testStatus } from \"./status\";\nimport { TestTreeNode } from \"./TestTreeNode\";\n\nconst nodeKey = (() => {\n // Tests carry no guaranteed id; derive a stable per-render key from route_path\n // when present, else the node's name path. A WeakMap keeps keys stable across\n // re-renders for the same object identity.\n const cache = new WeakMap<Test, string>();\n let counter = 0;\n return (node: Test): string => {\n if (node.route_path) return node.route_path;\n let key = cache.get(node);\n if (!key) {\n key = `tn-${counter++}-${node.name}`;\n cache.set(node, key);\n }\n return key;\n };\n})();\n\n/**\n * The left pane: the test forest rendered through the clicky `Tree`. Selection,\n * handlers and adapters all come from the runner context; failing branches and\n * the top level open by default. A name filter is always shown, and `actions`\n * sit in the tree toolbar beside it and Expand all / Collapse all.\n */\nexport function TestTree({ className, actions }: { className?: string; actions?: ReactNode }) {\n const runner = useTestRunner();\n return (\n <Tree<Test>\n className={cn(\"min-h-0\", className)}\n roots={runner.tests}\n getKey={nodeKey}\n getChildren={(node) => node
|
|
1
|
+
{"version":3,"file":"TestTree.js","names":[],"sources":["../../../src/data/test-runner/TestTree.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Tree } from \"../Tree\";\nimport { cn } from \"../../lib/utils\";\nimport type { Test } from \"./types\";\nimport { useTestRunner } from \"./context\";\nimport { hasFailed, testStatus } from \"./status\";\nimport { TestTreeNode } from \"./TestTreeNode\";\n\nconst nodeKey = (() => {\n // Tests carry no guaranteed id; derive a stable per-render key from route_path\n // when present, else the node's name path. A WeakMap keeps keys stable across\n // re-renders for the same object identity.\n const cache = new WeakMap<Test, string>();\n let counter = 0;\n return (node: Test): string => {\n if (node.route_path) return node.route_path;\n let key = cache.get(node);\n if (!key) {\n key = `tn-${counter++}-${node.name}`;\n cache.set(node, key);\n }\n return key;\n };\n})();\n\n/**\n * The left pane: the test forest rendered through the clicky `Tree`. Selection,\n * handlers and adapters all come from the runner context; failing branches and\n * the top level open by default. A name filter is always shown, and `actions`\n * sit in the tree toolbar beside it and Expand all / Collapse all.\n */\nexport function TestTree({ className, actions }: { className?: string; actions?: ReactNode }) {\n const runner = useTestRunner();\n return (\n <Tree<Test>\n className={cn(\"min-h-0\", className)}\n roots={runner.tests}\n getKey={nodeKey}\n getChildren={(node) => runner.adapters.resolveTreeChildren(node, runner)}\n selected={runner.selected}\n onSelect={(node) => runner.onSelect(node === runner.selected ? null : node)}\n expandAll={runner.expandAll}\n onExpandAllChange={runner.onExpandAllChange}\n defaultOpen={(node, depth) => depth < 1 || hasFailed(node)}\n showSearch\n searchLabel=\"Filter tests\"\n getSearchText={(node) => `${node.name} ${node.framework ?? \"\"}`}\n renderRow={({ node, selected }) => <TestTreeNode node={node} selected={selected} />}\n rowClass={(node, selected) => cn(\n \"hover:bg-accent\",\n testStatus(node) === \"running\" && \"border-l-2 border-primary bg-primary/10 font-semibold hover:bg-primary/15\",\n selected && \"border-l-2 border-primary bg-primary/20\",\n )}\n actions={actions}\n />\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,iBAAiB;CAIrB,MAAM,wBAAQ,IAAI,QAAsB;CACxC,IAAI,UAAU;CACd,QAAQ,SAAuB;EAC7B,IAAI,KAAK,YAAY,OAAO,KAAK;EACjC,IAAI,MAAM,MAAM,IAAI,IAAI;EACxB,IAAI,CAAC,KAAK;GACR,MAAM,MAAM,UAAU,GAAG,KAAK;GAC9B,MAAM,IAAI,MAAM,GAAG;EACrB;EACA,OAAO;CACT;AACF,EAAA,CAAG;;;;;;;AAQH,SAAgB,SAAS,EAAE,WAAW,WAAwD;CAC5F,MAAM,SAAS,cAAc;CAC7B,OACE,oBAAC,MAAD;EACE,WAAW,GAAG,WAAW,SAAS;EAClC,OAAO,OAAO;EACd,QAAQ;EACR,cAAc,SAAS,OAAO,SAAS,oBAAoB,MAAM,MAAM;EACvE,UAAU,OAAO;EACjB,WAAW,SAAS,OAAO,SAAS,SAAS,OAAO,WAAW,OAAO,IAAI;EAC1E,WAAW,OAAO;EAClB,mBAAmB,OAAO;EAC1B,cAAc,MAAM,UAAU,QAAQ,KAAK,UAAU,IAAI;EACzD,YAAA;EACA,aAAY;EACZ,gBAAgB,SAAS,GAAG,KAAK,KAAK,GAAG,KAAK,aAAa;EAC3D,YAAY,EAAE,MAAM,eAAe,oBAAC,cAAD;GAAoB;GAAgB;EAAW,CAAA;EAClF,WAAW,MAAM,aAAa,GAC5B,mBACA,WAAW,IAAI,MAAM,aAAa,6EAClC,YAAY,yCACd;EACS;CACV,CAAA;AAEL"}
|
|
@@ -15,7 +15,7 @@ var NAME_TONE = {
|
|
|
15
15
|
failed: "text-red-600 dark:text-red-400",
|
|
16
16
|
timedout: "text-amber-600 dark:text-amber-400",
|
|
17
17
|
warned: "text-amber-600 dark:text-amber-400",
|
|
18
|
-
aborted: "text-
|
|
18
|
+
aborted: "text-muted-foreground",
|
|
19
19
|
running: "text-blue-600 dark:text-blue-400",
|
|
20
20
|
skipped: "text-muted-foreground",
|
|
21
21
|
pending: "text-muted-foreground",
|
|
@@ -60,7 +60,7 @@ function CountBadges({ node }) {
|
|
|
60
60
|
count: s.timedout
|
|
61
61
|
}),
|
|
62
62
|
s.aborted > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Badge.Badge, {
|
|
63
|
-
tone: "
|
|
63
|
+
tone: "neutral",
|
|
64
64
|
variant: "soft",
|
|
65
65
|
size: "xxs",
|
|
66
66
|
count: s.aborted
|