69 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| exports.convertPosixPathToPattern = exports.convertWindowsPathToPattern = exports.convertPathToPattern = exports.escapePosixPath = exports.escapeWindowsPath = exports.escape = exports.removeLeadingDotSegment = exports.makeAbsolute = exports.unixify = void 0;
 | |
| const os = require("os");
 | |
| const path = require("path");
 | |
| const IS_WINDOWS_PLATFORM = os.platform() === 'win32';
 | |
| const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\
 | |
| /**
 | |
|  * All non-escaped special characters.
 | |
|  * Posix: ()*?[]{|}, !+@ before (, ! at the beginning, \\ before non-special characters.
 | |
|  * Windows: (){}[], !+@ before (, ! at the beginning.
 | |
|  */
 | |
| const POSIX_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g;
 | |
| const WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()[\]{}]|^!|[!+@](?=\())/g;
 | |
| /**
 | |
|  * The device path (\\.\ or \\?\).
 | |
|  * https://learn.microsoft.com/en-us/dotnet/standard/io/file-path-formats#dos-device-paths
 | |
|  */
 | |
| const DOS_DEVICE_PATH_RE = /^\\\\([.?])/;
 | |
| /**
 | |
|  * All backslashes except those escaping special characters.
 | |
|  * Windows: !()+@{}
 | |
|  * https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions
 | |
|  */
 | |
| const WINDOWS_BACKSLASHES_RE = /\\(?![!()+@[\]{}])/g;
 | |
| /**
 | |
|  * Designed to work only with simple paths: `dir\\file`.
 | |
|  */
 | |
| function unixify(filepath) {
 | |
|     return filepath.replace(/\\/g, '/');
 | |
| }
 | |
| exports.unixify = unixify;
 | |
| function makeAbsolute(cwd, filepath) {
 | |
|     return path.resolve(cwd, filepath);
 | |
| }
 | |
| exports.makeAbsolute = makeAbsolute;
 | |
| function removeLeadingDotSegment(entry) {
 | |
|     // We do not use `startsWith` because this is 10x slower than current implementation for some cases.
 | |
|     // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
 | |
|     if (entry.charAt(0) === '.') {
 | |
|         const secondCharactery = entry.charAt(1);
 | |
|         if (secondCharactery === '/' || secondCharactery === '\\') {
 | |
|             return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT);
 | |
|         }
 | |
|     }
 | |
|     return entry;
 | |
| }
 | |
| exports.removeLeadingDotSegment = removeLeadingDotSegment;
 | |
| exports.escape = IS_WINDOWS_PLATFORM ? escapeWindowsPath : escapePosixPath;
 | |
| function escapeWindowsPath(pattern) {
 | |
|     return pattern.replace(WINDOWS_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2');
 | |
| }
 | |
| exports.escapeWindowsPath = escapeWindowsPath;
 | |
| function escapePosixPath(pattern) {
 | |
|     return pattern.replace(POSIX_UNESCAPED_GLOB_SYMBOLS_RE, '\\$2');
 | |
| }
 | |
| exports.escapePosixPath = escapePosixPath;
 | |
| exports.convertPathToPattern = IS_WINDOWS_PLATFORM ? convertWindowsPathToPattern : convertPosixPathToPattern;
 | |
| function convertWindowsPathToPattern(filepath) {
 | |
|     return escapeWindowsPath(filepath)
 | |
|         .replace(DOS_DEVICE_PATH_RE, '//$1')
 | |
|         .replace(WINDOWS_BACKSLASHES_RE, '/');
 | |
| }
 | |
| exports.convertWindowsPathToPattern = convertWindowsPathToPattern;
 | |
| function convertPosixPathToPattern(filepath) {
 | |
|     return escapePosixPath(filepath);
 | |
| }
 | |
| exports.convertPosixPathToPattern = convertPosixPathToPattern;
 |