tiny-engine/packages/controller/js/linter.js

61 lines
1.8 KiB
JavaScript

/**
* Copyright (c) 2023 - present TinyEngine Authors.
* Copyright (c) 2023 - present Huawei Cloud Computing Technologies Co., Ltd.
*
* Use of this source code is governed by an MIT-style license.
*
* THE OPEN SOURCE SOFTWARE IN THIS PRODUCT IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
* BUT WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR FITNESS FOR
* A PARTICULAR PURPOSE. SEE THE APPLICABLE LICENSES FOR MORE DETAILS.
*
*/
import eslintWorkerUrl from './worker-files/eslint.worker?worker&url'
export const initLinter = (editor, monacoInstance, state) => {
let workerUrl = new URL(eslintWorkerUrl, import.meta.url)
// 线上环境,存在 worker 资源跨域的情况
if (workerUrl.origin !== location.origin) {
const workerBlob = new Blob([`import('${workerUrl}');`], {
type: 'application/javascript'
})
workerUrl = window.URL.createObjectURL(workerBlob)
}
const worker = new Worker(workerUrl, { type: 'module' })
// 监听 ESLint web worker 的返回
worker.onmessage = function (event) {
const { markers, version } = event.data
const model = editor.getModel()
state.hasError = markers.filter(({ severity }) => severity === 'Error').length > 0
// 判断当前 model 的 versionId 与请求时是否一致
if (model && model.getVersionId() === version) {
monacoInstance.editor.setModelMarkers(model, 'ESLint', markers)
}
}
return worker
}
let timer = null
export const lint = (model, worker) => {
if (timer) {
clearTimeout(timer)
}
// 防抖处理
timer = setTimeout(() => {
timer = null
worker.postMessage({
code: model.getValue(),
// 发起 ESLint 静态检查时,携带 versionId
version: model.getVersionId()
})
}, 500)
}