diff --git a/package-lock.json b/package-lock.json index 392a168..a9eb29a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1073,18 +1073,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/node": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", - "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~7.14.0" - } - }, "node_modules/@types/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", @@ -5319,15 +5307,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -6368,17 +6347,6 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/node": { - "version": "24.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz", - "integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==", - "dev": true, - "optional": true, - "peer": true, - "requires": { - "undici-types": "~7.14.0" - } - }, "@types/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", @@ -9283,14 +9251,6 @@ "which-boxed-primitive": "^1.0.2" } }, - "undici-types": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz", - "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==", - "dev": true, - "optional": true, - "peer": true - }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", diff --git a/src/hotkey.ts b/src/hotkey.ts index 2e168d0..a31fd3c 100644 --- a/src/hotkey.ts +++ b/src/hotkey.ts @@ -96,14 +96,16 @@ function localizeMod(hotkey: string, platform?: string | undefined): string { return hotkey.replace('Mod', localModifier) } +const orderedModifiers: Partial> = { + Control: 0, + Alt: 1, + Meta: 2, + Shift: 3 +} + function sortModifiers(hotkey: string): string { - const key = hotkey.split('+').pop() - const modifiers: string[] = [] - for (const modifier of ['Control', 'Alt', 'Meta', 'Shift']) { - if (hotkey.includes(modifier)) { - modifiers.push(modifier) - } - } - if (key) modifiers.push(key) - return modifiers.join('+') + return hotkey + .split('+') + .sort((a, b) => (orderedModifiers[a] ?? Infinity) - (orderedModifiers[b] ?? Infinity)) + .join('+') } diff --git a/test/test-normalize-hotkey.js b/test/test-normalize-hotkey.js index a9efb7b..8d61fa1 100644 --- a/test/test-normalize-hotkey.js +++ b/test/test-normalize-hotkey.js @@ -30,7 +30,10 @@ describe('normalizeHotkey', () => { ['Mod+a', 'Control+a', undefined], // Modifier sorting ['Shift+Alt+Meta+Control+m', 'Control+Alt+Meta+Shift+m'], - ['Shift+Alt+Mod+m', 'Control+Alt+Shift+m', 'win'] + ['Shift+Alt+Mod+m', 'Control+Alt+Shift+m', 'win'], + // Edge case: only modifiers + ['Alt', 'Alt', 'win / linux'], + ['Alt+Mod', 'Control+Alt', 'win / linux'] ] for (const [input, expected, platform = 'any platform'] of tests) {