2024-08-21 06:34:30 +00:00
"use strict" ;
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
function _typeof ( obj ) { "@babel/helpers - typeof" ; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol . iterator ? function ( obj ) { return typeof obj ; } : function ( obj ) { return obj && "function" == typeof Symbol && obj . constructor === Symbol && obj !== Symbol . prototype ? "symbol" : typeof obj ; } , _typeof ( obj ) ; }
function _defineProperties ( target , props ) { for ( var i = 0 ; i < props . length ; i ++ ) { var descriptor = props [ i ] ; descriptor . enumerable = descriptor . enumerable || false ; descriptor . configurable = true ; if ( "value" in descriptor ) descriptor . writable = true ; Object . defineProperty ( target , _toPropertyKey ( descriptor . key ) , descriptor ) ; } }
function _createClass ( Constructor , protoProps , staticProps ) { if ( protoProps ) _defineProperties ( Constructor . prototype , protoProps ) ; if ( staticProps ) _defineProperties ( Constructor , staticProps ) ; Object . defineProperty ( Constructor , "prototype" , { writable : false } ) ; return Constructor ; }
function _toPropertyKey ( arg ) { var key = _toPrimitive ( arg , "string" ) ; return _typeof ( key ) === "symbol" ? key : String ( key ) ; }
function _toPrimitive ( input , hint ) { if ( _typeof ( input ) !== "object" || input === null ) return input ; var prim = input [ Symbol . toPrimitive ] ; if ( prim !== undefined ) { var res = prim . call ( input , hint || "default" ) ; if ( _typeof ( res ) !== "object" ) return res ; throw new TypeError ( "@@toPrimitive must return a primitive value." ) ; } return ( hint === "string" ? String : Number ) ( input ) ; }
2024-08-09 12:04:48 +00:00
function _classCallCheck ( instance , Constructor ) { if ( ! ( instance instanceof Constructor ) ) { throw new TypeError ( "Cannot call a class as a function" ) ; } }
// A simple implementation of make-array
2024-08-21 06:34:30 +00:00
function makeArray ( subject ) {
2024-08-09 12:04:48 +00:00
return Array . isArray ( subject ) ? subject : [ subject ] ;
}
2024-08-21 06:34:30 +00:00
var EMPTY = '' ;
var SPACE = ' ' ;
var ESCAPE = '\\' ;
var REGEX _TEST _BLANK _LINE = /^\s+$/ ;
var REGEX _INVALID _TRAILING _BACKSLASH = /(?:[^\\]|^)\\$/ ;
var REGEX _REPLACE _LEADING _EXCAPED _EXCLAMATION = /^\\!/ ;
var REGEX _REPLACE _LEADING _EXCAPED _HASH = /^\\#/ ;
var REGEX _SPLITALL _CRLF = /\r?\n/g ;
// /foo,
// ./foo,
// ../foo,
// .
// ..
var REGEX _TEST _INVALID _PATH = /^\.*\/|^\.+$/ ;
2024-08-09 12:04:48 +00:00
var SLASH = '/' ;
2024-08-21 06:34:30 +00:00
// Do not use ternary expression here, since "istanbul ignore next" is buggy
var TMP _KEY _IGNORE = 'node-ignore' ;
/* istanbul ignore else */
if ( typeof Symbol !== 'undefined' ) {
TMP _KEY _IGNORE = Symbol [ "for" ] ( 'node-ignore' ) ;
}
var KEY _IGNORE = TMP _KEY _IGNORE ;
2024-08-09 12:04:48 +00:00
var define = function define ( object , key , value ) {
2024-08-21 06:34:30 +00:00
return Object . defineProperty ( object , key , {
value : value
} ) ;
2024-08-09 12:04:48 +00:00
} ;
var REGEX _REGEXP _RANGE = /([0-z])-([0-z])/g ;
2024-08-21 06:34:30 +00:00
var RETURN _FALSE = function RETURN _FALSE ( ) {
return false ;
} ;
2024-08-09 12:04:48 +00:00
// Sanitize the range of a regular expression
// The cases are complicated, see test cases for details
var sanitizeRange = function sanitizeRange ( range ) {
return range . replace ( REGEX _REGEXP _RANGE , function ( match , from , to ) {
return from . charCodeAt ( 0 ) <= to . charCodeAt ( 0 ) ? match
// Invalid range (out of order) which is ok for gitignore rules but
// fatal for JavaScript regular expression, so eliminate it.
2024-08-21 06:34:30 +00:00
: EMPTY ;
2024-08-09 12:04:48 +00:00
} ) ;
} ;
2024-08-21 06:34:30 +00:00
// See fixtures #59
var cleanRangeBackSlash = function cleanRangeBackSlash ( slashes ) {
var length = slashes . length ;
return slashes . slice ( 0 , length - length % 2 ) ;
} ;
2024-08-09 12:04:48 +00:00
// > If the pattern ends with a slash,
// > it is removed for the purpose of the following description,
// > but it would only find a match with a directory.
// > In other words, foo/ will match a directory foo and paths underneath it,
// > but will not match a regular file or a symbolic link foo
// > (this is consistent with the way how pathspec works in general in Git).
// '`foo/`' will not match regular file '`foo`' or symbolic link '`foo`'
// -> ignore-rules will not deal with it, because it costs extra `fs.stat` call
// you could use option `mark: true` with `glob`
// '`foo/`' should not continue with the '`..`'
2024-08-21 06:34:30 +00:00
var REPLACERS = [ [
// remove BOM
// TODO:
// Other similar zero-width characters?
/^\uFEFF/ , function ( ) {
return EMPTY ;
} ] ,
2024-08-09 12:04:48 +00:00
// > Trailing spaces are ignored unless they are quoted with backslash ("\")
[
// (a\ ) -> (a )
// (a ) -> (a)
// (a \ ) -> (a )
/\\?\s+$/ , function ( match ) {
2024-08-21 06:34:30 +00:00
return match . indexOf ( '\\' ) === 0 ? SPACE : EMPTY ;
2024-08-09 12:04:48 +00:00
} ] ,
// replace (\ ) with ' '
[ /\\\s/g , function ( ) {
2024-08-21 06:34:30 +00:00
return SPACE ;
2024-08-09 12:04:48 +00:00
} ] ,
// Escape metacharacters
// which is written down by users but means special for regular expressions.
// > There are 12 characters with special meanings:
// > - the backslash \,
// > - the caret ^,
// > - the dollar sign $,
// > - the period or dot .,
// > - the vertical bar or pipe symbol |,
// > - the question mark ?,
// > - the asterisk or star *,
// > - the plus sign +,
// > - the opening parenthesis (,
// > - the closing parenthesis ),
// > - and the opening square bracket [,
// > - the opening curly brace {,
// > These special characters are often called "metacharacters".
2024-08-21 06:34:30 +00:00
[ /[\\$.|*+(){^]/g , function ( match ) {
return "\\" . concat ( match ) ;
2024-08-09 12:04:48 +00:00
} ] , [
// > a question mark (?) matches a single character
/(?!\\)\?/g , function ( ) {
return '[^/]' ;
} ] ,
// leading slash
[
// > A leading slash matches the beginning of the pathname.
// > For example, "/*.c" matches "cat-file.c" but not "mozilla-sha1/sha1.c".
// A leading slash matches the beginning of the pathname
/^\// , function ( ) {
return '^' ;
} ] ,
// replace special metacharacter slash after the leading slash
[ /\//g , function ( ) {
return '\\/' ;
} ] , [
// > A leading "**" followed by a slash means match in all directories.
// > For example, "**/foo" matches file or directory "foo" anywhere,
// > the same as pattern "foo".
// > "**/foo/bar" matches file or directory "bar" anywhere that is directly
// > under directory "foo".
// Notice that the '*'s have been replaced as '\\*'
/^\^*\\\*\\\*\\\// ,
// '**/foo' <-> 'foo'
function ( ) {
return '^(?:.*\\/)?' ;
2024-08-21 06:34:30 +00:00
} ] ,
2024-08-09 12:04:48 +00:00
// starting
[
// there will be no leading '/'
// (which has been replaced by section "leading slash")
// If starts with '**', adding a '^' to the regular expression also works
/^(?=[^^])/ , function startingReplacer ( ) {
2024-08-21 06:34:30 +00:00
// If has a slash `/` at the beginning or middle
2024-08-09 12:04:48 +00:00
return ! /\/(?!$)/ . test ( this )
2024-08-21 06:34:30 +00:00
// > Prior to 2.22.1
2024-08-09 12:04:48 +00:00
// > If the pattern does not contain a slash /,
// > Git treats it as a shell glob pattern
// Actually, if there is only a trailing slash,
// git also treats it as a shell glob pattern
2024-08-21 06:34:30 +00:00
// After 2.22.1 (compatible but clearer)
// > If there is a separator at the beginning or middle (or both)
// > of the pattern, then the pattern is relative to the directory
// > level of the particular .gitignore file itself.
// > Otherwise the pattern may also match at any level below
// > the .gitignore level.
2024-08-09 12:04:48 +00:00
? '(?:^|\\/)'
// > Otherwise, Git treats the pattern as a shell glob suitable for
// > consumption by fnmatch(3)
: '^' ;
} ] ,
// two globstars
[
// Use lookahead assertions so that we could match more than one `'/**'`
/\\\/\\\*\\\*(?=\\\/|$)/g ,
// Zero, one or several directories
// should not use '*', or it will be replaced by the next replacer
// Check if it is not the last `'/**'`
2024-08-21 06:34:30 +00:00
function ( _ , index , str ) {
2024-08-09 12:04:48 +00:00
return index + 6 < str . length
// case: /**/
// > A slash followed by two consecutive asterisks then a slash matches
// > zero or more directories.
// > For example, "a/**/b" matches "a/b", "a/x/b", "a/x/y/b" and so on.
// '/**/'
? '(?:\\/[^\\/]+)*'
// case: /**
// > A trailing `"/**"` matches everything inside.
// #21: everything inside but it should not include the current folder
: '\\/.+' ;
} ] ,
2024-08-21 06:34:30 +00:00
// normal intermediate wildcards
2024-08-09 12:04:48 +00:00
[
// Never replace escaped '*'
// ignore rule '\*' will match the path '*'
// 'abc.*/' -> go
2024-08-21 06:34:30 +00:00
// 'abc.*' -> skip this rule,
// coz trailing single wildcard will be handed by [trailing wildcard]
/(^|[^\\]+)(\\\*)+(?=.+)/g ,
2024-08-09 12:04:48 +00:00
// '*.js' matches '.js'
// '*.js' doesn't match 'abc'
2024-08-21 06:34:30 +00:00
function ( _ , p1 , p2 ) {
// 1.
// > An asterisk "*" matches anything except a slash.
// 2.
// > Other consecutive asterisks are considered regular asterisks
// > and will match according to the previous rules.
var unescaped = p2 . replace ( /\\\*/g , '[^\\/]*' ) ;
return p1 + unescaped ;
} ] , [
// unescape, revert step 3 except for back slash
// For example, if a user escape a '\\*',
// after step 3, the result will be '\\\\\\*'
/\\\\\\(?=[$.|*+(){^])/g , function ( ) {
return ESCAPE ;
} ] , [
// '\\\\' -> '\\'
/\\\\/g , function ( ) {
return ESCAPE ;
} ] , [
// > The range notation, e.g. [a-zA-Z],
// > can be used to match one of the characters in a range.
// `\` is escaped by step 3
/(\\)?\[([^\]/]*?)(\\*)($|\])/g , function ( match , leadEscape , range , endEscape , close ) {
return leadEscape === ESCAPE
// '\\[bar]' -> '\\\\[bar\\]'
? "\\[" . concat ( range ) . concat ( cleanRangeBackSlash ( endEscape ) ) . concat ( close ) : close === ']' ? endEscape . length % 2 === 0
// A normal case, and it is a range notation
// '[bar]'
// '[bar\\\\]'
? "[" . concat ( sanitizeRange ( range ) ) . concat ( endEscape , "]" ) // Invalid range notaton
// '[bar\\]' -> '[bar\\\\]'
: '[]' : '[]' ;
2024-08-09 12:04:48 +00:00
} ] ,
2024-08-21 06:34:30 +00:00
// ending
[
// 'js' will not match 'js.'
// 'ab' will not match 'abc'
/(?:[^*])$/ ,
// WTF!
// https://git-scm.com/docs/gitignore
// changes in [2.22.1](https://git-scm.com/docs/gitignore/2.22.1)
// which re-fixes #24, #38
// > If there is a separator at the end of the pattern then the pattern
// > will only match directories, otherwise the pattern can match both
// > files and directories.
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// 'js*' will not match 'a.js'
// 'js/' will not match 'a.js'
// 'js' will match 'a.js' and 'a.js/'
function ( match ) {
return /\/$/ . test ( match )
// foo/ will not match 'foo'
? "" . concat ( match , "$" ) // foo matches 'foo' and 'foo/'
: "" . concat ( match , "(?=$|\\/$)" ) ;
} ] ,
2024-08-09 12:04:48 +00:00
// trailing wildcard
2024-08-21 06:34:30 +00:00
[ /(\^|\\\/)?\\\*$/ , function ( _ , p1 ) {
2024-08-09 12:04:48 +00:00
var prefix = p1
// '\^':
2024-08-21 06:34:30 +00:00
// '/*' does not match EMPTY
2024-08-09 12:04:48 +00:00
// '/*' does not match everything
// '\\\/':
// 'abc/*' does not match 'abc/'
2024-08-21 06:34:30 +00:00
? "" . concat ( p1 , "[^/]+" ) // 'a*' matches 'a'
2024-08-09 12:04:48 +00:00
// 'a*' matches 'aa'
: '[^/]*' ;
2024-08-21 06:34:30 +00:00
return "" . concat ( prefix , "(?=$|\\/$)" ) ;
2024-08-09 12:04:48 +00:00
} ] ] ;
// A simple cache, because an ignore rule only has only one certain meaning
2024-08-21 06:34:30 +00:00
var regexCache = Object . create ( null ) ;
2024-08-09 12:04:48 +00:00
// @param {pattern}
2024-08-21 06:34:30 +00:00
var makeRegex = function makeRegex ( pattern , ignoreCase ) {
var source = regexCache [ pattern ] ;
if ( ! source ) {
source = REPLACERS . reduce ( function ( prev , current ) {
return prev . replace ( current [ 0 ] , current [ 1 ] . bind ( pattern ) ) ;
} , pattern ) ;
regexCache [ pattern ] = source ;
2024-08-09 12:04:48 +00:00
}
2024-08-21 06:34:30 +00:00
return ignoreCase ? new RegExp ( source , 'i' ) : new RegExp ( source ) ;
} ;
var isString = function isString ( subject ) {
return typeof subject === 'string' ;
2024-08-09 12:04:48 +00:00
} ;
// > A blank line matches no files, so it can serve as a separator for readability.
var checkPattern = function checkPattern ( pattern ) {
2024-08-21 06:34:30 +00:00
return pattern && isString ( pattern ) && ! REGEX _TEST _BLANK _LINE . test ( pattern ) && ! REGEX _INVALID _TRAILING _BACKSLASH . test ( pattern )
2024-08-09 12:04:48 +00:00
// > A line starting with # serves as a comment.
&& pattern . indexOf ( '#' ) !== 0 ;
} ;
2024-08-21 06:34:30 +00:00
var splitPattern = function splitPattern ( pattern ) {
return pattern . split ( REGEX _SPLITALL _CRLF ) ;
} ;
var IgnoreRule = /*#__PURE__*/ _createClass ( function IgnoreRule ( origin , pattern , negative , regex ) {
_classCallCheck ( this , IgnoreRule ) ;
this . origin = origin ;
this . pattern = pattern ;
this . negative = negative ;
this . regex = regex ;
} ) ;
var createRule = function createRule ( pattern , ignoreCase ) {
2024-08-09 12:04:48 +00:00
var origin = pattern ;
var negative = false ;
// > An optional prefix "!" which negates the pattern;
if ( pattern . indexOf ( '!' ) === 0 ) {
negative = true ;
pattern = pattern . substr ( 1 ) ;
}
pattern = pattern
// > Put a backslash ("\") in front of the first "!" for patterns that
// > begin with a literal "!", for example, `"\!important!.txt"`.
2024-08-21 06:34:30 +00:00
. replace ( REGEX _REPLACE _LEADING _EXCAPED _EXCLAMATION , '!' )
2024-08-09 12:04:48 +00:00
// > Put a backslash ("\") in front of the first hash for patterns that
// > begin with a hash.
2024-08-21 06:34:30 +00:00
. replace ( REGEX _REPLACE _LEADING _EXCAPED _HASH , '#' ) ;
var regex = makeRegex ( pattern , ignoreCase ) ;
return new IgnoreRule ( origin , pattern , negative , regex ) ;
} ;
var throwError = function throwError ( message , Ctor ) {
throw new Ctor ( message ) ;
} ;
var checkPath = function checkPath ( path , originalPath , doThrow ) {
if ( ! isString ( path ) ) {
return doThrow ( "path must be a string, but got `" . concat ( originalPath , "`" ) , TypeError ) ;
}
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// We don't know if we should ignore EMPTY, so throw
if ( ! path ) {
return doThrow ( "path must not be empty" , TypeError ) ;
}
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// Check if it is a relative path
if ( checkPath . isNotRelative ( path ) ) {
var r = '`path.relative()`d' ;
return doThrow ( "path should be a " . concat ( r , " string, but got \"" ) . concat ( originalPath , "\"" ) , RangeError ) ;
}
return true ;
2024-08-09 12:04:48 +00:00
} ;
2024-08-21 06:34:30 +00:00
var isNotRelative = function isNotRelative ( path ) {
return REGEX _TEST _INVALID _PATH . test ( path ) ;
} ;
checkPath . isNotRelative = isNotRelative ;
checkPath . convert = function ( p ) {
return p ;
} ;
var Ignore = /*#__PURE__*/ function ( ) {
function Ignore ( ) {
2024-08-09 12:04:48 +00:00
var _ref = arguments . length > 0 && arguments [ 0 ] !== undefined ? arguments [ 0 ] : { } ,
2024-08-21 06:34:30 +00:00
_ref$ignorecase = _ref . ignorecase ,
ignorecase = _ref$ignorecase === void 0 ? true : _ref$ignorecase ,
_ref$ignoreCase = _ref . ignoreCase ,
ignoreCase = _ref$ignoreCase === void 0 ? ignorecase : _ref$ignoreCase ,
_ref$allowRelativePat = _ref . allowRelativePaths ,
allowRelativePaths = _ref$allowRelativePat === void 0 ? false : _ref$allowRelativePat ;
_classCallCheck ( this , Ignore ) ;
2024-08-09 12:04:48 +00:00
define ( this , KEY _IGNORE , true ) ;
2024-08-21 06:34:30 +00:00
this . _rules = [ ] ;
this . _ignoreCase = ignoreCase ;
this . _allowRelativePaths = allowRelativePaths ;
2024-08-09 12:04:48 +00:00
this . _initCache ( ) ;
}
2024-08-21 06:34:30 +00:00
_createClass ( Ignore , [ {
key : "_initCache" ,
2024-08-09 12:04:48 +00:00
value : function _initCache ( ) {
2024-08-21 06:34:30 +00:00
this . _ignoreCache = Object . create ( null ) ;
this . _testCache = Object . create ( null ) ;
}
} , {
key : "_addPattern" ,
value : function _addPattern ( pattern ) {
// #32
if ( pattern && pattern [ KEY _IGNORE ] ) {
this . _rules = this . _rules . concat ( pattern . _rules ) ;
this . _added = true ;
return ;
}
if ( checkPattern ( pattern ) ) {
var rule = createRule ( pattern , this . _ignoreCase ) ;
this . _added = true ;
this . _rules . push ( rule ) ;
}
2024-08-09 12:04:48 +00:00
}
2024-08-21 06:34:30 +00:00
// @param {Array<string> | string | Ignore} pattern
2024-08-09 12:04:48 +00:00
} , {
2024-08-21 06:34:30 +00:00
key : "add" ,
2024-08-09 12:04:48 +00:00
value : function add ( pattern ) {
this . _added = false ;
2024-08-21 06:34:30 +00:00
makeArray ( isString ( pattern ) ? splitPattern ( pattern ) : pattern ) . forEach ( this . _addPattern , this ) ;
2024-08-09 12:04:48 +00:00
// Some rules have just added to the ignore,
// making the behavior changed.
if ( this . _added ) {
this . _initCache ( ) ;
}
return this ;
}
// legacy
} , {
2024-08-21 06:34:30 +00:00
key : "addPattern" ,
2024-08-09 12:04:48 +00:00
value : function addPattern ( pattern ) {
return this . add ( pattern ) ;
}
2024-08-21 06:34:30 +00:00
// | ignored : unignored
// negative | 0:0 | 0:1 | 1:0 | 1:1
// -------- | ------- | ------- | ------- | --------
// 0 | TEST | TEST | SKIP | X
// 1 | TESTIF | SKIP | TEST | X
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// - SKIP: always skip
// - TEST: always test
// - TESTIF: only test if checkUnignored
// - X: that never happen
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// @param {boolean} whether should check if the path is unignored,
// setting `checkUnignored` to `false` could reduce additional
// path matching.
// @returns {TestResult} true if a file is ignored
} , {
key : "_testOne" ,
value : function _testOne ( path , checkUnignored ) {
var ignored = false ;
var unignored = false ;
this . _rules . forEach ( function ( rule ) {
var negative = rule . negative ;
if ( unignored === negative && ignored !== unignored || negative && ! ignored && ! unignored && ! checkUnignored ) {
return ;
}
var matched = rule . regex . test ( path ) ;
if ( matched ) {
ignored = ! negative ;
unignored = negative ;
}
} ) ;
return {
ignored : ignored ,
unignored : unignored
2024-08-09 12:04:48 +00:00
} ;
}
2024-08-21 06:34:30 +00:00
// @returns {TestResult}
2024-08-09 12:04:48 +00:00
} , {
2024-08-21 06:34:30 +00:00
key : "_test" ,
value : function _test ( originalPath , cache , checkUnignored , slices ) {
var path = originalPath
// Supports nullable path
&& checkPath . convert ( originalPath ) ;
checkPath ( path , originalPath , this . _allowRelativePaths ? RETURN _FALSE : throwError ) ;
return this . _t ( path , cache , checkUnignored , slices ) ;
2024-08-09 12:04:48 +00:00
}
} , {
2024-08-21 06:34:30 +00:00
key : "_t" ,
value : function _t ( path , cache , checkUnignored , slices ) {
if ( path in cache ) {
return cache [ path ] ;
2024-08-09 12:04:48 +00:00
}
if ( ! slices ) {
// path/to/a.js
// ['path', 'to', 'a.js']
slices = path . split ( SLASH ) ;
}
slices . pop ( ) ;
2024-08-21 06:34:30 +00:00
// If the path has no parent directory, just test it
if ( ! slices . length ) {
return cache [ path ] = this . _testOne ( path , checkUnignored ) ;
}
var parent = this . _t ( slices . join ( SLASH ) + SLASH , cache , checkUnignored , slices ) ;
// If the path contains a parent directory, check the parent first
return cache [ path ] = parent . ignored
2024-08-09 12:04:48 +00:00
// > It is not possible to re-include a file if a parent directory of
// > that file is excluded.
2024-08-21 06:34:30 +00:00
? parent : this . _testOne ( path , checkUnignored ) ;
2024-08-09 12:04:48 +00:00
}
} , {
2024-08-21 06:34:30 +00:00
key : "ignores" ,
value : function ignores ( path ) {
return this . _test ( path , this . _ignoreCache , false ) . ignored ;
}
} , {
key : "createFilter" ,
value : function createFilter ( ) {
var _this = this ;
return function ( path ) {
return ! _this . ignores ( path ) ;
} ;
}
} , {
key : "filter" ,
value : function filter ( paths ) {
return makeArray ( paths ) . filter ( this . createFilter ( ) ) ;
}
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// @returns {TestResult}
} , {
key : "test" ,
value : function test ( path ) {
return this . _test ( path , this . _testCache , true ) ;
2024-08-09 12:04:48 +00:00
}
} ] ) ;
2024-08-21 06:34:30 +00:00
return Ignore ;
2024-08-09 12:04:48 +00:00
} ( ) ;
2024-08-21 06:34:30 +00:00
var factory = function factory ( options ) {
return new Ignore ( options ) ;
} ;
var isPathValid = function isPathValid ( path ) {
return checkPath ( path && checkPath . convert ( path ) , path , RETURN _FALSE ) ;
} ;
factory . isPathValid = isPathValid ;
// Fixes typescript
factory [ "default" ] = factory ;
module . exports = factory ;
2024-08-09 12:04:48 +00:00
// Windows
// --------------------------------------------------------------
2024-08-21 06:34:30 +00:00
/* istanbul ignore if */
2024-08-09 12:04:48 +00:00
if (
// Detect `process` so that it can run in browsers.
typeof process !== 'undefined' && ( process . env && process . env . IGNORE _TEST _WIN32 || process . platform === 'win32' ) ) {
/* eslint no-control-regex: "off" */
2024-08-21 06:34:30 +00:00
var makePosix = function makePosix ( str ) {
return /^\\\\\?\\/ . test ( str ) || /[\0-\x1F"<>\|]+/ . test ( str ) ? str : str . replace ( /\\/g , '/' ) ;
2024-08-09 12:04:48 +00:00
} ;
2024-08-21 06:34:30 +00:00
checkPath . convert = makePosix ;
2024-08-09 12:04:48 +00:00
2024-08-21 06:34:30 +00:00
// 'C:\\foo' <- 'C:\\foo' has been converted to 'C:/'
// 'd:\\foo'
var REGIX _IS _WINDOWS _PATH _ABSOLUTE = /^[a-z]:\//i ;
checkPath . isNotRelative = function ( path ) {
return REGIX _IS _WINDOWS _PATH _ABSOLUTE . test ( path ) || isNotRelative ( path ) ;
2024-08-09 12:04:48 +00:00
} ;
}