Skip to content

Commit 1c00875

Browse files
not-an-aardvarkaddaleax
authored andcommitted
repl: include folder extensions in autocomplete
When autocompleting `require` calls, the repl strips .js file extensions from results. However, stripping an extension from a directory results in an error. Update the autocompletion logic to avoid stripping extensions from directories. PR-URL: #14727 Fixes: #14726 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Timothy Gu <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Tobias Nießen <[email protected]> Reviewed-By: Yuta Hiroto <[email protected]> Reviewed-By: Alexey Orlenko <[email protected]>
1 parent 9237ef8 commit 1c00875

File tree

3 files changed

+29
-16
lines changed

3 files changed

+29
-16
lines changed

lib/repl.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ function complete(line, callback) {
792792
completeOn = match[1];
793793
var subdir = match[2] || '';
794794
filter = match[1];
795-
var dir, files, f, name, base, ext, abs, subfiles, s;
795+
var dir, files, f, name, base, ext, abs, subfiles, s, isDirectory;
796796
group = [];
797797
let paths = [];
798798

@@ -821,23 +821,26 @@ function complete(line, callback) {
821821
// Exclude versioned names that 'npm' installs.
822822
continue;
823823
}
824-
if (exts.indexOf(ext) !== -1) {
825-
if (!subdir || base !== 'index') {
826-
group.push(subdir + base);
827-
}
828-
} else {
829-
abs = path.resolve(dir, name);
824+
abs = path.resolve(dir, name);
825+
try {
826+
isDirectory = fs.statSync(abs).isDirectory();
827+
} catch (e) {
828+
continue;
829+
}
830+
if (isDirectory) {
831+
group.push(subdir + name + '/');
830832
try {
831-
if (fs.statSync(abs).isDirectory()) {
832-
group.push(subdir + name + '/');
833-
subfiles = fs.readdirSync(abs);
834-
for (s = 0; s < subfiles.length; s++) {
835-
if (indexRe.test(subfiles[s])) {
836-
group.push(subdir + name);
837-
}
838-
}
833+
subfiles = fs.readdirSync(abs);
834+
} catch (e) {
835+
continue;
836+
}
837+
for (s = 0; s < subfiles.length; s++) {
838+
if (indexRe.test(subfiles[s])) {
839+
group.push(subdir + name);
839840
}
840-
} catch (e) {}
841+
}
842+
} else if (exts.includes(ext) && (!subdir || base !== 'index')) {
843+
group.push(subdir + base);
841844
}
842845
}
843846
}

test/fixtures/repl-folder-extensions/foo.js/index.js

Whitespace-only changes.

test/parallel/test-repl-tab-complete.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,16 @@ testMe.complete('require(\'n', common.mustCall(function(error, data) {
279279
});
280280
});
281281

282+
{
283+
const path = '../fixtures/repl-folder-extensions/f';
284+
testMe.complete(`require('${path}`, common.mustCall((err, data) => {
285+
assert.ifError(err);
286+
assert.strictEqual(data.length, 2);
287+
assert.strictEqual(data[1], path);
288+
assert.ok(data[0].includes('../fixtures/repl-folder-extensions/foo.js'));
289+
}));
290+
}
291+
282292
process.chdir(cwd);
283293
}
284294

0 commit comments

Comments
 (0)