-
-
Notifications
You must be signed in to change notification settings - Fork 12
/
checkFsPath.ts
64 lines (57 loc) · 1.85 KB
/
checkFsPath.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import * as vscode from 'vscode';
import * as path from 'path';
import pathIsInside from 'path-is-inside';
const rootDirectoryCache = new Map<string, string>();
function getRootDirectoryPath(entryFsDirectory: string) {
if (rootDirectoryCache.has(entryFsDirectory)) {
return rootDirectoryCache.get(entryFsDirectory);
}
// maybe use vscode.workspace.getWorkspaceFolder(uri)?
const rootDirectories = vscode.workspace.workspaceFolders.filter(
workspaceFolder => {
return pathIsInside(entryFsDirectory, workspaceFolder.uri.fsPath);
}
);
const rootDirectory = rootDirectories.sort((d1, d2) => {
return d1.uri.fsPath.length - d2.uri.fsPath.length;
})[0];
if (rootDirectory && rootDirectory.uri.fsPath) {
const rootDirectoryPath = rootDirectory.uri.fsPath;
if (rootDirectoryPath) {
rootDirectoryCache.set(entryFsDirectory, rootDirectoryPath);
return rootDirectoryPath;
}
}
}
export function handleDidChangeWorkspaceFolders() {
rootDirectoryCache.clear();
}
export function checkFsPath(entryFsDirectory: string, fsPath: string): boolean {
const rootDirectory = getRootDirectoryPath(entryFsDirectory);
if (path.sep === '\\') {
fsPath = path.normalize(fsPath);
}
if (!pathIsInside(fsPath, rootDirectory)) {
return false;
}
return true;
}
class CustomError extends Error {
constructor(...args: any[]) {
super(...args);
Object.setPrototypeOf(this, new.target.prototype);
this.name = new.target.name;
if (Error.captureStackTrace) {
Error.captureStackTrace(this, new.target);
}
}
}
export class PathAccessDeniedError extends CustomError {
fsPath: string;
constructor(fsPath: string) {
super(
`Accessing ${fsPath} denied. This path is outside of your workspace folders. Please make sure you have all dependencies inside your workspace.`
);
this.fsPath = fsPath;
}
}