Socket
Socket
Sign inDemoInstall

input-sim

Package Overview
Dependencies
Maintainers
2
Versions
10
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

input-sim - npm Package Compare versions

Comparing version 3.0.1 to 3.1.0

test/chai.js

2308

dist/input-sim.js

@@ -1,191 +0,179 @@

(function() {
"use strict";
var $$keybindings$$$__Array$prototype$slice = Array.prototype.slice;
var $$keybindings$$$__Object$defineProperties = Object.defineProperties;
var $$keybindings$$A = 65;
(function (global, factory) {
if (typeof define === 'function' && define.amd) {
define('InputSim', ['exports'], factory);
} else if (typeof exports !== 'undefined') {
factory(exports);
} else {
var mod = {
exports: {}
};
factory(mod.exports);
global.InputSim = mod.exports;
}
})(this, function (exports) {
/*! jshint esnext:true, undef:true, unused:true */
/** @private */
var $$keybindings$$Y = 89;
/** @private */
'use strict';
/** @private */
var $$keybindings$$Z = 90;
Object.defineProperty(exports, '__esModule', {
value: true
});
/** @private */
var $$keybindings$$ZERO = 48;
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
/** @private */
var $$keybindings$$NINE = 57;
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
/** @private */
var $$keybindings$$LEFT = 37;
var A = 65;
/** @private */
var Y = 89;
/** @private */
var Z = 90;
/** @private */
var ZERO = 48;
/** @private */
var NINE = 57;
/** @private */
var LEFT = 37;
/** @private */
var RIGHT = 39;
/** @private */
var UP = 38;
/** @private */
var DOWN = 40;
/** @private */
var BACKSPACE = 8;
/** @private */
var DELETE = 46;
/** @private */
var TAB = 9;
/** @private */
var ENTER = 13;
/** @private */
var $$keybindings$$RIGHT = 39;
/**
* @namespace KEYS
*/
var KEYS = {
A: A,
Y: Y,
Z: Z,
ZERO: ZERO,
NINE: NINE,
LEFT: LEFT,
RIGHT: RIGHT,
UP: UP,
DOWN: DOWN,
BACKSPACE: BACKSPACE,
DELETE: DELETE,
TAB: TAB,
ENTER: ENTER,
/** @private */
var $$keybindings$$UP = 38;
/**
* @param {number} keyCode
* @returns {boolean}
*/
isDigit: function isDigit(keyCode) {
return ZERO <= keyCode && keyCode <= NINE;
},
/** @private */
var $$keybindings$$DOWN = 40;
/**
* Is an arrow keyCode.
*
* @param {number} keyCode
* @returns {boolean}
*/
isDirectional: function isDirectional(keyCode) {
return keyCode === LEFT || keyCode === RIGHT || keyCode === UP || keyCode === DOWN;
}
};
/** @private */
var $$keybindings$$BACKSPACE = 8;
var CTRL = 1 << 0;
var META = 1 << 1;
var ALT = 1 << 2;
var SHIFT = 1 << 3;
/** @private */
var $$keybindings$$DELETE = 46;
var cache = {};
/** @private */
var $$keybindings$$TAB = 9;
/**
* Builds a BindingSet based on the current platform.
*
* @param {string} platform A string name of a platform (e.g. "OSX").
* @returns {BindingSet} keybindings appropriate for the given platform.
*/
function keyBindingsForPlatform(platform) {
var osx = platform === 'OSX';
var ctrl = osx ? META : CTRL;
/** @private */
var $$keybindings$$ENTER = 13;
if (!cache[platform]) {
cache[platform] = build(function (bind) {
bind(A, ctrl, 'selectAll');
bind(LEFT, null, 'moveLeft');
bind(LEFT, ALT, 'moveWordLeft');
bind(LEFT, SHIFT, 'moveLeftAndModifySelection');
bind(LEFT, ALT | SHIFT, 'moveWordLeftAndModifySelection');
bind(RIGHT, null, 'moveRight');
bind(RIGHT, ALT, 'moveWordRight');
bind(RIGHT, SHIFT, 'moveRightAndModifySelection');
bind(RIGHT, ALT | SHIFT, 'moveWordRightAndModifySelection');
bind(UP, null, 'moveUp');
bind(UP, ALT, 'moveToBeginningOfParagraph');
bind(UP, SHIFT, 'moveUpAndModifySelection');
bind(UP, ALT | SHIFT, 'moveParagraphBackwardAndModifySelection');
bind(DOWN, null, 'moveDown');
bind(DOWN, ALT, 'moveToEndOfParagraph');
bind(DOWN, SHIFT, 'moveDownAndModifySelection');
bind(DOWN, ALT | SHIFT, 'moveParagraphForwardAndModifySelection');
bind(BACKSPACE, null, 'deleteBackward');
bind(BACKSPACE, SHIFT, 'deleteBackward');
bind(BACKSPACE, ALT, 'deleteWordBackward');
bind(BACKSPACE, ALT | SHIFT, 'deleteWordBackward');
bind(BACKSPACE, ctrl, 'deleteBackwardToBeginningOfLine');
bind(BACKSPACE, ctrl | SHIFT, 'deleteBackwardToBeginningOfLine');
bind(DELETE, null, 'deleteForward');
bind(DELETE, ALT, 'deleteWordForward');
bind(TAB, null, 'insertTab');
bind(TAB, SHIFT, 'insertBackTab');
bind(ENTER, null, 'insertNewline');
bind(Z, ctrl, 'undo');
var $$keybindings$$KEYS = {
A: $$keybindings$$A,
Y: $$keybindings$$Y,
Z: $$keybindings$$Z,
ZERO: $$keybindings$$ZERO,
NINE: $$keybindings$$NINE,
LEFT: $$keybindings$$LEFT,
RIGHT: $$keybindings$$RIGHT,
UP: $$keybindings$$UP,
DOWN: $$keybindings$$DOWN,
BACKSPACE: $$keybindings$$BACKSPACE,
DELETE: $$keybindings$$DELETE,
TAB: $$keybindings$$TAB,
ENTER: $$keybindings$$ENTER,
/**
* @param {number} keyCode
* @returns {boolean}
*/
isDigit: function(keyCode) {
return $$keybindings$$ZERO <= keyCode && keyCode <= $$keybindings$$NINE;
},
/**
* Is an arrow keyCode.
*
* @param {number} keyCode
* @returns {boolean}
*/
isDirectional: function(keyCode) {
return keyCode === $$keybindings$$LEFT || keyCode === $$keybindings$$RIGHT || keyCode === $$keybindings$$UP || keyCode === $$keybindings$$DOWN;
}
};
var $$keybindings$$CTRL = 1 << 0;
var $$keybindings$$META = 1 << 1;
var $$keybindings$$ALT = 1 << 2;
var $$keybindings$$SHIFT = 1 << 3;
var $$keybindings$$cache = {};
function $$keybindings$$keyBindingsForPlatform(platform) {
var osx = platform === 'OSX';
var ctrl = osx ? $$keybindings$$META : $$keybindings$$CTRL;
if (!$$keybindings$$cache[platform]) {
$$keybindings$$cache[platform] = $$keybindings$$build(function(bind) {
bind($$keybindings$$A , ctrl , 'selectAll');
bind($$keybindings$$LEFT , null , 'moveLeft');
bind($$keybindings$$LEFT , $$keybindings$$ALT , 'moveWordLeft');
bind($$keybindings$$LEFT , $$keybindings$$SHIFT , 'moveLeftAndModifySelection');
bind($$keybindings$$LEFT , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveWordLeftAndModifySelection');
bind($$keybindings$$RIGHT , null , 'moveRight');
bind($$keybindings$$RIGHT , $$keybindings$$ALT , 'moveWordRight');
bind($$keybindings$$RIGHT , $$keybindings$$SHIFT , 'moveRightAndModifySelection');
bind($$keybindings$$RIGHT , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveWordRightAndModifySelection');
bind($$keybindings$$UP , null , 'moveUp');
bind($$keybindings$$UP , $$keybindings$$ALT , 'moveToBeginningOfParagraph');
bind($$keybindings$$UP , $$keybindings$$SHIFT , 'moveUpAndModifySelection');
bind($$keybindings$$UP , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveParagraphBackwardAndModifySelection');
bind($$keybindings$$DOWN , null , 'moveDown');
bind($$keybindings$$DOWN , $$keybindings$$ALT , 'moveToEndOfParagraph');
bind($$keybindings$$DOWN , $$keybindings$$SHIFT , 'moveDownAndModifySelection');
bind($$keybindings$$DOWN , $$keybindings$$ALT|$$keybindings$$SHIFT , 'moveParagraphForwardAndModifySelection');
bind($$keybindings$$BACKSPACE , null , 'deleteBackward');
bind($$keybindings$$BACKSPACE , $$keybindings$$SHIFT , 'deleteBackward');
bind($$keybindings$$BACKSPACE , $$keybindings$$ALT , 'deleteWordBackward');
bind($$keybindings$$BACKSPACE , $$keybindings$$ALT|$$keybindings$$SHIFT , 'deleteWordBackward');
bind($$keybindings$$BACKSPACE , ctrl , 'deleteBackwardToBeginningOfLine');
bind($$keybindings$$BACKSPACE , ctrl|$$keybindings$$SHIFT , 'deleteBackwardToBeginningOfLine');
bind($$keybindings$$DELETE , null , 'deleteForward');
bind($$keybindings$$DELETE , $$keybindings$$ALT , 'deleteWordForward');
bind($$keybindings$$TAB , null , 'insertTab');
bind($$keybindings$$TAB , $$keybindings$$SHIFT , 'insertBackTab');
bind($$keybindings$$ENTER , null , 'insertNewline');
bind($$keybindings$$Z , ctrl , 'undo');
if (osx) {
bind($$keybindings$$LEFT , $$keybindings$$META , 'moveToBeginningOfLine');
bind($$keybindings$$LEFT , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToBeginningOfLineAndModifySelection');
bind($$keybindings$$RIGHT , $$keybindings$$META , 'moveToEndOfLine');
bind($$keybindings$$RIGHT , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToEndOfLineAndModifySelection');
bind($$keybindings$$UP , $$keybindings$$META , 'moveToBeginningOfDocument');
bind($$keybindings$$UP , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToBeginningOfDocumentAndModifySelection');
bind($$keybindings$$DOWN , $$keybindings$$META , 'moveToEndOfDocument');
bind($$keybindings$$DOWN , $$keybindings$$META|$$keybindings$$SHIFT , 'moveToEndOfDocumentAndModifySelection');
bind($$keybindings$$BACKSPACE , $$keybindings$$CTRL , 'deleteBackwardByDecomposingPreviousCharacter');
bind($$keybindings$$BACKSPACE , $$keybindings$$CTRL|$$keybindings$$SHIFT , 'deleteBackwardByDecomposingPreviousCharacter');
bind($$keybindings$$Z , $$keybindings$$META|$$keybindings$$SHIFT , 'redo');
} else {
bind($$keybindings$$Y , $$keybindings$$CTRL , 'redo');
}
});
}
return $$keybindings$$cache[platform];
}
function $$keybindings$$build(callback) {
var result = new $$keybindings$$BindingSet();
callback(function() {
var $__0;
var $__arguments = arguments;
var args = [].slice.call($__arguments, 0);
return ($__0 = result).bind.apply($__0, $$keybindings$$$__Array$prototype$slice.call(args));
if (osx) {
bind(LEFT, META, 'moveToBeginningOfLine');
bind(LEFT, META | SHIFT, 'moveToBeginningOfLineAndModifySelection');
bind(RIGHT, META, 'moveToEndOfLine');
bind(RIGHT, META | SHIFT, 'moveToEndOfLineAndModifySelection');
bind(UP, META, 'moveToBeginningOfDocument');
bind(UP, META | SHIFT, 'moveToBeginningOfDocumentAndModifySelection');
bind(DOWN, META, 'moveToEndOfDocument');
bind(DOWN, META | SHIFT, 'moveToEndOfDocumentAndModifySelection');
bind(BACKSPACE, CTRL, 'deleteBackwardByDecomposingPreviousCharacter');
bind(BACKSPACE, CTRL | SHIFT, 'deleteBackwardByDecomposingPreviousCharacter');
bind(Z, META | SHIFT, 'redo');
} else {
bind(Y, CTRL, 'redo');
}
});
return result;
}
var $$keybindings$$BindingSet = function() {
"use strict";
return cache[platform];
}
function BindingSet() {
this.bindings = {};
}
function build(callback) {
var result = new BindingSet();
callback(function () {
return result.bind.apply(result, arguments);
});
return result;
}
$$keybindings$$$__Object$defineProperties(BindingSet.prototype, {
bind: {
value: function(keyCode, modifiers, action) {
if (!this.bindings[keyCode]) { this.bindings[keyCode] = {}; }
this.bindings[keyCode][modifiers || 0] = action;
},
/**
* @private
*/
enumerable: false,
writable: true
},
var BindingSet = (function () {
function BindingSet() {
_classCallCheck(this, BindingSet);
actionForEvent: {
value: function(event) {
var bindingsForKeyCode = this.bindings[event.keyCode];
if (bindingsForKeyCode) {
var modifiers = 0;
if (event.altKey) { modifiers |= $$keybindings$$ALT; }
if (event.ctrlKey) { modifiers |= $$keybindings$$CTRL; }
if (event.metaKey) { modifiers |= $$keybindings$$META; }
if (event.shiftKey) { modifiers |= $$keybindings$$SHIFT; }
return bindingsForKeyCode[modifiers];
}
},
this.bindings = {};
}
enumerable: false,
writable: true
}
});
return BindingSet;
}();
var $$input$sim$$$__Object$defineProperties = Object.defineProperties;
/**

@@ -198,835 +186,1307 @@ * Enum for text direction affinity.

*/
var $$input$sim$$Affinity = {
UPSTREAM: 0,
DOWNSTREAM: 1,
NONE: null
};
/**
* Tests is string passed in is a single word.
*
* @param {string} chr
* @returns {boolean}
* @private
* @param {number} keyCode
* @param {number} modifiers
* @param {string} action
*/
function $$input$sim$$isWordChar(chr) {
return chr && /^\w$/.test(chr);
}
/**
* Checks if char to the left of {index} in {string}
* is a break (non-char).
*
* @param {string} text
* @param {number} index
* @returns {boolean}
* @private
*/
function $$input$sim$$hasLeftWordBreakAtIndex(text, index) {
if (index === 0) {
return true;
} else {
return !$$input$sim$$isWordChar(text[index - 1]) && $$input$sim$$isWordChar(text[index]);
_createClass(BindingSet, [{
key: 'bind',
value: function bind(keyCode, modifiers, action) {
if (!this.bindings[keyCode]) {
this.bindings[keyCode] = {};
}
this.bindings[keyCode][modifiers || 0] = action;
}
}
/**
* Checks if char to the right of {index} in {string}
* is a break (non-char).
*
* @param {string} text
* @param {number} index
* @returns {boolean}
* @private
*/
function $$input$sim$$hasRightWordBreakAtIndex(text, index) {
if (index === text.length - 1) {
return true;
} else {
return $$input$sim$$isWordChar(text[index]) && !$$input$sim$$isWordChar(text[index + 1]);
}
}
var $$input$sim$$Input = function() {
"use strict";
function Input(value, range) {
this._value = '';
this._selectedRange = {
start: 0,
length: 0
};
this.shouldCancelEvents = true;
this.selectionAffinity = $$input$sim$$Affinity.NONE;
if(value) {
this.setText(value);
/**
* @param {Event} event
* @returns {?string}
*/
}, {
key: 'actionForEvent',
value: function actionForEvent(event) {
var bindingsForKeyCode = this.bindings[event.keyCode];
if (bindingsForKeyCode) {
var modifiers = 0;
if (event.altKey) {
modifiers |= ALT;
}
if (event.ctrlKey) {
modifiers |= CTRL;
}
if (event.metaKey) {
modifiers |= META;
}
if (event.shiftKey) {
modifiers |= SHIFT;
}
return bindingsForKeyCode[modifiers];
}
if(range) {
this.setSelectedRange(range);
}
this._buildKeybindings();
}
}]);
$$input$sim$$$__Object$defineProperties(Input.prototype, {
clearSelection: {
value: function() {
this.replaceSelection('');
},
return BindingSet;
})();
enumerable: false,
writable: true
},
var Affinity = {
UPSTREAM: 0,
DOWNSTREAM: 1,
NONE: null
};
deleteBackward: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.start--;
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
},
/**
* Tests is string passed in is a single word.
*
* @param {string} chr
* @returns {boolean}
* @private
*/
function isWordChar(chr) {
return chr && /^\w$/.test(chr);
}
enumerable: false,
writable: true
},
/**
* Checks if char to the left of {index} in {string}
* is a break (non-char).
*
* @param {string} text
* @param {number} index
* @returns {boolean}
* @private
*/
function hasLeftWordBreakAtIndex(text, index) {
if (index === 0) {
return true;
} else {
return !isWordChar(text[index - 1]) && isWordChar(text[index]);
}
}
deleteWordBackward: {
value: function(event) {
if (this.hasSelection()) {
this.deleteBackward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
var start = this._lastWordBreakBeforeIndex(range.start);
range.length += range.start - start;
range.start = start;
this.setSelectedRange(range);
this.clearSelection();
}
},
/**
* Checks if char to the right of {index} in {string}
* is a break (non-char).
*
* @param {string} text
* @param {number} index
* @returns {boolean}
* @private
*/
function hasRightWordBreakAtIndex(text, index) {
if (index === text.length - 1) {
return true;
} else {
return isWordChar(text[index]) && !isWordChar(text[index + 1]);
}
}
enumerable: false,
writable: true
},
var Input = (function () {
/**
* Sets up the initial properties of the TextField and
* sets up the event listeners
*
* @param {string} value
* @param {Object} range ({start: 0, length: 0})
*/
deleteBackwardByDecomposingPreviousCharacter: {
value: function(event) {
this.deleteBackward(event);
},
function Input(value, range) {
_classCallCheck(this, Input);
enumerable: false,
writable: true
},
this._value = '';
this._selectedRange = {
start: 0,
length: 0
};
this.shouldCancelEvents = true;
this.selectionAffinity = Affinity.NONE;
deleteBackwardToBeginningOfLine: {
value: function(event) {
if (this.hasSelection()) {
this.deleteBackward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
range.length = range.start;
range.start = 0;
this.setSelectedRange(range);
this.clearSelection();
}
},
if (value) {
this.setText(value);
}
if (range) {
this.setSelectedRange(range);
}
this._buildKeybindings();
}
enumerable: false,
writable: true
},
/**
* Clears all characters in the existing selection.
*
* @example
* // 12|34567|8
* clearSelection();
* // 12|8
*
*/
deleteForward: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
},
_createClass(Input, [{
key: 'clearSelection',
value: function clearSelection() {
this.replaceSelection('');
}
enumerable: false,
writable: true
},
/**
* Deletes backward one character or clears a non-empty selection.
*
* @example
*
* // |What's up, doc?
* deleteBackward(event);
* // |What's up, doc?
*
* // What'|s up, doc?
* deleteBackward(event);
* // What|s up, doc?
*
* // |What's| up, doc?
* deleteBackward(event);
* // | up, doc?
*/
}, {
key: 'deleteBackward',
value: function deleteBackward(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.start--;
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
}
deleteWordForward: {
value: function(event) {
if (this.hasSelection()) {
return this.deleteForward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
var end = this._nextWordBreakAfterIndex(range.start + range.length);
this.setSelectedRange({
start: range.start,
length: end - range.start
});
this.clearSelection();
}
},
/**
* Deletes backward one word or clears a non-empty selection.
*
* @example
* // |What's up, doc?
* deleteWordBackward(event);
* // |What's up, doc?
*
* // What'|s up, doc?
* deleteWordBackward(event);
* // |s up, doc?
*
* // |What's| up, doc?
* deleteWordBackward(event);
* // | up, doc?
*/
}, {
key: 'deleteWordBackward',
value: function deleteWordBackward(event) {
if (this.hasSelection()) {
this.deleteBackward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
var start = this._lastWordBreakBeforeIndex(range.start);
range.length += range.start - start;
range.start = start;
this.setSelectedRange(range);
this.clearSelection();
}
}
enumerable: false,
writable: true
},
/**
* Deletes backward one character, clears a non-empty selection, or decomposes
* an accented character to its simple form.
*
* @TODO Make this work as described.
*
* @example
* // |fiancée
* deleteBackwardByDecomposingPreviousCharacter(event);
* // |What's up, doc?
*
* // fianc|é|e
* deleteBackwardByDecomposingPreviousCharacter(event);
* // fianc|e
*
* // fiancé|e
* deleteBackwardByDecomposingPreviousCharacter(event);
* // fiance|e
*
*/
}, {
key: 'deleteBackwardByDecomposingPreviousCharacter',
value: function deleteBackwardByDecomposingPreviousCharacter(event) {
this.deleteBackward(event);
}
handleEvent: {
value: function(event) {
if(typeof event === 'undefined') {
throw new Error('cannot handle and event that isn\'t passed');
}
var action = this._bindings.actionForEvent(event);
if(action) this[action](event);
return action;
},
/**
* Deletes all characters before the cursor or clears a non-empty selection.
*
* @example
* // The quick |brown fox.
* deleteBackwardToBeginningOfLine(event);
* // |brown fox.
*
* // The |quick |brown fox.
* deleteBackwardToBeginningOfLine(event);
* // The brown fox.
*
*/
}, {
key: 'deleteBackwardToBeginningOfLine',
value: function deleteBackwardToBeginningOfLine(event) {
if (this.hasSelection()) {
this.deleteBackward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
range.length = range.start;
range.start = 0;
this.setSelectedRange(range);
this.clearSelection();
}
}
enumerable: false,
writable: true
},
/**
* Deletes forward one character or clears a non-empty selection.
*
* @example
* // What's up, doc?|
* deleteForward(event);
* // What's up, doc?|
*
* // What'|s up, doc?
* deleteForward(event);
* // What'| up, doc?
*
* // |What's| up, doc?
* deleteForward(event);
* // | up, doc?
*
*/
}, {
key: 'deleteForward',
value: function deleteForward(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
}
hasSelection: {
value: function() {
return this.selectedRange().length !== 0;
},
/**
* Deletes forward one word or clears a non-empty selection.
*
* @example
* // What's up, doc?|
* deleteWordForward(event);
* // What's up, doc?|
*
* // What's |up, doc?
* deleteWordForward(event);
* // What's |, doc?
*
* // |What's| up, doc?
* deleteWordForward(event);
* // | up, doc?
*/
}, {
key: 'deleteWordForward',
value: function deleteWordForward(event) {
if (this.hasSelection()) {
return this.deleteForward(event);
} else {
this._handleEvent(event);
var range = this.selectedRange();
var end = this._nextWordBreakAfterIndex(range.start + range.length);
this.setSelectedRange({
start: range.start,
length: end - range.start
});
this.clearSelection();
}
}
}, {
key: 'handleEvent',
value: function handleEvent(event) {
if (typeof event === 'undefined') {
throw new Error('cannot handle and event that isn\'t passed');
}
var action = this._bindings.actionForEvent(event);
if (action) this[action](event);
return action;
}
enumerable: false,
writable: true
},
/**
* Determines whether this field has any selection.
*
* @returns {boolean} true if there is at least one character selected
*/
}, {
key: 'hasSelection',
value: function hasSelection() {
return this.selectedRange().length !== 0;
}
insertBackTab: {
value: function() {},
enumerable: false,
writable: true
},
/**
* Handles the back tab key.
*
*/
}, {
key: 'insertBackTab',
value: function insertBackTab() {}
insertNewline: {
value: function() {},
enumerable: false,
writable: true
},
/**
* Handles a key event could be trying to end editing.
*
*/
}, {
key: 'insertNewline',
value: function insertNewline() {}
insertTab: {
value: function() {},
enumerable: false,
writable: true
},
/**
* Handles the tab key.
*
*/
}, {
key: 'insertTab',
value: function insertTab() {}
insertText: {
value: function(text) {
var range;
if (this.hasSelection()) {
this.clearSelection();
}
/**
* Handles a event that is trying to insert a character.
*
* @param {string} text
*/
}, {
key: 'insertText',
value: function insertText(text) {
var range;
if (this.hasSelection()) {
this.clearSelection();
}
this.replaceSelection(text);
range = this.selectedRange();
range.start += range.length;
range.length = 0;
this.setSelectedRange(range);
},
this.replaceSelection(text);
range = this.selectedRange();
range.start += range.length;
range.length = 0;
this.setSelectedRange(range);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor up, which because this is a single-line text field, means
* moving to the beginning of the value.
*
* @example
* // Hey guys|
* moveUp(event);
* // |Hey guys
*
* // Hey |guys|
* moveUp(event);
* // |Hey guys
*
* @param {Event} event
*/
}, {
key: 'moveUp',
value: function moveUp(event) {
this._handleEvent(event);
this.setSelectedRange({
start: 0,
length: 0
});
}
moveUp: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRange({
start: 0,
length: 0
});
},
/**
* Moves the cursor up to the beginning of the current paragraph, which because
* this is a single-line text field, means moving to the beginning of the
* value.
*
* @example
* // Hey guys|
* moveToBeginningOfParagraph(event)
* // |Hey guys
*
* // Hey |guys|
* moveToBeginningOfParagraph(event)
* // |Hey guys
*
* @param {Event} event
*/
}, {
key: 'moveToBeginningOfParagraph',
value: function moveToBeginningOfParagraph(event) {
this.moveUp(event);
}
enumerable: false,
writable: true
},
moveToBeginningOfParagraph: {
value: function(event) {
this.moveUp(event);
},
enumerable: false,
writable: true
},
moveUpAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
case $$input$sim$$Affinity.NONE:
// 12<34 56|78 => <1234 56|78
range.length += range.start;
range.start = 0;
break;
case $$input$sim$$Affinity.DOWNSTREAM:
// 12|34 56>78 => <12|34 5678
range.length = range.start;
range.start = 0;
break;
}
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM);
},
enumerable: false,
writable: true
},
moveParagraphBackwardAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
case $$input$sim$$Affinity.NONE:
// 12<34 56|78 => <1234 56|78
range.length += range.start;
range.start = 0;
break;
case $$input$sim$$Affinity.DOWNSTREAM:
// 12|34 56>78 => 12|34 5678
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM);
},
enumerable: false,
writable: true
},
moveToBeginningOfDocument: {
value: function(event) {
// Since we only support a single line this is just an alias.
this.moveToBeginningOfLine(event);
},
enumerable: false,
writable: true
},
moveToBeginningOfDocumentAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
/**
* Moves the cursor up, keeping the current anchor point and extending the
* selection to the beginning as moveUp would.
*
* @example
* // rightward selections are shrunk
* // Hey guys, |where> are you?
* moveUpAndModifySelection(event);
* // <Hey guys, |where are you?
*
* // leftward selections are extended
* // Hey guys, <where| are you?
* moveUpAndModifySelection(event);
* // <Hey guys, where| are you?
*
* // neutral selections are extended
* // Hey guys, |where| are you?
* moveUpAndModifySelection(event);
* // <Hey guys, where| are you?
*
* @param {Event} event
*/
}, {
key: 'moveUpAndModifySelection',
value: function moveUpAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
case Affinity.NONE:
// 12<34 56|78 => <1234 56|78
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM);
},
break;
case Affinity.DOWNSTREAM:
// 12|34 56>78 => <12|34 5678
range.length = range.start;
range.start = 0;
break;
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
enumerable: false,
writable: true
},
moveDown: {
value: function(event) {
this._handleEvent(event);
// 12|34 56|78 => 1234 5678|
var range = {
start: this.text().length,
length: 0
};
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE);
},
enumerable: false,
writable: true
},
moveToEndOfParagraph: {
value: function(event) {
this.moveDown(event);
},
enumerable: false,
writable: true
},
moveDownAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
var end = this.text().length;
if (this.selectionAffinity === $$input$sim$$Affinity.UPSTREAM) {
range.start += range.length;
}
range.length = end - range.start;
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM);
},
enumerable: false,
writable: true
},
moveParagraphForwardAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.DOWNSTREAM:
case $$input$sim$$Affinity.NONE:
// 12|34 56>78 => 12|34 5678>
range.length = this.text().length - range.start;
break;
case $$input$sim$$Affinity.UPSTREAM:
// 12<34 56|78 => 12|34 5678
range.start += range.length;
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM);
},
enumerable: false,
writable: true
},
moveToEndOfDocument: {
value: function(event) {
// Since we only support a single line this is just an alias.
this.moveToEndOfLine(event);
},
enumerable: false,
writable: true
},
moveToEndOfDocumentAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM);
},
enumerable: false,
writable: true
},
moveLeft: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length !== 0) {
range.length = 0;
} else {
range.start--;
}
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE);
},
enumerable: false,
writable: true
},
moveLeftAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
case $$input$sim$$Affinity.NONE:
this.selectionAffinity = $$input$sim$$Affinity.UPSTREAM;
range.start--;
range.length++;
break;
case $$input$sim$$Affinity.DOWNSTREAM:
range.length--;
break;
}
this.setSelectedRange(range);
},
enumerable: false,
writable: true
},
moveWordLeft: {
value: function(event) {
this._handleEvent(event);
var index = this._lastWordBreakBeforeIndex(this.selectedRange().start - 1);
this.setSelectedRange({ start: index, length: 0 });
},
enumerable: false,
writable: true
},
moveWordLeftAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
case $$input$sim$$Affinity.NONE:
this.selectionAffinity = $$input$sim$$Affinity.UPSTREAM;
var start = this._lastWordBreakBeforeIndex(range.start - 1);
range.length += range.start - start;
range.start = start;
break;
case $$input$sim$$Affinity.DOWNSTREAM:
var end = this._lastWordBreakBeforeIndex(range.start + range.length);
if (end < range.start) {
end = range.start;
}
range.length -= range.start + range.length - end;
break;
}
this.setSelectedRange(range);
},
enumerable: false,
writable: true
},
moveToBeginningOfLine: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRange({ start: 0, length: 0 });
},
enumerable: false,
writable: true
},
moveToBeginningOfLineAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
/**
* Moves the free end of the selection to the beginning of the paragraph, or
* since this is a single-line text field to the beginning of the line.
*
* @param {Event} event
*/
}, {
key: 'moveParagraphBackwardAndModifySelection',
value: function moveParagraphBackwardAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
case Affinity.NONE:
// 12<34 56|78 => <1234 56|78
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.UPSTREAM);
},
break;
case Affinity.DOWNSTREAM:
// 12|34 56>78 => 12|34 5678
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the beginning of the document.
*
* @param {Event} event
*/
}, {
key: 'moveToBeginningOfDocument',
value: function moveToBeginningOfDocument(event) {
// Since we only support a single line this is just an alias.
this.moveToBeginningOfLine(event);
}
moveRight: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length !== 0) {
range.start += range.length;
range.length = 0;
} else {
range.start++;
}
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE);
},
/**
* Moves the selection start to the beginning of the document.
* @param {Event} event
*/
}, {
key: 'moveToBeginningOfDocumentAndModifySelection',
value: function moveToBeginningOfDocumentAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor down, which because this is a single-line text field, means
* moving to the end of the value.
*
* @example
* // Hey |guys
* moveDown(event)
* // Hey guys|
*
* // |Hey| guys
* moveDown(event)
* // Hey guys|
*
* @param {Event} event
*/
}, {
key: 'moveDown',
value: function moveDown(event) {
this._handleEvent(event);
// 12|34 56|78 => 1234 5678|
var range = {
start: this.text().length,
length: 0
};
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
moveRightAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
range.start++;
range.length--;
break;
case $$input$sim$$Affinity.DOWNSTREAM:
case $$input$sim$$Affinity.NONE:
this.selectionAffinity = $$input$sim$$Affinity.DOWNSTREAM;
range.length++;
break;
}
this.setSelectedRange(range);
},
/**
* Moves the cursor up to the end of the current paragraph, which because this
* is a single-line text field, means moving to the end of the value.
*
* @example
* // |Hey guys
* moveToEndOfParagraph(event)
* // Hey guys|
*
* // Hey |guys|
* moveToEndOfParagraph(event)
* // Hey guys|
*
* @param {Event} event
*/
}, {
key: 'moveToEndOfParagraph',
value: function moveToEndOfParagraph(event) {
this.moveDown(event);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor down, keeping the current anchor point and extending the
* selection to the end as moveDown would.
*
* @example
* // leftward selections are shrunk
* // Hey guys, <where| are you?
* moveDownAndModifySelection(event)
* // Hey guys, where| are you?>
*
* // rightward selections are extended
* // Hey guys, |where> are you?
* moveDownAndModifySelection(event)
* // Hey guys, |where are you?>
*
* // neutral selections are extended
* // Hey guys, |where| are you?
* moveDownAndModifySelection(event)
* // Hey guys, |where are you?>
*
* @param {Event} event
*/
}, {
key: 'moveDownAndModifySelection',
value: function moveDownAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
var end = this.text().length;
if (this.selectionAffinity === Affinity.UPSTREAM) {
range.start += range.length;
}
range.length = end - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
moveWordRight: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
var index = this._nextWordBreakAfterIndex(range.start + range.length);
this.setSelectedRange({ start: index, length: 0 });
},
/**
* Moves the free end of the selection to the end of the paragraph, or since
* this is a single-line text field to the end of the line.
*
* @param {Event} event
*/
}, {
key: 'moveParagraphForwardAndModifySelection',
value: function moveParagraphForwardAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.DOWNSTREAM:
case Affinity.NONE:
// 12|34 56>78 => 12|34 5678>
range.length = this.text().length - range.start;
break;
case Affinity.UPSTREAM:
// 12<34 56|78 => 12|34 5678
range.start += range.length;
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the end of the document.
*
* @param {Event} event
*/
}, {
key: 'moveToEndOfDocument',
value: function moveToEndOfDocument(event) {
// Since we only support a single line this is just an alias.
this.moveToEndOfLine(event);
}
moveWordRightAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
var start = range.start;
var end = range.start + range.length;
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
start = Math.min(this._nextWordBreakAfterIndex(start), end);
break;
case $$input$sim$$Affinity.DOWNSTREAM:
case $$input$sim$$Affinity.NONE:
this.selectionAffinity = $$input$sim$$Affinity.DOWNSTREAM;
end = this._nextWordBreakAfterIndex(range.start + range.length);
break;
}
this.setSelectedRange({ start: start, length: end - start });
},
/**
* Moves the selection end to the end of the document.
* @param {Event} event
*/
}, {
key: 'moveToEndOfDocumentAndModifySelection',
value: function moveToEndOfDocumentAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the left, counting selections as a thing to move past.
*
* @example
* // no selection just moves the cursor left
* // Hey guys|
* moveLeft(event)
* // Hey guy|s
*
* // selections are removed
* // Hey |guys|
* moveLeft(event)
* // Hey |guys
*
* @param {Event} event
*/
}, {
key: 'moveLeft',
value: function moveLeft(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length !== 0) {
range.length = 0;
} else {
range.start--;
}
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
moveToEndOfLine: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRange({ start: this.text().length, length: 0 });
},
/**
* Moves the free end of the selection one to the left.
*
* @example
* // no selection just selects to the left
* // Hey guys|
* moveLeftAndModifySelection(event)
* // Hey guy<s|
*
* // left selections are extended
* // Hey <guys|
* moveLeftAndModifySelection(event)
* // Hey< guys|
*
* // right selections are shrunk
* // Hey |guys>
* moveLeftAndModifySelection(event)
* // Hey |guy>s
*
* // neutral selections are extended
* // Hey |guys|
* moveLeftAndModifySelection(event)
* //Hey< guys|
*
* @param {Event} event
*/
}, {
key: 'moveLeftAndModifySelection',
value: function moveLeftAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
case Affinity.NONE:
this.selectionAffinity = Affinity.UPSTREAM;
range.start--;
range.length++;
break;
case Affinity.DOWNSTREAM:
range.length--;
break;
}
this.setSelectedRange(range);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor left until the start of a word is found.
*
* @example
* // no selection just moves the cursor left
* // Hey guys|
* moveWordLeft(event)
* // Hey |guys
*
* // selections are removed
* // Hey |guys|
* moveWordLeft(event)
* // |Hey guys
*
* @param {Event} event
*/
}, {
key: 'moveWordLeft',
value: function moveWordLeft(event) {
this._handleEvent(event);
var index = this._lastWordBreakBeforeIndex(this.selectedRange().start - 1);
this.setSelectedRange({ start: index, length: 0 });
}
moveToEndOfLineAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.DOWNSTREAM);
},
enumerable: false,
writable: true
},
replaceSelection: {
value: function(replacement) {
var range = this.selectedRange();
var end = range.start + range.length;
var text = this.text();
text = text.substring(0, range.start) + replacement + text.substring(end);
range.length = replacement.length;
this.setText(text);
this.setSelectedRangeWithAffinity(range, $$input$sim$$Affinity.NONE);
},
enumerable: false,
writable: true
},
rightWordBreakIndexes: {
value: function() {
var result = [];
var text = this.text();
for (var i = 0, l = text.length; i < l; i++) {
if ($$input$sim$$hasRightWordBreakAtIndex(text, i)) {
result.push(i + 1);
}
/**
* Moves the free end of the current selection to the beginning of the previous
* word.
*
* @example
* // no selection just selects to the left
* // Hey guys|
* moveWordLeftAndModifySelection(event)
* // Hey <guys|
*
* // left selections are extended
* // Hey <guys|
* moveWordLeftAndModifySelection(event)
* // <Hey guys|
*
* // right selections are shrunk
* // |Hey guys>
* moveWordLeftAndModifySelection(event)
* // |Hey >guys
*
* // neutral selections are extended
* // Hey |guys|
* moveWordLeftAndModifySelection(event)
* // <Hey guys|
*
* @param {Event} event
*/
}, {
key: 'moveWordLeftAndModifySelection',
value: function moveWordLeftAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
case Affinity.NONE:
this.selectionAffinity = Affinity.UPSTREAM;
var start = this._lastWordBreakBeforeIndex(range.start - 1);
range.length += range.start - start;
range.start = start;
break;
case Affinity.DOWNSTREAM:
var end = this._lastWordBreakBeforeIndex(range.start + range.length);
if (end < range.start) {
end = range.start;
}
return result;
},
range.length -= range.start + range.length - end;
break;
}
this.setSelectedRange(range);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the beginning of the current line.
*
* @example
* // Hey guys, where| are ya?
* moveToBeginningOfLine(event)
* // |Hey guys, where are ya?
*
* @param {Event} event
*/
}, {
key: 'moveToBeginningOfLine',
value: function moveToBeginningOfLine(event) {
this._handleEvent(event);
this.setSelectedRange({ start: 0, length: 0 });
}
selectAll: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRangeWithAffinity({
start: 0,
length: this.text().length
}, $$input$sim$$Affinity.NONE);
},
/**
* Select from the free end of the selection to the beginning of line.
*
* @example
* // Hey guys, where| are ya?
* moveToBeginningOfLineAndModifySelection(event)
* // <Hey guys, where| are ya?
*
* // Hey guys, where| are> ya?
* moveToBeginningOfLineAndModifySelection(event)
* // <Hey guys, where are| ya?
*
* @param {Event} event
*/
}, {
key: 'moveToBeginningOfLineAndModifySelection',
value: function moveToBeginningOfLineAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the right, counting selections as a thing to move past.
*
* @example
* // no selection just moves the cursor right
* // Hey guy|s
* moveRight(event)
* // Hey guys|
*
* // selections are removed
* // Hey |guys|
* moveRight(event)
* // Hey guys|
*
* @param {Event} event
*/
}, {
key: 'moveRight',
value: function moveRight(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length !== 0) {
range.start += range.length;
range.length = 0;
} else {
range.start++;
}
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
text: {
value: function() {
return this._value;
},
/**
* Moves the free end of the selection one to the right.
*
* @example
* // no selection just selects to the right
* // Hey |guys
* moveRightAndModifySelection(event)
* // Hey |g>uys
*
* // right selections are extended
* // Hey |gu>ys
* moveRightAndModifySelection(event)
* // Hey |guy>s
*
* // left selections are shrunk
* // <Hey |guys
* moveRightAndModifySelection(event)
* // H<ey |guys
*
* // neutral selections are extended
* // |Hey| guys
* moveRightAndModifySelection(event)
* // |Hey >guys
*
* @param {Event} event
*/
}, {
key: 'moveRightAndModifySelection',
value: function moveRightAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
range.start++;
range.length--;
break;
case Affinity.DOWNSTREAM:
case Affinity.NONE:
this.selectionAffinity = Affinity.DOWNSTREAM;
range.length++;
break;
}
this.setSelectedRange(range);
}
enumerable: false,
writable: true
},
/**
* Moves the cursor right until the end of a word is found.
*
* @example
* // no selection just moves the cursor right
* // Hey| guys
* moveWordRight(event)
* // Hey guys|
*
* // selections are removed
* // |Hey| guys
* moveWordRight(event)
* // Hey guys|
*
* @param {Event} event
*/
}, {
key: 'moveWordRight',
value: function moveWordRight(event) {
this._handleEvent(event);
var range = this.selectedRange();
var index = this._nextWordBreakAfterIndex(range.start + range.length);
this.setSelectedRange({ start: index, length: 0 });
}
setText: {
value: function(value) {
this._value = '' + value;
this.setSelectedRange({
start: this._value.length,
length: 0
});
},
/**
* Moves the free end of the current selection to the next end of word.
*
* @example
* // no selection just selects to the right
* // Hey |guys
* moveWordRightAndModifySelection(event)
* // Hey |guys|
*
* // right selections are extended
* // Hey |g>uys
* moveWordRightAndModifySelection(event)
* // Hey |guys>
*
* // left selections are shrunk
* // He<y |guys
* moveWordRightAndModifySelection(event)
* // Hey< |guys
*
* // neutral selections are extended
* // He|y |guys
* moveWordRightAndModifySelection(event)
* // He|y guys>
*
* @param {Event} event
*/
}, {
key: 'moveWordRightAndModifySelection',
value: function moveWordRightAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
var start = range.start;
var end = range.start + range.length;
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
start = Math.min(this._nextWordBreakAfterIndex(start), end);
break;
case Affinity.DOWNSTREAM:
case Affinity.NONE:
this.selectionAffinity = Affinity.DOWNSTREAM;
end = this._nextWordBreakAfterIndex(range.start + range.length);
break;
}
this.setSelectedRange({ start: start, length: end - start });
}
enumerable: false,
writable: true
},
/**
* Moves the cursor to the end of the current line.
*
* @example
* // Hey guys, where| are ya?
* moveToEndOfLine(event)
* // |Hey guys, where are ya?
*
* @param {Event} event
*/
}, {
key: 'moveToEndOfLine',
value: function moveToEndOfLine(event) {
this._handleEvent(event);
this.setSelectedRange({ start: this.text().length, length: 0 });
}
selectedRange: {
value: function() {
return this._selectedRange;
},
/**
* Moves the free end of the selection to the end of the current line.
*
* @example
* // Hey guys, where| are ya?
* moveToEndOfLineAndModifySelection(event)
* // Hey guys, where| are ya?>
*
* // Hey guys, <where| are ya?
* moveToEndOfLineAndModifySelection(event)
* // Hey guys, |where are ya?>
*
* @param {Event} event
*/
}, {
key: 'moveToEndOfLineAndModifySelection',
value: function moveToEndOfLineAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
enumerable: false,
writable: true
},
/**
* Replaces the characters within the selection with given text.
*
* @example
* // 12|34567|8
* replaceSelection('00')
* // 12|00|8
*
* @param {string} replacement
*/
}, {
key: 'replaceSelection',
value: function replaceSelection(replacement) {
var range = this.selectedRange();
var end = range.start + range.length;
var text = this.text();
text = text.substring(0, range.start) + replacement + text.substring(end);
range.length = replacement.length;
this.setText(text);
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
setSelectedRange: {
value: function(range) {
this.setSelectedRangeWithAffinity(range, this.selectionAffinity);
},
/**
* Find ends of 'words' for navigational purposes.
*
* @example
* // given value of '123456789' and text of '123-45-6789'
* rightWordBreakIndexes()
* //=> [3, 5, 9]
*
* @returns {number[]}
*/
}, {
key: 'rightWordBreakIndexes',
value: function rightWordBreakIndexes() {
var result = [];
var text = this.text();
for (var i = 0, l = text.length; i < l; i++) {
if (hasRightWordBreakAtIndex(text, i)) {
result.push(i + 1);
}
}
return result;
}
enumerable: false,
writable: true
},
/**
* Expands the selection to contain all the characters in the content.
*
* @example
* // 123|45678
* selectAll(event)
* // |12345678|
*
* @param {Event} event
*/
}, {
key: 'selectAll',
value: function selectAll(event) {
this._handleEvent(event);
this.setSelectedRangeWithAffinity({
start: 0,
length: this.text().length
}, Affinity.NONE);
}
setSelectedRangeWithAffinity: {
value: function(range, affinity) {
var min = 0;
var max = this.text().length;
var caret = {
start: Math.max(min, Math.min(max, range.start)),
end: Math.max(min, Math.min(max, range.start + range.length))
};
this._selectedRange = {
start: caret.start,
length: caret.end - caret.start
}
this.selectionAffinity = range.length === 0 ? $$input$sim$$Affinity.NONE : affinity;
return this._selectedRange;
},
/**
* Gets the object value. This is the value that should be considered the
* 'real' value of the field.
*
* @returns {String}
*/
}, {
key: 'text',
value: function text() {
return this._value;
}
enumerable: false,
writable: true
},
/**
* Sets the object value of the field.
*
* @param {string} value
*/
}, {
key: 'setText',
value: function setText(value) {
this._value = '' + value;
this.setSelectedRange({
start: this._value.length,
length: 0
});
}
selectionAnchor: {
value: function() {
var range = this.selectedRange();
switch (this.selectionAffinity) {
case $$input$sim$$Affinity.UPSTREAM:
return range.start + range.length;
case $$input$sim$$Affinity.DOWNSTREAM:
return range.start;
default:
return $$input$sim$$Affinity.NONE;
}
},
/**
* Gets the range of the current selection.
*
* @returns {Object} {start: number, length: number}
*/
}, {
key: 'selectedRange',
value: function selectedRange() {
return this._selectedRange;
}
enumerable: false,
writable: true
},
/**
* Sets the range of the current selection without changing the affinity.
* @param {Object} range ({start: 0, length: 0})
*/
}, {
key: 'setSelectedRange',
value: function setSelectedRange(range) {
this.setSelectedRangeWithAffinity(range, this.selectionAffinity);
}
_buildKeybindings: {
value: function() {
var osx;
/**
* Sets the range of the current selection and the selection affinity.
*
* @param {Object} range {start: number, length: number}
* @param {Affinity} affinity
* @returns {Object} {start: 0, length: 0}
*/
}, {
key: 'setSelectedRangeWithAffinity',
value: function setSelectedRangeWithAffinity(range, affinity) {
var min = 0;
var max = this.text().length;
var caret = {
start: Math.max(min, Math.min(max, range.start)),
end: Math.max(min, Math.min(max, range.start + range.length))
};
this._selectedRange = {
start: caret.start,
length: caret.end - caret.start
};
this.selectionAffinity = range.length === 0 ? Affinity.NONE : affinity;
return this._selectedRange;
}
if(typeof navigator !== 'undefined') {
osx = /^Mozilla\/[\d\.]+ \(Macintosh/.test(navigator.userAgent);
} else if(typeof process !== 'undefined') {
osx = /darwin/.test(process.platform);
}
this._bindings = $$keybindings$$keyBindingsForPlatform(osx ? 'OSX' : 'Default');
},
/**
* Gets the position of the current selection's anchor point, i.e. the point
* that the selection extends from, if any.
*
* @returns {number}
*/
}, {
key: 'selectionAnchor',
value: function selectionAnchor() {
var range = this.selectedRange();
switch (this.selectionAffinity) {
case Affinity.UPSTREAM:
return range.start + range.length;
case Affinity.DOWNSTREAM:
return range.start;
default:
return Affinity.NONE;
}
}
enumerable: false,
writable: true
},
/**
* Builds the key bindings for platform
*
* @TODO: Make this better
* @private
*/
}, {
key: '_buildKeybindings',
value: function _buildKeybindings() {
var osx;
_handleEvent: {
value: function(event) {
if(event && this.shouldCancelEvents) {
event.preventDefault();
}
},
if (typeof navigator !== 'undefined') {
osx = /^Mozilla\/[\d\.]+ \(Macintosh/.test(navigator.userAgent);
} else if (typeof process !== 'undefined') {
osx = /darwin/.test(process.platform);
}
this._bindings = keyBindingsForPlatform(osx ? 'OSX' : 'Default');
}
enumerable: false,
writable: true
},
/**
* Handles the event based on the `shouldCancelEvents` prop.
*
* @param {Event} event
* @private
*/
}, {
key: '_handleEvent',
value: function _handleEvent(event) {
if (event && this.shouldCancelEvents) {
event.preventDefault();
}
}
_lastWordBreakBeforeIndex: {
value: function(index) {
var indexes = this._leftWordBreakIndexes();
var result = indexes[0];
for (var i = 0, l = indexes.length; i < l; i++) {
var wordBreakIndex = indexes[i];
if (index > wordBreakIndex) {
result = wordBreakIndex;
} else {
break;
}
}
return result;
},
/**
* Finds the start of the 'word' before index.
*
* @param {number} index position at which to start looking
* @returns {number} index in value less than or equal to the given index
* @private
*/
}, {
key: '_lastWordBreakBeforeIndex',
value: function _lastWordBreakBeforeIndex(index) {
var indexes = this._leftWordBreakIndexes();
var result = indexes[0];
for (var i = 0, l = indexes.length; i < l; i++) {
var wordBreakIndex = indexes[i];
if (index > wordBreakIndex) {
result = wordBreakIndex;
} else {
break;
}
}
return result;
}
enumerable: false,
writable: true
},
/**
* Find starts of 'words' for navigational purposes.
*
* @example
* // given value of '123456789' and text of '123-45-6789'
* leftWordBreakIndexes()
* // => [0, 3, 5]
*
* @returns {number[]} indexes in value of word starts.
* @private
*/
}, {
key: '_leftWordBreakIndexes',
value: function _leftWordBreakIndexes() {
var result = [];
var text = this.text();
for (var i = 0, l = text.length; i < l; i++) {
if (hasLeftWordBreakAtIndex(text, i)) {
result.push(i);
}
}
return result;
}
_leftWordBreakIndexes: {
value: function() {
var result = [];
var text = this.text();
for (var i = 0, l = text.length; i < l; i++) {
if ($$input$sim$$hasLeftWordBreakAtIndex(text, i)) {
result.push(i);
}
}
return result;
},
enumerable: false,
writable: true
},
_nextWordBreakAfterIndex: {
value: function(index) {
var indexes = this.rightWordBreakIndexes().reverse();
var result = indexes[0];
for (var i = 0, l = indexes.length; i < l; i++) {
var wordBreakIndex = indexes[i];
if (index < wordBreakIndex) {
result = wordBreakIndex;
} else {
break;
}
}
return result;
},
enumerable: false,
writable: true
/**
* Finds the end of the 'word' after index.
*
* @param {number} index position in value at which to start looking.
* @returns {number}
* @private
*/
}, {
key: '_nextWordBreakAfterIndex',
value: function _nextWordBreakAfterIndex(index) {
var indexes = this.rightWordBreakIndexes().reverse();
var result = indexes[0];
for (var i = 0, l = indexes.length; i < l; i++) {
var wordBreakIndex = indexes[i];
if (index < wordBreakIndex) {
result = wordBreakIndex;
} else {
break;
}
}
});
return result;
}
}]);
return Input;
}();
return Input;
})();
var input$sim$umd$$InputSim = {
Input: $$input$sim$$Input,
KEYS: $$keybindings$$KEYS,
keyBindingsForPlatform: $$keybindings$$keyBindingsForPlatform
};
exports.Input = Input;
exports.KEYS = KEYS;
exports.keyBindingsForPlatform = keyBindingsForPlatform;
});
if (typeof define === 'function' && define.amd) {
define(function() { return input$sim$umd$$InputSim; });
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = input$sim$umd$$InputSim;
} else if (typeof window !== 'undefined') {
window.InputSim = input$sim$umd$$InputSim;
} else {
this.InputSim = input$sim$umd$$InputSim;
}
}).call(this);
//# sourceMappingURL=input-sim.js.map

