UNPKG

ts-simple-ast

Version:

TypeScript compiler wrapper for AST navigation and code generation.

227 lines (226 loc) 9.66 kB
"use strict"; var __awaiter = (this && this.__awaiter)/* istanbul ignore next */ || function (thisArg, _arguments, P, generator) { 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) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator)/* istanbul ignore next */ || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [0, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __read = (this && this.__read)/* istanbul ignore next */ || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread)/* istanbul ignore next */ || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); var path = require("path"); var FileUtils = /** @class */ (function () { /* istanbul ignore next */ function FileUtils() { } /** * Ensure the directory exists synchronously. * @param host - File system host. * @param dirPath - Directory path. */ FileUtils.ensureDirectoryExistsSync = function (host, dirPath) { if (host.directoryExistsSync(dirPath)) return; // ensure the parent exists and is not the root var parentDirPath = path.dirname(dirPath); if (parentDirPath !== dirPath && path.dirname(parentDirPath) !== parentDirPath) FileUtils.ensureDirectoryExistsSync(host, parentDirPath); // make this directory host.mkdirSync(dirPath); }; /** * Ensure the directory exists asynchronously. * @param host - File system host. * @param dirPath - Directory path. */ FileUtils.ensureDirectoryExists = function (host, dirPath) { return __awaiter(this, void 0, void 0, function () { var parentDirPath; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, host.directoryExists(dirPath)]; case 1: if (_a.sent()) return [2 /*return*/]; parentDirPath = path.dirname(dirPath); if (!(parentDirPath !== dirPath && path.dirname(parentDirPath) !== parentDirPath)) return [3 /*break*/, 3]; return [4 /*yield*/, FileUtils.ensureDirectoryExists(host, parentDirPath)]; case 2: _a.sent(); _a.label = 3; case 3: // make this directory return [4 /*yield*/, host.mkdir(dirPath)]; case 4: // make this directory _a.sent(); return [2 /*return*/]; } }); }); }; /** * Joins the paths. * @param paths - Paths to join. */ FileUtils.pathJoin = function () { var paths = []; for (var _i = 0; _i < arguments.length; _i++) { paths[_i] = arguments[_i]; } return FileUtils.standardizeSlashes(path.join.apply(path, __spread(paths))); }; /** * Gets the standardized absolute path. * @param fileSystem - File system. * @param fileOrDirPath - Path to standardize. * @param relativeBase - Base path to be relative from. */ FileUtils.getStandardizedAbsolutePath = function (fileSystem, fileOrDirPath, relativeBase) { var isAbsolutePath = path.isAbsolute(fileOrDirPath); if (relativeBase != null && !isAbsolutePath) fileOrDirPath = path.join(relativeBase, fileOrDirPath); else if (!isAbsolutePath) fileOrDirPath = path.join(fileSystem.getCurrentDirectory(), fileOrDirPath); return FileUtils.standardizeSlashes(path.normalize(fileOrDirPath)); }; /** * Gets the directory path. * @param fileOrDirPath - Path to get the directory name from. */ FileUtils.getDirPath = function (fileOrDirPath) { return path.dirname(fileOrDirPath); }; /** * Gets the base name. * @param fileOrDirPath - Path to get the base name from. */ FileUtils.getBaseName = function (fileOrDirPath) { return path.basename(fileOrDirPath); }; /** * Changes all back slashes to forward slashes. * @param fileOrDirPath - Path. */ FileUtils.standardizeSlashes = function (fileOrDirPath) { return fileOrDirPath.replace(this.standardizeSlashesRegex, "/"); }; /** * Checks if a file path matches a specified search string. * @param filePath - File path. * @param searchString - Search string. */ FileUtils.filePathMatches = function (filePath, searchString) { var _this = this; var splitBySlash = function (p) { return _this.standardizeSlashes(p || "").replace(/^\//, "").split("/"); }; var filePathItems = splitBySlash(filePath); var searchItems = splitBySlash(searchString); if (searchItems.length > filePathItems.length) return false; for (var i = 0; i < searchItems.length; i++) { if (searchItems[searchItems.length - i - 1] !== filePathItems[filePathItems.length - i - 1]) return false; } return searchItems.length > 0; }; /** * Reads a file or returns false if the file doesn't exist. * @param fileSystem - File System. * @param filePath - Path to file. * @param encoding - File encoding. */ FileUtils.readFileOrNotExists = function (fileSystem, filePath, encoding) { return __awaiter(this, void 0, void 0, function () { var err_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, fileSystem.readFile(filePath, encoding)]; case 1: return [2 /*return*/, _a.sent()]; case 2: err_1 = _a.sent(); if (err_1.code !== "ENOENT") throw err_1; return [2 /*return*/, false]; case 3: return [2 /*return*/]; } }); }); }; /** * Reads a file synchronously or returns false if the file doesn't exist. * @param fileSystem - File System. * @param filePath - Path to file. * @param encoding - File encoding. */ FileUtils.readFileOrNotExistsSync = function (fileSystem, filePath, encoding) { try { return fileSystem.readFileSync(filePath, encoding); } catch (err) { if (err.code !== "ENOENT") throw err; return false; } }; /** * Gets the text with a byte order mark. * @param text - Text. */ FileUtils.getTextWithByteOrderMark = function (text) { var bom = "\ufeff"; if (text[0] === bom) return text; return bom + text; }; FileUtils.standardizeSlashesRegex = /\\/g; return FileUtils; }()); exports.FileUtils = FileUtils;