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 2.0.5 to 2.0.6

src/index.js

1707

lib/index.js

@@ -0,1 +1,2 @@

var $__Object$defineProperties = Object.defineProperties;
import { KEYS, keyBindingsForPlatform } from './keybindings';

@@ -61,11 +62,6 @@

class Input {
/**
* Sets up the initial properties of the TextField and
* sets up the event listeners
*
* @param {string} value
* @param {Object} range ({start: 0, length: 0})
*/
constructor(value, range) {
var Input = function() {
"use strict";
function Input(value, range) {
this._value = '';

@@ -88,1076 +84,747 @@ this._selectedRange = {

/**
* Clears all characters in the existing selection.
*
* @example
* // 12|34567|8
* clearSelection();
* // 12|8
*
*/
clearSelection() {
this.replaceSelection('');
}
$__Object$defineProperties(Input.prototype, {
clearSelection: {
value: function() {
this.replaceSelection('');
},
/**
* 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?
*/
deleteBackward(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.start--;
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
}
enumerable: false,
writable: true
},
/**
* 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?
*/
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();
}
}
deleteBackward: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.start--;
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
},
/**
* 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
*
*/
deleteBackwardByDecomposingPreviousCharacter(event) {
this.deleteBackward(event);
}
enumerable: false,
writable: true
},
/**
* 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.
*
*/
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();
}
}
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();
}
},
/**
* 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?
*
*/
deleteForward(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
}
enumerable: false,
writable: true
},
/**
* 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?
*/
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();
}
}
deleteBackwardByDecomposingPreviousCharacter: {
value: function(event) {
this.deleteBackward(event);
},
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
*/
hasSelection() {
return this.selectedRange().length !== 0;
}
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();
}
},
/**
* Handles the back tab key.
*
*/
insertBackTab() {}
enumerable: false,
writable: true
},
/**
* Handles a key event could be trying to end editing.
*
*/
insertNewline() {}
deleteForward: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length === 0) {
range.length++;
this.setSelectedRange(range);
}
this.clearSelection();
},
/**
* Handles the tab key.
*
*/
insertTab() {}
enumerable: false,
writable: true
},
/**
* Handles a event that is trying to insert a character.
*
* @param {string} text
*/
insertText(text) {
var range;
if (this.hasSelection()) {
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();
}
},
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
*/
moveUp(event) {
this._handleEvent(event);
this.setSelectedRange({
start: 0,
length: 0
});
}
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;
},
/**
* 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
*/
moveToBeginningOfParagraph(event) {
this.moveUp(event);
}
enumerable: false,
writable: true
},
/**
* 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
*/
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
hasSelection: {
value: function() {
return this.selectedRange().length !== 0;
},
enumerable: false,
writable: true
},
insertBackTab: {
value: function() {},
enumerable: false,
writable: true
},
insertNewline: {
value: function() {},
enumerable: false,
writable: true
},
insertTab: {
value: function() {},
enumerable: false,
writable: true
},
insertText: {
value: function(text) {
var range;
if (this.hasSelection()) {
this.clearSelection();
}
this.replaceSelection(text);
range = this.selectedRange();
range.start += range.length;
range.length = 0;
this.setSelectedRange(range);
},
enumerable: false,
writable: true
},
moveUp: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRange({
start: 0,
length: 0
});
},
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 Affinity.UPSTREAM:
case Affinity.NONE:
// 12<34 56|78 => <1234 56|78
range.length += range.start;
range.start = 0;
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
},
moveParagraphBackwardAndModifySelection: {
value: function(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;
break;
case Affinity.DOWNSTREAM:
// 12|34 56>78 => 12|34 5678
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, 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();
range.length += range.start;
range.start = 0;
break;
case Affinity.DOWNSTREAM:
// 12|34 56>78 => <12|34 5678
range.length = range.start;
range.start = 0;
break;
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
},
/**
* 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
*/
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
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, 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 === Affinity.UPSTREAM) {
range.start += range.length;
}
range.length = end - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
},
enumerable: false,
writable: true
},
moveParagraphForwardAndModifySelection: {
value: function(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
},
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, 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, Affinity.NONE);
},
enumerable: false,
writable: true
},
moveLeftAndModifySelection: {
value: function(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
},
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 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;
}
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();
range.length += range.start;
range.start = 0;
break;
case Affinity.DOWNSTREAM:
// 12|34 56>78 => 12|34 5678
range.length = 0;
break;
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
},
/**
* Moves the cursor to the beginning of the document.
*
* @param {Event} event
*/
moveToBeginningOfDocument(event) {
// Since we only support a single line this is just an alias.
this.moveToBeginningOfLine(event);
}
enumerable: false,
writable: true
},
/**
* Moves the selection start to the beginning of the document.
* @param {Event} event
*/
moveToBeginningOfDocumentAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
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, Affinity.NONE);
},
/**
* 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
*/
moveDown(event) {
this._handleEvent(event);
// 12|34 56|78 => 1234 5678|
var range = {
start: this.text().length,
length: 0
};
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
enumerable: false,
writable: true
},
/**
* 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
*/
moveToEndOfParagraph(event) {
this.moveDown(event);
}
moveRightAndModifySelection: {
value: function(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);
},
/**
* 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
*/
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);
}
enumerable: false,
writable: true
},
/**
* 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
*/
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);
}
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 cursor to the end of the document.
*
* @param {Event} event
*/
moveToEndOfDocument(event) {
// Since we only support a single line this is just an alias.
this.moveToEndOfLine(event);
}
enumerable: false,
writable: true
},
/**
* Moves the selection end to the end of the document.
* @param {Event} event
*/
moveToEndOfDocumentAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
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 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 });
},
/**
* 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
*/
moveLeft(event) {
this._handleEvent(event);
var range = this.selectedRange();
if (range.length !== 0) {
range.length = 0;
} else {
range.start--;
}
this.setSelectedRangeWithAffinity(range, Affinity.NONE);
}
enumerable: false,
writable: true
},
/**
* 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
*/
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);
}
moveToEndOfLine: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRange({ start: this.text().length, length: 0 });
},
/**
* 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
*/
moveWordLeft(event) {
this._handleEvent(event);
var index = this._lastWordBreakBeforeIndex(this.selectedRange().start - 1);
this.setSelectedRange({ start: index, length: 0 });
}
enumerable: false,
writable: true
},
/**
* 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
*/
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;
moveToEndOfLineAndModifySelection: {
value: function(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, 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, 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 (hasRightWordBreakAtIndex(text, i)) {
result.push(i + 1);
}
}
range.length -= range.start + range.length - end;
break;
}
this.setSelectedRange(range);
}
return result;
},
/**
* 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
*/
moveToBeginningOfLine(event) {
this._handleEvent(event);
this.setSelectedRange({ start: 0, length: 0 });
}
enumerable: false,
writable: true
},
/**
* 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
*/
moveToBeginningOfLineAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length += range.start;
range.start = 0;
this.setSelectedRangeWithAffinity(range, Affinity.UPSTREAM);
}
selectAll: {
value: function(event) {
this._handleEvent(event);
this.setSelectedRangeWithAffinity({
start: 0,
length: this.text().length
}, Affinity.NONE);
},
/**
* 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
*/
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);
}
enumerable: false,
writable: true
},
/**
* 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
*/
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);
}
text: {
value: function() {
return this._value;
},
/**
* 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
*/
moveWordRight(event) {
this._handleEvent(event);
var range = this.selectedRange();
var index = this._nextWordBreakAfterIndex(range.start + range.length);
this.setSelectedRange({ start: index, length: 0 });
}
enumerable: false,
writable: true
},
/**
* 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
*/
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 });
}
setText: {
value: function(value) {
this._value = '' + value;
this.setSelectedRange({
start: this._value.length,
length: 0
});
},
/**
* 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
*/
moveToEndOfLine(event) {
this._handleEvent(event);
this.setSelectedRange({ start: this.text().length, length: 0 });
}
enumerable: false,
writable: true
},
/**
* 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
*/
moveToEndOfLineAndModifySelection(event) {
this._handleEvent(event);
var range = this.selectedRange();
range.length = this.text().length - range.start;
this.setSelectedRangeWithAffinity(range, Affinity.DOWNSTREAM);
}
selectedRange: {
value: function() {
return this._selectedRange;
},
/**
* Replaces the characters within the selection with given text.
*
* @example
* // 12|34567|8
* replaceSelection('00')
* // 12|00|8
*
* @param {string} replacement
*/
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);
}
enumerable: false,
writable: true
},
/**
* Find ends of 'words' for navigational purposes.
*
* @example
* // given value of '123456789' and text of '123-45-6789'
* rightWordBreakIndexes()
* //=> [3, 5, 9]
*
* @returns {number[]}
*/
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;
}
setSelectedRange: {
value: function(range) {
this.setSelectedRangeWithAffinity(range, this.selectionAffinity);
},
/**
* Expands the selection to contain all the characters in the content.
*
* @example
* // 123|45678
* selectAll(event)
* // |12345678|
*
* @param {Event} event
*/
selectAll(event) {
this._handleEvent(event);
this.setSelectedRangeWithAffinity({
start: 0,
length: this.text().length
}, Affinity.NONE);
}
enumerable: false,
writable: true
},
/**
* Gets the object value. This is the value that should be considered the
* 'real' value of the field.
*
* @returns {String}
*/
text() {
return this._value;
}
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 ? Affinity.NONE : affinity;
return this._selectedRange;
},
/**
* Sets the object value of the field.
*
* @param {string} value
*/
setText(value) {
this._value = '' + value;
this.setSelectedRange({
start: this._value.length,
length: 0
});
}
enumerable: false,
writable: true
},
/**
* Gets the range of the current selection.
*
* @returns {Object} {start: number, length: number}
*/
selectedRange() {
return this._selectedRange;
}
selectionAnchor: {
value: function() {
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;
}
},
/**
* Sets the range of the current selection without changing the affinity.
* @param {Object} range ({start: 0, length: 0})
*/
setSelectedRange(range) {
this.setSelectedRangeWithAffinity(range, this.selectionAffinity);
}
enumerable: false,
writable: true
},
/**
* 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}
*/
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;
}
_buildKeybindings: {
value: function() {
var osx;
/**
* Gets the position of the current selection's anchor point, i.e. the point
* that the selection extends from, if any.
*
* @returns {number}
*/
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;
}
}
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
},
_handleEvent: {
value: function(event) {
if(event && this.shouldCancelEvents) {
event.preventDefault();
}
},
enumerable: false,
writable: true
},
/**
* Builds the key bindings for platform
*
* @TODO: Make this better
* @private
*/
_buildKeybindings() {
var osx;
_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;
},
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
*/
_handleEvent(event) {
if(event && this.shouldCancelEvents) {
event.preventDefault();
}
}
_leftWordBreakIndexes: {
value: function() {
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;
},
/**
* 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
*/
_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
*/
_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;
}
_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;
},
/**
* Finds the end of the 'word' after index.
*
* @param {number} index position in value at which to start looking.
* @returns {number}
* @private
*/
_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;
}
enumerable: false,
writable: true
}
return result;
}
}
});
return Input;
}();
export { Input, KEYS, keyBindingsForPlatform };
/*! jshint esnext:true, undef:true, unused:true */
/** @private */
var $__Array$prototype$slice = Array.prototype.slice;
var $__Object$defineProperties = Object.defineProperties;
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 */