@@ -19,5 +19,4 @@ // Karma configuration

'node_modules/chai/chai.js',
'node_modules/string-selection/dist/string-selection.js',
'dist/input-sim.js',
'test/dist/*.js'
'test/.build/test-bundle.js'
],

@@ -62,3 +61,3 @@

// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['PhantomJS'],
browsers: ['Chrome'],

@@ -65,0 +64,0 @@

{
"name": "input-sim",
"version": "3.0.1",
"version": "3.1.0",
"description": "Simulate keyboard events and selection ranges for inputs",
"main": "dist/input-sim.js",
"jsnext:main": "lib/input-sim.js",
"jsnext:main": "src/input-sim.js",
"scripts": {

@@ -30,5 +30,4 @@ "build": "make",

"devDependencies": {
"babel": "^5.8.21",
"chai": "^1.9.2",
"es6-module-transpiler": "^0.8.3",
"esnext": "^0.11.1",
"jsdoc": "git://github.com/eventualbuddha/jsdoc.git#add-support-for-es6-classes",

@@ -38,6 +37,6 @@ "karma": "^0.12.24",

"karma-mocha": "^0.1.9",
"karma-phantomjs-launcher": "^0.1.4",
"mocha": "^2.0.1",
"string-selection": "^1.0.0"
"rollup": "^0.14.0",
"string-selection": "^2.1.1"
}
}

@@ -35,3 +35,3 @@ # Input-Sim

```js
input.deleteWordForward(); // input.text() -> 'Mos '
input.deleteWordBackward(); // input.text() -> 'Mos '
```

@@ -38,0 +38,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc