Skip to content

Commit a393225

Browse files
authored
Remove array prototype extension (#16425)
1 parent 1776cd2 commit a393225

File tree

7 files changed

+24
-25
lines changed

7 files changed

+24
-25
lines changed

src/client/common/extensions.ts

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,6 @@ declare interface String {
3939
trimQuotes(): string;
4040
}
4141

42-
declare interface Array<T> {
43-
/**
44-
* Returns the elements of an array that meet the condition specified in an async callback function.
45-
* @param asyncPredicate The filter method calls the async predicate function one time for each element in the array.
46-
*/
47-
asyncFilter(asyncPredicate: (value: T) => Promise<unknown>): Promise<T[]>;
48-
}
49-
50-
/**
51-
* Returns the elements of an array that meet the condition specified in an async callback function.
52-
* @param asyncPredicate The filter method calls the async predicate function one time for each element in the array.
53-
*/
54-
Array.prototype.asyncFilter = async function <T>(
55-
this: T[],
56-
asyncPredicate: (value: T) => Promise<unknown>,
57-
): Promise<T[]> {
58-
const results = await Promise.all(this.map(asyncPredicate));
59-
return this.filter((_v, index) => results[index]);
60-
};
61-
6242
/**
6343
* Split a string using the cr and lf characters and return them as an array.
6444
* By default lines are trimmed and empty lines are removed.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
/**
5+
* Returns the elements of an array that meet the condition specified in an async callback function.
6+
* @param asyncPredicate The filter method calls the async predicate function one time for each element in the array.
7+
*/
8+
export async function asyncFilter<T>(arr: T[], asyncPredicate: (value: T) => Promise<unknown>): Promise<T[]> {
9+
const results = await Promise.all(arr.map(asyncPredicate));
10+
return arr.filter((_v, index) => results[index]);
11+
}

src/client/pythonEnvironments/base/locators/lowLevel/workspaceVirtualEnvLocator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { buildEnvInfo } from '../../info/env';
2323
import { IPythonEnvsIterator } from '../../locator';
2424
import { FSWatchingLocator } from './fsWatchingLocator';
2525
import '../../../../common/extensions';
26+
import { asyncFilter } from '../../../../common/utils/arrayUtils';
2627

2728
/**
2829
* Default number of levels of sub-directories to recurse when looking for interpreters.
@@ -33,7 +34,7 @@ const DEFAULT_SEARCH_DEPTH = 2;
3334
* Gets all default virtual environment locations to look for in a workspace.
3435
*/
3536
function getWorkspaceVirtualEnvDirs(root: string): Promise<string[]> {
36-
return [root, path.join(root, '.direnv')].asyncFilter(pathExists);
37+
return asyncFilter([root, path.join(root, '.direnv')], pathExists);
3738
}
3839

3940
/**

src/client/pythonEnvironments/discovery/locators/services/customVirtualEnvLocator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
isVirtualenvwrapperEnvironment,
3131
} from './virtualEnvironmentIdentifier';
3232
import '../../../../common/extensions';
33+
import { asyncFilter } from '../../../../common/utils/arrayUtils';
3334
/**
3435
* Default number of levels of sub-directories to recurse when looking for interpreters.
3536
*/
@@ -52,7 +53,7 @@ async function getCustomVirtualEnvDirs(): Promise<string[]> {
5253
if (homeDir && (await pathExists(homeDir))) {
5354
venvFolders.map((item) => path.join(homeDir, item)).forEach((d) => venvDirs.push(d));
5455
}
55-
return uniq(venvDirs).asyncFilter(pathExists);
56+
return asyncFilter(uniq(venvDirs), pathExists);
5657
}
5758

5859
/**

src/client/pythonEnvironments/discovery/locators/services/globalVirtualEnvronmentLocator.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
isVirtualenvwrapperEnvironment,
2525
} from './virtualEnvironmentIdentifier';
2626
import '../../../../common/extensions';
27+
import { asyncFilter } from '../../../../common/utils/arrayUtils';
2728

2829
const DEFAULT_SEARCH_DEPTH = 2;
2930
/**
@@ -48,7 +49,10 @@ async function getGlobalVirtualEnvDirs(): Promise<string[]> {
4849
if (getOSType() !== OSType.Windows) {
4950
subDirs.push('envs');
5051
}
51-
const filtered = await subDirs.map((d) => path.join(homeDir, d)).asyncFilter(pathExists);
52+
const filtered = await asyncFilter(
53+
subDirs.map((d) => path.join(homeDir, d)),
54+
pathExists,
55+
);
5256
filtered.forEach((d) => venvDirs.push(d));
5357
}
5458

src/client/pythonEnvironments/discovery/locators/services/poetryLocator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
import { getFileInfo, isParentPath, pathExists } from '../../../common/externalDependencies';
2121
import { isPoetryEnvironment, localPoetryEnvDirName, Poetry } from './poetry';
2222
import '../../../../common/extensions';
23+
import { asyncFilter } from '../../../../common/utils/arrayUtils';
2324

2425
/**
2526
* Gets all default virtual environment locations to look for in a workspace.
@@ -31,7 +32,7 @@ async function getVirtualEnvDirs(root: string): Promise<string[]> {
3132
if (virtualenvs) {
3233
envDirs.push(...virtualenvs);
3334
}
34-
return envDirs.asyncFilter(pathExists);
35+
return asyncFilter(envDirs, pathExists);
3536
}
3637

3738
async function getRootVirtualEnvDir(root: string): Promise<string[]> {

src/test/common/extensions.unit.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { assert, expect } from 'chai';
22
import '../../client/common/extensions';
3+
import { asyncFilter } from '../../client/common/utils/arrayUtils';
34

45
// Defines a Mocha test suite to group tests of similar kind together
56
suite('String Extensions', () => {
@@ -88,7 +89,7 @@ suite('String Extensions', () => {
8889
suite('Array extensions', () => {
8990
test('Async filter should filter items', async () => {
9091
const stringArray = ['Hello', 'I', 'am', 'the', 'Python', 'extension'];
91-
const result = await stringArray.asyncFilter(async (s: string) => {
92+
const result = await asyncFilter(stringArray, async (s: string) => {
9293
return s.length > 4;
9394
});
9495
assert.deepEqual(result, ['Hello', 'Python', 'extension']);

0 commit comments

Comments
 (0)