hoppscotch/packages/hoppscotch-app/helpers/tern.js
2021-09-10 00:28:28 +05:30

118 lines
2.5 KiB
JavaScript

import tern from "tern"
import { registerTernLinter } from "./ternlint"
import ECMA_DEF from "~/helpers/terndoc/ecma.json"
import PW_PRE_DEF from "~/helpers/terndoc/pw-pre.json"
import PW_TEST_DEF from "~/helpers/terndoc/pw-test.json"
import PW_EXTRAS_DEF from "~/helpers/terndoc/pw-extras.json"
const server = new tern.Server({
defs: [ECMA_DEF, PW_EXTRAS_DEF],
plugins: {
lint: {
rules: [],
},
},
})
registerTernLinter()
function performLinting(code) {
return new Promise((resolve, reject) => {
server.request(
{
query: {
type: "lint",
file: "doc",
lineCharPositions: true,
},
files: [
{
type: "full",
name: "doc",
text: code,
},
],
},
(err, res) => {
if (!err) resolve(res.messages)
else reject(err)
}
)
})
}
export function performPreRequestLinting(code) {
server.deleteDefs("pw-test")
server.deleteDefs("pw-pre")
server.addDefs(PW_PRE_DEF)
return performLinting(code)
}
export function performTestLinting(code) {
server.deleteDefs("pw-test")
server.deleteDefs("pw-pre")
server.addDefs(PW_TEST_DEF)
return performLinting(code)
}
function postProcessCompletionResult(res) {
if (res.completions) {
const index = res.completions.findIndex((el) => el.name === "pw")
if (index !== -1) {
const result = res.completions[index]
res.completions.splice(index, 1)
res.completions.splice(0, 0, result)
}
}
return res
}
function performCompletion(code, row, col) {
return new Promise((resolve, reject) => {
server.request(
{
query: {
type: "completions",
file: "doc",
end: {
line: row,
ch: col,
},
guess: false,
types: true,
includeKeywords: true,
inLiteral: false,
},
files: [
{
type: "full",
name: "doc",
text: code,
},
],
},
(err, res) => {
if (err) reject(err)
else resolve(postProcessCompletionResult(res))
}
)
})
}
export function getPreRequestScriptCompletions(code, row, col) {
server.deleteDefs("pw-test")
server.deleteDefs("pw-pre")
server.addDefs(PW_PRE_DEF)
return performCompletion(code, row, col)
}
export function getTestScriptCompletions(code, row, col) {
server.deleteDefs("pw-test")
server.deleteDefs("pw-pre")
server.addDefs(PW_TEST_DEF)
return performCompletion(code, row, col)
}