atom-languageclient
Version:
Integrate Language Servers with Atom
106 lines • 14.1 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const languageclient_1 = require("../languageclient");
/** Public: Adapts Atom's user notifications to those of the language server protocol. */
class NotificationsAdapter {
/** Public: Attach to a {LanguageClientConnection} to recieve events indicating when user notifications should be displayed. */
static attach(connection, name, projectPath) {
connection.onShowMessage((m) => NotificationsAdapter.onShowMessage(m, name, projectPath));
connection.onShowMessageRequest((m) => NotificationsAdapter.onShowMessageRequest(m, name, projectPath));
}
/**
* Public: Show a notification message with buttons using the Atom notifications API.
*
* @param params The {ShowMessageRequestParams} received from the language server indicating the details of the
* notification to be displayed.
* @param name The name of the language server so the user can identify the context of the message.
* @param projectPath The path of the current project.
*/
static onShowMessageRequest(params, name, projectPath) {
return new Promise((resolve, _reject) => {
const options = {
dismissable: true,
detail: `${name} ${projectPath}`,
};
if (params.actions) {
options.buttons = params.actions.map((a) => ({
text: a.title,
onDidClick: () => {
resolve(a);
if (notification != null) {
notification.dismiss();
}
},
}));
}
const notification = addNotificationForMessage(params.type, params.message, options);
if (notification != null) {
notification.onDidDismiss(() => {
resolve(null);
});
}
});
}
/**
* Public: Show a notification message using the Atom notifications API.
*
* @param params The {ShowMessageParams} received from the language server indicating the details of the notification
* to be displayed.
* @param name The name of the language server so the user can identify the context of the message.
* @param projectPath The path of the current project.
*/
static onShowMessage(params, name, projectPath) {
addNotificationForMessage(params.type, params.message, {
dismissable: true,
detail: `${name} ${projectPath}`,
});
}
/**
* Public: Convert a {MessageActionItem} from the language server into an equivalent {NotificationButton} within Atom.
*
* @param actionItem The {MessageActionItem} to be converted.
* @returns A {NotificationButton} equivalent to the {MessageActionItem} given.
*/
static actionItemToNotificationButton(actionItem) {
return {
text: actionItem.title,
};
}
}
exports.default = NotificationsAdapter;
function messageTypeToString(messageType) {
switch (messageType) {
case languageclient_1.MessageType.Error:
return "error";
case languageclient_1.MessageType.Warning:
return "warning";
default:
return "info";
}
}
function addNotificationForMessage(messageType, message, options) {
function isDuplicate(note) {
const noteDismissed = note.isDismissed && note.isDismissed();
const noteOptions = (note.getOptions && note.getOptions()) || {};
return (!noteDismissed &&
note.getType() === messageTypeToString(messageType) &&
note.getMessage() === message &&
noteOptions.detail === options.detail);
}
if (atom.notifications.getNotifications().some(isDuplicate)) {
return null;
}
switch (messageType) {
case languageclient_1.MessageType.Error:
return atom.notifications.addError(message, options);
case languageclient_1.MessageType.Warning:
return atom.notifications.addWarning(message, options);
case languageclient_1.MessageType.Log:
// console.log(params.message);
return null;
case languageclient_1.MessageType.Info:
default:
return atom.notifications.addInfo(message, options);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2FkYXB0ZXJzL25vdGlmaWNhdGlvbnMtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQU0wQjtBQU8xQix5RkFBeUY7QUFDekYsTUFBcUIsb0JBQW9CO0lBQ3ZDLCtIQUErSDtJQUN4SCxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQW9DLEVBQUUsSUFBWSxFQUFFLFdBQW1CO1FBQzFGLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7UUFDekYsVUFBVSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7SUFDekcsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQ2hDLE1BQWdDLEVBQ2hDLElBQVksRUFDWixXQUFtQjtRQUVuQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUF3QjtnQkFDbkMsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxXQUFXLEVBQUU7YUFDakMsQ0FBQTtZQUNELElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDbEIsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLO29CQUNiLFVBQVUsRUFBRSxHQUFHLEVBQUU7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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLFxuICBNZXNzYWdlVHlwZSxcbiAgTWVzc2FnZUFjdGlvbkl0ZW0sXG4gIFNob3dNZXNzYWdlUGFyYW1zLFxuICBTaG93TWVzc2FnZVJlcXVlc3RQYXJhbXMsXG59IGZyb20gXCIuLi9sYW5ndWFnZWNsaWVudFwiXG5pbXBvcnQgeyBOb3RpZmljYXRpb24sIE5vdGlmaWNhdGlvbk9wdGlvbnMgfSBmcm9tIFwiYXRvbVwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uQnV0dG9uIHtcbiAgdGV4dDogc3RyaW5nXG59XG5cbi8qKiBQdWJsaWM6IEFkYXB0cyBBdG9tJ3MgdXNlciBub3RpZmljYXRpb25zIHRvIHRob3NlIG9mIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgcHJvdG9jb2wuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb3RpZmljYXRpb25zQWRhcHRlciB7XG4gIC8qKiBQdWJsaWM6IEF0dGFjaCB0byBhIHtMYW5ndWFnZUNsaWVudENvbm5lY3Rpb259IHRvIHJlY2lldmUgZXZlbnRzIGluZGljYXRpbmcgd2hlbiB1c2VyIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlIGRpc3BsYXllZC4gKi9cbiAgcHVibGljIHN0YXRpYyBhdHRhY2goY29ubmVjdGlvbjogTGFuZ3VhZ2VDbGllbnRDb25uZWN0aW9uLCBuYW1lOiBzdHJpbmcsIHByb2plY3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25uZWN0aW9uLm9uU2hvd01lc3NhZ2UoKG0pID0+IE5vdGlmaWNhdGlvbnNBZGFwdGVyLm9uU2hvd01lc3NhZ2UobSwgbmFtZSwgcHJvamVjdFBhdGgpKVxuICAgIGNvbm5lY3Rpb24ub25TaG93TWVzc2FnZVJlcXVlc3QoKG0pID0+IE5vdGlmaWNhdGlvbnNBZGFwdGVyLm9uU2hvd01lc3NhZ2VSZXF1ZXN0KG0sIG5hbWUsIHByb2plY3RQYXRoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWJsaWM6IFNob3cgYSBub3RpZmljYXRpb24gbWVzc2FnZSB3aXRoIGJ1dHRvbnMgdXNpbmcgdGhlIEF0b20gbm90aWZpY2F0aW9ucyBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgVGhlIHtTaG93TWVzc2FnZVJlcXVlc3RQYXJhbXN9IHJlY2VpdmVkIGZyb20gdGhlIGxhbmd1YWdlIHNlcnZlciBpbmRpY2F0aW5nIHRoZSBkZXRhaWxzIG9mIHRoZVxuICAgKiAgIG5vdGlmaWNhdGlvbiB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgc28gdGhlIHVzZXIgY2FuIGlkZW50aWZ5IHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gcHJvamVjdFBhdGggVGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb25TaG93TWVzc2FnZVJlcXVlc3QoXG4gICAgcGFyYW1zOiBTaG93TWVzc2FnZVJlcXVlc3RQYXJhbXMsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb2plY3RQYXRoOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxNZXNzYWdlQWN0aW9uSXRlbSB8IG51bGw+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbnM6IE5vdGlmaWNhdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgIGRpc21pc3NhYmxlOiB0cnVlLFxuICAgICAgICBkZXRhaWw6IGAke25hbWV9ICR7cHJvamVjdFBhdGh9YCxcbiAgICAgIH1cbiAgICAgIGlmIChwYXJhbXMuYWN0aW9ucykge1xuICAgICAgICBvcHRpb25zLmJ1dHRvbnMgPSBwYXJhbXMuYWN0aW9ucy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgdGV4dDogYS50aXRsZSxcbiAgICAgICAgICBvbkRpZENsaWNrOiAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGEpXG4gICAgICAgICAgICBpZiAobm90aWZpY2F0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLmRpc21pc3MoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBub3RpZmljYXRpb24gPSBhZGROb3RpZmljYXRpb25Gb3JNZXNzYWdlKHBhcmFtcy50eXBlLCBwYXJhbXMubWVzc2FnZSwgb3B0aW9ucylcblxuICAgICAgaWYgKG5vdGlmaWNhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5vbkRpZERpc21pc3MoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUobnVsbClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYzogU2hvdyBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlIHVzaW5nIHRoZSBBdG9tIG5vdGlmaWNhdGlvbnMgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIFRoZSB7U2hvd01lc3NhZ2VQYXJhbXN9IHJlY2VpdmVkIGZyb20gdGhlIGxhbmd1YWdlIHNlcnZlciBpbmRpY2F0aW5nIHRoZSBkZXRhaWxzIG9mIHRoZSBub3RpZmljYXRpb25cbiAgICogICB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBsYW5ndWFnZSBzZXJ2ZXIgc28gdGhlIHVzZXIgY2FuIGlkZW50aWZ5IHRoZSBjb250ZXh0IG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gcHJvamVjdFBhdGggVGhlIHBhdGggb2YgdGhlIGN1cnJlbnQgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb25TaG93TWVzc2FnZShwYXJhbXM6IFNob3dNZXNzYWdlUGFyYW1zLCBuYW1lOiBzdHJpbmcsIHByb2plY3RQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBhZGROb3RpZmljYXRpb25Gb3JNZXNzYWdlKHBhcmFtcy50eXBlLCBwYXJhbXMubWVzc2FnZSwge1xuICAgICAgZGlzbWlzc2FibGU6IHRydWUsXG4gICAgICBkZXRhaWw6IGAke25hbWV9ICR7cHJvamVjdFBhdGh9YCxcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFB1YmxpYzogQ29udmVydCBhIHtNZXNzYWdlQWN0aW9uSXRlbX0gZnJvbSB0aGUgbGFuZ3VhZ2Ugc2VydmVyIGludG8gYW4gZXF1aXZhbGVudCB7Tm90aWZpY2F0aW9uQnV0dG9ufSB3aXRoaW4gQXRvbS5cbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbkl0ZW0gVGhlIHtNZXNzYWdlQWN0aW9uSXRlbX0gdG8gYmUgY29udmVydGVkLlxuICAgKiBAcmV0dXJucyBBIHtOb3RpZmljYXRpb25CdXR0b259IGVxdWl2YWxlbnQgdG8gdGhlIHtNZXNzYWdlQWN0aW9uSXRlbX0gZ2l2ZW4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFjdGlvbkl0ZW1Ub05vdGlmaWNhdGlvbkJ1dHRvbihhY3Rpb25JdGVtOiBNZXNzYWdlQWN0aW9uSXRlbSk6IE5vdGlmaWNhdGlvbkJ1dHRvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IGFjdGlvbkl0ZW0udGl0bGUsXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lc3NhZ2VUeXBlVG9TdHJpbmcobWVzc2FnZVR5cGU6IG51bWJlcik6IHN0cmluZyB7XG4gIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLkVycm9yOlxuICAgICAgcmV0dXJuIFwiZXJyb3JcIlxuICAgIGNhc2UgTWVzc2FnZVR5cGUuV2FybmluZzpcbiAgICAgIHJldHVybiBcIndhcm5pbmdcIlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJpbmZvXCJcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGROb3RpZmljYXRpb25Gb3JNZXNzYWdlKFxuICBtZXNzYWdlVHlwZTogbnVtYmVyLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIG9wdGlvbnM6IE5vdGlmaWNhdGlvbk9wdGlvbnNcbik6IE5vdGlmaWNhdGlvbiB8IG51bGwge1xuICBmdW5jdGlvbiBpc0R1cGxpY2F0ZShub3RlOiBOb3RpZmljYXRpb24pOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RlRGlzbWlzc2VkID0gbm90ZS5pc0Rpc21pc3NlZCAmJiBub3RlLmlzRGlzbWlzc2VkKClcbiAgICBjb25zdCBub3RlT3B0aW9ucyA9IChub3RlLmdldE9wdGlvbnMgJiYgbm90ZS5nZXRPcHRpb25zKCkpIHx8IHt9XG4gICAgcmV0dXJuIChcbiAgICAgICFub3RlRGlzbWlzc2VkICYmXG4gICAgICBub3RlLmdldFR5cGUoKSA9PT0gbWVzc2FnZVR5cGVUb1N0cmluZyhtZXNzYWdlVHlwZSkgJiZcbiAgICAgIG5vdGUuZ2V0TWVzc2FnZSgpID09PSBtZXNzYWdlICYmXG4gICAgICBub3RlT3B0aW9ucy5kZXRhaWwgPT09IG9wdGlvbnMuZGV0YWlsXG4gICAgKVxuICB9XG4gIGlmIChhdG9tLm5vdGlmaWNhdGlvbnMuZ2V0Tm90aWZpY2F0aW9ucygpLnNvbWUoaXNEdXBsaWNhdGUpKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHN3aXRjaCAobWVzc2FnZVR5cGUpIHtcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLkVycm9yOlxuICAgICAgcmV0dXJuIGF0b20ubm90aWZpY2F0aW9ucy5hZGRFcnJvcihtZXNzYWdlLCBvcHRpb25zKVxuICAgIGNhc2UgTWVzc2FnZVR5cGUuV2FybmluZzpcbiAgICAgIHJldHVybiBhdG9tLm5vdGlmaWNhdGlvbnMuYWRkV2FybmluZyhtZXNzYWdlLCBvcHRpb25zKVxuICAgIGNhc2UgTWVzc2FnZVR5cGUuTG9nOlxuICAgICAgLy8gY29uc29sZS5sb2cocGFyYW1zLm1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIG51bGxcbiAgICBjYXNlIE1lc3NhZ2VUeXBlLkluZm86XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBhdG9tLm5vdGlmaWNhdGlvbnMuYWRkSW5mbyhtZXNzYWdlLCBvcHRpb25zKVxuICB9XG59XG4iXX0=
;