From 4a80667c69355c76a572a5892b0f133c8e1f457e Mon Sep 17 00:00:00 2001 From: Paul Miller Date: Wed, 27 Mar 2019 14:05:20 +0200 Subject: [PATCH] feat: hoist regexps and strings for performance gains --- index.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index 9af5b98..cb4d2fb 100644 --- a/index.js +++ b/index.js @@ -1,18 +1,24 @@ 'use strict'; -var isglob = require('is-glob'); +var isGlob = require('is-glob'); var pathDirname = require('path-dirname'); var isWin32 = require('os').platform() === 'win32'; +var slash = '/'; +var backslash = /\\/g; +var enclosure = /[\{\[].*[\/]*.*[\}\]]$/; +var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; +var escaped = /\\([\*\?\|\[\]\(\)\{\}])/g; + module.exports = function globParent(str) { // flip windows path separators - if (isWin32 && str.indexOf('/') < 0) { - str = str.split('\\').join('/'); + if (isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); } // special case for strings ending in enclosure containing path separator - if (/[\{\[].*[\/]*.*[\}\]]$/.test(str)) { - str += '/'; + if (enclosure.test(str)) { + str += slash; } // preserves full path in case of trailing path separator @@ -21,8 +27,8 @@ module.exports = function globParent(str) { // remove path parts that are globby do { str = pathDirname.posix(str); - } while (isglob(str) || /(^|[^\\])([\{\[]|\([^\)]+$)/.test(str)); + } while (isGlob(str) || globby.test(str)); // remove escape chars and return result - return str.replace(/\\([\*\?\|\[\]\(\)\{\}])/g, '$1'); + return str.replace(escaped, '$1'); };