Joaquín Sánchez 7ec298eb37
feat(ui): add action to explorer item to show the test/suite line in the source code tab (#5948)
Co-authored-by: Anjorin Damilare <damilareanjorin1@gmail.com>
2024-06-27 14:47:31 +02:00

67 lines
1.6 KiB
TypeScript

import type { Ref, WritableComputedRef } from 'vue'
import { watch } from 'vue'
import CodeMirror from 'codemirror'
import 'codemirror/mode/javascript/javascript'
// import 'codemirror/mode/css/css'
import 'codemirror/mode/xml/xml'
// import 'codemirror/mode/htmlmixed/htmlmixed'
import 'codemirror/mode/jsx/jsx'
import 'codemirror/addon/display/placeholder'
import 'codemirror/addon/scroll/simplescrollbars'
import 'codemirror/addon/scroll/simplescrollbars.css'
import type { Task } from '@vitest/runner'
import { navigateTo } from '~/composables/navigation'
export const codemirrorRef = shallowRef<CodeMirror.EditorFromTextArea>()
export function useCodeMirror(
textarea: Ref<HTMLTextAreaElement | null | undefined>,
input: Ref<string> | WritableComputedRef<string>,
options: CodeMirror.EditorConfiguration = {},
) {
const cm = CodeMirror.fromTextArea(textarea.value!, {
theme: 'vars',
...options,
scrollbarStyle: 'simple',
})
let skip = false
cm.on('change', () => {
if (skip) {
skip = false
return
}
input.value = cm.getValue()
})
watch(
input,
(v) => {
if (v !== cm.getValue()) {
skip = true
const selections = cm.listSelections()
cm.replaceRange(
v,
cm.posFromIndex(0),
cm.posFromIndex(Number.POSITIVE_INFINITY),
)
cm.setSelections(selections)
}
},
{ immediate: true },
)
onUnmounted(() => {
codemirrorRef.value = undefined
})
return markRaw(cm)
}
export async function showSource(task: Task) {
navigateTo(task, task.location?.line ?? 0)
}