mirror of
https://github.com/kristoferssolo/solorice.git
synced 2025-10-21 20:10:34 +00:00
170 lines
6.9 KiB
JavaScript
170 lines
6.9 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.deactivate = exports.activate = void 0;
|
|
const path = require("path");
|
|
const vscode_1 = require("vscode");
|
|
const vscode_languageclient_1 = require("vscode-languageclient");
|
|
const SUPPORTED_EXTENSIONS = ["css", "scss", "less"];
|
|
const SUPPORTED_EXTENSION_REGEX = /\.(css|scss|less)$/;
|
|
let defaultClient;
|
|
const clients = new Map();
|
|
let _sortedWorkspaceFolders;
|
|
function sortedWorkspaceFolders() {
|
|
if (_sortedWorkspaceFolders === void 0) {
|
|
_sortedWorkspaceFolders = vscode_1.workspace.workspaceFolders
|
|
? vscode_1.workspace.workspaceFolders
|
|
.map((folder) => {
|
|
let result = folder.uri.toString();
|
|
if (result.charAt(result.length - 1) !== "/") {
|
|
result = result + "/";
|
|
}
|
|
return result;
|
|
})
|
|
.sort((a, b) => {
|
|
return a.length - b.length;
|
|
})
|
|
: [];
|
|
}
|
|
return _sortedWorkspaceFolders;
|
|
}
|
|
vscode_1.workspace.onDidChangeWorkspaceFolders(() => (_sortedWorkspaceFolders = undefined));
|
|
function getOuterMostWorkspaceFolder(folder) {
|
|
const sorted = sortedWorkspaceFolders();
|
|
for (const element of sorted) {
|
|
let uri = folder.uri.toString();
|
|
if (uri.charAt(uri.length - 1) !== "/") {
|
|
uri = uri + "/";
|
|
}
|
|
if (uri.startsWith(element)) {
|
|
return vscode_1.workspace.getWorkspaceFolder(vscode_1.Uri.parse(element));
|
|
}
|
|
}
|
|
return folder;
|
|
}
|
|
function activate(context) {
|
|
const module = context.asAbsolutePath(path.join("server", "out", "server.js"));
|
|
const outputChannel = vscode_1.window.createOutputChannel("CSS Peek");
|
|
const config = vscode_1.workspace.getConfiguration("cssPeek");
|
|
const peekFromLanguages = config.get("peekFromLanguages");
|
|
const peekToInclude = SUPPORTED_EXTENSIONS.map((l) => `**/*.${l}`);
|
|
const peekToExclude = config.get("peekToExclude");
|
|
function didOpenTextDocument(document) {
|
|
// TODO: Return if unsupported document.languageId
|
|
if (!["file", "untitled"].includes(document.uri.scheme) ||
|
|
(!peekFromLanguages.includes(document.languageId) &&
|
|
!SUPPORTED_EXTENSION_REGEX.test(document.fileName))) {
|
|
return;
|
|
}
|
|
const documentSelector = [
|
|
...SUPPORTED_EXTENSIONS.map((language) => ({
|
|
scheme: "file",
|
|
language,
|
|
})),
|
|
...SUPPORTED_EXTENSIONS.map((language) => ({
|
|
scheme: "untitled",
|
|
language,
|
|
})),
|
|
...peekFromLanguages.map((language) => ({
|
|
scheme: "file",
|
|
language,
|
|
})),
|
|
...peekFromLanguages.map((language) => ({
|
|
scheme: "untitled",
|
|
language,
|
|
})),
|
|
];
|
|
const uri = document.uri;
|
|
// Untitled files go to a default client.
|
|
if (uri.scheme === "untitled" && !defaultClient) {
|
|
const debugOptions = { execArgv: ["--nolazy", "--inspect=6010"] };
|
|
const serverOptions = {
|
|
run: { module, transport: vscode_languageclient_1.TransportKind.ipc },
|
|
debug: { module, transport: vscode_languageclient_1.TransportKind.ipc, options: debugOptions },
|
|
};
|
|
const clientOptions = {
|
|
documentSelector,
|
|
synchronize: {
|
|
configurationSection: "cssPeek",
|
|
},
|
|
initializationOptions: {
|
|
stylesheets: [],
|
|
peekFromLanguages,
|
|
},
|
|
diagnosticCollectionName: "css-peek",
|
|
outputChannel,
|
|
};
|
|
defaultClient = new vscode_languageclient_1.LanguageClient("css-peek", "CSS Peek", serverOptions, clientOptions);
|
|
defaultClient.registerProposedFeatures();
|
|
defaultClient.start();
|
|
return;
|
|
}
|
|
let folder = vscode_1.workspace.getWorkspaceFolder(uri);
|
|
// Files outside a folder can't be handled. This might depend on the language.
|
|
// Single file languages like JSON might handle files outside the workspace folders.
|
|
if (!folder) {
|
|
return;
|
|
}
|
|
// If we have nested workspace folders we only start a server on the outer most workspace folder.
|
|
folder = getOuterMostWorkspaceFolder(folder);
|
|
if (!clients.has(folder.uri.toString())) {
|
|
vscode_1.workspace.findFiles(`{${(peekToInclude || []).join(",")}}`, `{${(peekToExclude || []).join(",")}}`).then((file_searches) => {
|
|
const potentialFiles = file_searches.filter((uri) => uri.scheme === "file");
|
|
const debugOptions = {
|
|
execArgv: ["--nolazy", `--inspect=${6011 + clients.size}`],
|
|
};
|
|
const serverOptions = {
|
|
run: { module, transport: vscode_languageclient_1.TransportKind.ipc },
|
|
debug: {
|
|
module,
|
|
transport: vscode_languageclient_1.TransportKind.ipc,
|
|
options: debugOptions,
|
|
},
|
|
};
|
|
const clientOptions = {
|
|
documentSelector,
|
|
diagnosticCollectionName: "css-peek",
|
|
synchronize: {
|
|
configurationSection: "cssPeek",
|
|
},
|
|
initializationOptions: {
|
|
stylesheets: potentialFiles.map((u) => ({
|
|
uri: u.toString(),
|
|
fsPath: u.fsPath,
|
|
})),
|
|
peekFromLanguages,
|
|
},
|
|
workspaceFolder: folder,
|
|
outputChannel,
|
|
};
|
|
const client = new vscode_languageclient_1.LanguageClient("css-peek", "CSS Peek", serverOptions, clientOptions);
|
|
client.registerProposedFeatures();
|
|
client.start();
|
|
clients.set(folder.uri.toString(), client);
|
|
});
|
|
}
|
|
}
|
|
vscode_1.workspace.onDidOpenTextDocument(didOpenTextDocument);
|
|
vscode_1.workspace.textDocuments.forEach(didOpenTextDocument);
|
|
vscode_1.workspace.onDidChangeWorkspaceFolders((event) => {
|
|
for (const folder of event.removed) {
|
|
const client = clients.get(folder.uri.toString());
|
|
if (client) {
|
|
clients.delete(folder.uri.toString());
|
|
client.stop();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
exports.activate = activate;
|
|
function deactivate() {
|
|
const promises = [];
|
|
if (defaultClient) {
|
|
promises.push(defaultClient.stop());
|
|
}
|
|
for (const client of clients.values()) {
|
|
promises.push(client.stop());
|
|
}
|
|
return Promise.all(promises).then(() => undefined);
|
|
}
|
|
exports.deactivate = deactivate;
|
|
//# sourceMappingURL=extension.js.map
|