forked from opentiny/tiny-engine
59 lines
1.7 KiB
JavaScript
59 lines
1.7 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 { PROD, BASE_URL } from './environments'
|
|
|
|
export const initLinter = (editor, monacoInstance, state) => {
|
|
let workerUrl = `${BASE_URL}monaco-linter/eslint.worker.js`
|
|
|
|
// 线上环境,存在 worker 资源跨域的情况
|
|
if (PROD) {
|
|
const workerBlob = new Blob([`importScripts('${workerUrl}');`], { type: 'application/javascript' })
|
|
workerUrl = window.URL.createObjectURL(workerBlob)
|
|
}
|
|
|
|
const worker = new Worker(workerUrl)
|
|
|
|
// 监听 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)
|
|
}
|