@stoplight/command
Advanced tools
+150
-217
@@ -1,50 +0,32 @@ | ||
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| var tslib_1 = require("tslib"); | ||
| var mobx_1 = require("mobx"); | ||
| var disposable = require("@stoplight/disposable"); | ||
| var emitter_1 = require("@stoplight/emitter"); | ||
| var ioc_1 = require("@stoplight/ioc"); | ||
| var types_1 = require("./types"); | ||
| var keyboardJS; | ||
| var Command = /** @class */ (function () { | ||
| function Command(command) { | ||
| import * as tslib_1 from "tslib"; | ||
| import { action, computed, observable } from 'mobx'; | ||
| import * as disposable from '@stoplight/disposable'; | ||
| import { Emitter } from '@stoplight/emitter'; | ||
| import { provideSingleton } from '@stoplight/ioc'; | ||
| import { SYMBOLS, } from './types'; | ||
| let keyboardJS; | ||
| export class Command { | ||
| constructor(command) { | ||
| this._enabled = false; | ||
| this._executing = false; | ||
| this._visible = false; | ||
| this._didUpdateEmitter = new emitter_1.Emitter(); | ||
| this._didUpdateEmitter = new Emitter(); | ||
| this.id = command.id; | ||
| } | ||
| Object.defineProperty(Command.prototype, "enabled", { | ||
| get: function () { | ||
| return this._enabled; | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| Object.defineProperty(Command.prototype, "executing", { | ||
| get: function () { | ||
| return this._executing; | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| Object.defineProperty(Command.prototype, "visible", { | ||
| get: function () { | ||
| return this._visible; | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| Object.defineProperty(Command.prototype, "onDidUpdate", { | ||
| get: function () { | ||
| return this._didUpdateEmitter.event; | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| Command.prototype.update = function (change) { | ||
| get enabled() { | ||
| return this._enabled; | ||
| } | ||
| get executing() { | ||
| return this._executing; | ||
| } | ||
| get visible() { | ||
| return this._visible; | ||
| } | ||
| get onDidUpdate() { | ||
| return this._didUpdateEmitter.event; | ||
| } | ||
| update(change) { | ||
| if (!change) | ||
| return; | ||
| var enabled = change.enabled, executing = change.executing, visible = change.visible; | ||
| const { enabled, executing, visible } = change; | ||
| if (enabled === this.enabled && executing === this.executing && visible === this.visible) | ||
@@ -59,44 +41,42 @@ return; | ||
| this._didUpdateEmitter.fire(this); | ||
| }; | ||
| tslib_1.__decorate([ | ||
| mobx_1.observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_enabled", void 0); | ||
| tslib_1.__decorate([ | ||
| mobx_1.observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_executing", void 0); | ||
| tslib_1.__decorate([ | ||
| mobx_1.observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_visible", void 0); | ||
| tslib_1.__decorate([ | ||
| mobx_1.computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "enabled", null); | ||
| tslib_1.__decorate([ | ||
| mobx_1.computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "executing", null); | ||
| tslib_1.__decorate([ | ||
| mobx_1.computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "visible", null); | ||
| tslib_1.__decorate([ | ||
| mobx_1.action, | ||
| tslib_1.__metadata("design:type", Function), | ||
| tslib_1.__metadata("design:paramtypes", [Object]), | ||
| tslib_1.__metadata("design:returntype", void 0) | ||
| ], Command.prototype, "update", null); | ||
| return Command; | ||
| }()); | ||
| exports.Command = Command; | ||
| } | ||
| } | ||
| tslib_1.__decorate([ | ||
| observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_enabled", void 0); | ||
| tslib_1.__decorate([ | ||
| observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_executing", void 0); | ||
| tslib_1.__decorate([ | ||
| observable, | ||
| tslib_1.__metadata("design:type", Boolean) | ||
| ], Command.prototype, "_visible", void 0); | ||
| tslib_1.__decorate([ | ||
| computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "enabled", null); | ||
| tslib_1.__decorate([ | ||
| computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "executing", null); | ||
| tslib_1.__decorate([ | ||
| computed, | ||
| tslib_1.__metadata("design:type", Object), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], Command.prototype, "visible", null); | ||
| tslib_1.__decorate([ | ||
| action, | ||
| tslib_1.__metadata("design:type", Function), | ||
| tslib_1.__metadata("design:paramtypes", [Object]), | ||
| tslib_1.__metadata("design:returntype", void 0) | ||
| ], Command.prototype, "update", null); | ||
| /** | ||
| * The command registry manages commands and handlers. | ||
| */ | ||
| var CommandRegistry = /** @class */ (function () { | ||
| function CommandRegistry() { | ||
| let CommandRegistry = class CommandRegistry { | ||
| constructor() { | ||
| this._commands = {}; | ||
@@ -110,36 +90,27 @@ this._handlers = {}; | ||
| } | ||
| Object.defineProperty(CommandRegistry.prototype, "commands", { | ||
| /** | ||
| * Get all registered commands. | ||
| */ | ||
| get: function () { | ||
| var commands = []; | ||
| for (var _i = 0, _a = this.commandIds; _i < _a.length; _i++) { | ||
| var id = _a[_i]; | ||
| var cmd = this.getCommand(id); | ||
| if (cmd) { | ||
| commands.push(cmd); | ||
| } | ||
| /** | ||
| * Get all registered commands. | ||
| */ | ||
| get commands() { | ||
| const commands = []; | ||
| for (const id of this.commandIds) { | ||
| const cmd = this.getCommand(id); | ||
| if (cmd) { | ||
| commands.push(cmd); | ||
| } | ||
| return commands; | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| Object.defineProperty(CommandRegistry.prototype, "commandIds", { | ||
| /** | ||
| * Get all registered commands identifiers. | ||
| */ | ||
| get: function () { | ||
| return Object.keys(this._commands); | ||
| }, | ||
| enumerable: true, | ||
| configurable: true | ||
| }); | ||
| } | ||
| return commands; | ||
| } | ||
| /** | ||
| * Get all registered commands identifiers. | ||
| */ | ||
| get commandIds() { | ||
| return Object.keys(this._commands); | ||
| } | ||
| /** | ||
| * Get a command for the given command identifier. | ||
| */ | ||
| CommandRegistry.prototype.getCommand = function (id) { | ||
| getCommand(id) { | ||
| return this._commands[id]; | ||
| }; | ||
| } | ||
| /** | ||
@@ -150,5 +121,5 @@ * Register the given command and handler if present. | ||
| */ | ||
| CommandRegistry.prototype.registerCommand = function (command, handler) { | ||
| registerCommand(command, handler) { | ||
| if (handler) { | ||
| var toDispose = new disposable.Collection(); | ||
| const toDispose = new disposable.Collection(); | ||
| toDispose.push(this._registerCommand(command)); | ||
@@ -159,9 +130,8 @@ toDispose.push(this.registerHandler(command.id, handler)); | ||
| return this._registerCommand(command); | ||
| }; | ||
| } | ||
| /** | ||
| * Register the given handler for the given command identifier. | ||
| */ | ||
| CommandRegistry.prototype.registerHandler = function (commandId, handler) { | ||
| var _this = this; | ||
| var handlers = this._handlers[commandId]; | ||
| registerHandler(commandId, handler) { | ||
| let handlers = this._handlers[commandId]; | ||
| if (!handlers) { | ||
@@ -172,34 +142,33 @@ this._handlers[commandId] = handlers = []; | ||
| this.refreshCommandState(commandId); | ||
| return disposable.create(function () { | ||
| var idx = handlers.indexOf(handler); | ||
| return disposable.create(() => { | ||
| const idx = handlers.indexOf(handler); | ||
| if (idx >= 0) { | ||
| handlers.splice(idx, 1); | ||
| } | ||
| _this.refreshCommandState(commandId); | ||
| this.refreshCommandState(commandId); | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Register the given shortcut for the given command identifier. | ||
| */ | ||
| CommandRegistry.prototype.registerShortcut = function (shortcut, options) { | ||
| var _this = this; | ||
| registerShortcut(shortcut, options) { | ||
| if (!keyboardJS) | ||
| return disposable.NOOP; | ||
| var commandId = options.commandId, execute = options.execute; | ||
| const { commandId, execute } = options; | ||
| if (commandId) { | ||
| if (!this._commands[commandId]) { | ||
| throw Error("Cannot bind '" + shortcut + "' to unregistered command with ID '" + commandId + "'."); | ||
| throw Error(`Cannot bind '${shortcut}' to unregistered command with ID '${commandId}'.`); | ||
| } | ||
| } | ||
| else if (!execute) { | ||
| throw Error("Cannot bind '" + shortcut + "' shortcut. commandId or execute function must be provided."); | ||
| throw Error(`Cannot bind '${shortcut}' shortcut. commandId or execute function must be provided.`); | ||
| } | ||
| if (this._shortcuts[shortcut]) { | ||
| throw Error("The '" + shortcut + "' has already been registered."); | ||
| throw Error(`The '${shortcut}' has already been registered.`); | ||
| } | ||
| this._shortcuts[shortcut] = keyboardJS.bind(shortcut, function (e) { | ||
| this._shortcuts[shortcut] = keyboardJS.bind(shortcut, (e) => { | ||
| e.preventDefault(); | ||
| if (commandId) { | ||
| if (_this.isActive(commandId)) { | ||
| _this.executeCommand(commandId); | ||
| if (this.isActive(commandId)) { | ||
| this.executeCommand(commandId); | ||
| } | ||
@@ -211,40 +180,28 @@ } | ||
| }); | ||
| return disposable.create(function () { | ||
| var sh = _this._shortcuts[shortcut]; | ||
| return disposable.create(() => { | ||
| const sh = this._shortcuts[shortcut]; | ||
| if (sh) { | ||
| keyboardJS.unbind(shortcut, sh); | ||
| delete _this._shortcuts[shortcut]; | ||
| delete this._shortcuts[shortcut]; | ||
| } | ||
| }); | ||
| }; | ||
| } | ||
| /** | ||
| * Test whether there is an active handler for the given command. | ||
| */ | ||
| CommandRegistry.prototype.isActive = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| return this.getActiveHandler.apply(this, [commandId].concat(args)) !== undefined; | ||
| }; | ||
| isActive(commandId, ...args) { | ||
| return this.getActiveHandler(commandId, ...args) !== undefined; | ||
| } | ||
| /** | ||
| * Test whether there is a visible handler for the given command. | ||
| */ | ||
| CommandRegistry.prototype.isVisible = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| return this.getVisibleHandler.apply(this, [commandId].concat(args)) !== undefined; | ||
| }; | ||
| isVisible(commandId, ...args) { | ||
| return this.getVisibleHandler(commandId, ...args) !== undefined; | ||
| } | ||
| /** | ||
| * Test whether there is a handler that is currently executing for the given command. | ||
| */ | ||
| CommandRegistry.prototype.isExecuting = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| return this.getExecutingHandler.apply(this, [commandId].concat(args)) !== undefined; | ||
| }; | ||
| isExecuting(commandId, ...args) { | ||
| return this.getExecutingHandler(commandId, ...args) !== undefined; | ||
| } | ||
| /** | ||
@@ -255,26 +212,18 @@ * Execute the active handler for the given command and arguments. | ||
| */ | ||
| CommandRegistry.prototype.executeCommand = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| var handler = this.getActiveHandler.apply(this, [commandId].concat(args)); | ||
| executeCommand(commandId, ...args) { | ||
| const handler = this.getActiveHandler(commandId, ...args); | ||
| if (handler) { | ||
| return Promise.resolve(handler.execute.apply(handler, args)); | ||
| return Promise.resolve(handler.execute(...args)); | ||
| } | ||
| return Promise.reject("The command '" + commandId + "' cannot be executed. There are no active\n handlers available for the command."); | ||
| }; | ||
| return Promise.reject(`The command '${commandId}' cannot be executed. There are no active | ||
| handlers available for the command.`); | ||
| } | ||
| /** | ||
| * Get a visible handler for the given command or `undefined`. | ||
| */ | ||
| CommandRegistry.prototype.getVisibleHandler = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| var handlers = this._handlers[commandId]; | ||
| getVisibleHandler(commandId, ...args) { | ||
| const handlers = this._handlers[commandId]; | ||
| if (handlers) { | ||
| for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) { | ||
| var handler = handlers_1[_a]; | ||
| if (!handler.isVisible || handler.isVisible.apply(handler, args)) { | ||
| for (const handler of handlers) { | ||
| if (!handler.isVisible || handler.isVisible(...args)) { | ||
| return handler; | ||
@@ -285,16 +234,11 @@ } | ||
| // return this.getHandlerWithState('isVisible', true, commandId, ...args); | ||
| }; | ||
| } | ||
| /** | ||
| * Get a handler that is currently executing for the given command or `undefined`. | ||
| */ | ||
| CommandRegistry.prototype.getExecutingHandler = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| var handlers = this._handlers[commandId]; | ||
| getExecutingHandler(commandId, ...args) { | ||
| const handlers = this._handlers[commandId]; | ||
| if (handlers) { | ||
| for (var _a = 0, handlers_2 = handlers; _a < handlers_2.length; _a++) { | ||
| var handler = handlers_2[_a]; | ||
| if (handler.isExecuting && handler.isExecuting.apply(handler, args)) { | ||
| for (const handler of handlers) { | ||
| if (handler.isExecuting && handler.isExecuting(...args)) { | ||
| return handler; | ||
@@ -305,16 +249,11 @@ } | ||
| // return this.getHandlerWithState('isExecuting', false, commandId, ...args); | ||
| }; | ||
| } | ||
| /** | ||
| * Get an active handler for the given command or `undefined`. | ||
| */ | ||
| CommandRegistry.prototype.getActiveHandler = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| var handlers = this._handlers[commandId]; | ||
| getActiveHandler(commandId, ...args) { | ||
| const handlers = this._handlers[commandId]; | ||
| if (handlers) { | ||
| for (var _a = 0, handlers_3 = handlers; _a < handlers_3.length; _a++) { | ||
| var handler = handlers_3[_a]; | ||
| if (!handler.isActive || handler.isActive.apply(handler, args)) { | ||
| for (const handler of handlers) { | ||
| if (!handler.isActive || handler.isActive(...args)) { | ||
| return handler; | ||
@@ -325,44 +264,38 @@ } | ||
| // return this.getHandlerWithState('isActive', true, commandId, ...args); | ||
| }; | ||
| } | ||
| /** | ||
| * Re-compute and set command props such as enabled. | ||
| */ | ||
| CommandRegistry.prototype.refreshCommandState = function (commandId) { | ||
| var args = []; | ||
| for (var _i = 1; _i < arguments.length; _i++) { | ||
| args[_i - 1] = arguments[_i]; | ||
| } | ||
| var command = this.getCommand(commandId); | ||
| refreshCommandState(commandId, ...args) { | ||
| const command = this.getCommand(commandId); | ||
| if (!command) | ||
| return; | ||
| command.update({ | ||
| enabled: this.isActive.apply(this, [commandId].concat(args)), | ||
| executing: this.isExecuting.apply(this, [commandId].concat(args)), | ||
| visible: this.isVisible.apply(this, [commandId].concat(args)), | ||
| enabled: this.isActive(commandId, ...args), | ||
| executing: this.isExecuting(commandId, ...args), | ||
| visible: this.isVisible(commandId, ...args), | ||
| }); | ||
| }; | ||
| CommandRegistry.prototype._registerCommand = function (command) { | ||
| var _this = this; | ||
| } | ||
| _registerCommand(command) { | ||
| if (this._commands[command.id]) { | ||
| throw Error("A command with ID '" + command.id + "' is already registered."); | ||
| throw Error(`A command with ID '${command.id}' is already registered.`); | ||
| } | ||
| this._commands[command.id] = new Command(command); | ||
| var shortcut; | ||
| let shortcut; | ||
| if (command.shortcut) { | ||
| shortcut = this.registerShortcut(command.shortcut, { commandId: command.id }); | ||
| } | ||
| return disposable.create(function () { | ||
| return disposable.create(() => { | ||
| if (shortcut) { | ||
| shortcut.dispose(); | ||
| } | ||
| delete _this._commands[command.id]; | ||
| delete this._commands[command.id]; | ||
| }); | ||
| }; | ||
| CommandRegistry = tslib_1.__decorate([ | ||
| ioc_1.provideSingleton(types_1.SYMBOLS.CommandRegistry), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], CommandRegistry); | ||
| return CommandRegistry; | ||
| }()); | ||
| exports.CommandRegistry = CommandRegistry; | ||
| } | ||
| }; | ||
| CommandRegistry = tslib_1.__decorate([ | ||
| provideSingleton(SYMBOLS.CommandRegistry), | ||
| tslib_1.__metadata("design:paramtypes", []) | ||
| ], CommandRegistry); | ||
| export { CommandRegistry }; | ||
| //# sourceMappingURL=command.js.map |
+4
-7
@@ -1,8 +0,5 @@ | ||
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| var tslib_1 = require("tslib"); | ||
| tslib_1.__exportStar(require("./command"), exports); | ||
| tslib_1.__exportStar(require("./types"), exports); | ||
| var types = require("./types"); | ||
| exports.types = types; | ||
| export * from './command'; | ||
| export * from './types'; | ||
| import * as types from './types'; | ||
| export { types }; | ||
| //# sourceMappingURL=index.js.map |
+1
-3
@@ -1,9 +0,7 @@ | ||
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| /** | ||
| * Unique symbol identifiers, used for IOC. | ||
| */ | ||
| exports.SYMBOLS = { | ||
| export const SYMBOLS = { | ||
| CommandRegistry: 'CommandRegistry', | ||
| }; | ||
| //# sourceMappingURL=types.js.map |
+6
-7
| { | ||
| "name": "@stoplight/command", | ||
| "version": "0.0.43", | ||
| "version": "0.0.44-alpha.0", | ||
| "description": "Stoplight command registry implementation.", | ||
| "main": "lib/index.js", | ||
| "module": "lib/index.es.js", | ||
| "jsnext:main": "lib/index.es.js", | ||
| "sideEffects": false, | ||
| "author": "Stoplight <dev@stoplight.io>", | ||
@@ -23,9 +22,9 @@ "homepage": "https://stoplight.io", | ||
| "dependencies": { | ||
| "@stoplight/disposable": "0.0.43", | ||
| "@stoplight/emitter": "0.0.43", | ||
| "@stoplight/ioc": "0.0.43", | ||
| "@stoplight/disposable": "0.0.44-alpha.0", | ||
| "@stoplight/emitter": "0.0.44-alpha.0", | ||
| "@stoplight/ioc": "0.0.44-alpha.0", | ||
| "keyboardjs": "2.4.x", | ||
| "tslib": "1.x.x" | ||
| }, | ||
| "gitHead": "863127087b0dcfaebf40e7c0ed86bedcd2835468" | ||
| "gitHead": "ba495e3f8984dd68df510ccfbc2d8401515c4161" | ||
| } |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
23286
-15.17%457
-13.61%+ Added
+ Added
+ Added
- Removed
- Removed
- Removed