dragonfly_chrome_headless 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +12 -0
- data/Gemfile +4 -0
- data/README.md +53 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/dragonfly_chrome_headless.gemspec +27 -0
- data/lib/dragonfly_chrome_headless.rb +9 -0
- data/lib/dragonfly_chrome_headless/plugin.rb +17 -0
- data/lib/dragonfly_chrome_headless/processors/rasterize.rb +33 -0
- data/lib/dragonfly_chrome_headless/version.rb +3 -0
- data/node_modules/.bin/chrome-remote-interface +1 -0
- data/node_modules/.bin/mkdirp +1 -0
- data/node_modules/.bin/rimraf +1 -0
- data/node_modules/@types/core-js/LICENSE +21 -0
- data/node_modules/@types/core-js/README.md +16 -0
- data/node_modules/@types/core-js/index.d.ts +2452 -0
- data/node_modules/@types/core-js/package.json +85 -0
- data/node_modules/@types/mkdirp/README.md +18 -0
- data/node_modules/@types/mkdirp/index.d.ts +14 -0
- data/node_modules/@types/mkdirp/package.json +77 -0
- data/node_modules/@types/mkdirp/types-metadata.json +25 -0
- data/node_modules/@types/node/README.md +16 -0
- data/node_modules/@types/node/index.d.ts +4132 -0
- data/node_modules/@types/node/package.json +84 -0
- data/node_modules/balanced-match/.npmignore +5 -0
- data/node_modules/balanced-match/LICENSE.md +21 -0
- data/node_modules/balanced-match/README.md +91 -0
- data/node_modules/balanced-match/index.js +59 -0
- data/node_modules/balanced-match/package.json +112 -0
- data/node_modules/brace-expansion/README.md +123 -0
- data/node_modules/brace-expansion/index.js +201 -0
- data/node_modules/brace-expansion/package.json +114 -0
- data/node_modules/chrome-launcher/.clang-format +6 -0
- data/node_modules/chrome-launcher/.npmignore +11 -0
- data/node_modules/chrome-launcher/README.md +123 -0
- data/node_modules/chrome-launcher/ask.js +32 -0
- data/node_modules/chrome-launcher/ask.ts +35 -0
- data/node_modules/chrome-launcher/chrome-finder.js +157 -0
- data/node_modules/chrome-launcher/chrome-finder.ts +186 -0
- data/node_modules/chrome-launcher/chrome-launcher.js +245 -0
- data/node_modules/chrome-launcher/chrome-launcher.ts +312 -0
- data/node_modules/chrome-launcher/compiled-check.js +14 -0
- data/node_modules/chrome-launcher/flags.js +27 -0
- data/node_modules/chrome-launcher/flags.ts +26 -0
- data/node_modules/chrome-launcher/index.js +7 -0
- data/node_modules/chrome-launcher/index.ts +1 -0
- data/node_modules/chrome-launcher/manual-chrome-launcher.js +30 -0
- data/node_modules/chrome-launcher/package.json +116 -0
- data/node_modules/chrome-launcher/random-port.js +24 -0
- data/node_modules/chrome-launcher/random-port.ts +23 -0
- data/node_modules/chrome-launcher/tsconfig.json +19 -0
- data/node_modules/chrome-launcher/utils.js +52 -0
- data/node_modules/chrome-launcher/utils.ts +44 -0
- data/node_modules/chrome-launcher/yarn.lock +1486 -0
- data/node_modules/chrome-remote-interface/LICENSE +18 -0
- data/node_modules/chrome-remote-interface/README.md +849 -0
- data/node_modules/chrome-remote-interface/bin/client.js +337 -0
- data/node_modules/chrome-remote-interface/chrome-remote-interface.js +11 -0
- data/node_modules/chrome-remote-interface/index.js +39 -0
- data/node_modules/chrome-remote-interface/lib/api.js +84 -0
- data/node_modules/chrome-remote-interface/lib/chrome.js +307 -0
- data/node_modules/chrome-remote-interface/lib/defaults.js +4 -0
- data/node_modules/chrome-remote-interface/lib/devtools.js +245 -0
- data/node_modules/chrome-remote-interface/lib/external-request.js +28 -0
- data/node_modules/chrome-remote-interface/lib/protocol.json +13780 -0
- data/node_modules/chrome-remote-interface/lib/websocket-wrapper.js +32 -0
- data/node_modules/chrome-remote-interface/package.json +128 -0
- data/node_modules/chrome-remote-interface/webpack.config.js +55 -0
- data/node_modules/commander/Readme.md +195 -0
- data/node_modules/commander/index.js +851 -0
- data/node_modules/commander/package.json +92 -0
- data/node_modules/concat-map/.travis.yml +4 -0
- data/node_modules/concat-map/LICENSE +18 -0
- data/node_modules/concat-map/README.markdown +62 -0
- data/node_modules/concat-map/example/map.js +6 -0
- data/node_modules/concat-map/index.js +13 -0
- data/node_modules/concat-map/package.json +117 -0
- data/node_modules/concat-map/test/map.js +39 -0
- data/node_modules/debug/.coveralls.yml +1 -0
- data/node_modules/debug/.eslintrc +11 -0
- data/node_modules/debug/.npmignore +9 -0
- data/node_modules/debug/.travis.yml +14 -0
- data/node_modules/debug/CHANGELOG.md +357 -0
- data/node_modules/debug/LICENSE +19 -0
- data/node_modules/debug/Makefile +50 -0
- data/node_modules/debug/Readme.md +312 -0
- data/node_modules/debug/component.json +19 -0
- data/node_modules/debug/karma.conf.js +70 -0
- data/node_modules/debug/node.js +1 -0
- data/node_modules/debug/package.json +124 -0
- data/node_modules/debug/src/browser.js +185 -0
- data/node_modules/debug/src/debug.js +202 -0
- data/node_modules/debug/src/index.js +10 -0
- data/node_modules/debug/src/node.js +246 -0
- data/node_modules/fs.realpath/LICENSE +43 -0
- data/node_modules/fs.realpath/README.md +33 -0
- data/node_modules/fs.realpath/index.js +66 -0
- data/node_modules/fs.realpath/old.js +303 -0
- data/node_modules/fs.realpath/package.json +94 -0
- data/node_modules/glob/LICENSE +15 -0
- data/node_modules/glob/README.md +368 -0
- data/node_modules/glob/changelog.md +67 -0
- data/node_modules/glob/common.js +240 -0
- data/node_modules/glob/glob.js +790 -0
- data/node_modules/glob/package.json +112 -0
- data/node_modules/glob/sync.js +486 -0
- data/node_modules/html-pdf-chrome/.npmignore +9 -0
- data/node_modules/html-pdf-chrome/LICENSE +21 -0
- data/node_modules/html-pdf-chrome/README.md +165 -0
- data/node_modules/html-pdf-chrome/lib/src/ChromePrintOptions.d.ts +87 -0
- data/node_modules/html-pdf-chrome/lib/src/ChromePrintOptions.js +4 -0
- data/node_modules/html-pdf-chrome/lib/src/ChromePrintOptions.js.map +1 -0
- data/node_modules/html-pdf-chrome/lib/src/CompletionTrigger.d.ts +120 -0
- data/node_modules/html-pdf-chrome/lib/src/CompletionTrigger.js +206 -0
- data/node_modules/html-pdf-chrome/lib/src/CompletionTrigger.js.map +1 -0
- data/node_modules/html-pdf-chrome/lib/src/CreateResult.d.ts +70 -0
- data/node_modules/html-pdf-chrome/lib/src/CreateResult.js +98 -0
- data/node_modules/html-pdf-chrome/lib/src/CreateResult.js.map +1 -0
- data/node_modules/html-pdf-chrome/lib/src/index.d.ts +72 -0
- data/node_modules/html-pdf-chrome/lib/src/index.js +123 -0
- data/node_modules/html-pdf-chrome/lib/src/index.js.map +1 -0
- data/node_modules/html-pdf-chrome/package.json +133 -0
- data/node_modules/html-pdf-chrome/src/ChromePrintOptions.ts +99 -0
- data/node_modules/html-pdf-chrome/src/CompletionTrigger.ts +201 -0
- data/node_modules/html-pdf-chrome/src/CreateResult.ts +100 -0
- data/node_modules/html-pdf-chrome/src/index.ts +179 -0
- data/node_modules/inflight/LICENSE +15 -0
- data/node_modules/inflight/README.md +37 -0
- data/node_modules/inflight/inflight.js +54 -0
- data/node_modules/inflight/package.json +105 -0
- data/node_modules/inherits/LICENSE +16 -0
- data/node_modules/inherits/README.md +42 -0
- data/node_modules/inherits/inherits.js +7 -0
- data/node_modules/inherits/inherits_browser.js +23 -0
- data/node_modules/inherits/package.json +97 -0
- data/node_modules/lighthouse-logger/README.md +4 -0
- data/node_modules/lighthouse-logger/index.js +212 -0
- data/node_modules/lighthouse-logger/package.json +69 -0
- data/node_modules/lighthouse-logger/yarn.lock +13 -0
- data/node_modules/minimatch/LICENSE +15 -0
- data/node_modules/minimatch/README.md +209 -0
- data/node_modules/minimatch/minimatch.js +923 -0
- data/node_modules/minimatch/package.json +99 -0
- data/node_modules/minimist/.travis.yml +4 -0
- data/node_modules/minimist/LICENSE +18 -0
- data/node_modules/minimist/example/parse.js +2 -0
- data/node_modules/minimist/index.js +187 -0
- data/node_modules/minimist/package.json +101 -0
- data/node_modules/minimist/readme.markdown +73 -0
- data/node_modules/minimist/test/dash.js +24 -0
- data/node_modules/minimist/test/default_bool.js +20 -0
- data/node_modules/minimist/test/dotted.js +16 -0
- data/node_modules/minimist/test/long.js +31 -0
- data/node_modules/minimist/test/parse.js +318 -0
- data/node_modules/minimist/test/parse_modified.js +9 -0
- data/node_modules/minimist/test/short.js +67 -0
- data/node_modules/minimist/test/whitespace.js +8 -0
- data/node_modules/mkdirp/.travis.yml +8 -0
- data/node_modules/mkdirp/LICENSE +21 -0
- data/node_modules/mkdirp/bin/cmd.js +33 -0
- data/node_modules/mkdirp/bin/usage.txt +12 -0
- data/node_modules/mkdirp/examples/pow.js +6 -0
- data/node_modules/mkdirp/index.js +98 -0
- data/node_modules/mkdirp/package.json +93 -0
- data/node_modules/mkdirp/readme.markdown +100 -0
- data/node_modules/mkdirp/test/chmod.js +41 -0
- data/node_modules/mkdirp/test/clobber.js +38 -0
- data/node_modules/mkdirp/test/mkdirp.js +28 -0
- data/node_modules/mkdirp/test/opts_fs.js +29 -0
- data/node_modules/mkdirp/test/opts_fs_sync.js +27 -0
- data/node_modules/mkdirp/test/perm.js +32 -0
- data/node_modules/mkdirp/test/perm_sync.js +36 -0
- data/node_modules/mkdirp/test/race.js +37 -0
- data/node_modules/mkdirp/test/rel.js +32 -0
- data/node_modules/mkdirp/test/return.js +25 -0
- data/node_modules/mkdirp/test/return_sync.js +24 -0
- data/node_modules/mkdirp/test/root.js +19 -0
- data/node_modules/mkdirp/test/sync.js +32 -0
- data/node_modules/mkdirp/test/umask.js +28 -0
- data/node_modules/mkdirp/test/umask_sync.js +32 -0
- data/node_modules/ms/README.md +51 -0
- data/node_modules/ms/index.js +152 -0
- data/node_modules/ms/license.md +21 -0
- data/node_modules/ms/package.json +109 -0
- data/node_modules/once/LICENSE +15 -0
- data/node_modules/once/README.md +79 -0
- data/node_modules/once/once.js +42 -0
- data/node_modules/once/package.json +101 -0
- data/node_modules/path-is-absolute/index.js +20 -0
- data/node_modules/path-is-absolute/license +21 -0
- data/node_modules/path-is-absolute/package.json +111 -0
- data/node_modules/path-is-absolute/readme.md +59 -0
- data/node_modules/rimraf/LICENSE +15 -0
- data/node_modules/rimraf/README.md +101 -0
- data/node_modules/rimraf/bin.js +50 -0
- data/node_modules/rimraf/package.json +99 -0
- data/node_modules/rimraf/rimraf.js +363 -0
- data/node_modules/ultron/LICENSE +22 -0
- data/node_modules/ultron/index.js +138 -0
- data/node_modules/ultron/package.json +112 -0
- data/node_modules/wrappy/LICENSE +15 -0
- data/node_modules/wrappy/README.md +36 -0
- data/node_modules/wrappy/package.json +97 -0
- data/node_modules/wrappy/wrappy.js +33 -0
- data/node_modules/ws/LICENSE +21 -0
- data/node_modules/ws/README.md +259 -0
- data/node_modules/ws/SECURITY.md +33 -0
- data/node_modules/ws/index.js +15 -0
- data/node_modules/ws/lib/BufferUtil.fallback.js +56 -0
- data/node_modules/ws/lib/BufferUtil.js +15 -0
- data/node_modules/ws/lib/ErrorCodes.js +28 -0
- data/node_modules/ws/lib/EventTarget.js +158 -0
- data/node_modules/ws/lib/Extensions.js +69 -0
- data/node_modules/ws/lib/PerMessageDeflate.js +339 -0
- data/node_modules/ws/lib/Receiver.js +520 -0
- data/node_modules/ws/lib/Sender.js +438 -0
- data/node_modules/ws/lib/Validation.fallback.js +9 -0
- data/node_modules/ws/lib/Validation.js +17 -0
- data/node_modules/ws/lib/WebSocket.js +705 -0
- data/node_modules/ws/lib/WebSocketServer.js +336 -0
- data/node_modules/ws/package.json +122 -0
- data/package.json +26 -0
- data/samples/sample.html +13 -0
- data/script/rasterize.js +18 -0
- metadata +325 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
## 7.0
|
|
2
|
+
|
|
3
|
+
- Raise error if `options.cwd` is specified, and not a directory
|
|
4
|
+
|
|
5
|
+
## 6.0
|
|
6
|
+
|
|
7
|
+
- Remove comment and negation pattern support
|
|
8
|
+
- Ignore patterns are always in `dot:true` mode
|
|
9
|
+
|
|
10
|
+
## 5.0
|
|
11
|
+
|
|
12
|
+
- Deprecate comment and negation patterns
|
|
13
|
+
- Fix regression in `mark` and `nodir` options from making all cache
|
|
14
|
+
keys absolute path.
|
|
15
|
+
- Abort if `fs.readdir` returns an error that's unexpected
|
|
16
|
+
- Don't emit `match` events for ignored items
|
|
17
|
+
- Treat ENOTSUP like ENOTDIR in readdir
|
|
18
|
+
|
|
19
|
+
## 4.5
|
|
20
|
+
|
|
21
|
+
- Add `options.follow` to always follow directory symlinks in globstar
|
|
22
|
+
- Add `options.realpath` to call `fs.realpath` on all results
|
|
23
|
+
- Always cache based on absolute path
|
|
24
|
+
|
|
25
|
+
## 4.4
|
|
26
|
+
|
|
27
|
+
- Add `options.ignore`
|
|
28
|
+
- Fix handling of broken symlinks
|
|
29
|
+
|
|
30
|
+
## 4.3
|
|
31
|
+
|
|
32
|
+
- Bump minimatch to 2.x
|
|
33
|
+
- Pass all tests on Windows
|
|
34
|
+
|
|
35
|
+
## 4.2
|
|
36
|
+
|
|
37
|
+
- Add `glob.hasMagic` function
|
|
38
|
+
- Add `options.nodir` flag
|
|
39
|
+
|
|
40
|
+
## 4.1
|
|
41
|
+
|
|
42
|
+
- Refactor sync and async implementations for performance
|
|
43
|
+
- Throw if callback provided to sync glob function
|
|
44
|
+
- Treat symbolic links in globstar results the same as Bash 4.3
|
|
45
|
+
|
|
46
|
+
## 4.0
|
|
47
|
+
|
|
48
|
+
- Use `^` for dependency versions (bumped major because this breaks
|
|
49
|
+
older npm versions)
|
|
50
|
+
- Ensure callbacks are only ever called once
|
|
51
|
+
- switch to ISC license
|
|
52
|
+
|
|
53
|
+
## 3.x
|
|
54
|
+
|
|
55
|
+
- Rewrite in JavaScript
|
|
56
|
+
- Add support for setting root, cwd, and windows support
|
|
57
|
+
- Cache many fs calls
|
|
58
|
+
- Add globstar support
|
|
59
|
+
- emit match events
|
|
60
|
+
|
|
61
|
+
## 2.x
|
|
62
|
+
|
|
63
|
+
- Use `glob.h` and `fnmatch.h` from NetBSD
|
|
64
|
+
|
|
65
|
+
## 1.x
|
|
66
|
+
|
|
67
|
+
- `glob.h` static binding.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
exports.alphasort = alphasort
|
|
2
|
+
exports.alphasorti = alphasorti
|
|
3
|
+
exports.setopts = setopts
|
|
4
|
+
exports.ownProp = ownProp
|
|
5
|
+
exports.makeAbs = makeAbs
|
|
6
|
+
exports.finish = finish
|
|
7
|
+
exports.mark = mark
|
|
8
|
+
exports.isIgnored = isIgnored
|
|
9
|
+
exports.childrenIgnored = childrenIgnored
|
|
10
|
+
|
|
11
|
+
function ownProp (obj, field) {
|
|
12
|
+
return Object.prototype.hasOwnProperty.call(obj, field)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
var path = require("path")
|
|
16
|
+
var minimatch = require("minimatch")
|
|
17
|
+
var isAbsolute = require("path-is-absolute")
|
|
18
|
+
var Minimatch = minimatch.Minimatch
|
|
19
|
+
|
|
20
|
+
function alphasorti (a, b) {
|
|
21
|
+
return a.toLowerCase().localeCompare(b.toLowerCase())
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function alphasort (a, b) {
|
|
25
|
+
return a.localeCompare(b)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function setupIgnores (self, options) {
|
|
29
|
+
self.ignore = options.ignore || []
|
|
30
|
+
|
|
31
|
+
if (!Array.isArray(self.ignore))
|
|
32
|
+
self.ignore = [self.ignore]
|
|
33
|
+
|
|
34
|
+
if (self.ignore.length) {
|
|
35
|
+
self.ignore = self.ignore.map(ignoreMap)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// ignore patterns are always in dot:true mode.
|
|
40
|
+
function ignoreMap (pattern) {
|
|
41
|
+
var gmatcher = null
|
|
42
|
+
if (pattern.slice(-3) === '/**') {
|
|
43
|
+
var gpattern = pattern.replace(/(\/\*\*)+$/, '')
|
|
44
|
+
gmatcher = new Minimatch(gpattern, { dot: true })
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
matcher: new Minimatch(pattern, { dot: true }),
|
|
49
|
+
gmatcher: gmatcher
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function setopts (self, pattern, options) {
|
|
54
|
+
if (!options)
|
|
55
|
+
options = {}
|
|
56
|
+
|
|
57
|
+
// base-matching: just use globstar for that.
|
|
58
|
+
if (options.matchBase && -1 === pattern.indexOf("/")) {
|
|
59
|
+
if (options.noglobstar) {
|
|
60
|
+
throw new Error("base matching requires globstar")
|
|
61
|
+
}
|
|
62
|
+
pattern = "**/" + pattern
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
self.silent = !!options.silent
|
|
66
|
+
self.pattern = pattern
|
|
67
|
+
self.strict = options.strict !== false
|
|
68
|
+
self.realpath = !!options.realpath
|
|
69
|
+
self.realpathCache = options.realpathCache || Object.create(null)
|
|
70
|
+
self.follow = !!options.follow
|
|
71
|
+
self.dot = !!options.dot
|
|
72
|
+
self.mark = !!options.mark
|
|
73
|
+
self.nodir = !!options.nodir
|
|
74
|
+
if (self.nodir)
|
|
75
|
+
self.mark = true
|
|
76
|
+
self.sync = !!options.sync
|
|
77
|
+
self.nounique = !!options.nounique
|
|
78
|
+
self.nonull = !!options.nonull
|
|
79
|
+
self.nosort = !!options.nosort
|
|
80
|
+
self.nocase = !!options.nocase
|
|
81
|
+
self.stat = !!options.stat
|
|
82
|
+
self.noprocess = !!options.noprocess
|
|
83
|
+
self.absolute = !!options.absolute
|
|
84
|
+
|
|
85
|
+
self.maxLength = options.maxLength || Infinity
|
|
86
|
+
self.cache = options.cache || Object.create(null)
|
|
87
|
+
self.statCache = options.statCache || Object.create(null)
|
|
88
|
+
self.symlinks = options.symlinks || Object.create(null)
|
|
89
|
+
|
|
90
|
+
setupIgnores(self, options)
|
|
91
|
+
|
|
92
|
+
self.changedCwd = false
|
|
93
|
+
var cwd = process.cwd()
|
|
94
|
+
if (!ownProp(options, "cwd"))
|
|
95
|
+
self.cwd = cwd
|
|
96
|
+
else {
|
|
97
|
+
self.cwd = path.resolve(options.cwd)
|
|
98
|
+
self.changedCwd = self.cwd !== cwd
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
self.root = options.root || path.resolve(self.cwd, "/")
|
|
102
|
+
self.root = path.resolve(self.root)
|
|
103
|
+
if (process.platform === "win32")
|
|
104
|
+
self.root = self.root.replace(/\\/g, "/")
|
|
105
|
+
|
|
106
|
+
// TODO: is an absolute `cwd` supposed to be resolved against `root`?
|
|
107
|
+
// e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')
|
|
108
|
+
self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)
|
|
109
|
+
if (process.platform === "win32")
|
|
110
|
+
self.cwdAbs = self.cwdAbs.replace(/\\/g, "/")
|
|
111
|
+
self.nomount = !!options.nomount
|
|
112
|
+
|
|
113
|
+
// disable comments and negation in Minimatch.
|
|
114
|
+
// Note that they are not supported in Glob itself anyway.
|
|
115
|
+
options.nonegate = true
|
|
116
|
+
options.nocomment = true
|
|
117
|
+
|
|
118
|
+
self.minimatch = new Minimatch(pattern, options)
|
|
119
|
+
self.options = self.minimatch.options
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function finish (self) {
|
|
123
|
+
var nou = self.nounique
|
|
124
|
+
var all = nou ? [] : Object.create(null)
|
|
125
|
+
|
|
126
|
+
for (var i = 0, l = self.matches.length; i < l; i ++) {
|
|
127
|
+
var matches = self.matches[i]
|
|
128
|
+
if (!matches || Object.keys(matches).length === 0) {
|
|
129
|
+
if (self.nonull) {
|
|
130
|
+
// do like the shell, and spit out the literal glob
|
|
131
|
+
var literal = self.minimatch.globSet[i]
|
|
132
|
+
if (nou)
|
|
133
|
+
all.push(literal)
|
|
134
|
+
else
|
|
135
|
+
all[literal] = true
|
|
136
|
+
}
|
|
137
|
+
} else {
|
|
138
|
+
// had matches
|
|
139
|
+
var m = Object.keys(matches)
|
|
140
|
+
if (nou)
|
|
141
|
+
all.push.apply(all, m)
|
|
142
|
+
else
|
|
143
|
+
m.forEach(function (m) {
|
|
144
|
+
all[m] = true
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (!nou)
|
|
150
|
+
all = Object.keys(all)
|
|
151
|
+
|
|
152
|
+
if (!self.nosort)
|
|
153
|
+
all = all.sort(self.nocase ? alphasorti : alphasort)
|
|
154
|
+
|
|
155
|
+
// at *some* point we statted all of these
|
|
156
|
+
if (self.mark) {
|
|
157
|
+
for (var i = 0; i < all.length; i++) {
|
|
158
|
+
all[i] = self._mark(all[i])
|
|
159
|
+
}
|
|
160
|
+
if (self.nodir) {
|
|
161
|
+
all = all.filter(function (e) {
|
|
162
|
+
var notDir = !(/\/$/.test(e))
|
|
163
|
+
var c = self.cache[e] || self.cache[makeAbs(self, e)]
|
|
164
|
+
if (notDir && c)
|
|
165
|
+
notDir = c !== 'DIR' && !Array.isArray(c)
|
|
166
|
+
return notDir
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (self.ignore.length)
|
|
172
|
+
all = all.filter(function(m) {
|
|
173
|
+
return !isIgnored(self, m)
|
|
174
|
+
})
|
|
175
|
+
|
|
176
|
+
self.found = all
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function mark (self, p) {
|
|
180
|
+
var abs = makeAbs(self, p)
|
|
181
|
+
var c = self.cache[abs]
|
|
182
|
+
var m = p
|
|
183
|
+
if (c) {
|
|
184
|
+
var isDir = c === 'DIR' || Array.isArray(c)
|
|
185
|
+
var slash = p.slice(-1) === '/'
|
|
186
|
+
|
|
187
|
+
if (isDir && !slash)
|
|
188
|
+
m += '/'
|
|
189
|
+
else if (!isDir && slash)
|
|
190
|
+
m = m.slice(0, -1)
|
|
191
|
+
|
|
192
|
+
if (m !== p) {
|
|
193
|
+
var mabs = makeAbs(self, m)
|
|
194
|
+
self.statCache[mabs] = self.statCache[abs]
|
|
195
|
+
self.cache[mabs] = self.cache[abs]
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return m
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// lotta situps...
|
|
203
|
+
function makeAbs (self, f) {
|
|
204
|
+
var abs = f
|
|
205
|
+
if (f.charAt(0) === '/') {
|
|
206
|
+
abs = path.join(self.root, f)
|
|
207
|
+
} else if (isAbsolute(f) || f === '') {
|
|
208
|
+
abs = f
|
|
209
|
+
} else if (self.changedCwd) {
|
|
210
|
+
abs = path.resolve(self.cwd, f)
|
|
211
|
+
} else {
|
|
212
|
+
abs = path.resolve(f)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (process.platform === 'win32')
|
|
216
|
+
abs = abs.replace(/\\/g, '/')
|
|
217
|
+
|
|
218
|
+
return abs
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
|
|
223
|
+
// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
|
|
224
|
+
function isIgnored (self, path) {
|
|
225
|
+
if (!self.ignore.length)
|
|
226
|
+
return false
|
|
227
|
+
|
|
228
|
+
return self.ignore.some(function(item) {
|
|
229
|
+
return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
|
|
230
|
+
})
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function childrenIgnored (self, path) {
|
|
234
|
+
if (!self.ignore.length)
|
|
235
|
+
return false
|
|
236
|
+
|
|
237
|
+
return self.ignore.some(function(item) {
|
|
238
|
+
return !!(item.gmatcher && item.gmatcher.match(path))
|
|
239
|
+
})
|
|
240
|
+
}
|
|
@@ -0,0 +1,790 @@
|
|
|
1
|
+
// Approach:
|
|
2
|
+
//
|
|
3
|
+
// 1. Get the minimatch set
|
|
4
|
+
// 2. For each pattern in the set, PROCESS(pattern, false)
|
|
5
|
+
// 3. Store matches per-set, then uniq them
|
|
6
|
+
//
|
|
7
|
+
// PROCESS(pattern, inGlobStar)
|
|
8
|
+
// Get the first [n] items from pattern that are all strings
|
|
9
|
+
// Join these together. This is PREFIX.
|
|
10
|
+
// If there is no more remaining, then stat(PREFIX) and
|
|
11
|
+
// add to matches if it succeeds. END.
|
|
12
|
+
//
|
|
13
|
+
// If inGlobStar and PREFIX is symlink and points to dir
|
|
14
|
+
// set ENTRIES = []
|
|
15
|
+
// else readdir(PREFIX) as ENTRIES
|
|
16
|
+
// If fail, END
|
|
17
|
+
//
|
|
18
|
+
// with ENTRIES
|
|
19
|
+
// If pattern[n] is GLOBSTAR
|
|
20
|
+
// // handle the case where the globstar match is empty
|
|
21
|
+
// // by pruning it out, and testing the resulting pattern
|
|
22
|
+
// PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
|
|
23
|
+
// // handle other cases.
|
|
24
|
+
// for ENTRY in ENTRIES (not dotfiles)
|
|
25
|
+
// // attach globstar + tail onto the entry
|
|
26
|
+
// // Mark that this entry is a globstar match
|
|
27
|
+
// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
|
|
28
|
+
//
|
|
29
|
+
// else // not globstar
|
|
30
|
+
// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
|
|
31
|
+
// Test ENTRY against pattern[n]
|
|
32
|
+
// If fails, continue
|
|
33
|
+
// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
|
|
34
|
+
//
|
|
35
|
+
// Caveat:
|
|
36
|
+
// Cache all stats and readdirs results to minimize syscall. Since all
|
|
37
|
+
// we ever care about is existence and directory-ness, we can just keep
|
|
38
|
+
// `true` for files, and [children,...] for directories, or `false` for
|
|
39
|
+
// things that don't exist.
|
|
40
|
+
|
|
41
|
+
module.exports = glob
|
|
42
|
+
|
|
43
|
+
var fs = require('fs')
|
|
44
|
+
var rp = require('fs.realpath')
|
|
45
|
+
var minimatch = require('minimatch')
|
|
46
|
+
var Minimatch = minimatch.Minimatch
|
|
47
|
+
var inherits = require('inherits')
|
|
48
|
+
var EE = require('events').EventEmitter
|
|
49
|
+
var path = require('path')
|
|
50
|
+
var assert = require('assert')
|
|
51
|
+
var isAbsolute = require('path-is-absolute')
|
|
52
|
+
var globSync = require('./sync.js')
|
|
53
|
+
var common = require('./common.js')
|
|
54
|
+
var alphasort = common.alphasort
|
|
55
|
+
var alphasorti = common.alphasorti
|
|
56
|
+
var setopts = common.setopts
|
|
57
|
+
var ownProp = common.ownProp
|
|
58
|
+
var inflight = require('inflight')
|
|
59
|
+
var util = require('util')
|
|
60
|
+
var childrenIgnored = common.childrenIgnored
|
|
61
|
+
var isIgnored = common.isIgnored
|
|
62
|
+
|
|
63
|
+
var once = require('once')
|
|
64
|
+
|
|
65
|
+
function glob (pattern, options, cb) {
|
|
66
|
+
if (typeof options === 'function') cb = options, options = {}
|
|
67
|
+
if (!options) options = {}
|
|
68
|
+
|
|
69
|
+
if (options.sync) {
|
|
70
|
+
if (cb)
|
|
71
|
+
throw new TypeError('callback provided to sync glob')
|
|
72
|
+
return globSync(pattern, options)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return new Glob(pattern, options, cb)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
glob.sync = globSync
|
|
79
|
+
var GlobSync = glob.GlobSync = globSync.GlobSync
|
|
80
|
+
|
|
81
|
+
// old api surface
|
|
82
|
+
glob.glob = glob
|
|
83
|
+
|
|
84
|
+
function extend (origin, add) {
|
|
85
|
+
if (add === null || typeof add !== 'object') {
|
|
86
|
+
return origin
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
var keys = Object.keys(add)
|
|
90
|
+
var i = keys.length
|
|
91
|
+
while (i--) {
|
|
92
|
+
origin[keys[i]] = add[keys[i]]
|
|
93
|
+
}
|
|
94
|
+
return origin
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
glob.hasMagic = function (pattern, options_) {
|
|
98
|
+
var options = extend({}, options_)
|
|
99
|
+
options.noprocess = true
|
|
100
|
+
|
|
101
|
+
var g = new Glob(pattern, options)
|
|
102
|
+
var set = g.minimatch.set
|
|
103
|
+
|
|
104
|
+
if (!pattern)
|
|
105
|
+
return false
|
|
106
|
+
|
|
107
|
+
if (set.length > 1)
|
|
108
|
+
return true
|
|
109
|
+
|
|
110
|
+
for (var j = 0; j < set[0].length; j++) {
|
|
111
|
+
if (typeof set[0][j] !== 'string')
|
|
112
|
+
return true
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
return false
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
glob.Glob = Glob
|
|
119
|
+
inherits(Glob, EE)
|
|
120
|
+
function Glob (pattern, options, cb) {
|
|
121
|
+
if (typeof options === 'function') {
|
|
122
|
+
cb = options
|
|
123
|
+
options = null
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (options && options.sync) {
|
|
127
|
+
if (cb)
|
|
128
|
+
throw new TypeError('callback provided to sync glob')
|
|
129
|
+
return new GlobSync(pattern, options)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (!(this instanceof Glob))
|
|
133
|
+
return new Glob(pattern, options, cb)
|
|
134
|
+
|
|
135
|
+
setopts(this, pattern, options)
|
|
136
|
+
this._didRealPath = false
|
|
137
|
+
|
|
138
|
+
// process each pattern in the minimatch set
|
|
139
|
+
var n = this.minimatch.set.length
|
|
140
|
+
|
|
141
|
+
// The matches are stored as {<filename>: true,...} so that
|
|
142
|
+
// duplicates are automagically pruned.
|
|
143
|
+
// Later, we do an Object.keys() on these.
|
|
144
|
+
// Keep them as a list so we can fill in when nonull is set.
|
|
145
|
+
this.matches = new Array(n)
|
|
146
|
+
|
|
147
|
+
if (typeof cb === 'function') {
|
|
148
|
+
cb = once(cb)
|
|
149
|
+
this.on('error', cb)
|
|
150
|
+
this.on('end', function (matches) {
|
|
151
|
+
cb(null, matches)
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
var self = this
|
|
156
|
+
this._processing = 0
|
|
157
|
+
|
|
158
|
+
this._emitQueue = []
|
|
159
|
+
this._processQueue = []
|
|
160
|
+
this.paused = false
|
|
161
|
+
|
|
162
|
+
if (this.noprocess)
|
|
163
|
+
return this
|
|
164
|
+
|
|
165
|
+
if (n === 0)
|
|
166
|
+
return done()
|
|
167
|
+
|
|
168
|
+
var sync = true
|
|
169
|
+
for (var i = 0; i < n; i ++) {
|
|
170
|
+
this._process(this.minimatch.set[i], i, false, done)
|
|
171
|
+
}
|
|
172
|
+
sync = false
|
|
173
|
+
|
|
174
|
+
function done () {
|
|
175
|
+
--self._processing
|
|
176
|
+
if (self._processing <= 0) {
|
|
177
|
+
if (sync) {
|
|
178
|
+
process.nextTick(function () {
|
|
179
|
+
self._finish()
|
|
180
|
+
})
|
|
181
|
+
} else {
|
|
182
|
+
self._finish()
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
Glob.prototype._finish = function () {
|
|
189
|
+
assert(this instanceof Glob)
|
|
190
|
+
if (this.aborted)
|
|
191
|
+
return
|
|
192
|
+
|
|
193
|
+
if (this.realpath && !this._didRealpath)
|
|
194
|
+
return this._realpath()
|
|
195
|
+
|
|
196
|
+
common.finish(this)
|
|
197
|
+
this.emit('end', this.found)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
Glob.prototype._realpath = function () {
|
|
201
|
+
if (this._didRealpath)
|
|
202
|
+
return
|
|
203
|
+
|
|
204
|
+
this._didRealpath = true
|
|
205
|
+
|
|
206
|
+
var n = this.matches.length
|
|
207
|
+
if (n === 0)
|
|
208
|
+
return this._finish()
|
|
209
|
+
|
|
210
|
+
var self = this
|
|
211
|
+
for (var i = 0; i < this.matches.length; i++)
|
|
212
|
+
this._realpathSet(i, next)
|
|
213
|
+
|
|
214
|
+
function next () {
|
|
215
|
+
if (--n === 0)
|
|
216
|
+
self._finish()
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
Glob.prototype._realpathSet = function (index, cb) {
|
|
221
|
+
var matchset = this.matches[index]
|
|
222
|
+
if (!matchset)
|
|
223
|
+
return cb()
|
|
224
|
+
|
|
225
|
+
var found = Object.keys(matchset)
|
|
226
|
+
var self = this
|
|
227
|
+
var n = found.length
|
|
228
|
+
|
|
229
|
+
if (n === 0)
|
|
230
|
+
return cb()
|
|
231
|
+
|
|
232
|
+
var set = this.matches[index] = Object.create(null)
|
|
233
|
+
found.forEach(function (p, i) {
|
|
234
|
+
// If there's a problem with the stat, then it means that
|
|
235
|
+
// one or more of the links in the realpath couldn't be
|
|
236
|
+
// resolved. just return the abs value in that case.
|
|
237
|
+
p = self._makeAbs(p)
|
|
238
|
+
rp.realpath(p, self.realpathCache, function (er, real) {
|
|
239
|
+
if (!er)
|
|
240
|
+
set[real] = true
|
|
241
|
+
else if (er.syscall === 'stat')
|
|
242
|
+
set[p] = true
|
|
243
|
+
else
|
|
244
|
+
self.emit('error', er) // srsly wtf right here
|
|
245
|
+
|
|
246
|
+
if (--n === 0) {
|
|
247
|
+
self.matches[index] = set
|
|
248
|
+
cb()
|
|
249
|
+
}
|
|
250
|
+
})
|
|
251
|
+
})
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
Glob.prototype._mark = function (p) {
|
|
255
|
+
return common.mark(this, p)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
Glob.prototype._makeAbs = function (f) {
|
|
259
|
+
return common.makeAbs(this, f)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
Glob.prototype.abort = function () {
|
|
263
|
+
this.aborted = true
|
|
264
|
+
this.emit('abort')
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
Glob.prototype.pause = function () {
|
|
268
|
+
if (!this.paused) {
|
|
269
|
+
this.paused = true
|
|
270
|
+
this.emit('pause')
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
Glob.prototype.resume = function () {
|
|
275
|
+
if (this.paused) {
|
|
276
|
+
this.emit('resume')
|
|
277
|
+
this.paused = false
|
|
278
|
+
if (this._emitQueue.length) {
|
|
279
|
+
var eq = this._emitQueue.slice(0)
|
|
280
|
+
this._emitQueue.length = 0
|
|
281
|
+
for (var i = 0; i < eq.length; i ++) {
|
|
282
|
+
var e = eq[i]
|
|
283
|
+
this._emitMatch(e[0], e[1])
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (this._processQueue.length) {
|
|
287
|
+
var pq = this._processQueue.slice(0)
|
|
288
|
+
this._processQueue.length = 0
|
|
289
|
+
for (var i = 0; i < pq.length; i ++) {
|
|
290
|
+
var p = pq[i]
|
|
291
|
+
this._processing--
|
|
292
|
+
this._process(p[0], p[1], p[2], p[3])
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
|
|
299
|
+
assert(this instanceof Glob)
|
|
300
|
+
assert(typeof cb === 'function')
|
|
301
|
+
|
|
302
|
+
if (this.aborted)
|
|
303
|
+
return
|
|
304
|
+
|
|
305
|
+
this._processing++
|
|
306
|
+
if (this.paused) {
|
|
307
|
+
this._processQueue.push([pattern, index, inGlobStar, cb])
|
|
308
|
+
return
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
//console.error('PROCESS %d', this._processing, pattern)
|
|
312
|
+
|
|
313
|
+
// Get the first [n] parts of pattern that are all strings.
|
|
314
|
+
var n = 0
|
|
315
|
+
while (typeof pattern[n] === 'string') {
|
|
316
|
+
n ++
|
|
317
|
+
}
|
|
318
|
+
// now n is the index of the first one that is *not* a string.
|
|
319
|
+
|
|
320
|
+
// see if there's anything else
|
|
321
|
+
var prefix
|
|
322
|
+
switch (n) {
|
|
323
|
+
// if not, then this is rather simple
|
|
324
|
+
case pattern.length:
|
|
325
|
+
this._processSimple(pattern.join('/'), index, cb)
|
|
326
|
+
return
|
|
327
|
+
|
|
328
|
+
case 0:
|
|
329
|
+
// pattern *starts* with some non-trivial item.
|
|
330
|
+
// going to readdir(cwd), but not include the prefix in matches.
|
|
331
|
+
prefix = null
|
|
332
|
+
break
|
|
333
|
+
|
|
334
|
+
default:
|
|
335
|
+
// pattern has some string bits in the front.
|
|
336
|
+
// whatever it starts with, whether that's 'absolute' like /foo/bar,
|
|
337
|
+
// or 'relative' like '../baz'
|
|
338
|
+
prefix = pattern.slice(0, n).join('/')
|
|
339
|
+
break
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
var remain = pattern.slice(n)
|
|
343
|
+
|
|
344
|
+
// get the list of entries.
|
|
345
|
+
var read
|
|
346
|
+
if (prefix === null)
|
|
347
|
+
read = '.'
|
|
348
|
+
else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
|
|
349
|
+
if (!prefix || !isAbsolute(prefix))
|
|
350
|
+
prefix = '/' + prefix
|
|
351
|
+
read = prefix
|
|
352
|
+
} else
|
|
353
|
+
read = prefix
|
|
354
|
+
|
|
355
|
+
var abs = this._makeAbs(read)
|
|
356
|
+
|
|
357
|
+
//if ignored, skip _processing
|
|
358
|
+
if (childrenIgnored(this, read))
|
|
359
|
+
return cb()
|
|
360
|
+
|
|
361
|
+
var isGlobStar = remain[0] === minimatch.GLOBSTAR
|
|
362
|
+
if (isGlobStar)
|
|
363
|
+
this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
|
|
364
|
+
else
|
|
365
|
+
this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
|
369
|
+
var self = this
|
|
370
|
+
this._readdir(abs, inGlobStar, function (er, entries) {
|
|
371
|
+
return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
|
372
|
+
})
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
|
376
|
+
|
|
377
|
+
// if the abs isn't a dir, then nothing can match!
|
|
378
|
+
if (!entries)
|
|
379
|
+
return cb()
|
|
380
|
+
|
|
381
|
+
// It will only match dot entries if it starts with a dot, or if
|
|
382
|
+
// dot is set. Stuff like @(.foo|.bar) isn't allowed.
|
|
383
|
+
var pn = remain[0]
|
|
384
|
+
var negate = !!this.minimatch.negate
|
|
385
|
+
var rawGlob = pn._glob
|
|
386
|
+
var dotOk = this.dot || rawGlob.charAt(0) === '.'
|
|
387
|
+
|
|
388
|
+
var matchedEntries = []
|
|
389
|
+
for (var i = 0; i < entries.length; i++) {
|
|
390
|
+
var e = entries[i]
|
|
391
|
+
if (e.charAt(0) !== '.' || dotOk) {
|
|
392
|
+
var m
|
|
393
|
+
if (negate && !prefix) {
|
|
394
|
+
m = !e.match(pn)
|
|
395
|
+
} else {
|
|
396
|
+
m = e.match(pn)
|
|
397
|
+
}
|
|
398
|
+
if (m)
|
|
399
|
+
matchedEntries.push(e)
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
//console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
|
|
404
|
+
|
|
405
|
+
var len = matchedEntries.length
|
|
406
|
+
// If there are no matched entries, then nothing matches.
|
|
407
|
+
if (len === 0)
|
|
408
|
+
return cb()
|
|
409
|
+
|
|
410
|
+
// if this is the last remaining pattern bit, then no need for
|
|
411
|
+
// an additional stat *unless* the user has specified mark or
|
|
412
|
+
// stat explicitly. We know they exist, since readdir returned
|
|
413
|
+
// them.
|
|
414
|
+
|
|
415
|
+
if (remain.length === 1 && !this.mark && !this.stat) {
|
|
416
|
+
if (!this.matches[index])
|
|
417
|
+
this.matches[index] = Object.create(null)
|
|
418
|
+
|
|
419
|
+
for (var i = 0; i < len; i ++) {
|
|
420
|
+
var e = matchedEntries[i]
|
|
421
|
+
if (prefix) {
|
|
422
|
+
if (prefix !== '/')
|
|
423
|
+
e = prefix + '/' + e
|
|
424
|
+
else
|
|
425
|
+
e = prefix + e
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (e.charAt(0) === '/' && !this.nomount) {
|
|
429
|
+
e = path.join(this.root, e)
|
|
430
|
+
}
|
|
431
|
+
this._emitMatch(index, e)
|
|
432
|
+
}
|
|
433
|
+
// This was the last one, and no stats were needed
|
|
434
|
+
return cb()
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// now test all matched entries as stand-ins for that part
|
|
438
|
+
// of the pattern.
|
|
439
|
+
remain.shift()
|
|
440
|
+
for (var i = 0; i < len; i ++) {
|
|
441
|
+
var e = matchedEntries[i]
|
|
442
|
+
var newPattern
|
|
443
|
+
if (prefix) {
|
|
444
|
+
if (prefix !== '/')
|
|
445
|
+
e = prefix + '/' + e
|
|
446
|
+
else
|
|
447
|
+
e = prefix + e
|
|
448
|
+
}
|
|
449
|
+
this._process([e].concat(remain), index, inGlobStar, cb)
|
|
450
|
+
}
|
|
451
|
+
cb()
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
Glob.prototype._emitMatch = function (index, e) {
|
|
455
|
+
if (this.aborted)
|
|
456
|
+
return
|
|
457
|
+
|
|
458
|
+
if (isIgnored(this, e))
|
|
459
|
+
return
|
|
460
|
+
|
|
461
|
+
if (this.paused) {
|
|
462
|
+
this._emitQueue.push([index, e])
|
|
463
|
+
return
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
var abs = isAbsolute(e) ? e : this._makeAbs(e)
|
|
467
|
+
|
|
468
|
+
if (this.mark)
|
|
469
|
+
e = this._mark(e)
|
|
470
|
+
|
|
471
|
+
if (this.absolute)
|
|
472
|
+
e = abs
|
|
473
|
+
|
|
474
|
+
if (this.matches[index][e])
|
|
475
|
+
return
|
|
476
|
+
|
|
477
|
+
if (this.nodir) {
|
|
478
|
+
var c = this.cache[abs]
|
|
479
|
+
if (c === 'DIR' || Array.isArray(c))
|
|
480
|
+
return
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
this.matches[index][e] = true
|
|
484
|
+
|
|
485
|
+
var st = this.statCache[abs]
|
|
486
|
+
if (st)
|
|
487
|
+
this.emit('stat', e, st)
|
|
488
|
+
|
|
489
|
+
this.emit('match', e)
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
Glob.prototype._readdirInGlobStar = function (abs, cb) {
|
|
493
|
+
if (this.aborted)
|
|
494
|
+
return
|
|
495
|
+
|
|
496
|
+
// follow all symlinked directories forever
|
|
497
|
+
// just proceed as if this is a non-globstar situation
|
|
498
|
+
if (this.follow)
|
|
499
|
+
return this._readdir(abs, false, cb)
|
|
500
|
+
|
|
501
|
+
var lstatkey = 'lstat\0' + abs
|
|
502
|
+
var self = this
|
|
503
|
+
var lstatcb = inflight(lstatkey, lstatcb_)
|
|
504
|
+
|
|
505
|
+
if (lstatcb)
|
|
506
|
+
fs.lstat(abs, lstatcb)
|
|
507
|
+
|
|
508
|
+
function lstatcb_ (er, lstat) {
|
|
509
|
+
if (er && er.code === 'ENOENT')
|
|
510
|
+
return cb()
|
|
511
|
+
|
|
512
|
+
var isSym = lstat && lstat.isSymbolicLink()
|
|
513
|
+
self.symlinks[abs] = isSym
|
|
514
|
+
|
|
515
|
+
// If it's not a symlink or a dir, then it's definitely a regular file.
|
|
516
|
+
// don't bother doing a readdir in that case.
|
|
517
|
+
if (!isSym && lstat && !lstat.isDirectory()) {
|
|
518
|
+
self.cache[abs] = 'FILE'
|
|
519
|
+
cb()
|
|
520
|
+
} else
|
|
521
|
+
self._readdir(abs, false, cb)
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
Glob.prototype._readdir = function (abs, inGlobStar, cb) {
|
|
526
|
+
if (this.aborted)
|
|
527
|
+
return
|
|
528
|
+
|
|
529
|
+
cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
|
|
530
|
+
if (!cb)
|
|
531
|
+
return
|
|
532
|
+
|
|
533
|
+
//console.error('RD %j %j', +inGlobStar, abs)
|
|
534
|
+
if (inGlobStar && !ownProp(this.symlinks, abs))
|
|
535
|
+
return this._readdirInGlobStar(abs, cb)
|
|
536
|
+
|
|
537
|
+
if (ownProp(this.cache, abs)) {
|
|
538
|
+
var c = this.cache[abs]
|
|
539
|
+
if (!c || c === 'FILE')
|
|
540
|
+
return cb()
|
|
541
|
+
|
|
542
|
+
if (Array.isArray(c))
|
|
543
|
+
return cb(null, c)
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
var self = this
|
|
547
|
+
fs.readdir(abs, readdirCb(this, abs, cb))
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
function readdirCb (self, abs, cb) {
|
|
551
|
+
return function (er, entries) {
|
|
552
|
+
if (er)
|
|
553
|
+
self._readdirError(abs, er, cb)
|
|
554
|
+
else
|
|
555
|
+
self._readdirEntries(abs, entries, cb)
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
Glob.prototype._readdirEntries = function (abs, entries, cb) {
|
|
560
|
+
if (this.aborted)
|
|
561
|
+
return
|
|
562
|
+
|
|
563
|
+
// if we haven't asked to stat everything, then just
|
|
564
|
+
// assume that everything in there exists, so we can avoid
|
|
565
|
+
// having to stat it a second time.
|
|
566
|
+
if (!this.mark && !this.stat) {
|
|
567
|
+
for (var i = 0; i < entries.length; i ++) {
|
|
568
|
+
var e = entries[i]
|
|
569
|
+
if (abs === '/')
|
|
570
|
+
e = abs + e
|
|
571
|
+
else
|
|
572
|
+
e = abs + '/' + e
|
|
573
|
+
this.cache[e] = true
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
this.cache[abs] = entries
|
|
578
|
+
return cb(null, entries)
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
Glob.prototype._readdirError = function (f, er, cb) {
|
|
582
|
+
if (this.aborted)
|
|
583
|
+
return
|
|
584
|
+
|
|
585
|
+
// handle errors, and cache the information
|
|
586
|
+
switch (er.code) {
|
|
587
|
+
case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
|
|
588
|
+
case 'ENOTDIR': // totally normal. means it *does* exist.
|
|
589
|
+
var abs = this._makeAbs(f)
|
|
590
|
+
this.cache[abs] = 'FILE'
|
|
591
|
+
if (abs === this.cwdAbs) {
|
|
592
|
+
var error = new Error(er.code + ' invalid cwd ' + this.cwd)
|
|
593
|
+
error.path = this.cwd
|
|
594
|
+
error.code = er.code
|
|
595
|
+
this.emit('error', error)
|
|
596
|
+
this.abort()
|
|
597
|
+
}
|
|
598
|
+
break
|
|
599
|
+
|
|
600
|
+
case 'ENOENT': // not terribly unusual
|
|
601
|
+
case 'ELOOP':
|
|
602
|
+
case 'ENAMETOOLONG':
|
|
603
|
+
case 'UNKNOWN':
|
|
604
|
+
this.cache[this._makeAbs(f)] = false
|
|
605
|
+
break
|
|
606
|
+
|
|
607
|
+
default: // some unusual error. Treat as failure.
|
|
608
|
+
this.cache[this._makeAbs(f)] = false
|
|
609
|
+
if (this.strict) {
|
|
610
|
+
this.emit('error', er)
|
|
611
|
+
// If the error is handled, then we abort
|
|
612
|
+
// if not, we threw out of here
|
|
613
|
+
this.abort()
|
|
614
|
+
}
|
|
615
|
+
if (!this.silent)
|
|
616
|
+
console.error('glob error', er)
|
|
617
|
+
break
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
return cb()
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
|
|
624
|
+
var self = this
|
|
625
|
+
this._readdir(abs, inGlobStar, function (er, entries) {
|
|
626
|
+
self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
|
|
627
|
+
})
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
|
|
632
|
+
//console.error('pgs2', prefix, remain[0], entries)
|
|
633
|
+
|
|
634
|
+
// no entries means not a dir, so it can never have matches
|
|
635
|
+
// foo.txt/** doesn't match foo.txt
|
|
636
|
+
if (!entries)
|
|
637
|
+
return cb()
|
|
638
|
+
|
|
639
|
+
// test without the globstar, and with every child both below
|
|
640
|
+
// and replacing the globstar.
|
|
641
|
+
var remainWithoutGlobStar = remain.slice(1)
|
|
642
|
+
var gspref = prefix ? [ prefix ] : []
|
|
643
|
+
var noGlobStar = gspref.concat(remainWithoutGlobStar)
|
|
644
|
+
|
|
645
|
+
// the noGlobStar pattern exits the inGlobStar state
|
|
646
|
+
this._process(noGlobStar, index, false, cb)
|
|
647
|
+
|
|
648
|
+
var isSym = this.symlinks[abs]
|
|
649
|
+
var len = entries.length
|
|
650
|
+
|
|
651
|
+
// If it's a symlink, and we're in a globstar, then stop
|
|
652
|
+
if (isSym && inGlobStar)
|
|
653
|
+
return cb()
|
|
654
|
+
|
|
655
|
+
for (var i = 0; i < len; i++) {
|
|
656
|
+
var e = entries[i]
|
|
657
|
+
if (e.charAt(0) === '.' && !this.dot)
|
|
658
|
+
continue
|
|
659
|
+
|
|
660
|
+
// these two cases enter the inGlobStar state
|
|
661
|
+
var instead = gspref.concat(entries[i], remainWithoutGlobStar)
|
|
662
|
+
this._process(instead, index, true, cb)
|
|
663
|
+
|
|
664
|
+
var below = gspref.concat(entries[i], remain)
|
|
665
|
+
this._process(below, index, true, cb)
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
cb()
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
Glob.prototype._processSimple = function (prefix, index, cb) {
|
|
672
|
+
// XXX review this. Shouldn't it be doing the mounting etc
|
|
673
|
+
// before doing stat? kinda weird?
|
|
674
|
+
var self = this
|
|
675
|
+
this._stat(prefix, function (er, exists) {
|
|
676
|
+
self._processSimple2(prefix, index, er, exists, cb)
|
|
677
|
+
})
|
|
678
|
+
}
|
|
679
|
+
Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
|
|
680
|
+
|
|
681
|
+
//console.error('ps2', prefix, exists)
|
|
682
|
+
|
|
683
|
+
if (!this.matches[index])
|
|
684
|
+
this.matches[index] = Object.create(null)
|
|
685
|
+
|
|
686
|
+
// If it doesn't exist, then just mark the lack of results
|
|
687
|
+
if (!exists)
|
|
688
|
+
return cb()
|
|
689
|
+
|
|
690
|
+
if (prefix && isAbsolute(prefix) && !this.nomount) {
|
|
691
|
+
var trail = /[\/\\]$/.test(prefix)
|
|
692
|
+
if (prefix.charAt(0) === '/') {
|
|
693
|
+
prefix = path.join(this.root, prefix)
|
|
694
|
+
} else {
|
|
695
|
+
prefix = path.resolve(this.root, prefix)
|
|
696
|
+
if (trail)
|
|
697
|
+
prefix += '/'
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
if (process.platform === 'win32')
|
|
702
|
+
prefix = prefix.replace(/\\/g, '/')
|
|
703
|
+
|
|
704
|
+
// Mark this as a match
|
|
705
|
+
this._emitMatch(index, prefix)
|
|
706
|
+
cb()
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// Returns either 'DIR', 'FILE', or false
|
|
710
|
+
Glob.prototype._stat = function (f, cb) {
|
|
711
|
+
var abs = this._makeAbs(f)
|
|
712
|
+
var needDir = f.slice(-1) === '/'
|
|
713
|
+
|
|
714
|
+
if (f.length > this.maxLength)
|
|
715
|
+
return cb()
|
|
716
|
+
|
|
717
|
+
if (!this.stat && ownProp(this.cache, abs)) {
|
|
718
|
+
var c = this.cache[abs]
|
|
719
|
+
|
|
720
|
+
if (Array.isArray(c))
|
|
721
|
+
c = 'DIR'
|
|
722
|
+
|
|
723
|
+
// It exists, but maybe not how we need it
|
|
724
|
+
if (!needDir || c === 'DIR')
|
|
725
|
+
return cb(null, c)
|
|
726
|
+
|
|
727
|
+
if (needDir && c === 'FILE')
|
|
728
|
+
return cb()
|
|
729
|
+
|
|
730
|
+
// otherwise we have to stat, because maybe c=true
|
|
731
|
+
// if we know it exists, but not what it is.
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
var exists
|
|
735
|
+
var stat = this.statCache[abs]
|
|
736
|
+
if (stat !== undefined) {
|
|
737
|
+
if (stat === false)
|
|
738
|
+
return cb(null, stat)
|
|
739
|
+
else {
|
|
740
|
+
var type = stat.isDirectory() ? 'DIR' : 'FILE'
|
|
741
|
+
if (needDir && type === 'FILE')
|
|
742
|
+
return cb()
|
|
743
|
+
else
|
|
744
|
+
return cb(null, type, stat)
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
var self = this
|
|
749
|
+
var statcb = inflight('stat\0' + abs, lstatcb_)
|
|
750
|
+
if (statcb)
|
|
751
|
+
fs.lstat(abs, statcb)
|
|
752
|
+
|
|
753
|
+
function lstatcb_ (er, lstat) {
|
|
754
|
+
if (lstat && lstat.isSymbolicLink()) {
|
|
755
|
+
// If it's a symlink, then treat it as the target, unless
|
|
756
|
+
// the target does not exist, then treat it as a file.
|
|
757
|
+
return fs.stat(abs, function (er, stat) {
|
|
758
|
+
if (er)
|
|
759
|
+
self._stat2(f, abs, null, lstat, cb)
|
|
760
|
+
else
|
|
761
|
+
self._stat2(f, abs, er, stat, cb)
|
|
762
|
+
})
|
|
763
|
+
} else {
|
|
764
|
+
self._stat2(f, abs, er, lstat, cb)
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
|
|
770
|
+
if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {
|
|
771
|
+
this.statCache[abs] = false
|
|
772
|
+
return cb()
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
var needDir = f.slice(-1) === '/'
|
|
776
|
+
this.statCache[abs] = stat
|
|
777
|
+
|
|
778
|
+
if (abs.slice(-1) === '/' && stat && !stat.isDirectory())
|
|
779
|
+
return cb(null, false, stat)
|
|
780
|
+
|
|
781
|
+
var c = true
|
|
782
|
+
if (stat)
|
|
783
|
+
c = stat.isDirectory() ? 'DIR' : 'FILE'
|
|
784
|
+
this.cache[abs] = this.cache[abs] || c
|
|
785
|
+
|
|
786
|
+
if (needDir && c === 'FILE')
|
|
787
|
+
return cb()
|
|
788
|
+
|
|
789
|
+
return cb(null, c, stat)
|
|
790
|
+
}
|