appcenter-cli
Version:
Command line tool for Visual Studio App Center
71 lines (70 loc) • 3.09 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.PathResolver = void 0;
const promisfied_glob_1 = require("../../../util/misc/promisfied-glob");
const path = require("path");
const fs = require("fs");
const _ = require("lodash");
class PathResolver {
constructor(workspace) {
this.workspace = workspace;
}
resolve(pattern) {
return __awaiter(this, void 0, void 0, function* () {
if (typeof pattern === "string") {
return this.resolveSinglePattern(pattern);
}
const allFiles = (yield Promise.all(pattern.map((p) => this.resolveSinglePattern(p))));
return _.uniq(_.union.apply(_, allFiles)).sort();
});
}
resolveSinglePattern(pattern) {
return __awaiter(this, void 0, void 0, function* () {
let workspacePattern = path.join(this.workspace, pattern);
if (pattern.indexOf("*") === -1) {
try {
const stats = fs.statSync(workspacePattern);
if (stats.isDirectory()) {
workspacePattern = `${workspacePattern}${path.sep}**`;
}
}
catch (err) {
throw new Error(`Cannot access file or directory "${workspacePattern}"`);
}
}
const matches = yield promisfied_glob_1.glob(workspacePattern);
const result = [];
for (let i = 0; i < matches.length; i++) {
const match = matches[i];
const validatedRelativePath = yield this.validateAndMakeRelative(match);
if (validatedRelativePath) {
result.push(validatedRelativePath);
}
}
return result;
});
}
validateAndMakeRelative(match) {
return __awaiter(this, void 0, void 0, function* () {
const relativePath = path.relative(this.workspace, match);
const stats = yield fs.statSync(match);
if (stats.isDirectory()) {
return null;
}
if (relativePath.indexOf("..") !== -1) {
throw new Error("Pattern cannot contain files that are outside of workspace directory");
}
return relativePath;
});
}
}
exports.PathResolver = PathResolver;