[mod] surface client

This commit is contained in:
Andy Bunce 2025-08-07 16:21:29 +01:00
parent 5f094cdd95
commit 5c859d014f
9 changed files with 37 additions and 19 deletions

View file

@ -28,12 +28,11 @@ function simpleWebSocketTransport(uri) {
}); });
}; };
function client(transport){
function lsp(transport,fileId){ return new LSPClient().connect(transport)
let client = new LSPClient().connect(transport);
return languageServerSupport(client, fileId);
}; };
const baseExts = [ const baseExts = [
lineNumbers(), lineNumbers(),
highlightActiveLineGutter(), highlightActiveLineGutter(),
@ -82,4 +81,4 @@ function createEditorView(state, parent) {
return new EditorView({ state, parent }); return new EditorView({ state, parent });
} }
export { createEditorState, createEditorView, openSearchPanel,openLintPanel, languageServerSupport, baseExts ,lsp, simpleWebSocketTransport}; export { createEditorState, createEditorView, openSearchPanel,openLintPanel, languageServerSupport, baseExts ,client, simpleWebSocketTransport};

View file

@ -1 +1 @@
{"cells":[{"kind":2,"language":"xquery","value":" db:system() "}]} {"cells":[{"kind":2,"language":"xquery","value":"(:<:)\r\n\r\nimport module namespace docs=\"lsp/docs\" at \"/srv/basex/webapp/lsp/docs.xqm\";"},{"kind":2,"language":"xquery","value":"ws:ids()"},{"kind":2,"language":"xquery","value":"let $f:=docs:list(ws:ids())[1]\r\nreturn docs:get(ws:ids(),$f,\"parse\")"}]}

View file

@ -20,7 +20,7 @@
}, },
"scripts": { "scripts": {
"build": "rollup src/index.js -m true -f iife -o dist/cm6.bundle.js -p node-resolve,tla --output.name cm6", "build": "rollup src/index.js -m true -f iife -o dist/cm6.bundle.js -p node-resolve,tla --output.name cm6",
"build-cm": "rollup src/lsp.js -m true -f iife -o webapp/static/clients/codemirror/lsp.bundle.js -p node-resolve,tla --output.name lsp", "build-cm": "rollup bundles/src/lsp.js -m true -f iife -o webapp/static/clients/codemirror/lsp.bundle.js -p node-resolve,tla --output.name lsp",
"min-cm": "cd webapp/static/clients/codemirror && npx minify lsp.bundle.js > lsp.bundle.min.js ", "min-cm": "cd webapp/static/clients/codemirror && npx minify lsp.bundle.js > lsp.bundle.min.js ",
"min": "cd dist && npx minify cm6.bundle.js > cm6.bundle.min.js && npx minify lsp.bundle.js > lsp.bundle.min.js" "min": "cd dist && npx minify cm6.bundle.js > cm6.bundle.min.js && npx minify lsp.bundle.js > lsp.bundle.min.js"
} }

View file

@ -51,3 +51,21 @@ return (
) )
}; };
(:~ close a file :)
declare function docs:close($socket as xs:string,$uri as xs:string)
as map(*){
let $files:=ws:get($socket,"files",{})
return if(map:contains($files,$uri))
then let $props:=$files($uri)
return (
map:items($props)!ws:delete($socket,.),
ws:set($socket,"files",map:remove($files,$uri))
)
else ()
};
(:~ list a file :)
declare function docs:list($socket as xs:string)
as xs:string*{
ws:get($socket,"files",{})=>map:keys()
};

View file

@ -14,7 +14,7 @@
"selectionRangeProvider": true, "selectionRangeProvider": true,
"documentLinkProvider": {}, "documentLinkProvider": {},
"serverInfo": { "serverInfo": {
"name": "BaseX Language Server", "name": "XQuery 4.0 Language Server",
"version": "0.0.1" "version": "0.0.1"
} }
} }

View file

@ -64,7 +64,7 @@ as empty-sequence()
return () return ()
}; };
(:~ didOpen method response :) (:~ didChange method response :)
declare declare
function lsp-text:didChange($json as map(*)) function lsp-text:didChange($json as map(*))
as map(*)? as map(*)?

View file

@ -31305,11 +31305,10 @@ ${text}</tr>
}); });
}); });
}function client(transport){
return new LSPClient().connect(transport)
} }
function lsp(transport,fileId){
let client = new LSPClient().connect(transport);
return languageServerSupport(client, fileId);
}
const baseExts = [ const baseExts = [
lineNumbers(), lineNumbers(),
highlightActiveLineGutter(), highlightActiveLineGutter(),
@ -31359,10 +31358,10 @@ ${text}</tr>
} }
exports.baseExts = baseExts; exports.baseExts = baseExts;
exports.client = client;
exports.createEditorState = createEditorState; exports.createEditorState = createEditorState;
exports.createEditorView = createEditorView; exports.createEditorView = createEditorView;
exports.languageServerSupport = languageServerSupport; exports.languageServerSupport = languageServerSupport;
exports.lsp = lsp;
exports.openLintPanel = openLintPanel; exports.openLintPanel = openLintPanel;
exports.openSearchPanel = openSearchPanel; exports.openSearchPanel = openSearchPanel;
exports.simpleWebSocketTransport = simpleWebSocketTransport; exports.simpleWebSocketTransport = simpleWebSocketTransport;

File diff suppressed because one or more lines are too long

View file

@ -10,7 +10,7 @@ window.addEventListener('load', () => {
const view = lsp.createEditorView(undefined, document.getElementById("editor")); const view = lsp.createEditorView(undefined, document.getElementById("editor"));
view.setState(lsp.createEditorState(doc, lsp.baseExts)); view.setState(lsp.createEditorState(doc, lsp.baseExts));
let client;
// Save content to localStorage when the page is about to unload // Save content to localStorage when the page is about to unload
window.addEventListener('beforeunload', () => { window.addEventListener('beforeunload', () => {
const doc = view.state.doc.toString(); const doc = view.state.doc.toString();
@ -40,6 +40,7 @@ document.getElementById("load").onchange = e => {
insert: t insert: t
} }
}) })
console.log("SYNC")
}); });
document.getElementById("load").value=""; document.getElementById("load").value="";
}; };
@ -48,11 +49,12 @@ function connect() {
const file = document.getElementById("iFile").value; const file = document.getElementById("iFile").value;
lsp.simpleWebSocketTransport(server) lsp.simpleWebSocketTransport(server)
.then(transport => { .then(transport => {
let link = lsp.lsp(transport, file); client = lsp.client(transport);
let plugin=lsp.languageServerSupport(client,file,"xquery")
const doc = view.state.doc.toString(); const doc = view.state.doc.toString();
const state = lsp.createEditorState(doc, [...lsp.baseExts, link]); const state = lsp.createEditorState(doc, [...lsp.baseExts, plugin]);
view.setState(state); view.setState(state);
}) })
.catch(r => alert("fail")); .catch(r => alert("connection failed: "+ server));
}; };
connect(); connect();