@github/hotkey
Advanced tools
Comparing version 2.3.1 to 3.0.1
@@ -1,4 +0,4 @@ | ||
import { NormalizedSequenceString } from './sequence'; | ||
import { NormalizedSequenceString } from './sequence.js'; | ||
declare const normalizedHotkeyBrand: unique symbol; | ||
export declare type NormalizedHotkeyString = NormalizedSequenceString & { | ||
export type NormalizedHotkeyString = NormalizedSequenceString & { | ||
[normalizedHotkeyBrand]: true; | ||
@@ -5,0 +5,0 @@ }; |
@@ -1,2 +0,3 @@ | ||
import { macosSymbolLayerKeys } from './macos-symbol-layer'; | ||
import { macosSymbolLayerKeys } from './macos-symbol-layer.js'; | ||
import { macosUppercaseLayerKeys } from './macos-uppercase-layer.js'; | ||
const normalizedHotkeyBrand = Symbol('normalizedHotkey'); | ||
@@ -8,6 +9,6 @@ const syntheticKeyNames = { | ||
export function eventToHotkeyString(event, platform = navigator.platform) { | ||
var _a, _b; | ||
const { ctrlKey, altKey, metaKey, key } = event; | ||
var _a, _b, _c; | ||
const { ctrlKey, altKey, metaKey, shiftKey, key } = event; | ||
const hotkeyString = []; | ||
const modifiers = [ctrlKey, altKey, metaKey, showShift(event)]; | ||
const modifiers = [ctrlKey, altKey, metaKey, shiftKey]; | ||
for (const [i, mod] of modifiers.entries()) { | ||
@@ -18,4 +19,7 @@ if (mod) | ||
if (!modifierKeyNames.includes(key)) { | ||
const nonOptionPlaneKey = hotkeyString.includes('Alt') && matchApplePlatform.test(platform) ? (_a = macosSymbolLayerKeys[key]) !== null && _a !== void 0 ? _a : key : key; | ||
const syntheticKey = (_b = syntheticKeyNames[nonOptionPlaneKey]) !== null && _b !== void 0 ? _b : nonOptionPlaneKey; | ||
const altNormalizedKey = hotkeyString.includes('Alt') && matchApplePlatform.test(platform) ? (_a = macosSymbolLayerKeys[key]) !== null && _a !== void 0 ? _a : key : key; | ||
const shiftNormalizedKey = hotkeyString.includes('Shift') && matchApplePlatform.test(platform) | ||
? (_b = macosUppercaseLayerKeys[altNormalizedKey]) !== null && _b !== void 0 ? _b : altNormalizedKey | ||
: altNormalizedKey; | ||
const syntheticKey = (_c = syntheticKeyNames[shiftNormalizedKey]) !== null && _c !== void 0 ? _c : shiftNormalizedKey; | ||
hotkeyString.push(syntheticKey); | ||
@@ -26,6 +30,2 @@ } | ||
const modifierKeyNames = ['Control', 'Alt', 'Meta', 'Shift']; | ||
function showShift(event) { | ||
const { shiftKey, code, key } = event; | ||
return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key); | ||
} | ||
export function normalizeHotkey(hotkey, platform) { | ||
@@ -50,4 +50,5 @@ let result; | ||
} | ||
modifiers.push(key); | ||
if (key) | ||
modifiers.push(key); | ||
return modifiers.join('+'); | ||
} |
@@ -1,5 +0,5 @@ | ||
export { eventToHotkeyString, normalizeHotkey, NormalizedHotkeyString } from './hotkey'; | ||
export { SequenceTracker, normalizeSequence, NormalizedSequenceString } from './sequence'; | ||
export { RadixTrie, Leaf } from './radix-trie'; | ||
export { eventToHotkeyString, normalizeHotkey, NormalizedHotkeyString } from './hotkey.js'; | ||
export { SequenceTracker, normalizeSequence, NormalizedSequenceString } from './sequence.js'; | ||
export { RadixTrie, Leaf } from './radix-trie.js'; | ||
export declare function install(element: HTMLElement, hotkey?: string): void; | ||
export declare function uninstall(element: HTMLElement): void; |
@@ -164,2 +164,52 @@ class Leaf { | ||
const macosUppercaseLayerKeys = { | ||
['`']: '~', | ||
['1']: '!', | ||
['2']: '@', | ||
['3']: '#', | ||
['4']: '$', | ||
['5']: '%', | ||
['6']: '^', | ||
['7']: '&', | ||
['8']: '*', | ||
['9']: '(', | ||
['0']: ')', | ||
['-']: '_', | ||
['=']: '+', | ||
['[']: '{', | ||
[']']: '}', | ||
['\\']: '|', | ||
[';']: ':', | ||
["'"]: '"', | ||
[',']: '<', | ||
['.']: '>', | ||
['/']: '?', | ||
['q']: 'Q', | ||
['w']: 'W', | ||
['e']: 'E', | ||
['r']: 'R', | ||
['t']: 'T', | ||
['y']: 'Y', | ||
['u']: 'U', | ||
['i']: 'I', | ||
['o']: 'O', | ||
['p']: 'P', | ||
['a']: 'A', | ||
['s']: 'S', | ||
['d']: 'D', | ||
['f']: 'F', | ||
['g']: 'G', | ||
['h']: 'H', | ||
['j']: 'J', | ||
['k']: 'K', | ||
['l']: 'L', | ||
['z']: 'Z', | ||
['x']: 'X', | ||
['c']: 'C', | ||
['v']: 'V', | ||
['b']: 'B', | ||
['n']: 'N', | ||
['m']: 'M' | ||
}; | ||
const syntheticKeyNames = { | ||
@@ -170,6 +220,6 @@ ' ': 'Space', | ||
function eventToHotkeyString(event, platform = navigator.platform) { | ||
var _a, _b; | ||
const { ctrlKey, altKey, metaKey, key } = event; | ||
var _a, _b, _c; | ||
const { ctrlKey, altKey, metaKey, shiftKey, key } = event; | ||
const hotkeyString = []; | ||
const modifiers = [ctrlKey, altKey, metaKey, showShift(event)]; | ||
const modifiers = [ctrlKey, altKey, metaKey, shiftKey]; | ||
for (const [i, mod] of modifiers.entries()) { | ||
@@ -180,4 +230,7 @@ if (mod) | ||
if (!modifierKeyNames.includes(key)) { | ||
const nonOptionPlaneKey = hotkeyString.includes('Alt') && matchApplePlatform.test(platform) ? (_a = macosSymbolLayerKeys[key]) !== null && _a !== void 0 ? _a : key : key; | ||
const syntheticKey = (_b = syntheticKeyNames[nonOptionPlaneKey]) !== null && _b !== void 0 ? _b : nonOptionPlaneKey; | ||
const altNormalizedKey = hotkeyString.includes('Alt') && matchApplePlatform.test(platform) ? (_a = macosSymbolLayerKeys[key]) !== null && _a !== void 0 ? _a : key : key; | ||
const shiftNormalizedKey = hotkeyString.includes('Shift') && matchApplePlatform.test(platform) | ||
? (_b = macosUppercaseLayerKeys[altNormalizedKey]) !== null && _b !== void 0 ? _b : altNormalizedKey | ||
: altNormalizedKey; | ||
const syntheticKey = (_c = syntheticKeyNames[shiftNormalizedKey]) !== null && _c !== void 0 ? _c : shiftNormalizedKey; | ||
hotkeyString.push(syntheticKey); | ||
@@ -188,6 +241,2 @@ } | ||
const modifierKeyNames = ['Control', 'Alt', 'Meta', 'Shift']; | ||
function showShift(event) { | ||
const { shiftKey, code, key } = event; | ||
return shiftKey && !(code.startsWith('Key') && key.toUpperCase() === key); | ||
} | ||
function normalizeHotkey(hotkey, platform) { | ||
@@ -212,3 +261,4 @@ let result; | ||
} | ||
modifiers.push(key); | ||
if (key) | ||
modifiers.push(key); | ||
return modifiers.join('+'); | ||
@@ -215,0 +265,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import { NormalizedHotkeyString } from './hotkey'; | ||
import { NormalizedHotkeyString } from './hotkey.js'; | ||
interface SequenceTrackerOptions { | ||
@@ -7,3 +7,3 @@ onReset?: () => void; | ||
declare const sequenceBrand: unique symbol; | ||
export declare type NormalizedSequenceString = string & { | ||
export type NormalizedSequenceString = string & { | ||
[sequenceBrand]: true; | ||
@@ -10,0 +10,0 @@ }; |
@@ -1,2 +0,2 @@ | ||
import { eventToHotkeyString, normalizeHotkey } from './hotkey'; | ||
import { eventToHotkeyString, normalizeHotkey } from './hotkey.js'; | ||
export const SEQUENCE_DELIMITER = ' '; | ||
@@ -3,0 +3,0 @@ const sequenceBrand = Symbol('sequence'); |
@@ -1,4 +0,4 @@ | ||
import { NormalizedHotkeyString } from './hotkey'; | ||
import { NormalizedHotkeyString } from './hotkey.js'; | ||
export declare function isFormField(element: Node): boolean; | ||
export declare function fireDeterminedAction(el: HTMLElement, path: readonly NormalizedHotkeyString[]): void; | ||
export declare function expandHotkeyToEdges(hotkey: string): NormalizedHotkeyString[][]; |
@@ -1,3 +0,3 @@ | ||
import { normalizeHotkey } from './hotkey'; | ||
import { SEQUENCE_DELIMITER } from './sequence'; | ||
import { normalizeHotkey } from './hotkey.js'; | ||
import { SEQUENCE_DELIMITER } from './sequence.js'; | ||
export function isFormField(element) { | ||
@@ -4,0 +4,0 @@ if (!(element instanceof HTMLElement)) { |
{ | ||
"name": "@github/hotkey", | ||
"version": "2.3.1", | ||
"version": "3.0.1", | ||
"description": "", | ||
@@ -15,5 +15,5 @@ "main": "dist/index.js", | ||
"clean": "rm -rf dist", | ||
"prebuild": "npm run clean && npm run lint && mkdir dist", | ||
"pretest": "npm run build", | ||
"prepublishOnly": "npm run build", | ||
"prebuild": "npm run clean && mkdir dist", | ||
"pretest": "npm run build && npm run lint", | ||
"prepublishOnly": "npm run test", | ||
"buildSite": "npm run build && mkdir -p pages/hotkey && cp -r dist/* pages/hotkey" | ||
@@ -30,18 +30,21 @@ }, | ||
"@github/prettier-config": "0.0.4", | ||
"chai": "^4.2.0", | ||
"chai": "^4.3.10", | ||
"chromium": "^3.0.3", | ||
"eslint": "^7.22.0", | ||
"eslint-plugin-github": "^4.0.0", | ||
"karma": "^6.2.0", | ||
"eslint": "^8.52.0", | ||
"eslint-plugin-github": "^4.10.1", | ||
"karma": "^6.4.2", | ||
"karma-chai": "^0.1.0", | ||
"karma-chrome-launcher": "^3.1.0", | ||
"karma-chrome-launcher": "^3.2.0", | ||
"karma-mocha": "^2.0.1", | ||
"karma-mocha-reporter": "^2.2.3", | ||
"karma-mocha-reporter": "^2.2.5", | ||
"mocha": "^10.2.0", | ||
"rollup": "^2.4.0", | ||
"typescript": "^4.2.3" | ||
"rollup": "^4.1.4", | ||
"typescript": "^5.2.2" | ||
}, | ||
"eslintIgnore": [ | ||
"dist/" | ||
] | ||
], | ||
"dependencies": { | ||
"eslint-import-resolver-typescript": "^3.6.1" | ||
} | ||
} |
@@ -111,5 +111,6 @@ # Hotkey Behavior | ||
2. Neither the `Control` or `Meta` modifiers should appear in a hotkey string with `Mod`. | ||
3. Due to the inconsistent lowercasing of `event.key` on Mac and iOS when `Meta` is pressed along with `Shift`, it is recommended to avoid hotkey strings containing both `Mod` and `Shift`. | ||
7. `"Plus"` and `"Space"` are special key names to represent the `+` and ` ` keys respectively, because these symbols cannot be represented in the normal hotkey string syntax. | ||
8. You can use the comma key `,` as a hotkey, e.g. `a,,` would activate if the user typed `a` or `,`. `Control+,,x` would activate for `Control+,` or `x`. | ||
9. `"Shift"` should be included if it would be held and the key is uppercase: ie, `Shift+A` not `A` | ||
1. MacOS outputs lowercase key names when `Meta+Shift` is held (ie, `Meta+Shift+a`). In an attempt to normalize this, `hotkey` will automatically map these key names to uppercase, so the uppercase keys should still be used (ie, `"Meta+Shift+A"` or `"Mod+Shift+A"`). **However**, this normalization only works on US keyboard layouts. | ||
@@ -122,3 +123,2 @@ ### Example | ||
'a b,Control+Alt+/' | ||
``` | ||
@@ -125,0 +125,0 @@ |
32950
17
840
1
+ Added@eslint-community/eslint-utils@4.4.0(transitive)
+ Added@eslint-community/regexpp@4.10.1(transitive)
+ Added@eslint/config-array@0.16.0(transitive)
+ Added@eslint/eslintrc@2.1.43.1.0(transitive)
+ Added@eslint/js@8.57.09.5.0(transitive)
+ Added@eslint/object-schema@2.1.4(transitive)
+ Added@humanwhocodes/config-array@0.11.14(transitive)
+ Added@humanwhocodes/module-importer@1.0.1(transitive)
+ Added@humanwhocodes/object-schema@2.0.3(transitive)
+ Added@humanwhocodes/retry@0.3.0(transitive)
+ Added@nodelib/fs.scandir@2.1.5(transitive)
+ Added@nodelib/fs.stat@2.0.5(transitive)
+ Added@nodelib/fs.walk@1.2.8(transitive)
+ Added@types/json5@0.0.29(transitive)
+ Added@ungap/structured-clone@1.2.0(transitive)
+ Addedacorn@8.12.0(transitive)
+ Addedacorn-jsx@5.3.2(transitive)
+ Addedajv@6.12.6(transitive)
+ Addedansi-regex@5.0.1(transitive)
+ Addedansi-styles@4.3.0(transitive)
+ Addedargparse@2.0.1(transitive)
+ Addedarray-buffer-byte-length@1.0.1(transitive)
+ Addedarray-includes@3.1.8(transitive)
+ Addedarray.prototype.findlastindex@1.2.5(transitive)
+ Addedarray.prototype.flat@1.3.2(transitive)
+ Addedarray.prototype.flatmap@1.3.2(transitive)
+ Addedarraybuffer.prototype.slice@1.0.3(transitive)
+ Addedavailable-typed-arrays@1.0.7(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@3.0.3(transitive)
+ Addedcall-bind@1.0.7(transitive)
+ Addedcallsites@3.1.0(transitive)
+ Addedchalk@4.1.2(transitive)
+ Addedcolor-convert@2.0.1(transitive)
+ Addedcolor-name@1.1.4(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedcross-spawn@7.0.3(transitive)
+ Addeddata-view-buffer@1.0.1(transitive)
+ Addeddata-view-byte-length@1.0.1(transitive)
+ Addeddata-view-byte-offset@1.0.0(transitive)
+ Addeddebug@3.2.74.3.5(transitive)
+ Addeddeep-is@0.1.4(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddefine-properties@1.2.1(transitive)
+ Addeddoctrine@3.0.0(transitive)
+ Addedenhanced-resolve@5.17.0(transitive)
+ Addedes-abstract@1.23.3(transitive)
+ Addedes-define-property@1.0.0(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.0.0(transitive)
+ Addedes-set-tostringtag@2.0.3(transitive)
+ Addedes-shim-unscopables@1.0.2(transitive)
+ Addedes-to-primitive@1.2.1(transitive)
+ Addedescape-string-regexp@4.0.0(transitive)
+ Addedeslint@8.57.09.5.0(transitive)
+ Addedeslint-import-resolver-node@0.3.9(transitive)
+ Addedeslint-import-resolver-typescript@3.6.1(transitive)
+ Addedeslint-module-utils@2.8.1(transitive)
+ Addedeslint-plugin-import@2.29.1(transitive)
+ Addedeslint-scope@7.2.28.0.1(transitive)
+ Addedeslint-visitor-keys@3.4.34.0.0(transitive)
+ Addedespree@10.1.09.6.1(transitive)
+ Addedesquery@1.5.0(transitive)
+ Addedesrecurse@4.3.0(transitive)
+ Addedestraverse@5.3.0(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedfast-deep-equal@3.1.3(transitive)
+ Addedfast-glob@3.3.2(transitive)
+ Addedfast-json-stable-stringify@2.1.0(transitive)
+ Addedfast-levenshtein@2.0.6(transitive)
+ Addedfastq@1.17.1(transitive)
+ Addedfile-entry-cache@6.0.18.0.0(transitive)
+ Addedfill-range@7.1.1(transitive)
+ Addedfind-up@5.0.0(transitive)
+ Addedflat-cache@3.2.04.0.1(transitive)
+ Addedflatted@3.3.1(transitive)
+ Addedfor-each@0.3.3(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedfunction.prototype.name@1.1.6(transitive)
+ Addedfunctions-have-names@1.2.3(transitive)
+ Addedget-intrinsic@1.2.4(transitive)
+ Addedget-symbol-description@1.0.2(transitive)
+ Addedget-tsconfig@4.7.5(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglob-parent@5.1.26.0.2(transitive)
+ Addedglobals@13.24.014.0.0(transitive)
+ Addedglobalthis@1.0.4(transitive)
+ Addedgopd@1.0.1(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedgraphemer@1.4.0(transitive)
+ Addedhas-bigints@1.0.2(transitive)
+ Addedhas-flag@4.0.0(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-proto@1.0.3(transitive)
+ Addedhas-symbols@1.0.3(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedignore@5.3.1(transitive)
+ Addedimport-fresh@3.3.0(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedinternal-slot@1.0.7(transitive)
+ Addedis-array-buffer@3.0.4(transitive)
+ Addedis-bigint@1.0.4(transitive)
+ Addedis-boolean-object@1.1.2(transitive)
+ Addedis-callable@1.2.7(transitive)
+ Addedis-core-module@2.14.0(transitive)
+ Addedis-data-view@1.0.1(transitive)
+ Addedis-date-object@1.0.5(transitive)
+ Addedis-extglob@2.1.1(transitive)
+ Addedis-glob@4.0.3(transitive)
+ Addedis-negative-zero@2.0.3(transitive)
+ Addedis-number@7.0.0(transitive)
+ Addedis-number-object@1.0.7(transitive)
+ Addedis-path-inside@3.0.3(transitive)
+ Addedis-regex@1.1.4(transitive)
+ Addedis-shared-array-buffer@1.0.3(transitive)
+ Addedis-string@1.0.7(transitive)
+ Addedis-symbol@1.0.4(transitive)
+ Addedis-typed-array@1.1.13(transitive)
+ Addedis-weakref@1.0.2(transitive)
+ Addedisarray@2.0.5(transitive)
+ Addedisexe@2.0.0(transitive)
+ Addedjs-yaml@4.1.0(transitive)
+ Addedjson-buffer@3.0.1(transitive)
+ Addedjson-schema-traverse@0.4.1(transitive)
+ Addedjson-stable-stringify-without-jsonify@1.0.1(transitive)
+ Addedjson5@1.0.2(transitive)
+ Addedkeyv@4.5.4(transitive)
+ Addedlevn@0.4.1(transitive)
+ Addedlocate-path@6.0.0(transitive)
+ Addedlodash.merge@4.6.2(transitive)
+ Addedmerge2@1.4.1(transitive)
+ Addedmicromatch@4.0.7(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedms@2.1.2(transitive)
+ Addednatural-compare@1.4.0(transitive)
+ Addedobject-inspect@1.13.2(transitive)
+ Addedobject-keys@1.1.1(transitive)
+ Addedobject.assign@4.1.5(transitive)
+ Addedobject.fromentries@2.0.8(transitive)
+ Addedobject.groupby@1.0.3(transitive)
+ Addedobject.values@1.2.0(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedoptionator@0.9.4(transitive)
+ Addedp-limit@3.1.0(transitive)
+ Addedp-locate@5.0.0(transitive)
+ Addedparent-module@1.0.1(transitive)
+ Addedpath-exists@4.0.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-key@3.1.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpicomatch@2.3.1(transitive)
+ Addedpossible-typed-array-names@1.0.0(transitive)
+ Addedprelude-ls@1.2.1(transitive)
+ Addedpunycode@2.3.1(transitive)
+ Addedqueue-microtask@1.2.3(transitive)
+ Addedregexp.prototype.flags@1.5.2(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedresolve-from@4.0.0(transitive)
+ Addedresolve-pkg-maps@1.0.0(transitive)
+ Addedreusify@1.0.4(transitive)
+ Addedrimraf@3.0.2(transitive)
+ Addedrun-parallel@1.2.0(transitive)
+ Addedsafe-array-concat@1.1.2(transitive)
+ Addedsafe-regex-test@1.0.3(transitive)
+ Addedsemver@6.3.1(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedset-function-name@2.0.2(transitive)
+ Addedshebang-command@2.0.0(transitive)
+ Addedshebang-regex@3.0.0(transitive)
+ Addedside-channel@1.0.6(transitive)
+ Addedstring.prototype.trim@1.2.9(transitive)
+ Addedstring.prototype.trimend@1.0.8(transitive)
+ Addedstring.prototype.trimstart@1.0.8(transitive)
+ Addedstrip-ansi@6.0.1(transitive)
+ Addedstrip-bom@3.0.0(transitive)
+ Addedstrip-json-comments@3.1.1(transitive)
+ Addedsupports-color@7.2.0(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtapable@2.2.1(transitive)
+ Addedtext-table@0.2.0(transitive)
+ Addedto-regex-range@5.0.1(transitive)
+ Addedtsconfig-paths@3.15.0(transitive)
+ Addedtype-check@0.4.0(transitive)
+ Addedtype-fest@0.20.2(transitive)
+ Addedtyped-array-buffer@1.0.2(transitive)
+ Addedtyped-array-byte-length@1.0.1(transitive)
+ Addedtyped-array-byte-offset@1.0.2(transitive)
+ Addedtyped-array-length@1.0.6(transitive)
+ Addedunbox-primitive@1.0.2(transitive)
+ Addeduri-js@4.4.1(transitive)
+ Addedwhich@2.0.2(transitive)
+ Addedwhich-boxed-primitive@1.0.2(transitive)
+ Addedwhich-typed-array@1.1.15(transitive)
+ Addedword-wrap@1.2.5(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedyocto-queue@0.1.0(transitive)