matrix-react-sdk
Version:
SDK for matrix.org using React
105 lines (102 loc) • 15.3 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _languageHandler = require("../languageHandler");
var _AutocompleteProvider = _interopRequireDefault(require("./AutocompleteProvider"));
var _QueryMatcher = _interopRequireDefault(require("./QueryMatcher"));
var _Components = require("./Components");
var _SlashCommands = require("../SlashCommands");
var _MatrixClientPeg = require("../MatrixClientPeg");
/*
Copyright 2024 New Vector Ltd.
Copyright 2018 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2017 Vector Creations Ltd
Copyright 2017 New Vector Ltd
Copyright 2016 Aviral Dasgupta
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
const COMMAND_RE = /(^\/\w*)(?: .*)?/g;
class CommandProvider extends _AutocompleteProvider.default {
constructor(room, renderingType) {
super({
commandRegex: COMMAND_RE,
renderingType
});
(0, _defineProperty2.default)(this, "matcher", void 0);
this.matcher = new _QueryMatcher.default(_SlashCommands.Commands, {
keys: ["command", "args", "description"],
funcs: [({
aliases
}) => aliases.join(" ")],
// aliases
context: renderingType
});
}
async getCompletions(query, selection, force, limit = -1) {
const {
command,
range
} = this.getCurrentCommand(query, selection);
if (!command) return [];
const cli = _MatrixClientPeg.MatrixClientPeg.get();
let matches = [];
// check if the full match differs from the first word (i.e. returns false if the command has args)
if (command[0] !== command[1]) {
// The input looks like a command with arguments, perform exact match
const name = command[1].slice(1); // strip leading `/`
if (_SlashCommands.CommandMap.has(name) && _SlashCommands.CommandMap.get(name).isEnabled(cli)) {
// some commands, namely `me` don't suit having the usage shown whilst typing their arguments
if (_SlashCommands.CommandMap.get(name).hideCompletionAfterSpace) return [];
matches = [_SlashCommands.CommandMap.get(name)];
}
} else {
if (query === "/") {
// If they have just entered `/` show everything
// We exclude the limit on purpose to have a comprehensive list
matches = _SlashCommands.Commands;
} else {
// otherwise fuzzy match against all of the fields
matches = this.matcher.match(command[1], limit);
}
}
return matches.filter(cmd => {
const display = !cmd.renderingTypes || cmd.renderingTypes.includes(this.renderingType);
return cmd.isEnabled(cli) && display;
}).map(result => {
let completion = result.getCommand() + " ";
const usedAlias = result.aliases.find(alias => `/${alias}` === command[1]);
// If the command (or an alias) is the same as the one they entered, we don't want to discard their arguments
if (usedAlias || result.getCommand() === command[1]) {
completion = command[0];
}
return {
completion,
type: "command",
component: /*#__PURE__*/_react.default.createElement(_Components.TextualCompletion, {
title: `/${usedAlias || result.command}`,
subtitle: result.args,
description: (0, _languageHandler._t)(result.description)
}),
range: range
};
});
}
getName() {
return "*️⃣ " + (0, _languageHandler._t)("composer|autocomplete|command_description");
}
renderCompletions(completions) {
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Autocomplete_Completion_container_pill",
role: "presentation",
"aria-label": (0, _languageHandler._t)("composer|autocomplete|command_a11y")
}, completions);
}
}
exports.default = CommandProvider;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfQXV0b2NvbXBsZXRlUHJvdmlkZXIiLCJfUXVlcnlNYXRjaGVyIiwiX0NvbXBvbmVudHMiLCJfU2xhc2hDb21tYW5kcyIsIl9NYXRyaXhDbGllbnRQZWciLCJDT01NQU5EX1JFIiwiQ29tbWFuZFByb3ZpZGVyIiwiQXV0b2NvbXBsZXRlUHJvdmlkZXIiLCJjb25zdHJ1Y3RvciIsInJvb20iLCJyZW5kZXJpbmdUeXBlIiwiY29tbWFuZFJlZ2V4IiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJtYXRjaGVyIiwiUXVlcnlNYXRjaGVyIiwiQ29tbWFuZHMiLCJrZXlzIiwiZnVuY3MiLCJhbGlhc2VzIiwiam9pbiIsImNvbnRleHQiLCJnZXRDb21wbGV0aW9ucyIsInF1ZXJ5Iiwic2VsZWN0aW9uIiwiZm9yY2UiLCJsaW1pdCIsImNvbW1hbmQiLCJyYW5nZSIsImdldEN1cnJlbnRDb21tYW5kIiwiY2xpIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwibWF0Y2hlcyIsIm5hbWUiLCJzbGljZSIsIkNvbW1hbmRNYXAiLCJoYXMiLCJpc0VuYWJsZWQiLCJoaWRlQ29tcGxldGlvbkFmdGVyU3BhY2UiLCJtYXRjaCIsImZpbHRlciIsImNtZCIsImRpc3BsYXkiLCJyZW5kZXJpbmdUeXBlcyIsImluY2x1ZGVzIiwibWFwIiwicmVzdWx0IiwiY29tcGxldGlvbiIsImdldENvbW1hbmQiLCJ1c2VkQWxpYXMiLCJmaW5kIiwiYWxpYXMiLCJ0eXBlIiwiY29tcG9uZW50IiwiY3JlYXRlRWxlbWVudCIsIlRleHR1YWxDb21wbGV0aW9uIiwidGl0bGUiLCJzdWJ0aXRsZSIsImFyZ3MiLCJkZXNjcmlwdGlvbiIsIl90IiwiZ2V0TmFtZSIsInJlbmRlckNvbXBsZXRpb25zIiwiY29tcGxldGlvbnMiLCJjbGFzc05hbWUiLCJyb2xlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRvY29tcGxldGUvQ29tbWFuZFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOCBNaWNoYWVsIFRlbGF0eW5za2kgPDd0M2NoZ3V5QGdtYWlsLmNvbT5cbkNvcHlyaWdodCAyMDE3IFZlY3RvciBDcmVhdGlvbnMgTHRkXG5Db3B5cmlnaHQgMjAxNyBOZXcgVmVjdG9yIEx0ZFxuQ29weXJpZ2h0IDIwMTYgQXZpcmFsIERhc2d1cHRhXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJvb20gfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IEF1dG9jb21wbGV0ZVByb3ZpZGVyIGZyb20gXCIuL0F1dG9jb21wbGV0ZVByb3ZpZGVyXCI7XG5pbXBvcnQgUXVlcnlNYXRjaGVyIGZyb20gXCIuL1F1ZXJ5TWF0Y2hlclwiO1xuaW1wb3J0IHsgVGV4dHVhbENvbXBsZXRpb24gfSBmcm9tIFwiLi9Db21wb25lbnRzXCI7XG5pbXBvcnQgeyBJQ29tcGxldGlvbiwgSVNlbGVjdGlvblJhbmdlIH0gZnJvbSBcIi4vQXV0b2NvbXBsZXRlclwiO1xuaW1wb3J0IHsgQ29tbWFuZCwgQ29tbWFuZHMsIENvbW1hbmRNYXAgfSBmcm9tIFwiLi4vU2xhc2hDb21tYW5kc1wiO1xuaW1wb3J0IHsgVGltZWxpbmVSZW5kZXJpbmdUeXBlIH0gZnJvbSBcIi4uL2NvbnRleHRzL1Jvb21Db250ZXh0XCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5cbmNvbnN0IENPTU1BTkRfUkUgPSAvKF5cXC9cXHcqKSg/OiAuKik/L2c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbW1hbmRQcm92aWRlciBleHRlbmRzIEF1dG9jb21wbGV0ZVByb3ZpZGVyIHtcbiAgICBwdWJsaWMgbWF0Y2hlcjogUXVlcnlNYXRjaGVyPENvbW1hbmQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHJvb206IFJvb20sIHJlbmRlcmluZ1R5cGU/OiBUaW1lbGluZVJlbmRlcmluZ1R5cGUpIHtcbiAgICAgICAgc3VwZXIoeyBjb21tYW5kUmVnZXg6IENPTU1BTkRfUkUsIHJlbmRlcmluZ1R5cGUgfSk7XG4gICAgICAgIHRoaXMubWF0Y2hlciA9IG5ldyBRdWVyeU1hdGNoZXIoQ29tbWFuZHMsIHtcbiAgICAgICAgICAgIGtleXM6IFtcImNvbW1hbmRcIiwgXCJhcmdzXCIsIFwiZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICBmdW5jczogWyh7IGFsaWFzZXMgfSkgPT4gYWxpYXNlcy5qb2luKFwiIFwiKV0sIC8vIGFsaWFzZXNcbiAgICAgICAgICAgIGNvbnRleHQ6IHJlbmRlcmluZ1R5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBnZXRDb21wbGV0aW9ucyhcbiAgICAgICAgcXVlcnk6IHN0cmluZyxcbiAgICAgICAgc2VsZWN0aW9uOiBJU2VsZWN0aW9uUmFuZ2UsXG4gICAgICAgIGZvcmNlPzogYm9vbGVhbixcbiAgICAgICAgbGltaXQgPSAtMSxcbiAgICApOiBQcm9taXNlPElDb21wbGV0aW9uW10+IHtcbiAgICAgICAgY29uc3QgeyBjb21tYW5kLCByYW5nZSB9ID0gdGhpcy5nZXRDdXJyZW50Q29tbWFuZChxdWVyeSwgc2VsZWN0aW9uKTtcbiAgICAgICAgaWYgKCFjb21tYW5kKSByZXR1cm4gW107XG5cbiAgICAgICAgY29uc3QgY2xpID0gTWF0cml4Q2xpZW50UGVnLmdldCgpO1xuXG4gICAgICAgIGxldCBtYXRjaGVzOiBDb21tYW5kW10gPSBbXTtcbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGZ1bGwgbWF0Y2ggZGlmZmVycyBmcm9tIHRoZSBmaXJzdCB3b3JkIChpLmUuIHJldHVybnMgZmFsc2UgaWYgdGhlIGNvbW1hbmQgaGFzIGFyZ3MpXG4gICAgICAgIGlmIChjb21tYW5kWzBdICE9PSBjb21tYW5kWzFdKSB7XG4gICAgICAgICAgICAvLyBUaGUgaW5wdXQgbG9va3MgbGlrZSBhIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMsIHBlcmZvcm0gZXhhY3QgbWF0Y2hcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBjb21tYW5kWzFdLnNsaWNlKDEpOyAvLyBzdHJpcCBsZWFkaW5nIGAvYFxuICAgICAgICAgICAgaWYgKENvbW1hbmRNYXAuaGFzKG5hbWUpICYmIENvbW1hbmRNYXAuZ2V0KG5hbWUpIS5pc0VuYWJsZWQoY2xpKSkge1xuICAgICAgICAgICAgICAgIC8vIHNvbWUgY29tbWFuZHMsIG5hbWVseSBgbWVgIGRvbid0IHN1aXQgaGF2aW5nIHRoZSB1c2FnZSBzaG93biB3aGlsc3QgdHlwaW5nIHRoZWlyIGFyZ3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChDb21tYW5kTWFwLmdldChuYW1lKSEuaGlkZUNvbXBsZXRpb25BZnRlclNwYWNlKSByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgbWF0Y2hlcyA9IFtDb21tYW5kTWFwLmdldChuYW1lKSFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHF1ZXJ5ID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXkgaGF2ZSBqdXN0IGVudGVyZWQgYC9gIHNob3cgZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgIC8vIFdlIGV4Y2x1ZGUgdGhlIGxpbWl0IG9uIHB1cnBvc2UgdG8gaGF2ZSBhIGNvbXByZWhlbnNpdmUgbGlzdFxuICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBDb21tYW5kcztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGZ1enp5IG1hdGNoIGFnYWluc3QgYWxsIG9mIHRoZSBmaWVsZHNcbiAgICAgICAgICAgICAgICBtYXRjaGVzID0gdGhpcy5tYXRjaGVyLm1hdGNoKGNvbW1hbmRbMV0sIGxpbWl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtYXRjaGVzXG4gICAgICAgICAgICAuZmlsdGVyKChjbWQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5ID0gIWNtZC5yZW5kZXJpbmdUeXBlcyB8fCBjbWQucmVuZGVyaW5nVHlwZXMuaW5jbHVkZXModGhpcy5yZW5kZXJpbmdUeXBlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY21kLmlzRW5hYmxlZChjbGkpICYmIGRpc3BsYXk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLm1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbXBsZXRpb24gPSByZXN1bHQuZ2V0Q29tbWFuZCgpICsgXCIgXCI7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlZEFsaWFzID0gcmVzdWx0LmFsaWFzZXMuZmluZCgoYWxpYXMpID0+IGAvJHthbGlhc31gID09PSBjb21tYW5kWzFdKTtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tbWFuZCAob3IgYW4gYWxpYXMpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdGhleSBlbnRlcmVkLCB3ZSBkb24ndCB3YW50IHRvIGRpc2NhcmQgdGhlaXIgYXJndW1lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHVzZWRBbGlhcyB8fCByZXN1bHQuZ2V0Q29tbWFuZCgpID09PSBjb21tYW5kWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gPSBjb21tYW5kWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiY29tbWFuZFwiLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0dWFsQ29tcGxldGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtgLyR7dXNlZEFsaWFzIHx8IHJlc3VsdC5jb21tYW5kfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGU9e3Jlc3VsdC5hcmdzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChyZXN1bHQuZGVzY3JpcHRpb24pfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlISxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiKu+4j+KDoyBcIiArIF90KFwiY29tcG9zZXJ8YXV0b2NvbXBsZXRlfGNvbW1hbmRfZGVzY3JpcHRpb25cIik7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlckNvbXBsZXRpb25zKGNvbXBsZXRpb25zOiBSZWFjdC5SZWFjdE5vZGVbXSk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQXV0b2NvbXBsZXRlX0NvbXBsZXRpb25fY29udGFpbmVyX3BpbGxcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJwcmVzZW50YXRpb25cIlxuICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwiY29tcG9zZXJ8YXV0b2NvbXBsZXRlfGNvbW1hbmRfYTExeVwiKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y29tcGxldGlvbnN9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBV0EsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLHFCQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxhQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxXQUFBLEdBQUFKLE9BQUE7QUFFQSxJQUFBSyxjQUFBLEdBQUFMLE9BQUE7QUFFQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWNBLE1BQU1PLFVBQVUsR0FBRyxtQkFBbUI7QUFFdkIsTUFBTUMsZUFBZSxTQUFTQyw2QkFBb0IsQ0FBQztFQUd2REMsV0FBV0EsQ0FBQ0MsSUFBVSxFQUFFQyxhQUFxQyxFQUFFO0lBQ2xFLEtBQUssQ0FBQztNQUFFQyxZQUFZLEVBQUVOLFVBQVU7TUFBRUs7SUFBYyxDQUFDLENBQUM7SUFBQyxJQUFBRSxnQkFBQSxDQUFBQyxPQUFBO0lBQ25ELElBQUksQ0FBQ0MsT0FBTyxHQUFHLElBQUlDLHFCQUFZLENBQUNDLHVCQUFRLEVBQUU7TUFDdENDLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDO01BQ3hDQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQUVDO01BQVEsQ0FBQyxLQUFLQSxPQUFPLENBQUNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUFFO01BQzdDQyxPQUFPLEVBQUVYO0lBQ2IsQ0FBQyxDQUFDO0VBQ047RUFFQSxNQUFhWSxjQUFjQSxDQUN2QkMsS0FBYSxFQUNiQyxTQUEwQixFQUMx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