@@ -71,4 +85,2 @@ var ENTER = 13;

var SHIFT = 1 << 3;
var cache = {};

@@ -141,4 +153,7 @@

var result = new BindingSet();
callback(function(...args) {
return result.bind(...args);
callback(function() {
var $__0;
var $__arguments = arguments;
var args = [].slice.call($__arguments, 0);
return ($__0 = result).bind.apply($__0, $__Array$prototype$slice.call(args));
});

@@ -148,35 +163,39 @@ return result;

/**
* @private
*/
class BindingSet {
constructor() {
var BindingSet = function() {
"use strict";
function BindingSet() {
this.bindings = {};
}
/**
* @param {number} keyCode
* @param {number} modifiers
* @param {string} action
*/
bind(keyCode, modifiers, action) {
if (!this.bindings[keyCode]) { this.bindings[keyCode] = {}; }
this.bindings[keyCode][modifiers || 0] = action;
}
$__Object$defineProperties(BindingSet.prototype, {
bind: {
value: function(keyCode, modifiers, action) {
if (!this.bindings[keyCode]) { this.bindings[keyCode] = {}; }
this.bindings[keyCode][modifiers || 0] = action;
},
/**
* @param {Event} event
* @returns {?string}
*/
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];
enumerable: false,
writable: true
},
actionForEvent: {
value: function(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];
}
},
enumerable: false,
writable: true
}
}
}
});
return BindingSet;
}();
{
"name": "input-sim",
"version": "2.0.5",
"version": "2.0.6",
"description": "Simulate keyboard events and selection ranges for inputs",

@@ -5,0 +5,0 @@ "main": "dist/index.js",

@@ -19,4 +19,4 @@ import Selection from './selection';

inputDescription === description,
`expected #{exp} to be '${inputDescription}'`,
`expected #{exp} not to be '${inputDescription}'`,
"expected #{exp} to be '" + inputDescription + "'",
"expected #{exp} not to be '" + inputDescription + "'",
description

@@ -23,0 +23,0 @@ );

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

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