From 3072338da7e40afae05f0b69c65b030ba944f992 Mon Sep 17 00:00:00 2001 From: Jason Poon <85374+jpoon@users.noreply.github.com> Date: Fri, 1 Feb 2019 07:36:01 -0800 Subject: [PATCH] fix: validate that remappings are string arrays (#3440) --- src/configuration/configuration.ts | 2 +- src/configuration/configurationValidator.ts | 12 ++++++++++++ src/configuration/remapper.ts | 3 ++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/configuration/configuration.ts b/src/configuration/configuration.ts index 9e881786333..b777e1719c8 100644 --- a/src/configuration/configuration.ts +++ b/src/configuration/configuration.ts @@ -101,7 +101,7 @@ class Configuration implements IConfiguration { const modeKeyBindingsMap = new Map(); for (let i = keybindings.length - 1; i >= 0; i--) { - let remapping = keybindings[i]; + let remapping = keybindings[i] as IKeyRemapping; // validate let remappingErrors = await configurationValidator.isRemappingValid(remapping); diff --git a/src/configuration/configurationValidator.ts b/src/configuration/configurationValidator.ts index dd0bee081ae..bc348c7c4f6 100644 --- a/src/configuration/configurationValidator.ts +++ b/src/configuration/configurationValidator.ts @@ -42,6 +42,18 @@ class ConfigurationValidator { return [{ level: 'error', message: `${remapping.before} missing 'after' key or 'command'.` }]; } + if (!(remapping.before instanceof Array)) { + return [ + { level: 'error', message: `Remapping of '${remapping.before}' should be a string array.` }, + ]; + } + + if (remapping.after && !(remapping.after instanceof Array)) { + return [ + { level: 'error', message: `Remapping of '${remapping.after}' should be a string array.` }, + ]; + } + if (remapping.commands) { for (const command of remapping.commands) { let cmd: string; diff --git a/src/configuration/remapper.ts b/src/configuration/remapper.ts index 96507cb2b44..f26d805a148 100644 --- a/src/configuration/remapper.ts +++ b/src/configuration/remapper.ts @@ -197,7 +197,7 @@ export class Remapper implements IRemapper { for (let sliceLength = startingSliceLength; sliceLength >= range[0]; sliceLength--) { const keySlice = inputtedKeys.slice(-sliceLength).join(''); - this._logger.verbose(`trying to find matching remap for keySlice=${keySlice}.`); + this._logger.verbose(`key=${inputtedKeys}. keySlice=${keySlice}.`); if (userDefinedRemappings.has(keySlice)) { // In Insert mode, we allow users to precede remapped commands // with extraneous keystrokes (eg. "hello world jj") @@ -208,6 +208,7 @@ export class Remapper implements IRemapper { .slice(0, inputtedKeys.length - keySlice.length) .join(''); if (precedingKeys.length > 0 && !/^[0-9]+$/.test(precedingKeys)) { + this._logger.verbose(`key sequences need to match precisely. precedingKeys=${precedingKeys}.`); break; } }