Comparing version 9.2.0 to 10.0.0
'use strict'; | ||
const {promisify} = require('util'); | ||
const fs = require('fs'); | ||
@@ -6,3 +7,2 @@ const path = require('path'); | ||
const gitIgnore = require('ignore'); | ||
const pify = require('pify'); | ||
const slash = require('slash'); | ||
@@ -12,3 +12,2 @@ | ||
'**/node_modules/**', | ||
'**/bower_components/**', | ||
'**/flow-typed/**', | ||
@@ -19,3 +18,3 @@ '**/coverage/**', | ||
const readFileP = pify(fs.readFile); | ||
const readFileP = promisify(fs.readFile); | ||
@@ -36,3 +35,3 @@ const mapGitIgnorePatternTo = base => ignore => { | ||
.filter(Boolean) | ||
.filter(line => line.charAt(0) !== '#') | ||
.filter(line => !line.startsWith('#')) | ||
.map(mapGitIgnorePatternTo(base)); | ||
@@ -51,14 +50,27 @@ }; | ||
const ensureAbsolutePathForCwd = (cwd, p) => { | ||
if (path.isAbsolute(p)) { | ||
if (p.startsWith(cwd)) { | ||
return p; | ||
} | ||
throw new Error(`Path ${p} is not in cwd ${cwd}`); | ||
} | ||
return path.join(cwd, p); | ||
}; | ||
const getIsIgnoredPredecate = (ignores, cwd) => { | ||
return p => ignores.ignores(slash(path.relative(cwd, p))); | ||
return p => ignores.ignores(slash(path.relative(cwd, ensureAbsolutePathForCwd(cwd, p)))); | ||
}; | ||
const getFile = (file, cwd) => { | ||
const getFile = async (file, cwd) => { | ||
const filePath = path.join(cwd, file); | ||
return readFileP(filePath, 'utf8') | ||
.then(content => ({ | ||
content, | ||
cwd, | ||
filePath | ||
})); | ||
const content = await readFileP(filePath, 'utf8'); | ||
return { | ||
cwd, | ||
filePath, | ||
content | ||
}; | ||
}; | ||
@@ -71,24 +83,27 @@ | ||
return { | ||
content, | ||
cwd, | ||
filePath | ||
filePath, | ||
content | ||
}; | ||
}; | ||
const normalizeOptions = (options = {}) => { | ||
const ignore = options.ignore || []; | ||
const cwd = options.cwd || process.cwd(); | ||
const normalizeOptions = ({ | ||
ignore = [], | ||
cwd = process.cwd() | ||
} = {}) => { | ||
return {ignore, cwd}; | ||
}; | ||
module.exports = options => { | ||
module.exports = async options => { | ||
options = normalizeOptions(options); | ||
return fastGlob('**/.gitignore', { | ||
const paths = await fastGlob('**/.gitignore', { | ||
ignore: DEFAULT_IGNORE.concat(options.ignore), | ||
cwd: options.cwd | ||
}) | ||
.then(paths => Promise.all(paths.map(file => getFile(file, options.cwd)))) | ||
.then(files => reduceIgnore(files)) | ||
.then(ignores => getIsIgnoredPredecate(ignores, options.cwd)); | ||
}); | ||
const files = await Promise.all(paths.map(file => getFile(file, options.cwd))); | ||
const ignores = reduceIgnore(files); | ||
return getIsIgnoredPredecate(ignores, options.cwd); | ||
}; | ||
@@ -103,2 +118,3 @@ | ||
}); | ||
const files = paths.map(file => getFileSync(file, options.cwd)); | ||
@@ -105,0 +121,0 @@ const ignores = reduceIgnore(files); |
@@ -8,3 +8,3 @@ import {IOptions as NodeGlobOptions} from 'glob'; | ||
| ReadonlyArray<string> | ||
| {files: ReadonlyArray<string>; extensions: ReadonlyArray<string>}; | ||
| {files: readonly string[]; extensions: readonly string[]}; | ||
@@ -52,3 +52,3 @@ interface GlobbyOptions extends FastGlobOptions { | ||
readonly cwd?: string; | ||
readonly ignore?: ReadonlyArray<string>; | ||
readonly ignore?: readonly string[]; | ||
} | ||
@@ -63,3 +63,3 @@ | ||
@returns A `Promise` for a filter function indicating whether a given path is ignored via a `.gitignore` file. | ||
@returns A filter function indicating whether a given path is ignored via a `.gitignore` file. | ||
@@ -88,3 +88,3 @@ @example | ||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-1) in addition to the ones in this package. | ||
@returns A `Promise<Array>` of matching paths. | ||
@returns The matching paths. | ||
@@ -104,3 +104,3 @@ @example | ||
( | ||
patterns: string | ReadonlyArray<string>, | ||
patterns: string | readonly string[], | ||
options?: globby.GlobbyOptions | ||
@@ -112,6 +112,6 @@ ): Promise<string[]>; | ||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-1) in addition to the ones in this package. | ||
@returns An `Array` of matching paths. | ||
@returns The matching paths. | ||
*/ | ||
sync( | ||
patterns: string | ReadonlyArray<string>, | ||
patterns: string | readonly string[], | ||
options?: globby.GlobbyOptions | ||
@@ -121,2 +121,23 @@ ): string[]; | ||
/** | ||
@param patterns - See supported `minimatch` [patterns](https://github.com/isaacs/minimatch#usage). | ||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-1) in addition to the ones in this package. | ||
@returns The stream of matching paths. | ||
@example | ||
``` | ||
import globby = require('globby'); | ||
(async () => { | ||
for await (const path of globby.stream('*.tmp')) { | ||
console.log(path); | ||
} | ||
})(); | ||
``` | ||
*/ | ||
stream( | ||
patterns: string | readonly string[], | ||
options?: globby.GlobbyOptions | ||
): NodeJS.ReadableStream; | ||
/** | ||
Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration. | ||
@@ -126,6 +147,6 @@ | ||
@param options - See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-1) in addition to the ones in this package. | ||
@returns An `Array<Object>` in the format `{ pattern: string, options: Object }`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages. | ||
@returns Object in the format `{ pattern: string, options: Object }`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages. | ||
*/ | ||
generateGlobTasks( | ||
patterns: string | ReadonlyArray<string>, | ||
patterns: string | readonly string[], | ||
options?: globby.GlobbyOptions | ||
@@ -141,6 +162,6 @@ ): globby.GlobTask[]; | ||
@param options - See the [`node-glob` options](https://github.com/isaacs/node-glob#globhasmagicpattern-options). | ||
@returns A boolean of whether there are any special glob characters in the `patterns`. | ||
@returns Whether there are any special glob characters in the `patterns`. | ||
*/ | ||
hasMagic( | ||
patterns: string | ReadonlyArray<string>, | ||
patterns: string | readonly string[], | ||
options?: NodeGlobOptions | ||
@@ -150,7 +171,4 @@ ): boolean; | ||
readonly gitignore: Gitignore; | ||
// TODO: Remove this for the next major release | ||
default: typeof globby; | ||
}; | ||
export = globby; |
115
index.js
'use strict'; | ||
const fs = require('fs'); | ||
const arrayUnion = require('array-union'); | ||
const merge2 = require('merge2'); | ||
const glob = require('glob'); | ||
@@ -8,2 +9,3 @@ const fastGlob = require('fast-glob'); | ||
const gitignore = require('./gitignore'); | ||
const {FilterStream, UniqueStream} = require('./stream-utils'); | ||
@@ -15,3 +17,3 @@ const DEFAULT_FILTER = () => false; | ||
const assertPatternsInput = patterns => { | ||
if (!patterns.every(x => typeof x === 'string')) { | ||
if (!patterns.every(pattern => typeof pattern === 'string')) { | ||
throw new TypeError('Patterns must be a string or an array of strings'); | ||
@@ -27,2 +29,4 @@ } | ||
const getPathString = p => p.stats instanceof fs.Stats ? p.path : p; | ||
const generateGlobTasks = (patterns, taskOptions) => { | ||
@@ -35,23 +39,25 @@ patterns = arrayUnion([].concat(patterns)); | ||
taskOptions = Object.assign({ | ||
taskOptions = { | ||
ignore: [], | ||
expandDirectories: true | ||
}, taskOptions); | ||
expandDirectories: true, | ||
...taskOptions | ||
}; | ||
patterns.forEach((pattern, i) => { | ||
for (const [index, pattern] of patterns.entries()) { | ||
if (isNegative(pattern)) { | ||
return; | ||
continue; | ||
} | ||
const ignore = patterns | ||
.slice(i) | ||
.slice(index) | ||
.filter(isNegative) | ||
.map(pattern => pattern.slice(1)); | ||
const options = Object.assign({}, taskOptions, { | ||
const options = { | ||
...taskOptions, | ||
ignore: taskOptions.ignore.concat(ignore) | ||
}); | ||
}; | ||
globTasks.push({pattern, options}); | ||
}); | ||
} | ||
@@ -68,5 +74,11 @@ return globTasks; | ||
if (Array.isArray(task.options.expandDirectories)) { | ||
options = Object.assign(options, {files: task.options.expandDirectories}); | ||
options = { | ||
...options, | ||
files: task.options.expandDirectories | ||
}; | ||
} else if (typeof task.options.expandDirectories === 'object') { | ||
options = Object.assign(options, task.options.expandDirectories); | ||
options = { | ||
...options, | ||
...task.options.expandDirectories | ||
}; | ||
} | ||
@@ -79,2 +91,8 @@ | ||
const getFilterSync = options => { | ||
return options && options.gitignore ? | ||
gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : | ||
DEFAULT_FILTER; | ||
}; | ||
const globToTask = task => glob => { | ||
@@ -92,46 +110,29 @@ const {options} = task; | ||
const globby = (patterns, options) => { | ||
let globTasks; | ||
module.exports = async (patterns, options) => { | ||
const globTasks = generateGlobTasks(patterns, options); | ||
try { | ||
globTasks = generateGlobTasks(patterns, options); | ||
} catch (error) { | ||
return Promise.reject(error); | ||
} | ||
const getFilter = async () => { | ||
return options && options.gitignore ? | ||
gitignore({cwd: options.cwd, ignore: options.ignore}) : | ||
DEFAULT_FILTER; | ||
}; | ||
const getTasks = Promise.all(globTasks.map(task => Promise.resolve(getPattern(task, dirGlob)) | ||
.then(globs => Promise.all(globs.map(globToTask(task)))) | ||
)) | ||
.then(tasks => arrayUnion(...tasks)); | ||
const getTasks = async () => { | ||
const tasks = await Promise.all(globTasks.map(async task => { | ||
const globs = await getPattern(task, dirGlob); | ||
return Promise.all(globs.map(globToTask(task))); | ||
})); | ||
const getFilter = () => { | ||
return Promise.resolve( | ||
options && options.gitignore ? | ||
gitignore({cwd: options.cwd, ignore: options.ignore}) : | ||
DEFAULT_FILTER | ||
); | ||
return arrayUnion(...tasks); | ||
}; | ||
return getFilter() | ||
.then(filter => { | ||
return getTasks | ||
.then(tasks => Promise.all(tasks.map(task => fastGlob(task.pattern, task.options)))) | ||
.then(paths => arrayUnion(...paths)) | ||
.then(paths => paths.filter(p => !filter(p))); | ||
}); | ||
const [filter, tasks] = await Promise.all([getFilter(), getTasks()]); | ||
const paths = await Promise.all(tasks.map(task => fastGlob(task.pattern, task.options))); | ||
return arrayUnion(...paths).filter(path_ => !filter(getPathString(path_))); | ||
}; | ||
module.exports = globby; | ||
// TODO: Remove this for the next major release | ||
module.exports.default = globby; | ||
module.exports.sync = (patterns, options) => { | ||
const globTasks = generateGlobTasks(patterns, options); | ||
const getFilter = () => { | ||
return options && options.gitignore ? | ||
gitignore.sync({cwd: options.cwd, ignore: options.ignore}) : | ||
DEFAULT_FILTER; | ||
}; | ||
const tasks = globTasks.reduce((tasks, task) => { | ||
@@ -142,9 +143,27 @@ const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); | ||
const filter = getFilter(); | ||
const filter = getFilterSync(options); | ||
return tasks.reduce( | ||
(matches, task) => arrayUnion(matches, fastGlob.sync(task.pattern, task.options)), | ||
[] | ||
).filter(p => !filter(p)); | ||
).filter(path_ => !filter(path_)); | ||
}; | ||
module.exports.stream = (patterns, options) => { | ||
const globTasks = generateGlobTasks(patterns, options); | ||
const tasks = globTasks.reduce((tasks, task) => { | ||
const newTask = getPattern(task, dirGlob.sync).map(globToTask(task)); | ||
return tasks.concat(newTask); | ||
}, []); | ||
const filter = getFilterSync(options); | ||
const filterStream = new FilterStream(p => !filter(p)); | ||
const uniqueStream = new UniqueStream(); | ||
return merge2(tasks.map(task => fastGlob.stream(task.pattern, task.options))) | ||
.pipe(filterStream) | ||
.pipe(uniqueStream); | ||
}; | ||
module.exports.generateGlobTasks = generateGlobTasks; | ||
@@ -151,0 +170,0 @@ |
{ | ||
"name": "globby", | ||
"version": "9.2.0", | ||
"version": "10.0.0", | ||
"description": "Extends `glob` with support for multiple patterns and exposes a Promise API", | ||
@@ -13,3 +13,3 @@ "license": "MIT", | ||
"engines": { | ||
"node": ">=6" | ||
"node": ">=8" | ||
}, | ||
@@ -23,3 +23,4 @@ "scripts": { | ||
"gitignore.js", | ||
"index.d.ts" | ||
"index.d.ts", | ||
"stream-utils.js" | ||
], | ||
@@ -30,3 +31,2 @@ "keywords": [ | ||
"directories", | ||
"dirs", | ||
"expand", | ||
@@ -63,12 +63,13 @@ "files", | ||
"@types/glob": "^7.1.1", | ||
"array-union": "^1.0.2", | ||
"dir-glob": "^2.2.2", | ||
"fast-glob": "^2.2.6", | ||
"array-union": "^2.1.0", | ||
"dir-glob": "^3.0.1", | ||
"fast-glob": "^3.0.3", | ||
"glob": "^7.1.3", | ||
"ignore": "^4.0.3", | ||
"pify": "^4.0.1", | ||
"slash": "^2.0.0" | ||
"ignore": "^5.1.1", | ||
"merge2": "^1.2.3", | ||
"slash": "^3.0.0" | ||
}, | ||
"devDependencies": { | ||
"ava": "^1.4.1", | ||
"ava": "^2.1.0", | ||
"get-stream": "^5.1.0", | ||
"glob-stream": "^6.1.0", | ||
@@ -78,3 +79,3 @@ "globby": "sindresorhus/globby#master", | ||
"rimraf": "^2.6.3", | ||
"tsd": "^0.7.1", | ||
"tsd": "^0.7.3", | ||
"xo": "^0.24.0" | ||
@@ -81,0 +82,0 @@ }, |
@@ -46,9 +46,9 @@ # globby [![Build Status](https://travis-ci.org/sindresorhus/globby.svg?branch=master)](https://travis-ci.org/sindresorhus/globby) | ||
### globby(patterns, [options]) | ||
### globby(patterns, options?) | ||
Returns a `Promise<Array>` of matching paths. | ||
Returns a `Promise<string[]>` of matching paths. | ||
#### patterns | ||
Type: `string` `Array` | ||
Type: `string | string[]` | ||
@@ -59,3 +59,3 @@ See supported `minimatch` [patterns](https://github.com/isaacs/minimatch#usage). | ||
Type: `Object` | ||
Type: `object` | ||
@@ -66,8 +66,10 @@ See the [`fast-glob` options](https://github.com/mrmlnc/fast-glob#options-1) in addition to the ones below. | ||
Type: `boolean` `Array` `Object`<br> | ||
Type: `boolean | string[] | object`<br> | ||
Default: `true` | ||
If set to `true`, `globby` will automatically glob directories for you. If you define an `Array` it will only glob files that matches the patterns inside the `Array`. You can also define an `Object` with `files` and `extensions` like below: | ||
If set to `true`, `globby` will automatically glob directories for you. If you define an `Array` it will only glob files that matches the patterns inside the `Array`. You can also define an `object` with `files` and `extensions` like below: | ||
```js | ||
const globby = require('globby'); | ||
(async () => { | ||
@@ -95,13 +97,29 @@ const paths = await globby('images', { | ||
### globby.sync(patterns, [options]) | ||
### globby.sync(patterns, options?) | ||
Returns an `Array` of matching paths. | ||
Returns `string[]` of matching paths. | ||
### globby.generateGlobTasks(patterns, [options]) | ||
### globby.stream(patterns, options?) | ||
Returns an `Array<Object>` in the format `{pattern: string, options: Object}`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages. | ||
Returns a [`stream.Readable`](https://nodejs.org/api/stream.html#stream_readable_streams) of matching paths. | ||
Since Node.js 10, [readable streams are iterable](https://nodejs.org/api/stream.html#stream_readable_symbol_asynciterator), so you can loop over glob matches in a [`for await...of` loop](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of) like this: | ||
```js | ||
const globby = require('globby'); | ||
(async () => { | ||
for await (const path of globby.stream('*.tmp')) { | ||
console.log(path); | ||
} | ||
})(); | ||
``` | ||
### globby.generateGlobTasks(patterns, options?) | ||
Returns an `object[]` in the format `{pattern: string, options: Object}`, which can be passed as arguments to [`fast-glob`](https://github.com/mrmlnc/fast-glob). This is useful for other globbing-related packages. | ||
Note that you should avoid running the same tasks multiple times as they contain a file system cache. Instead, run this method each time to ensure file system changes are taken into consideration. | ||
### globby.hasMagic(patterns, [options]) | ||
### globby.hasMagic(patterns, options?) | ||
@@ -114,3 +132,3 @@ Returns a `boolean` of whether there are any special glob characters in the `patterns`. | ||
### globby.gitignore([options]) | ||
### globby.gitignore(options?) | ||
@@ -131,3 +149,3 @@ Returns a `Promise<(path: string) => boolean>` indicating whether a given path is ignored via a `.gitignore` file. | ||
### globby.gitignore.sync([options]) | ||
### globby.gitignore.sync(options?) | ||
@@ -160,4 +178,12 @@ Returns a `(path: string) => boolean` indicating whether a given path is ignored via a `.gitignore` file. | ||
## License | ||
--- | ||
MIT © [Sindre Sorhus](https://sindresorhus.com) | ||
<div align="center"> | ||
<b> | ||
<a href="https://tidelift.com/subscription/pkg/npm-globby?utm_source=npm-globby&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a> | ||
</b> | ||
<br> | ||
<sub> | ||
Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies. | ||
</sub> | ||
</div> |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
20813
7
394
183
8
+ Addedmerge2@^1.2.3
+ Added@nodelib/fs.scandir@2.1.5(transitive)
+ Added@nodelib/fs.stat@2.0.5(transitive)
+ Added@nodelib/fs.walk@1.2.8(transitive)
+ Addedarray-union@2.1.0(transitive)
+ Addedbraces@3.0.3(transitive)
+ Addeddir-glob@3.0.1(transitive)
+ Addedfast-glob@3.3.2(transitive)
+ Addedfastq@1.17.1(transitive)
+ Addedfill-range@7.1.1(transitive)
+ Addedglob-parent@5.1.2(transitive)
+ Addedignore@5.3.2(transitive)
+ Addedis-number@7.0.0(transitive)
+ Addedmicromatch@4.0.8(transitive)
+ Addedpath-type@4.0.0(transitive)
+ Addedpicomatch@2.3.1(transitive)
+ Addedqueue-microtask@1.2.3(transitive)
+ Addedreusify@1.0.4(transitive)
+ Addedrun-parallel@1.2.0(transitive)
+ Addedslash@3.0.0(transitive)
+ Addedto-regex-range@5.0.1(transitive)
- Removedpify@^4.0.1
- Removed@mrmlnc/readdir-enhanced@2.2.1(transitive)
- Removed@nodelib/fs.stat@1.1.3(transitive)
- Removedarr-diff@4.0.0(transitive)
- Removedarr-flatten@1.1.0(transitive)
- Removedarr-union@3.1.0(transitive)
- Removedarray-union@1.0.2(transitive)
- Removedarray-uniq@1.0.3(transitive)
- Removedarray-unique@0.3.2(transitive)
- Removedassign-symbols@1.0.0(transitive)
- Removedatob@2.1.2(transitive)
- Removedbase@0.11.2(transitive)
- Removedbraces@2.3.2(transitive)
- Removedcache-base@1.0.1(transitive)
- Removedcall-me-maybe@1.0.2(transitive)
- Removedclass-utils@0.3.6(transitive)
- Removedcollection-visit@1.0.0(transitive)
- Removedcomponent-emitter@1.3.1(transitive)
- Removedcopy-descriptor@0.1.1(transitive)
- Removeddebug@2.6.9(transitive)
- Removeddecode-uri-component@0.2.2(transitive)
- Removeddefine-property@0.2.51.0.02.0.2(transitive)
- Removeddir-glob@2.2.2(transitive)
- Removedexpand-brackets@2.1.4(transitive)
- Removedextend-shallow@2.0.13.0.2(transitive)
- Removedextglob@2.0.4(transitive)
- Removedfast-glob@2.2.7(transitive)
- Removedfill-range@4.0.0(transitive)
- Removedfor-in@1.0.2(transitive)
- Removedfragment-cache@0.2.1(transitive)
- Removedfunction-bind@1.1.2(transitive)
- Removedget-value@2.0.6(transitive)
- Removedglob-parent@3.1.0(transitive)
- Removedglob-to-regexp@0.3.0(transitive)
- Removedhas-value@0.3.11.0.0(transitive)
- Removedhas-values@0.1.41.0.0(transitive)
- Removedhasown@2.0.2(transitive)
- Removedignore@4.0.6(transitive)
- Removedis-accessor-descriptor@1.0.1(transitive)
- Removedis-buffer@1.1.6(transitive)
- Removedis-data-descriptor@1.0.1(transitive)
- Removedis-descriptor@0.1.71.0.3(transitive)
- Removedis-extendable@0.1.11.0.1(transitive)
- Removedis-glob@3.1.0(transitive)
- Removedis-number@3.0.0(transitive)
- Removedis-plain-object@2.0.4(transitive)
- Removedis-windows@1.0.2(transitive)
- Removedisarray@1.0.0(transitive)
- Removedisobject@2.1.03.0.1(transitive)
- Removedkind-of@3.2.24.0.06.0.3(transitive)
- Removedmap-cache@0.2.2(transitive)
- Removedmap-visit@1.0.0(transitive)
- Removedmicromatch@3.1.10(transitive)
- Removedmixin-deep@1.3.2(transitive)
- Removedms@2.0.0(transitive)
- Removednanomatch@1.2.13(transitive)
- Removedobject-copy@0.1.0(transitive)
- Removedobject-visit@1.0.1(transitive)
- Removedobject.pick@1.3.0(transitive)
- Removedpascalcase@0.1.1(transitive)
- Removedpath-dirname@1.0.2(transitive)
- Removedpath-type@3.0.0(transitive)
- Removedpify@3.0.04.0.1(transitive)
- Removedposix-character-classes@0.1.1(transitive)
- Removedregex-not@1.0.2(transitive)
- Removedrepeat-element@1.1.4(transitive)
- Removedrepeat-string@1.6.1(transitive)
- Removedresolve-url@0.2.1(transitive)
- Removedret@0.1.15(transitive)
- Removedsafe-regex@1.1.0(transitive)
- Removedset-value@2.0.1(transitive)
- Removedslash@2.0.0(transitive)
- Removedsnapdragon@0.8.2(transitive)
- Removedsnapdragon-node@2.1.1(transitive)
- Removedsnapdragon-util@3.0.1(transitive)
- Removedsource-map@0.5.7(transitive)
- Removedsource-map-resolve@0.5.3(transitive)
- Removedsource-map-url@0.4.1(transitive)
- Removedsplit-string@3.1.0(transitive)
- Removedstatic-extend@0.1.2(transitive)
- Removedto-object-path@0.3.0(transitive)
- Removedto-regex@3.0.2(transitive)
- Removedto-regex-range@2.1.1(transitive)
- Removedunion-value@1.0.1(transitive)
- Removedunset-value@1.0.0(transitive)
- Removedurix@0.1.0(transitive)
- Removeduse@3.1.1(transitive)
Updatedarray-union@^2.1.0
Updateddir-glob@^3.0.1
Updatedfast-glob@^3.0.3
Updatedignore@^5.1.1
Updatedslash@^3.0.0