diff options
author | Florian Dold <florian.dold@gmail.com> | 2016-10-10 03:43:44 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2016-10-10 03:43:44 +0200 |
commit | abd94a7f5a50f43c797a11b53549ae48fff667c3 (patch) | |
tree | ab8ed457f65cdd72e13e0571d2975729428f1551 /node_modules/vinyl-fs | |
parent | a0247c6a3fd6a09a41a7e35a3441324c4dcb58be (diff) | |
download | wallet-core-abd94a7f5a50f43c797a11b53549ae48fff667c3.tar.xz |
add node_modules to address #4364
Diffstat (limited to 'node_modules/vinyl-fs')
115 files changed, 13204 insertions, 0 deletions
diff --git a/node_modules/vinyl-fs/CHANGELOG.md b/node_modules/vinyl-fs/CHANGELOG.md new file mode 100644 index 000000000..43b775373 --- /dev/null +++ b/node_modules/vinyl-fs/CHANGELOG.md @@ -0,0 +1,369 @@ +## Change Log + +### v2.4.2 (2016/03/03 19:59 +00:00) +- [5edb75a](https://github.com/gulpjs/vinyl-fs/commit/5edb75a10935fdc89e29d5e2413694aca77a3e85) 2.4.2 (@phated) +- [f445987](https://github.com/gulpjs/vinyl-fs/commit/f445987ce905659e62dcb27a8ad69f4ed2fb8198) upgrade glob-stream and remove path.normalize workaround (@phated) + +### v2.4.1 (2016/03/02 20:53 +00:00) +- [caac041](https://github.com/gulpjs/vinyl-fs/commit/caac041836436577d52468d32b9844c00d666265) 2.4.1 (@phated) +- [#154](https://github.com/gulpjs/vinyl-fs/pull/154) Don't pass `read` option from `src` to `through2` (@erikkemperman) + +### v2.4.0 (2016/03/01 22:40 +00:00) +- [926a9ad](https://github.com/gulpjs/vinyl-fs/commit/926a9ad3cf40d133120eb6f90d26234dc9f00138) 2.4.0 (@phated) +- [#160](https://github.com/gulpjs/vinyl-fs/pull/160) Allow specify dest sourcemaps option as string (@TrySound) +- [ebaffbe](https://github.com/gulpjs/vinyl-fs/commit/ebaffbecd642d3f8dd7d6edd6a19a1e768e7d2d1) Upgrade documentation (@TrySound) +- [7a0c94a](https://github.com/gulpjs/vinyl-fs/commit/7a0c94ae97de5e46392efe9a08ee3c68885dd7ba) Allow specify dest sourcemaps option as string (@TrySound) + +### v2.3.4 (2016/02/26 21:48 +00:00) +- [cd8a992](https://github.com/gulpjs/vinyl-fs/commit/cd8a992294228eea1d08957efc823794baa48fba) 2.3.4 (@phated) +- [8b50f49](https://github.com/gulpjs/vinyl-fs/commit/8b50f495c9b782d2afc64b38c0b7181a21c20b62) revert string handling from previous release, add support for SlowBuffer support (@phated) + +### v2.3.3 (2016/02/26 20:08 +00:00) +- [a75feda](https://github.com/gulpjs/vinyl-fs/commit/a75feda20131177a8f5a5008483f24169d0b3df3) 2.3.3 (@phated) +- [165149c](https://github.com/gulpjs/vinyl-fs/commit/165149c6a676ac867933173db28300cf3bab2a5f) support strings in writeFile (@phated) +- [3b67921](https://github.com/gulpjs/vinyl-fs/commit/3b67921fe5ddd925fc12acef2bd03777b0081dc3) Don't pass `read` option from `src` to `through2` (@erikkemperman) +- [5918841](https://github.com/gulpjs/vinyl-fs/commit/5918841bbd2c5256413b86c000e28ac3fff516e7) update changelog (@phated) + +### v2.3.2 (2016/02/26 01:17 +00:00) +- [6ed1793](https://github.com/gulpjs/vinyl-fs/commit/6ed179380da7caa4e3506f78b8864ea59164992e) 2.3.2 (@phated) +- [#151](https://github.com/gulpjs/vinyl-fs/pull/151) Feature metadata refactor (@gulpjs) +- [0cd8f22](https://github.com/gulpjs/vinyl-fs/commit/0cd8f2229d7788477a3fa2613dbf93e019503198) add docs for changes (@phated) +- [8d55978](https://github.com/gulpjs/vinyl-fs/commit/8d55978c3640ac25db8331ac4d7314579eb04da9) skip broken tests that were not testing the right thing (@phated) +- [550edd5](https://github.com/gulpjs/vinyl-fs/commit/550edd56f555240c36068ad060b2136213b135f6) test on latest node 4 instead of old ones (@phated) +- [6f4c2eb](https://github.com/gulpjs/vinyl-fs/commit/6f4c2eb396b78a91dcf41f5063eee27b66b35fe0) `sourcemaps` is not a valid option to gulp-sourcemaps (@phated) +- [011320b](https://github.com/gulpjs/vinyl-fs/commit/011320b1f988ecd7846ef04f7a597ee4b25d7285) add appveyor to test on windows & get tests to actually pass (@phated) +- [84cf3c2](https://github.com/gulpjs/vinyl-fs/commit/84cf3c2e1901bd700c089edac06ce0c75f8e701d) refactor and lots of tests for updating of metadata (@phated) +- [90a1189](https://github.com/gulpjs/vinyl-fs/commit/90a11894472d29abe9e34b80df0dfab9907f11e7) Make the tests pass again, some more refactoring of metadata handling (@erikkemperman) +- [35e9b3a](https://github.com/gulpjs/vinyl-fs/commit/35e9b3a68907167b51fa31edd0701ae24915fd84) Use filedescriptors where possible, refactor handling of stats metadata in dest (@piranna) +- [#150](https://github.com/gulpjs/vinyl-fs/pull/150) Update license year from initial date of release to current (@pra85) +- [ec48559](https://github.com/gulpjs/vinyl-fs/commit/ec485592d7a96562acc97ccd8b39a12cf17ed319) Update license year from initial date of release to current (@pra85) +- [#149](https://github.com/gulpjs/vinyl-fs/pull/149) chore: add NPM script for changelog (@T1st3) +- [0010bd3](https://github.com/gulpjs/vinyl-fs/commit/0010bd3b3c49e7b60e0d69dacdd8fd1b87a6c3dd) chore: add NPM script for changelog (@t1st3) +- [#148](https://github.com/gulpjs/vinyl-fs/pull/148) docs: add CHANGELOG.md (@T1st3) +- [da4cd0b](https://github.com/gulpjs/vinyl-fs/commit/da4cd0b449f8e9bd4bd0842fe2eb2b4eceea6c0b) docs: add changelog (@t1st3) + +### v2.3.1 (2016/01/14 09:13 +00:00) +- [7d2fcba](https://github.com/gulpjs/vinyl-fs/commit/7d2fcbaa49c78087fa975a4183fee38d422b9d4a) 2.3.1 +- [#145](https://github.com/gulpjs/vinyl-fs/pull/145) Allow things to listen for data or readable events and avoid sinking in those cases (@gulpjs) +- [a7fae5a](https://github.com/gulpjs/vinyl-fs/commit/a7fae5a2e2f349237614fc3cb3f371b6f10f5df3) keep style consistent +- [1b02a46](https://github.com/gulpjs/vinyl-fs/commit/1b02a46aff9650afbfdf36aea386d177508d45fa) more updates, nextTick the removable of listeners in tests +- [3a0cf5b](https://github.com/gulpjs/vinyl-fs/commit/3a0cf5b098d4a4f2f407f7622cbccc4b29ddbf0e) DRY up listenerCount check +- [dcfc8b8](https://github.com/gulpjs/vinyl-fs/commit/dcfc8b8b2e93486703449960a69fef87b495a7e9) new sink removal impl +- [8cec809](https://github.com/gulpjs/vinyl-fs/commit/8cec80998516b20a6fc43c3e865b588a34236899) more tests, better tests +- [5167080](https://github.com/gulpjs/vinyl-fs/commit/5167080b13bfecd307da3b04be3b1892a9e8996c) harden event handling +- [ef0b8e0](https://github.com/gulpjs/vinyl-fs/commit/ef0b8e043eb3c3ff72f09d7597b4ae9ed105ba6d) Fix sink from preventing the readable event to fire on the underlying stream (@benurb) + +### v2.3.0 (2016/01/12 01:46 +00:00) +- [941b040](https://github.com/gulpjs/vinyl-fs/commit/941b040905616eb0408a44213d5efe010388cb9d) 2.3.0 +- [#121](https://github.com/gulpjs/vinyl-fs/pull/121) Fix file descriptor exhaustion when streaming many files (@Klowner) +- [1f3af33](https://github.com/gulpjs/vinyl-fs/commit/1f3af33b1693b07fa2af5ed325ba8f0c0380b5f0) Add test for unbuffered file descriptor exhaustion issue (@Klowner) +- [38b032c](https://github.com/gulpjs/vinyl-fs/commit/38b032cd9b481a1c16d88f1b7968dd51c6a5ed15) Add 20 second timeout to dest's afterEach wipeOut task (@Klowner) +- [c63a797](https://github.com/gulpjs/vinyl-fs/commit/c63a79749a4b2ea500c519e1be5e073a87e4b940) Use lazystream for streamFile to avoid fd exhaustion (@Klowner) +- [00ece7e](https://github.com/gulpjs/vinyl-fs/commit/00ece7ef6b794fd1999695fde2d88bba8d69f5d0) avoid else-if and isFatal variable +- [6b9912e](https://github.com/gulpjs/vinyl-fs/commit/6b9912e14a3a7504bbba9d176c04b35e69208b64) get max statements warning for future cleanup +- [a2be0d6](https://github.com/gulpjs/vinyl-fs/commit/a2be0d69de86af9e09ab1193b740d1a0736009fc) ESLint and JSCS plus fixup (@pdehaan) +- [24119a8](https://github.com/gulpjs/vinyl-fs/commit/24119a862ad062f39ed15db767feff459843c2d8) Rework writeStream to prevent issue with futimes (@Klowner) +- [17ef52e](https://github.com/gulpjs/vinyl-fs/commit/17ef52ec014ea6a72abda35d104e92786904f92b) Add test for streaming with buffering disabled (@Klowner) +- [6934485](https://github.com/gulpjs/vinyl-fs/commit/69344858edb85e7c904621fa5d45782aa9825878) drastically improve docs +- [80add99](https://github.com/gulpjs/vinyl-fs/commit/80add99101bd41f5161ff90c8b4a9b3ba496c73d) big timeout for slow node +- [d553e74](https://github.com/gulpjs/vinyl-fs/commit/d553e7474ebb65b89e496dfc3916292b59eec4c2) Send options to through2 (@vineethawal) +- [#134](https://github.com/gulpjs/vinyl-fs/pull/134) Make tests ignore gid (@gulpjs) +- [e33b632](https://github.com/gulpjs/vinyl-fs/commit/e33b632ffb139599922bc414f76e4c5b81c82f70) adjust realMode method to avoid gid in the parse - fixes #103 +- [4adb4d9](https://github.com/gulpjs/vinyl-fs/commit/4adb4d9d35a148d0c2507a5f06946951b54d443e) setgid on test directory - make travis fail as per #103 +- [#130](https://github.com/gulpjs/vinyl-fs/pull/130) #129 - Update documentation to more clearly explain what happens for default base option values. (@treshugart) +- [#126](https://github.com/gulpjs/vinyl-fs/pull/126) read from the stream once we finish processing a file, this avoids highWaterMark being hit - add test (@gulpjs) +- [df97b14](https://github.com/gulpjs/vinyl-fs/commit/df97b1482200e7bc5dd01a49f0bdedeed2b6bd08) sink the saveStream on nextTick to start flowing and avoid highWaterMark - add tests +- [#133](https://github.com/gulpjs/vinyl-fs/pull/133) fix TypeError when the dest sourcemaps option is a boolean (@chocolateboy) +- [df874af](https://github.com/gulpjs/vinyl-fs/commit/df874af6c3dce1b8f008230b06f3ef9ef0e30d1a) add test for the boolean (true) source-map option (@chocolateboy) +- [6ab48dd](https://github.com/gulpjs/vinyl-fs/commit/6ab48dd66899141d1c8e7f14e1ccb1ccc62c261e) fix TypeError when the dest sourcemaps option is a boolean (@chocolateboy) +- [edb9caa](https://github.com/gulpjs/vinyl-fs/commit/edb9caa91e57690ddaace09aafb863f5bbac3ed8) #129 - Update documentation to more clearly explain what happens for default base option values. (@treshugart) +- [#125](https://github.com/gulpjs/vinyl-fs/pull/125) Use `fs.futimes` to retain sub-second precision in `atime` and `mtime` (@erikkemperman) +- [e3849f2](https://github.com/gulpjs/vinyl-fs/commit/e3849f2a19fa967842506fe4d34eeb8f6565464b) Use `fs.futimes` to retain sub-second precision in `atime` and `mtime` (@erikkemperman) +- [be8d1fd](https://github.com/gulpjs/vinyl-fs/commit/be8d1fd878ae2c6332851aa15a669a1cd128c6cb) guarantee 5.2.0 glob-stream and update test +- [#119](https://github.com/gulpjs/vinyl-fs/pull/119) Check if `atime` Date object is invalid and set a new one explicitly (@NodeOS) +- [#122](https://github.com/gulpjs/vinyl-fs/pull/122) Change writeStream callbacks from cb to complete (@Klowner) +- [8f93a48](https://github.com/gulpjs/vinyl-fs/commit/8f93a48c98ff75bab09bed47b989c9c1dbb5aaa0) Change writeStream callbacks from cb to complete (@Klowner) +- [f575377](https://github.com/gulpjs/vinyl-fs/commit/f5753770962df157023e37dfadca2dcce6aa18b5) Check if `atime` Date object is invalid and set a new one explicitly (@piranna) + +### v2.2.1 (2015/10/20 01:06 +00:00) +- [a28ba42](https://github.com/gulpjs/vinyl-fs/commit/a28ba42d87eeaecc2ae3de9174270019fab76fe3) 2.2.1 +- [7f539dd](https://github.com/gulpjs/vinyl-fs/commit/7f539dd562e501e904ab6401892f6f4c68a4da25) simplify utimes helper +- [c2beec8](https://github.com/gulpjs/vinyl-fs/commit/c2beec86ddab2ef51a3a6fa7077907c74d1eadd7) fix tests for invalid dates +- [97ff9ce](https://github.com/gulpjs/vinyl-fs/commit/97ff9ce60efba49a3d6cafcece3c9dce95aa670a) Test for invalid atime and mtime (@piranna) +- [624d7f5](https://github.com/gulpjs/vinyl-fs/commit/624d7f59090a4ae8e7e5c83178b199e13973c635) [Fix] Ignore atime and mtime if they are invalid (@piranna) + +### v2.2.0 (2015/10/16 02:02 +00:00) +- [bf7edd3](https://github.com/gulpjs/vinyl-fs/commit/bf7edd37cb0207951b75879d4e07402c51ac8770) 2.2.0 +- [039d689](https://github.com/gulpjs/vinyl-fs/commit/039d68920cc5bde6f0f12375daee2713260a1ecf) make tests pass +- [6f36372](https://github.com/gulpjs/vinyl-fs/commit/6f36372b9d0b0bf10087b3ac863f858b15e54bb9) Test for vynil stat not modified (FAIL) (@piranna) +- [dbc606b](https://github.com/gulpjs/vinyl-fs/commit/dbc606bb091008215fd586e4a1eee6ec8bdb22d3) Don't modify vynil stat when atime is not defined (@piranna) +- [573b8b6](https://github.com/gulpjs/vinyl-fs/commit/573b8b656032e1b486f7e4bca9f5916ceb6def54) Tests for atime and mtime (@piranna) +- [d7a53d5](https://github.com/gulpjs/vinyl-fs/commit/d7a53d5f557c23aa26d9d5d179645288204a6faa) Style improvements (@piranna) +- [9237100](https://github.com/gulpjs/vinyl-fs/commit/92371008a2bafa74ba87450b57578d0ace17b194) Fix mtime test to 1 second resolution as Node.js does (@piranna) +- [801da1c](https://github.com/gulpjs/vinyl-fs/commit/801da1c04696736df9c9c2ad47645faadab970d2) Test for mtime (fail on second decimals) (@piranna) +- [def6815](https://github.com/gulpjs/vinyl-fs/commit/def68150d0e42ad870afe314cd3b7cea760e9c48) Updated style & made utility function (@piranna) +- [d55fd11](https://github.com/gulpjs/vinyl-fs/commit/d55fd119718a3166cf3f76362a896bfa8e91427d) Made atime optional ("cpio" don't have it, and sometimes "tar" too) (@piranna) +- [9a10c15](https://github.com/gulpjs/vinyl-fs/commit/9a10c15aeb1ef3f0b3c1e39c7c7c94f5295449d2) Set utimes of files if they are provided (@piranna) +- [#108](https://github.com/gulpjs/vinyl-fs/pull/108) Fix links, spacing in README (@moshen) +- [c603138](https://github.com/gulpjs/vinyl-fs/commit/c603138077df416cf7892f82a2e3a91daa3456fd) Fix links, spacing in README (@moshen) +- [#105](https://github.com/gulpjs/vinyl-fs/pull/105) updated to test on nodejs 4 (@ckross01) +- [3148943](https://github.com/gulpjs/vinyl-fs/commit/3148943032a834ad1c82c951576e735d4824d6f0) updated to test on nodejs 4 (@ckross01) +- [#102](https://github.com/gulpjs/vinyl-fs/pull/102) Update tests to 'strict mode' (@OnkelTem) +- [85c1286](https://github.com/gulpjs/vinyl-fs/commit/85c128604b521d2e465f1e78548d128c95f4719c) Update tests to 'strict mode' (@OnkelTem) + +### v2.1.1 (2015/09/28 09:55 +00:00) +- [812c696](https://github.com/gulpjs/vinyl-fs/commit/812c696709a16f0de2e06e03b5fe41a45fbfe4f2) 2.1.1 (@contra) +- [0a4caf6](https://github.com/gulpjs/vinyl-fs/commit/0a4caf61f5745e3a0f368be9d285d006fd7cbf4c) more elegant sourcemap handling, more docs (@contra) +- [0ac5a2c](https://github.com/gulpjs/vinyl-fs/commit/0ac5a2cb072111917e561c655441aa10a8ee1718) only pass buffer files to sourcemaps (@contra) + +### v2.1.0 (2015/09/27 22:01 +00:00) +- [dbf2a25](https://github.com/gulpjs/vinyl-fs/commit/dbf2a25dc9273e1d5bfa592e6b8564d245294e55) 2.1.0 (@contra) +- [#100](https://github.com/gulpjs/vinyl-fs/pull/100) allow a function to be used as value for the overwrite option - closes #68 (@gulpjs) +- [#99](https://github.com/gulpjs/vinyl-fs/pull/99) add option to strip BOM, default to true - closes #83 (@gulpjs) +- [b966d51](https://github.com/gulpjs/vinyl-fs/commit/b966d517906116021b5cec4ab7d41bbe8dd23168) update docs +- [13c853a](https://github.com/gulpjs/vinyl-fs/commit/13c853a1ae0a829f0fd33347ed791f9b92593d18) allow a function to be used as value for the overwrite option - closes #68 +- [870551c](https://github.com/gulpjs/vinyl-fs/commit/870551c43d69547accd4b4918142b06926f20e99) add option to strip BOM, default to true - closes #83 +- [50c9e33](https://github.com/gulpjs/vinyl-fs/commit/50c9e33149a7f365d039cd0115526c79145a5534) more sourcemaps docs (@contra) + +### v2.0.0 (2015/09/25 22:43 +00:00) +- [de7bf7b](https://github.com/gulpjs/vinyl-fs/commit/de7bf7ba79acf33610d8d8e58626dc39d8ed2611) 2.0.0 (@contra) +- [59620dc](https://github.com/gulpjs/vinyl-fs/commit/59620dce078d0a458d96ba0c82416f24b82cb95f) update vinyl (@contra) + +### v1.0.0 (2015/03/01 23:10 +00:00) +- [db025fe](https://github.com/gulpjs/vinyl-fs/commit/db025fe85b190414b28512c1f5ef08662564d4eb) 1.0.0 (@contra) +- [c7195ed](https://github.com/gulpjs/vinyl-fs/commit/c7195ed3a7c93b5206ba9a1035e84da479888f4e) 1.0.0 (@contra) +- [4a70dd6](https://github.com/gulpjs/vinyl-fs/commit/4a70dd63386db8abfeeb985630406e1a39f776a5) update dep, remove engineStrict (@contra) +- [#59](https://github.com/gulpjs/vinyl-fs/pull/59) Implemented `overwrite` option in `dest()` (@derekslife) +- [c4750b2](https://github.com/gulpjs/vinyl-fs/commit/c4750b2efccd840e4ae840dc55b01cb7051f2f48) Encapsulated error filtering logic into `isErrorFatal` func (@derekslife) +- [32fc5c8](https://github.com/gulpjs/vinyl-fs/commit/32fc5c805ec6209c3d2145036ff2eabff79845be) Updated docs for `overwrite` option (@derekslife) +- [5572793](https://github.com/gulpjs/vinyl-fs/commit/5572793954b63e1ec00983bad716af01e02476ef) Implemented `overwrite` option in `dest()` (@derekslife) +- [2dfe290](https://github.com/gulpjs/vinyl-fs/commit/2dfe2901cc329f5db86d0f2272d4292a2078d5a3) update watch to fix a bug with .remove (@contra) +- [#57](https://github.com/gulpjs/vinyl-fs/pull/57) Follow symlinks (@valeriangalliat) +- [a4ea945](https://github.com/gulpjs/vinyl-fs/commit/a4ea945cf04660fc007266c87caa43d345a5b1bc) Follow symlinks (@valeriangalliat) +- [041de1b](https://github.com/gulpjs/vinyl-fs/commit/041de1b6f20434a7bd6146fdf0a3425dfe301f96) update should (@contra) +- [#55](https://github.com/gulpjs/vinyl-fs/pull/55) Add `passthrough` option, fixes #25, fixes gulpjs/gulp#840 (@UltCombo) +- [972c8ad](https://github.com/gulpjs/vinyl-fs/commit/972c8ad3ac377ff7b4a03edeb04f52409d383dd4) Code style (@UltCombo) +- [b9629ea](https://github.com/gulpjs/vinyl-fs/commit/b9629ea6e9b9b797b518ab8192f4a2ec446ea325) Add `passthrough` option, fixes #25, fixes gulpjs/gulp#840 (@UltCombo) +- [318a983](https://github.com/gulpjs/vinyl-fs/commit/318a983832408ddc5500b27cfcb8c5cb07c8af11) new glob-watcher (@contra) +- [#53](https://github.com/gulpjs/vinyl-fs/pull/53) Remove unnecessary `coveralls` from devDependencies (@shinnn) +- [1ccdc53](https://github.com/gulpjs/vinyl-fs/commit/1ccdc53e22e2449a8b1f9fdc9dfbe7cd526f1dec) remove unnecessary `coveralls` from devDeps (@shinnn) +- [#52](https://github.com/gulpjs/vinyl-fs/pull/52) Update dotfiles and readme (@shinnn) +- [87c36ed](https://github.com/gulpjs/vinyl-fs/commit/87c36ede9da5e1508e62a984da4ebc9c8412f6d2) introduce istanbul-coveralls (@shinnn) +- [fb1a0fa](https://github.com/gulpjs/vinyl-fs/commit/fb1a0fa6bf4028f54629014f89fee0dd148945b6) use sag badges instead of png badges (@shinnn) +- [5e1b24b](https://github.com/gulpjs/vinyl-fs/commit/5e1b24b4d2a811a02ae7b6449d4f0de778bbe4ef) update dotfiles (@shinnn) +- [96c721f](https://github.com/gulpjs/vinyl-fs/commit/96c721f07b59964849b15d737ab8abaf52377312) clean up empty object allocation (@contra) +- [6e97447](https://github.com/gulpjs/vinyl-fs/commit/6e97447dab806b1da7df52d9d4da337d49fe71cb) logic consolidation (@contra) +- [6f8f045](https://github.com/gulpjs/vinyl-fs/commit/6f8f0459e51fe4c1065a0e693fbcdc26776b6e78) more style normalization (@contra) +- [141ff43](https://github.com/gulpjs/vinyl-fs/commit/141ff43302dec6535d086cf27d538530161952c5) style normalization (@contra) +- [500f5cf](https://github.com/gulpjs/vinyl-fs/commit/500f5cf9100256db5ea2d180773385bacaca251e) logic cleanups (@contra) +- [f081c21](https://github.com/gulpjs/vinyl-fs/commit/f081c21cb264164fee8896056bd0337f734c1904) code cleanups in dest logic (@contra) +- [2692230](https://github.com/gulpjs/vinyl-fs/commit/269223036d24fe700dba8b5b9f04ad4023eadb2a) fix dest memory leak when writing streams (@contra) +- [3d2c6c0](https://github.com/gulpjs/vinyl-fs/commit/3d2c6c0350407b3b98c7d2e7950f999f3832b2de) report errors preparing write on symlinks (@contra) +- [4481668](https://github.com/gulpjs/vinyl-fs/commit/448166864ba6c973055eb205575c3e392cf0f39a) add dirMode param to dest and symlink, closes #36 (@contra) +- [#49](https://github.com/gulpjs/vinyl-fs/pull/49) Add symlink support (Fixes #42) (@JonAbrams) +- [558f374](https://github.com/gulpjs/vinyl-fs/commit/558f3744489d5e671f4172453b24ba62bfd9b102) new glob ordering (@contra) +- [5876564](https://github.com/gulpjs/vinyl-fs/commit/587656487d7cd8a56cadd57d311d28af820377a0) Match function to prepareWrite.js filename (@JonAbrams) +- [21d7528](https://github.com/gulpjs/vinyl-fs/commit/21d7528f04afbc88529a69e81e4c64823edbbfe9) Move and rename to prepareWrite.js (@JonAbrams) +- [b447d5e](https://github.com/gulpjs/vinyl-fs/commit/b447d5ea22bbd9a54bcdceccac8e94c0bd0e18e7) Fix jshint warnings (@JonAbrams) +- [15af3e5](https://github.com/gulpjs/vinyl-fs/commit/15af3e58512c2cdfb00fcc6f8850cfffa69ef431) De-dup common code between dest + symlink (#42) (@JonAbrams) +- [4392605](https://github.com/gulpjs/vinyl-fs/commit/439260503481296ac8f3482ee901434fd7e3969e) Add symlink support (Fixes #42) (@JonAbrams) +- [#47](https://github.com/gulpjs/vinyl-fs/pull/47) option.since implementation (@doowb) +- [8cca620](https://github.com/gulpjs/vinyl-fs/commit/8cca62066c07ce4cc75f390aeb523c228cd887c3) updates per @contra (@doowb) +- [cec31c6](https://github.com/gulpjs/vinyl-fs/commit/cec31c66d03c0e9c57b6e7223ea2e1029b0b5110) docs (@doowb) +- [3d440b3](https://github.com/gulpjs/vinyl-fs/commit/3d440b3dfe745261239071335b3839a8a12460b7) check for instance of Date (@doowb) +- [44cc193](https://github.com/gulpjs/vinyl-fs/commit/44cc193a9984a012f93082fa940516ad6249023f) since implementation (@doowb) +- [#44](https://github.com/gulpjs/vinyl-fs/pull/44) Swap defaults dependency with object-assign. (@ben-eb) +- [c07074c](https://github.com/gulpjs/vinyl-fs/commit/c07074c835cae9361973c1046a3f0522565a919d) Swap defaults dep with object-assign. (@ben-eb) + +### v0.3.14 (2015/09/21 23:57 +00:00) +- [5b056f6](https://github.com/gulpjs/vinyl-fs/commit/5b056f66c476ff32687c172d5fe79eaf47b2e80e) update object-assign dep (@contra) +- [27983ef](https://github.com/gulpjs/vinyl-fs/commit/27983ef0114ceb16abd82a5c47557cb0be95ae62) merge (@contra) +- [7ca959e](https://github.com/gulpjs/vinyl-fs/commit/7ca959e8ac89034e0e09714da76eb06b7b55d61c) remove watch #92 (@contra) +- [#90](https://github.com/gulpjs/vinyl-fs/pull/90) Updated merge-stream version to 1.0.0 (@davidbarrows) +- [22e5e13](https://github.com/gulpjs/vinyl-fs/commit/22e5e13f8edf399cf286f5d908a1bd6766308408) Updated merge-stream version to 1.0.0 (@davidbarrows) +- [#88](https://github.com/gulpjs/vinyl-fs/pull/88) fix wrong event name in README.md (@kketch) +- [65445ec](https://github.com/gulpjs/vinyl-fs/commit/65445ec16f1546b268c6a66c2ee798baa94883c8) fix wrong event name in README.md (@kketch) +- [#85](https://github.com/gulpjs/vinyl-fs/pull/85) Add symlink passthrough with `followSymlinks` (@Klowner) +- [9f5f6e8](https://github.com/gulpjs/vinyl-fs/commit/9f5f6e8770b4e1364381bfdc832a1c4aacd68274) Add symlink copy with `followSymlinks` option (@Klowner) +- [#82](https://github.com/gulpjs/vinyl-fs/pull/82) symlink opt.base should be the same as dest (@stevemao) +- [0b3eed2](https://github.com/gulpjs/vinyl-fs/commit/0b3eed2d84a7b8c134b990a2234916b24e54906b) symlink opt.base should be the same as dest (@stevemao) +- [3e2a5ef](https://github.com/gulpjs/vinyl-fs/commit/3e2a5ef63c98b9ef44b3d05cdc6c03bdb9c2392b) base can be a function now, also add better error messaging. closes #78 (@contra) +- [#81](https://github.com/gulpjs/vinyl-fs/pull/81) use valid semver range for `engine` (@silverwind) +- [69090c4](https://github.com/gulpjs/vinyl-fs/commit/69090c41d79bcb7c492fab6c4ac1a7788a0e8dc7) use valid semver range for `engine` (@silverwind) +- [65090b8](https://github.com/gulpjs/vinyl-fs/commit/65090b81b98c8ed80fda247495d8015701d62813) Merge branch 'master' of https://github.com/wearefractal/vinyl-fs (@contra) +- [b481130](https://github.com/gulpjs/vinyl-fs/commit/b48113066f04fa5a240770132fbf1e57af12687c) fix filter-since (@contra) +- [#79](https://github.com/gulpjs/vinyl-fs/pull/79) add missing test for f7516ebac102104ad0f39437f7739bf5aedec165 (@stevemao) +- [8e8135c](https://github.com/gulpjs/vinyl-fs/commit/8e8135c3f99c4669129295e65b54581c45535191) update vinyl-filter-since (@contra) +- [cb86d86](https://github.com/gulpjs/vinyl-fs/commit/cb86d86deefa593f3099d2494e06cbc59b69e9bc) add missing test for f7516ebac102104ad0f39437f7739bf5aedec165 (@stevemao) +- [a8161c8](https://github.com/gulpjs/vinyl-fs/commit/a8161c87f38d465497c63ec3158f0f033868b60b) update vinyl filter since (@contra) +- [99db7de](https://github.com/gulpjs/vinyl-fs/commit/99db7de8f0485c5ca158c79126b53b8fdab9d821) add sourcemaps to dest, clear up some dead src code now that empty arrays arent valid globs, dep updates (@contra) +- [d32876f](https://github.com/gulpjs/vinyl-fs/commit/d32876f8df5a8a28f71b476ae907644ab5d35c07) update deps (@contra) +- [#77](https://github.com/gulpjs/vinyl-fs/pull/77) Improvements (@stevemao) +- [f7516eb](https://github.com/gulpjs/vinyl-fs/commit/f7516ebac102104ad0f39437f7739bf5aedec165) Expose `options.base` for `dest` (@stevemao) +- [435c401](https://github.com/gulpjs/vinyl-fs/commit/435c40193acebdaca62a9d688ceec5875b1ece15) test on iojs and 0.12 (@stevemao) +- [a3b1aa6](https://github.com/gulpjs/vinyl-fs/commit/a3b1aa6d5446760bf18de77ebf2aa199bef9f9b0) Make readme more consistent (@stevemao) +- [#75](https://github.com/gulpjs/vinyl-fs/pull/75) Fix default option in README (@stevemao) +- [a0820f4](https://github.com/gulpjs/vinyl-fs/commit/a0820f4ec4737ab826999cde2dda6ee0dae2db03) Fix default option in README (@stevemao) +- [812d0e6](https://github.com/gulpjs/vinyl-fs/commit/812d0e6ef55ac7ecd6e7dc83ef6f58e324837354) add new glob tests, empty string is a failing glob now. https://github.com/google/material-design-lite/issues/790 (@contra) +- [1b7322d](https://github.com/gulpjs/vinyl-fs/commit/1b7322d800008095596da9472801a2ddabcdf938) Merge branch 'master' of https://github.com/wearefractal/vinyl-fs (@contra) +- [5af3ed8](https://github.com/gulpjs/vinyl-fs/commit/5af3ed844d4dac6a84cf836aa09373ad2d3193dd) fix dir symlinks on windows, closes #74 (@contra) +- [#73](https://github.com/gulpjs/vinyl-fs/pull/73) using is-valid-glob module to handle nested arrays properly (@doowb) +- [0a6bcb1](https://github.com/gulpjs/vinyl-fs/commit/0a6bcb15067f2ac0b534d17c0f66aa9616c2bd54) using is-valid-glob module to handle nested arrays properly (@doowb) +- [baf97e1](https://github.com/gulpjs/vinyl-fs/commit/baf97e1f66caa4f1a9f9630620233c8c927f7509) passing options through to readers is still a good idea, so not a full revert. #72 (@contra) +- [f6ead3c](https://github.com/gulpjs/vinyl-fs/commit/f6ead3cec64c27a86f2a2e497d75e8a4f235339c) remove stripBOM flag, document BOM stripping. #72 (@contra) +- [#71](https://github.com/gulpjs/vinyl-fs/pull/71) Update vinyl to 0.5.x (@lijunle) +- [3a44b5d](https://github.com/gulpjs/vinyl-fs/commit/3a44b5da290c1d0279381a4d13f8816bc2ebb014) Update vinyl to 0.5.x (@lijunle) +- [#69](https://github.com/gulpjs/vinyl-fs/pull/69) update license attribute (@pgilad) +- [23640fd](https://github.com/gulpjs/vinyl-fs/commit/23640fde7378465625b2e0579bb661c7501b0e04) update license attribute (@pgilad) +- [60685eb](https://github.com/gulpjs/vinyl-fs/commit/60685eb89e57f61c4462855532f43d75f0a616db) fix problem where you couldnt catch singular glob errors. add sourcemaps into src (@contra) +- [12dec99](https://github.com/gulpjs/vinyl-fs/commit/12dec99a99af362ddfa2a0f7af7a39063803f182) dep updates (@contra) +- [#63](https://github.com/gulpjs/vinyl-fs/pull/63) export `filterSince` to `vinyl-filter-since` (@tunnckoCore) +- [9bbf989](https://github.com/gulpjs/vinyl-fs/commit/9bbf989151a912307686d36dc6ee4ef01cdbd38f) bump to `vinyl-filter-since@v2` (@tunnckoCore) +- [1a788e8](https://github.com/gulpjs/vinyl-fs/commit/1a788e826951939e81ab1a2505f2aaf2a9cde264) Merge github.com:wearefractal/vinyl-fs (@tunnckoCore) +- [#65](https://github.com/gulpjs/vinyl-fs/pull/65) Remove realMode equality test on special bit test (@Meroje) +- [627ace7](https://github.com/gulpjs/vinyl-fs/commit/627ace7702895c35f313d439c357e6387961d05a) Remove realMode equality test on special bit test (@Meroje) +- [fd9388d](https://github.com/gulpjs/vinyl-fs/commit/fd9388db1a15afe1e3c748d3859ab969c34ba1db) merge in blaines changes (@contra) +- [fda2a71](https://github.com/gulpjs/vinyl-fs/commit/fda2a71b8d26580f8dc564636005f78514e2b791) fix some tests, update deps (@contra) +- [#64](https://github.com/gulpjs/vinyl-fs/pull/64) switch to glob-watcher 2.0 (@phated) +- [6524088](https://github.com/gulpjs/vinyl-fs/commit/65240883f15b9f0aa792735a2f358c3ee5761c51) switch to glob-watcher 2.0 +- [5d9f058](https://github.com/gulpjs/vinyl-fs/commit/5d9f0581b0d3985d135b507086dbd464e4aaafb9) export `filterSince` to `vinyl-filter-since` (@tunnckoCore) +- [#62](https://github.com/gulpjs/vinyl-fs/pull/62) Fix mode comparison (@Meroje) +- [ba57ce7](https://github.com/gulpjs/vinyl-fs/commit/ba57ce76e978850f79f78bba9b8aa1a73ac5fb2f) Test for chmod with additional bits (@Meroje) +- [0c3516b](https://github.com/gulpjs/vinyl-fs/commit/0c3516bd67ca56810f3e587cda12584caced223e) Fix mode comparison (@Meroje) + +### v0.3.13 (2014/11/13 23:18 +00:00) +- [315e76a](https://github.com/gulpjs/vinyl-fs/commit/315e76a248e9d150f228e4ef50b61de15dc55123) 0.3.13 (@contra) +- [ac5b449](https://github.com/gulpjs/vinyl-fs/commit/ac5b449ec49b4de5f10313d31fd8e8effed0421b) switch off lodash to reduce size (@contra) + +### v0.3.12 (2014/11/13 23:01 +00:00) +- [84a3fe9](https://github.com/gulpjs/vinyl-fs/commit/84a3fe96dd162041eac9c9d4465cc1369659027a) 0.3.12 (@contra) +- [b963614](https://github.com/gulpjs/vinyl-fs/commit/b963614bf206862f9bed60bab16ed7038f554c42) exclude files to save space (@contra) + +### v0.3.11 (2014/11/04 18:56 +00:00) +- [5ee1404](https://github.com/gulpjs/vinyl-fs/commit/5ee1404cc25b54fc338e6f84909e87be2eb09e84) 0.3.11 (@contra) +- [#41](https://github.com/gulpjs/vinyl-fs/pull/41) use default mode for new files and directories (@joachimgit) +- [99661c5](https://github.com/gulpjs/vinyl-fs/commit/99661c5881cf2b22545be688c68318c6b7541df1) use default mode for new files and directories (@joachimgit) +- [c0cf9d0](https://github.com/gulpjs/vinyl-fs/commit/c0cf9d0663460881f9ee97310f44e382d9a09fbe) small style fix (@contra) + +### v0.3.10 (2014/10/22 06:48 +00:00) +- [c6e7433](https://github.com/gulpjs/vinyl-fs/commit/c6e7433a93d052905611680dc3f6f87c8e629376) 0.3.10 (@contra) +- [793f538](https://github.com/gulpjs/vinyl-fs/commit/793f538beaa275a6d31f67e5499cb96949654699) remove duplexer2 which was broken (@contra) +- [1e3b338](https://github.com/gulpjs/vinyl-fs/commit/1e3b33883c5a9efbb28ec9141564bdfe6292c716) end false (@contra) + +### v0.3.9 (2014/10/09 18:34 +00:00) +- [37c648d](https://github.com/gulpjs/vinyl-fs/commit/37c648da6826b36600f48c3002a03b1248d4f58e) 0.3.9 (@contra) +- [6bba193](https://github.com/gulpjs/vinyl-fs/commit/6bba193c8395d2e32ccfa332684bec1bdd52d4ad) empty arrays = dead stream, closes #40 (@contra) +- [3e3d371](https://github.com/gulpjs/vinyl-fs/commit/3e3d371c41a9e3e50a9af9ad5f5c8634744dcd6d) fix that potentially closes #25 (@contra) + +### v0.3.8 (2014/09/29 22:16 +00:00) +- [0507aed](https://github.com/gulpjs/vinyl-fs/commit/0507aed94a1902ee61a45f77caf059669fb7ea76) 0.3.8 (@contra) +- [4d95e2e](https://github.com/gulpjs/vinyl-fs/commit/4d95e2e19f35045ca5ec66d697167078696bfc86) lstat (@contra) +- [#37](https://github.com/gulpjs/vinyl-fs/pull/37) Docs link fix (@yuvilio) +- [b9f3053](https://github.com/gulpjs/vinyl-fs/commit/b9f3053a8640839c2098f43066d06cc11d2e6196) Docs link fix (@yuvilio) + +### v0.3.7 (2014/08/29 07:10 +00:00) +- [1a5efe8](https://github.com/gulpjs/vinyl-fs/commit/1a5efe8d1f7d698691103f2fdc21e07dc1bd5634) 0.3.7 (@contra) +- [97d3195](https://github.com/gulpjs/vinyl-fs/commit/97d3195464893ad526f40a6355c792d35ab562e6) update deps (@contra) +- [#34](https://github.com/gulpjs/vinyl-fs/pull/34) Chmod mode to match the vinyl object (@oconnore) +- [a73458e](https://github.com/gulpjs/vinyl-fs/commit/a73458e33aba6de1ee2852a1374da7e8c8225e22) reduce nesting per review +- [cf8e5fd](https://github.com/gulpjs/vinyl-fs/commit/cf8e5fd59070beedf88936527935168d18afbbfc) Code review changes +- [e5684ac](https://github.com/gulpjs/vinyl-fs/commit/e5684ace84d0d226c382a77d505e1517c6f4c7a3) Check final mode in no-chmod test +- [dc8e769](https://github.com/gulpjs/vinyl-fs/commit/dc8e7691430555c4fe419825306426062c3e03e8) Fix a fall through error +- [b20d11b](https://github.com/gulpjs/vinyl-fs/commit/b20d11bbbaf9e244e16af7eabb7c98af213e7a89) Test stat/chmod approach with sinon stubs +- [126164a](https://github.com/gulpjs/vinyl-fs/commit/126164a4f2056d3cb1996c39562a2a008153975d) Test if the file should be chmod'ed + +### v0.3.6 (2014/08/02 04:56 +00:00) +- [7256498](https://github.com/gulpjs/vinyl-fs/commit/72564989a5dc17468e645f00ae811f8614dec17b) 0.3.6 (@contra) +- [dc9d723](https://github.com/gulpjs/vinyl-fs/commit/dc9d7230a4173792b0296e54a9560b44103d50c2) update vinyl dep (@contra) +- [387c47b](https://github.com/gulpjs/vinyl-fs/commit/387c47b6fda5f0af8f95b93e513bc130bee3cdd3) Satisfy the bot. +- [5887067](https://github.com/gulpjs/vinyl-fs/commit/58870677ff458a3e855ac87f2d165f43c4aafd2e) Chmod mode to match the vinyl object + +### v0.3.5 (2014/07/30 23:04 +00:00) +- [22edfd2](https://github.com/gulpjs/vinyl-fs/commit/22edfd20dc2fbad888fedd022d02fdf933bf30b6) 0.3.5 (@contra) +- [20a7a05](https://github.com/gulpjs/vinyl-fs/commit/20a7a0525b80cf0884cf73bee9690e1dab17a2bb) fix dep tree (@contra) +- [#33](https://github.com/gulpjs/vinyl-fs/pull/33) Display the invalid glob in error message (@kevinwestern) +- [726b3a1](https://github.com/gulpjs/vinyl-fs/commit/726b3a1ac771c90a8186828e3eb37ad9f4832df8) Display the invalid glob in error message (@kevinwestern) + +### v0.3.4 (2014/06/27 06:07 +00:00) +- [a83eb9a](https://github.com/gulpjs/vinyl-fs/commit/a83eb9a53aa0c4e50306a20845111ccda276146d) 0.3.4 (@contra) +- [4f4a3f3](https://github.com/gulpjs/vinyl-fs/commit/4f4a3f363cf491de80afdcf58f9926d2bfeb408e) resume stream (@contra) + +### v0.3.3 (2014/06/26 16:35 +00:00) +- [52ce21b](https://github.com/gulpjs/vinyl-fs/commit/52ce21ba241f73f0348d7683306c1175ce6c88b3) 0.3.3 (@contra) +- [#29](https://github.com/gulpjs/vinyl-fs/pull/29) Quick fix for using through2 to create dest stream (@tomchentw) +- [c678bd4](https://github.com/gulpjs/vinyl-fs/commit/c678bd469e11e768713219b774fa82aa781e4fef) test(dest): also added finish event check for #26 (@tomchentw) +- [595e96e](https://github.com/gulpjs/vinyl-fs/commit/595e96e45f12fc868f9ce256d0421da7f4932843) test(dest): added test case for #26 (@tomchentw) +- [8bf8612](https://github.com/gulpjs/vinyl-fs/commit/8bf8612702e228fcc0c678acafe7634f2c6b269b) fix(vfs.dest): attatched an noop data listener (@tomchentw) + +### v0.3.2 (2014/06/25 18:34 +00:00) +- [8fef1ed](https://github.com/gulpjs/vinyl-fs/commit/8fef1ed6d65a2532271983360d8700ec8dd03023) 0.3.2 (@contra) +- [#27](https://github.com/gulpjs/vinyl-fs/pull/27) Removed through2-map dependency (@tomchentw) +- [ede010b](https://github.com/gulpjs/vinyl-fs/commit/ede010be5aa110f55f2fc9daa34c1643e377e11c) feat(index.js): removed through2-map dependency (@tomchentw) +- [d1433cb](https://github.com/gulpjs/vinyl-fs/commit/d1433cb41ed3e0bf78bc2ea3a52e0599cccc45c2) .npmignore (@contra) +- [74347cc](https://github.com/gulpjs/vinyl-fs/commit/74347ccc71e5189e5d8809919fb145cfa9657481) .npmignore (@contra) +- [7c66ea2](https://github.com/gulpjs/vinyl-fs/commit/7c66ea2f09acb2dba51b192ccc8a8f09ef01489f) .npmignore (@contra) +- [cece0dc](https://github.com/gulpjs/vinyl-fs/commit/cece0dc68dfc1ebd3b344e367a4a269c43f15a0e) .npmignore (@contra) +- [33ac098](https://github.com/gulpjs/vinyl-fs/commit/33ac098ca8ff2e3216399784cd58b775d764ccab) .npmignore (@contra) +- [831044b](https://github.com/gulpjs/vinyl-fs/commit/831044b683c65eb9858323dc2744fd3ec33d82e1) .npmignore (@contra) +- [ff582cc](https://github.com/gulpjs/vinyl-fs/commit/ff582ccd55e6481134f6c44d1d2cb1dfc338818c) .npmignore (@contra) +- [fe75d6a](https://github.com/gulpjs/vinyl-fs/commit/fe75d6af6703bf2b6711ca1abfe9832d1d836375) .npmignore (@contra) +- [0c1da37](https://github.com/gulpjs/vinyl-fs/commit/0c1da37d252d16a171f30dfea42714bb208d1b3d) .npmignore (@contra) +- [10e6b53](https://github.com/gulpjs/vinyl-fs/commit/10e6b53bd9f8683408f6394c04142ac55ab9f493) .gitignore (@contra) +- [97296ef](https://github.com/gulpjs/vinyl-fs/commit/97296ef8e724953570ab989b043692cea5ba9062) .npmignore (@contra) +- [a12356c](https://github.com/gulpjs/vinyl-fs/commit/a12356c36cfd24e19d0c88225d364368ae7dac36) .gitignore (@contra) +- [7a7f2e5](https://github.com/gulpjs/vinyl-fs/commit/7a7f2e544b5eacf595bcc1fd9cac34de880ec071) .jshintrc (@contra) + +### v0.3.1 (2014/06/25 14:28 +00:00) +- [6004e32](https://github.com/gulpjs/vinyl-fs/commit/6004e32a6c5dca3f9361695d1b9797bbc4529337) 0.3.1 (@contra) +- [#26](https://github.com/gulpjs/vinyl-fs/pull/26) feat(lib/*.js): change map-stream to through2 (@tomchentw) +- [b181693](https://github.com/gulpjs/vinyl-fs/commit/b181693e7c2dd1b3992be02af899b8024669771c) styles(lib): changed done back to cb (@tomchentw) +- [c5d76e5](https://github.com/gulpjs/vinyl-fs/commit/c5d76e51157a7ae7788d7dd762145ca48a701dfb) feat(lib/*.js): change map-stream to through2@0.5.1 (@tomchentw) +- [583d30e](https://github.com/gulpjs/vinyl-fs/commit/583d30efd72267b59752f98a920541b1cfadb31c) function for dest, closes #15 (@contra) +- [d0ba8bb](https://github.com/gulpjs/vinyl-fs/commit/d0ba8bba4519df2b6bb41f0f07cfaf1d7a5fbf7d) make src a passthrough, clean up mode logic in dest, jshint, stylize (@contra) +- [c9b2c07](https://github.com/gulpjs/vinyl-fs/commit/c9b2c075dbb55ee97cd6ab9909bd1e1f87bf77e0) update graceful-fs dep (@contra) +- [7af93d0](https://github.com/gulpjs/vinyl-fs/commit/7af93d0c63822f17183b89ec591622d14f9f17ca) update travis yml (@contra) +- [49fb44d](https://github.com/gulpjs/vinyl-fs/commit/49fb44d44d6891f450c4c7cef9bda3caa4035107) 0.2.0 - BOM stripping and dep updates (@contra) +- [#21](https://github.com/gulpjs/vinyl-fs/pull/21) Strip BOM when reading UTF-8 files (@mathiasbynens) +- [4c1fc02](https://github.com/gulpjs/vinyl-fs/commit/4c1fc02bab8c2ca8fcefe0bff80347cc0b17712b) Strip BOM when reading UTF-8-encoded files (@mathiasbynens) +- [abd2fe4](https://github.com/gulpjs/vinyl-fs/commit/abd2fe4e1e32ef46d7544ce90fe941ece3a49a55) rollback gaze update (@contra) +- [103bb8c](https://github.com/gulpjs/vinyl-fs/commit/103bb8ca0b16e888ee44146603d5591220e228f4) update glob-watcher (@contra) +- [a319889](https://github.com/gulpjs/vinyl-fs/commit/a319889b9cbad1db0097d041ad02e0e2f76640bf) check src and dest args, closes #8 (@contra) +- [671197a](https://github.com/gulpjs/vinyl-fs/commit/671197a54ddda0277abdc0c1c9fce27cc8ab9b86) drop support for 0.9 (@contra) +- [f89e03e](https://github.com/gulpjs/vinyl-fs/commit/f89e03e62cb62dc6c28d0ebe6f146123be2232a7) 0.1.0 (@contra) +- [bb34369](https://github.com/gulpjs/vinyl-fs/commit/bb343692f3bbeab08b40b4bb1ee20af7205f2837) comment (@contra) +- [c1c866a](https://github.com/gulpjs/vinyl-fs/commit/c1c866a5277038056d52fb106b2bca8cea430e59) mergit (@contra) +- [cc81580](https://github.com/gulpjs/vinyl-fs/commit/cc81580a4818e2260a367c54bdcc42b0b4d0a5cc) respect file modes in dest, add mode option to dest (@contra) +- [#10](https://github.com/gulpjs/vinyl-fs/pull/10) Allow piping streaming vinyls through multiple .dest()'s (@hughsk) +- [d5566b2](https://github.com/gulpjs/vinyl-fs/commit/d5566b213b7e90a94b20aad35d4c08b2861c8247) Use ./src/streamFile for re-streaming .dest() streams (@hughsk) +- [868a3ec](https://github.com/gulpjs/vinyl-fs/commit/868a3ecc7945e798ee702cc30c5bcfff2af3ecd5) Allow piping streaming vinyls through multiple .dest()'s (@hughsk) +- [191d4ae](https://github.com/gulpjs/vinyl-fs/commit/191d4ae3672c76eb0cf0d46a2404c8e60e587d85) update file paths as they cruise through .dest (@contra) +- [cb69aa6](https://github.com/gulpjs/vinyl-fs/commit/cb69aa6c7ead7a435067fdfc89f89cd8af1215d4) cleanup (@contra) +- [f50d669](https://github.com/gulpjs/vinyl-fs/commit/f50d669a968f6f69ef07a0cc34b11704829c9c9f) add tests for relative cwd (@contra) +- [39dfc18](https://github.com/gulpjs/vinyl-fs/commit/39dfc189367154136718fa0958712b1b14ea5e5a) fix tests (@contra) +- [60dac5f](https://github.com/gulpjs/vinyl-fs/commit/60dac5fa38c3470556d987b01405d3ccca6af9ec) remove async dep (@contra) +- [1178422](https://github.com/gulpjs/vinyl-fs/commit/11784223e5a38795715c759333b352d40e83c76a) more tests (@contra) +- [ed50c02](https://github.com/gulpjs/vinyl-fs/commit/ed50c02ba3487e8f4212792a0db2aa39dbc060a6) directory test (@contra) +- [ee32c0a](https://github.com/gulpjs/vinyl-fs/commit/ee32c0a3a5f7aa30fc62a8481dd2f38aa410fa1a) more simplifying (@contra) +- [fb481f0](https://github.com/gulpjs/vinyl-fs/commit/fb481f0c6baedf89635faa1eb278cafb4b72c5bb) more simplifying (@contra) +- [a415173](https://github.com/gulpjs/vinyl-fs/commit/a4151738c740a760fa8b577a4f633ea6aad4055c) yep (@contra) +- [753add9](https://github.com/gulpjs/vinyl-fs/commit/753add9acc8cc0b3ff883f5228c972731a5fde74) simplify dest (@contra) +- [5325dcf](https://github.com/gulpjs/vinyl-fs/commit/5325dcf796e1e6db86a3c9abd58484f552c299f8) cwd in dest (@contra) +- [1b975fd](https://github.com/gulpjs/vinyl-fs/commit/1b975fdbf6c005674e86454b1a780b1fbf72f605) test cleaning (@contra) +- [abdcbb7](https://github.com/gulpjs/vinyl-fs/commit/abdcbb7fcd8b78469eaf784675df2d7c7a15c766) coveralls (@contra) +- [b7a8ebc](https://github.com/gulpjs/vinyl-fs/commit/b7a8ebcfa07865a283b5efe69303b795a2dcdd83) license update (@contra) +- [bac7381](https://github.com/gulpjs/vinyl-fs/commit/bac7381e31b7c30aed8ae925d12821cf65f9337e) more dep updates (@contra) +- [14f0a1e](https://github.com/gulpjs/vinyl-fs/commit/14f0a1eeaab5ca6a52042aae489a2da5ef78c318) badges and refactor (@contra) +- [8ac77fc](https://github.com/gulpjs/vinyl-fs/commit/8ac77fc245b8b3938c74748900358e9ad540e4bd) wait for file close in writeStream (@contra) +- [002273c](https://github.com/gulpjs/vinyl-fs/commit/002273cfae226d562a8b22173c3a718614444c7a) writeStream fix (@contra) +- [af64059](https://github.com/gulpjs/vinyl-fs/commit/af640595b1325385ce650b410f9091531447b35a) Merge branch 'master' of https://github.com/wearefractal/vinyl-fs (@contra) +- [5c36fbc](https://github.com/gulpjs/vinyl-fs/commit/5c36fbcaa7d7eca58fb5f035bf15492f4a3b737a) trim fat - graceful-fs, map-stream, etc. (@contra) +- [#3](https://github.com/gulpjs/vinyl-fs/pull/3) Fix broken refactor changes (@yyx990803) +- [c610342](https://github.com/gulpjs/vinyl-fs/commit/c610342755156dc9c059f21ac31a679623cef227) fix writePath +- [b09678b](https://github.com/gulpjs/vinyl-fs/commit/b09678b05069852d713a263e8526f30f83ecae23) require deps in writecontent.js +- [a30a0ea](https://github.com/gulpjs/vinyl-fs/commit/a30a0ea5ba65aa32b8a3a7a72fe6ddcbb20fe3fa) watch added (@contra) +- [209d4f2](https://github.com/gulpjs/vinyl-fs/commit/209d4f235fcd4419318527a96f6bc8757a4b87a7) flesh out more (@contra) +- [5958e7e](https://github.com/gulpjs/vinyl-fs/commit/5958e7e7b55bed41ae0972d721eae91ea9d21cbf) new vinyl file isDirectory changes (@contra) +- [7f8684b](https://github.com/gulpjs/vinyl-fs/commit/7f8684b87d93ee66fdbefe5397c8b7e365727d3d) more tests (@contra) +- [bf1f18c](https://github.com/gulpjs/vinyl-fs/commit/bf1f18cef59dff9ad01658b5e11968f2a3b11ff5) start tests (@contra) +- [23a1cff](https://github.com/gulpjs/vinyl-fs/commit/23a1cff61b8fcc07d543c1757a415591277a5425) fix deps (@contra) +- [35f230b](https://github.com/gulpjs/vinyl-fs/commit/35f230b2abe22e5fa0cc710a9bbbfb8dd3cfe3fa) start impl (@contra)
\ No newline at end of file diff --git a/node_modules/vinyl-fs/LICENSE b/node_modules/vinyl-fs/LICENSE new file mode 100755 index 000000000..3ebc30895 --- /dev/null +++ b/node_modules/vinyl-fs/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2013-2016 Fractal <contact@wearefractal.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/README.md b/node_modules/vinyl-fs/README.md new file mode 100644 index 000000000..f449c6b56 --- /dev/null +++ b/node_modules/vinyl-fs/README.md @@ -0,0 +1,293 @@ +<p align="center"> + <a href="http://gulpjs.com"> + <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png"> + </a> +</p> + +# vinyl-fs + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +[Vinyl][vinyl] adapter for the file system. + +## What is Vinyl? + +[Vinyl][vinyl] is a very simple metadata object that describes a file. When you think of a file, two attributes come to mind: `path` and `contents`. These are the main attributes on a [Vinyl][vinyl] object. A file does not necessarily represent something on your computer’s file system. You have files on S3, FTP, Dropbox, Box, CloudThingly.io and other services. [Vinyl][vinyl] can be used to describe files from all of these sources. + +## What is a Vinyl Adapter? + +While Vinyl provides a clean way to describe a file, we now need a way to access these files. Each file source needs what I call a "Vinyl adapter". A Vinyl adapter simply exposes a `src(globs)` and a `dest(folder)` method. Each return a stream. The `src` stream produces Vinyl objects, and the `dest` stream consumes Vinyl objects. Vinyl adapters can expose extra methods that might be specific to their input/output medium, such as the `symlink` method `vinyl-fs` provides. + +## Usage + +```javascript +var map = require('map-stream'); +var vfs = require('vinyl-fs'); + +var log = function(file, cb) { + console.log(file.path); + cb(null, file); +}; + +vfs.src(['./js/**/*.js', '!./js/vendor/*.js']) + .pipe(map(log)) + .pipe(vfs.dest('./output')); +``` + +## API + +### `src(globs[, options])` + +Takes a glob string or an array of glob strings as the first argument and an options object as the second. +Returns a stream of [vinyl] `File` objects. + +__Note: UTF-8 BOM will be stripped from all UTF-8 files read with `.src` unless disabled in the options.__ + +#### Globs + +Globs are executed in order, so negations should follow positive globs. + +For example: + +```js +fs.src(['!b*.js', '*.js']) +``` + +would not exclude any files, but the following would: + +```js +fs.src(['*.js', '!b*.js']) +``` + +#### Options + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +The folder relative to the cwd. This is used to determine the file names when saving in `.dest()`. + +Type: `String` + +Default: The part of the path before the glob (if any) begins. For example, `path/to/**/*.js` would resolve to `path/to`. If there is no glob (i.e. a file path with no pattern), then the dirname of the path is used. For example, `path/to/some/file.js` would resolve to `path/to/some`. + +##### `options.buffer` + +Whether or not you want to buffer the file contents into memory. Setting to `false` will make `file.contents` a paused Stream. + +Type: `Boolean` + +Default: `true` + +##### `options.read` + +Whether or not you want the file to be read at all. Useful for stuff like removing files. Setting to `false` will make `file.contents` `null` and will disable writing the file to disk via `.dest()`. + +Type: `Boolean` + +Default: `true` + +##### `options.since` + +Only streams files that have been modified since the time specified. + +Type: `Date` or `Number` + +Default: `undefined` + +##### `options.stripBOM` + +Causes the BOM to be stripped on UTF-8 encoded files. Set to `false` if you need the BOM for some reason. + +Type: `Boolean` + +Default: `true` + +##### `options.passthrough` + +Allows `.src` to be used in the middle of a pipeline (using a duplex stream) which passes through all objects received and adds all files globbed to the stream. + +Type: `Boolean` + +Default: `false` + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will load inline sourcemaps and resolve sourcemap links from files. Uses [gulp-sourcemaps] under the hood. + +Type: `Boolean` + +Default: `false` + +##### `options.followSymlinks` - `true` if you want + +Whether or not to recursively resolve symlinks to their targets. Setting to `false` to preserve them as symlinks and make `file.symlink` equal the original symlink's target path. + +Type: `Boolean` + +Default: `true` + +##### other + +Any glob-related options are documented in [glob-stream] and [node-glob]. +Any through2-related options are documented in [through2]. + +### `dest(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, writes them to disk at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +Once the file is written to disk, an attempt is made to determine if the `stat.mode`, `stat.mtime` and `stat.atime` of the [vinyl] `File` object differ from the file on the filesystem. +If they differ and the running process owns the file, the corresponding filesystem metadata is updated. +If they don't differ or the process doesn't own the file, the attempt is skipped silently. +__This functionality is disabled on Windows operating systems or any other OS that doesn't support `process.getuid` or `process.geteuid` in node. This is due to Windows having very unexpected results through usage of `fs.fchmod` and `fs.futimes`.__ + +If the file has a `symlink` attribute specifying a target path, then a symlink will be created. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + - `stat` will be updated to match the file on the filesystem. + - `contents` will have it's position reset to the beginning if it is a stream. + +#### Options + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +The folder relative to the cwd. This is used to determine the file names when saving in `.dest()`. Can also be a function that takes in a file and returns a folder path. + +Type: `String` or `Function` + +Default: The `cwd` resolved to the folder path. + +##### `options.mode` + +The mode the files should be created with. + +Type: `Number` + +Default: The `mode` of the input file (`file.stat.mode`) if any, or the process mode if the input file has no `mode` property. + +##### `options.dirMode` + +The mode the directory should be created with. + +Type: `Number` + +Default: The process `mode`. + +##### `options.overwrite` + +Whether or not existing files with the same path should be overwritten. Can also be a function that takes in a file and returns `true` or `false`. + +Type: `Boolean` or `Function` + +Default: `true` (always overwrite existing files) + +##### `options.sourcemaps` + +Enables sourcemap support on files passed through the stream. Will write inline soucemaps if specified as `true`. +Specifying a `string` is shorthand for the path option. Uses [gulp-sourcemaps] under the hood. + +Examples: + +```js +// Write as inline comments +vfs.dest('./', { + sourcemaps: true +}); + +// Write as files in the same folder +vfs.dest('./', { + sourcemaps: '.' +}); + +// Any other options are passed through to [gulp-sourcemaps] +vfs.dest('./', { + sourcemaps: { + path: '.', + addComment: false, + includeContent: false + } +}); +``` + +Type: `Boolean`, `String` or `Object` + +Default: `undefined` (do not write sourcemaps) + +##### other + +Any through2-related options are documented in [through2]. + +### `symlink(folder[, options])` + +Takes a folder path string or a function as the first argument and an options object as the second. If given a function, it will be called with each [vinyl] `File` object and must return a folder path. +Returns a stream that accepts [vinyl] `File` objects, create a symbolic link (i.e. symlink) at the folder/cwd specified, and passes them downstream so you can keep piping these around. + +__Note: The file will be modified after being written to this stream.__ + - `cwd`, `base`, and `path` will be overwritten to match the folder. + +#### Options + +##### `options.cwd` + +The working directory the folder is relative to. + +Type: `String` + +Default: `process.cwd()` + +##### `options.base` + +The folder relative to the cwd. This is used to determine the file names when saving in `.symlink()`. Can also be a function that takes in a file and returns a folder path. + +Type: `String` or `Function` + +Default: The `cwd` resolved to the folder path. + +##### `options.dirMode` + +The mode the directory should be created with. + +Type: `Number` + +Default: The process mode. + +##### other + +Any through2-related options are documented in [through2]. + +[glob-stream]: https://github.com/gulpjs/glob-stream +[gulp-sourcemaps]: https://github.com/floridoo/gulp-sourcemaps +[node-glob]: https://github.com/isaacs/node-glob +[gaze]: https://github.com/shama/gaze +[glob-watcher]: https://github.com/wearefractal/glob-watcher +[vinyl]: https://github.com/wearefractal/vinyl +[through2]: https://github.com/rvagg/through2 + +[downloads-image]: http://img.shields.io/npm/dm/vinyl-fs.svg +[npm-url]: https://www.npmjs.com/package/vinyl-fs +[npm-image]: https://badge.fury.io/js/vinyl-fs.svg + +[travis-url]: https://travis-ci.org/gulpjs/vinyl-fs +[travis-image]: https://travis-ci.org/gulpjs/vinyl-fs.svg?branch=master + +[coveralls-url]: https://coveralls.io/r/gulpjs/vinyl-fs +[coveralls-image]: https://coveralls.io/repos/gulpjs/vinyl-fs/badge.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/vinyl-fs/index.js b/node_modules/vinyl-fs/index.js new file mode 100644 index 000000000..acdeac2b1 --- /dev/null +++ b/node_modules/vinyl-fs/index.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + src: require('./lib/src'), + dest: require('./lib/dest'), + symlink: require('./lib/symlink'), +}; diff --git a/node_modules/vinyl-fs/lib/dest/index.js b/node_modules/vinyl-fs/lib/dest/index.js new file mode 100644 index 000000000..049ac9690 --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/index.js @@ -0,0 +1,54 @@ +'use strict'; + +var through2 = require('through2'); +var sourcemaps = require('gulp-sourcemaps'); +var duplexify = require('duplexify'); +var sink = require('../sink'); +var prepareWrite = require('../prepareWrite'); +var writeContents = require('./writeContents'); + +function dest(outFolder, opt) { + if (!opt) { + opt = {}; + } + + function saveFile(file, enc, cb) { + prepareWrite(outFolder, file, opt, function(err, writePath) { + if (err) { + return cb(err); + } + writeContents(writePath, file, cb); + }); + } + + var saveStream = through2.obj(opt, saveFile); + if (!opt.sourcemaps) { + // Sink the save stream to start flowing + // Do this on nextTick, it will flow at slowest speed of piped streams + process.nextTick(sink(saveStream)); + + return saveStream; + } + + var sourcemapOpt = opt.sourcemaps; + if (typeof sourcemapOpt === 'boolean') { + sourcemapOpt = {}; + } + if (typeof sourcemapOpt === 'string') { + sourcemapOpt = { + path: sourcemapOpt, + }; + } + + var mapStream = sourcemaps.write(sourcemapOpt.path, sourcemapOpt); + var outputStream = duplexify.obj(mapStream, saveStream); + mapStream.pipe(saveStream); + + // Sink the output stream to start flowing + // Do this on nextTick, it will flow at slowest speed of piped streams + process.nextTick(sink(outputStream)); + + return outputStream; +} + +module.exports = dest; diff --git a/node_modules/vinyl-fs/lib/dest/writeContents/index.js b/node_modules/vinyl-fs/lib/dest/writeContents/index.js new file mode 100644 index 000000000..1382d9567 --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/writeContents/index.js @@ -0,0 +1,59 @@ +'use strict'; + +var writeDir = require('./writeDir'); +var writeStream = require('./writeStream'); +var writeBuffer = require('./writeBuffer'); +var writeSymbolicLink = require('./writeSymbolicLink'); + +function writeContents(writePath, file, callback) { + // If directory then mkdirp it + if (file.isDirectory()) { + return writeDir(writePath, file, written); + } + + // Stream it to disk yo + if (file.isStream()) { + return writeStream(writePath, file, written); + } + + // Write it as a symlink + if (file.symlink) { + return writeSymbolicLink(writePath, file, written); + } + + // Write it like normal + if (file.isBuffer()) { + return writeBuffer(writePath, file, written); + } + + // If no contents then do nothing + if (file.isNull()) { + return written(); + } + + // This is invoked by the various writeXxx modules when they've finished + // writing the contents. + function written(err) { + if (isErrorFatal(err)) { + return callback(err); + } + + callback(null, file); + } + + function isErrorFatal(err) { + if (!err) { + return false; + } + + if (err.code === 'EEXIST' && file.flag === 'wx') { + // Handle scenario for file overwrite failures. + return false; // "These aren't the droids you're looking for" + } + + // Otherwise, this is a fatal error + return true; + } +} + +module.exports = writeContents; diff --git a/node_modules/vinyl-fs/lib/dest/writeContents/writeBuffer.js b/node_modules/vinyl-fs/lib/dest/writeContents/writeBuffer.js new file mode 100644 index 000000000..f23a4aa05 --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/writeContents/writeBuffer.js @@ -0,0 +1,26 @@ +'use strict'; + +var fo = require('../../fileOperations'); + +function writeBuffer(writePath, file, written) { + var opt = { + mode: file.stat.mode, + flag: file.flag, + }; + + fo.writeFile(writePath, file.contents, opt, onWriteFile); + + function onWriteFile(writeErr, fd) { + if (writeErr) { + return fo.closeFd(writeErr, fd, written); + } + + fo.updateMetadata(fd, file, onUpdate); + } + + function onUpdate(statErr, fd) { + fo.closeFd(statErr, fd, written); + } +} + +module.exports = writeBuffer; diff --git a/node_modules/vinyl-fs/lib/dest/writeContents/writeDir.js b/node_modules/vinyl-fs/lib/dest/writeContents/writeDir.js new file mode 100644 index 000000000..ef7622c9c --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/writeContents/writeDir.js @@ -0,0 +1,53 @@ +'use strict'; + +var fs = require('graceful-fs'); +var mkdirp = require('mkdirp'); + +var fo = require('../../fileOperations'); + +function writeDir(writePath, file, written) { + var mkdirpOpts = { + mode: file.stat.mode, + fs: fs, + }; + mkdirp(writePath, mkdirpOpts, onMkdirp); + + function onMkdirp(mkdirpErr) { + if (mkdirpErr) { + return written(mkdirpErr); + } + + fs.open(writePath, 'r', onOpen); + } + + function onOpen(openErr, fd) { + // If we don't have access, just move along + if (isInaccessible(openErr)) { + return fo.closeFd(null, fd, written); + } + + if (openErr) { + return fo.closeFd(openErr, fd, written); + } + + fo.updateMetadata(fd, file, onUpdate); + } + + function onUpdate(statErr, fd) { + fo.closeFd(statErr, fd, written); + } +} + +function isInaccessible(err) { + if (!err) { + return false; + } + + if (err.code === 'EACCES') { + return true; + } + + return false; + } + +module.exports = writeDir; diff --git a/node_modules/vinyl-fs/lib/dest/writeContents/writeStream.js b/node_modules/vinyl-fs/lib/dest/writeContents/writeStream.js new file mode 100644 index 000000000..e9af5f1d9 --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/writeContents/writeStream.js @@ -0,0 +1,57 @@ +'use strict'; + +var fs = require('graceful-fs'); + +var fo = require('../../fileOperations'); +var streamFile = require('../../src/getContents/streamFile'); + +function writeStream(writePath, file, written) { + var opt = { + mode: file.stat.mode, + flag: file.flag, + }; + + var outStream = fs.createWriteStream(writePath, opt); + + file.contents.once('error', complete); + file.contents.once('end', readStreamEnd); + outStream.once('error', complete); + outStream.once('finish', complete); + + // Streams are piped with end disabled, this prevents the + // WriteStream from closing the file descriptor after all + // data is written. + file.contents.pipe(outStream, { end: false }); + + function readStreamEnd() { + streamFile(file, complete); + } + + function end(propagatedErr) { + outStream.end(onEnd); + + function onEnd(endErr) { + written(propagatedErr || endErr); + } + } + + // Cleanup + function complete(streamErr) { + file.contents.removeListener('error', complete); + file.contents.removeListener('end', readStreamEnd); + outStream.removeListener('error', complete); + outStream.removeListener('finish', complete); + + if (streamErr) { + return end(streamErr); + } + + if (typeof outStream.fd !== 'number') { + return end(); + } + + fo.updateMetadata(outStream.fd, file, end); + } +} + +module.exports = writeStream; diff --git a/node_modules/vinyl-fs/lib/dest/writeContents/writeSymbolicLink.js b/node_modules/vinyl-fs/lib/dest/writeContents/writeSymbolicLink.js new file mode 100644 index 000000000..b09696926 --- /dev/null +++ b/node_modules/vinyl-fs/lib/dest/writeContents/writeSymbolicLink.js @@ -0,0 +1,20 @@ +'use strict'; + +var fs = require('graceful-fs'); + +function writeSymbolicLink(writePath, file, written) { + // TODO handle symlinks properly + fs.symlink(file.symlink, writePath, function(err) { + if (isFatalError(err)) { + return written(err); + } + + written(); + }); +} + +function isFatalError(err) { + return (err && err.code !== 'EEXIST'); +} + +module.exports = writeSymbolicLink; diff --git a/node_modules/vinyl-fs/lib/fileOperations.js b/node_modules/vinyl-fs/lib/fileOperations.js new file mode 100644 index 000000000..e323fb70e --- /dev/null +++ b/node_modules/vinyl-fs/lib/fileOperations.js @@ -0,0 +1,206 @@ +'use strict'; + +var fs = require('graceful-fs'); +var assign = require('object-assign'); +var isEqual = require('lodash.isequal'); +var isValidDate = require('vali-date'); + +// TODO shared module +// TODO include sticky/setuid/setgid, i.e. 7777? +var MASK_MODE = parseInt('0777', 8); +var DEFAULT_FILE_MODE = parseInt('0666', 8); +var APPEND_MODE_REGEXP = /a/; + +function closeFd(propagatedErr, fd, callback) { + if (typeof fd !== 'number') { + return callback(propagatedErr); + } + + fs.close(fd, onClosed); + + function onClosed(closeErr) { + if (propagatedErr || closeErr) { + return callback(propagatedErr || closeErr); + } + + callback(); + } +} + +function getModeDiff(fsMode, vinylMode) { + var modeDiff = 0; + + if (typeof vinylMode === 'number') { + modeDiff = (vinylMode ^ fsMode) & MASK_MODE; + } + + return modeDiff; +} + +function getTimesDiff(fsStat, vinylStat) { + + if (!isValidDate(vinylStat.mtime)) { + return; + } + + if (isEqual(vinylStat.mtime, fsStat.mtime) && + isEqual(vinylStat.atime, fsStat.atime)) { + return; + } + + var atime; + if (isValidDate(vinylStat.atime)) { + atime = vinylStat.atime; + } else { + atime = fsStat.atime; + } + + if (!isValidDate(atime)) { + atime = undefined; + } + + var timesDiff = { + mtime: vinylStat.mtime, + atime: atime, + }; + + return timesDiff; +} + +function isOwner(fsStat) { + var hasGetuid = (typeof process.getuid === 'function'); + var hasGeteuid = (typeof process.geteuid === 'function'); + + // If we don't have either, assume we don't have permissions. + // This should only happen on Windows. + // Windows basically noops fchmod and errors on futimes called on directories. + if (!hasGeteuid && !hasGetuid) { + return false; + } + + var uid; + if (hasGeteuid) { + uid = process.geteuid(); + } else { + uid = process.getuid(); + } + + if (fsStat.uid !== uid && uid !== 0) { + return false; + } + + return true; +} + +function updateMetadata(fd, file, callback) { + + fs.fstat(fd, onStat); + + function onStat(err, stat) { + if (err) { + return callback(err, fd); + } + + // Check if mode needs to be updated + var modeDiff = getModeDiff(stat.mode, file.stat.mode); + + // Check if atime/mtime need to be updated + var timesDiff = getTimesDiff(stat, file.stat); + + // Set file.stat to the reflect current state on disk + assign(file.stat, stat); + + // Nothing to do + if (!modeDiff && !timesDiff) { + return callback(null, fd); + } + + // Check access, `futimes` and `fchmod` only work if we own the file, + // or if we are effectively root. + if (!isOwner(stat)) { + return callback(null, fd); + } + + if (modeDiff) { + return mode(); + } + times(); + + function mode() { + var mode = stat.mode ^ modeDiff; + + fs.fchmod(fd, mode, onFchmod); + + function onFchmod(fchmodErr) { + if (!fchmodErr) { + file.stat.mode = mode; + } + if (timesDiff) { + return times(fchmodErr); + } + callback(fchmodErr, fd); + } + } + + function times(fchmodErr) { + fs.futimes(fd, timesDiff.atime, timesDiff.mtime, onFutimes); + + function onFutimes(futimesErr) { + if (!futimesErr) { + file.stat.atime = timesDiff.atime; + file.stat.mtime = timesDiff.mtime; + } + callback(fchmodErr || futimesErr, fd); + } + } + } +} + +/* + Custom writeFile implementation because we need access to the + file descriptor after the write is complete. + Most of the implementation taken from node core. + */ +function writeFile(path, data, options, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } + + if (!Buffer.isBuffer(data)) { + callback(new TypeError('Data must be a Buffer')); + return; + } + + if (!options) { + options = {}; + } + + // Default the same as node + var mode = options.mode || DEFAULT_FILE_MODE; + var flag = options.flag || 'w'; + var position = APPEND_MODE_REGEXP.test(flag) ? null : 0; + + fs.open(path, flag, mode, onOpen); + + function onOpen(err, fd) { + if (err) { + return onComplete(err); + } + + fs.write(fd, data, 0, data.length, position, onComplete); + + function onComplete(err) { + callback(err, fd); + } + } +} + +module.exports = { + closeFd: closeFd, + getModeDiff: getModeDiff, + getTimesDiff: getTimesDiff, + isOwner: isOwner, + updateMetadata: updateMetadata, + writeFile: writeFile, +}; diff --git a/node_modules/vinyl-fs/lib/filterSince.js b/node_modules/vinyl-fs/lib/filterSince.js new file mode 100644 index 000000000..234b58987 --- /dev/null +++ b/node_modules/vinyl-fs/lib/filterSince.js @@ -0,0 +1,16 @@ +'use strict'; + +var filter = require('through2-filter'); + +module.exports = function(d) { + var isValid = typeof d === 'number' || + d instanceof Number || + d instanceof Date; + + if (!isValid) { + throw new Error('expected since option to be a date or a number'); + } + return filter.obj(function(file) { + return file.stat && file.stat.mtime > d; + }); +}; diff --git a/node_modules/vinyl-fs/lib/prepareWrite.js b/node_modules/vinyl-fs/lib/prepareWrite.js new file mode 100644 index 000000000..50d86cd12 --- /dev/null +++ b/node_modules/vinyl-fs/lib/prepareWrite.js @@ -0,0 +1,69 @@ +'use strict'; + +var assign = require('object-assign'); +var path = require('path'); +var mkdirp = require('mkdirp'); +var fs = require('graceful-fs'); + +function booleanOrFunc(v, file) { + if (typeof v !== 'boolean' && typeof v !== 'function') { + return null; + } + + return typeof v === 'boolean' ? v : v(file); +} + +function stringOrFunc(v, file) { + if (typeof v !== 'string' && typeof v !== 'function') { + return null; + } + + return typeof v === 'string' ? v : v(file); +} + +function prepareWrite(outFolder, file, opt, cb) { + var options = assign({ + cwd: process.cwd(), + mode: (file.stat ? file.stat.mode : null), + dirMode: null, + overwrite: true, + }, opt); + var overwrite = booleanOrFunc(options.overwrite, file); + options.flag = (overwrite ? 'w' : 'wx'); + + var cwd = path.resolve(options.cwd); + var outFolderPath = stringOrFunc(outFolder, file); + if (!outFolderPath) { + throw new Error('Invalid output folder'); + } + var basePath = options.base ? + stringOrFunc(options.base, file) : path.resolve(cwd, outFolderPath); + if (!basePath) { + throw new Error('Invalid base option'); + } + + var writePath = path.resolve(basePath, file.relative); + var writeFolder = path.dirname(writePath); + + // Wire up new properties + file.stat = (file.stat || new fs.Stats()); + file.stat.mode = options.mode; + file.flag = options.flag; + file.cwd = cwd; + file.base = basePath; + file.path = writePath; + + // Mkdirp the folder the file is going in + var mkdirpOpts = { + mode: options.dirMode, + fs: fs, + }; + mkdirp(writeFolder, mkdirpOpts, function(err) { + if (err) { + return cb(err); + } + cb(null, writePath); + }); +} + +module.exports = prepareWrite; diff --git a/node_modules/vinyl-fs/lib/sink.js b/node_modules/vinyl-fs/lib/sink.js new file mode 100644 index 000000000..cfab46980 --- /dev/null +++ b/node_modules/vinyl-fs/lib/sink.js @@ -0,0 +1,53 @@ +'use strict'; + +var Writable = require('readable-stream/writable'); + +function listenerCount(stream, evt) { + return stream.listeners(evt).length; +} + +function hasListeners(stream) { + return !!(listenerCount(stream, 'readable') || listenerCount(stream, 'data')); +} + +function sink(stream) { + var sinkAdded = false; + var sinkStream = new Writable({ + objectMode: true, + write: function(file, enc, cb) { + cb(); + }, + }); + + function addSink() { + if (sinkAdded) { + return; + } + + if (hasListeners(stream)) { + return; + } + + sinkAdded = true; + stream.pipe(sinkStream); + } + + function removeSink(evt) { + if (evt !== 'readable' && evt !== 'data') { + return; + } + + if (hasListeners(stream)) { + sinkAdded = false; + stream.unpipe(sinkStream); + } + } + + stream.on('newListener', removeSink); + stream.on('removeListener', removeSink); + stream.on('removeListener', addSink); + + return addSink; +} + +module.exports = sink; diff --git a/node_modules/vinyl-fs/lib/src/getContents/bufferFile.js b/node_modules/vinyl-fs/lib/src/getContents/bufferFile.js new file mode 100644 index 000000000..894dd9cea --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/getContents/bufferFile.js @@ -0,0 +1,22 @@ +'use strict'; + +var fs = require('graceful-fs'); +var stripBom = require('strip-bom'); + +function bufferFile(file, opt, cb) { + fs.readFile(file.path, function(err, data) { + if (err) { + return cb(err); + } + + if (opt.stripBOM) { + file.contents = stripBom(data); + } else { + file.contents = data; + } + + cb(null, file); + }); +} + +module.exports = bufferFile; diff --git a/node_modules/vinyl-fs/lib/src/getContents/index.js b/node_modules/vinyl-fs/lib/src/getContents/index.js new file mode 100644 index 000000000..c1c8c159d --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/getContents/index.js @@ -0,0 +1,31 @@ +'use strict'; + +var through2 = require('through2'); +var readDir = require('./readDir'); +var readSymbolicLink = require('./readSymbolicLink'); +var bufferFile = require('./bufferFile'); +var streamFile = require('./streamFile'); + +function getContents(opt) { + return through2.obj(opt, function(file, enc, cb) { + // Don't fail to read a directory + if (file.isDirectory()) { + return readDir(file, opt, cb); + } + + // Process symbolic links included with `followSymlinks` option + if (file.stat && file.stat.isSymbolicLink()) { + return readSymbolicLink(file, opt, cb); + } + + // Read and pass full contents + if (opt.buffer !== false) { + return bufferFile(file, opt, cb); + } + + // Don't buffer anything - just pass streams + return streamFile(file, opt, cb); + }); +} + +module.exports = getContents; diff --git a/node_modules/vinyl-fs/lib/src/getContents/readDir.js b/node_modules/vinyl-fs/lib/src/getContents/readDir.js new file mode 100644 index 000000000..a800d4738 --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/getContents/readDir.js @@ -0,0 +1,8 @@ +'use strict'; + +function readDir(file, opt, cb) { + // Do nothing for now + cb(null, file); +} + +module.exports = readDir; diff --git a/node_modules/vinyl-fs/lib/src/getContents/readSymbolicLink.js b/node_modules/vinyl-fs/lib/src/getContents/readSymbolicLink.js new file mode 100644 index 000000000..794077a62 --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/getContents/readSymbolicLink.js @@ -0,0 +1,18 @@ +'use strict'; + +var fs = require('graceful-fs'); + +function readLink(file, opt, cb) { + fs.readlink(file.path, function(err, target) { + if (err) { + return cb(err); + } + + // Store the link target path + file.symlink = target; + + return cb(null, file); + }); +} + +module.exports = readLink; diff --git a/node_modules/vinyl-fs/lib/src/getContents/streamFile.js b/node_modules/vinyl-fs/lib/src/getContents/streamFile.js new file mode 100644 index 000000000..43dc12635 --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/getContents/streamFile.js @@ -0,0 +1,26 @@ +'use strict'; + +var fs = require('graceful-fs'); +var stripBom = require('strip-bom-stream'); +var lazystream = require('lazystream'); + +function streamFile(file, opt, cb) { + if (typeof opt === 'function') { + cb = opt; + opt = {}; + } + + var filePath = file.path; + + file.contents = new lazystream.Readable(function() { + return fs.createReadStream(filePath); + }); + + if (opt.stripBOM) { + file.contents = file.contents.pipe(stripBom()); + } + + cb(null, file); +} + +module.exports = streamFile; diff --git a/node_modules/vinyl-fs/lib/src/index.js b/node_modules/vinyl-fs/lib/src/index.js new file mode 100644 index 000000000..06cbe754d --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/index.js @@ -0,0 +1,62 @@ +'use strict'; + +var assign = require('object-assign'); +var through2 = require('through2'); +var gs = require('glob-stream'); +var duplexify = require('duplexify'); +var merge = require('merge-stream'); +var sourcemaps = require('gulp-sourcemaps'); +var filterSince = require('../filterSince'); +var isValidGlob = require('is-valid-glob'); + +var getContents = require('./getContents'); +var wrapWithVinylFile = require('./wrapWithVinylFile'); + +function src(glob, opt) { + var options = assign({ + read: true, + buffer: true, + stripBOM: true, + sourcemaps: false, + passthrough: false, + followSymlinks: true, + }, opt); + + // Don't pass `read` option on to through2 + var read = options.read !== false; + options.read = undefined; + + var inputPass; + + if (!isValidGlob(glob)) { + throw new Error('Invalid glob argument: ' + glob); + } + + var globStream = gs.create(glob, options); + + var outputStream = globStream + .pipe(wrapWithVinylFile(options)); + + if (options.since != null) { + outputStream = outputStream + .pipe(filterSince(options.since)); + } + + if (read) { + outputStream = outputStream + .pipe(getContents(options)); + } + + if (options.passthrough === true) { + inputPass = through2.obj(options); + outputStream = duplexify.obj(inputPass, merge(outputStream, inputPass)); + } + if (options.sourcemaps === true) { + outputStream = outputStream + .pipe(sourcemaps.init({ loadMaps: true })); + } + globStream.on('error', outputStream.emit.bind(outputStream, 'error')); + return outputStream; +} + +module.exports = src; diff --git a/node_modules/vinyl-fs/lib/src/wrapWithVinylFile.js b/node_modules/vinyl-fs/lib/src/wrapWithVinylFile.js new file mode 100644 index 000000000..5e6290e59 --- /dev/null +++ b/node_modules/vinyl-fs/lib/src/wrapWithVinylFile.js @@ -0,0 +1,51 @@ +'use strict'; + +var through2 = require('through2'); +var fs = require('graceful-fs'); +var File = require('vinyl'); + +function wrapWithVinylFile(options) { + + // A stat property is exposed on file objects as a (wanted) side effect + function resolveFile(globFile, enc, cb) { + fs.lstat(globFile.path, function(err, stat) { + if (err) { + return cb(err); + } + + globFile.stat = stat; + + if (!stat.isSymbolicLink() || !options.followSymlinks) { + var vinylFile = new File(globFile); + if (globFile.originalSymlinkPath) { + // If we reach here, it means there is at least one + // symlink on the path and we need to rewrite the path + // to its original value. + // Updated file stats will tell getContents() to actually read it. + vinylFile.path = globFile.originalSymlinkPath; + } + return cb(null, vinylFile); + } + + fs.realpath(globFile.path, function(err, filePath) { + if (err) { + return cb(err); + } + + if (!globFile.originalSymlinkPath) { + // Store the original symlink path before the recursive call + // to later rewrite it back. + globFile.originalSymlinkPath = globFile.path; + } + globFile.path = filePath; + + // Recurse to get real file stat + resolveFile(globFile, enc, cb); + }); + }); + } + + return through2.obj(options, resolveFile); +} + +module.exports = wrapWithVinylFile; diff --git a/node_modules/vinyl-fs/lib/symlink/index.js b/node_modules/vinyl-fs/lib/symlink/index.js new file mode 100644 index 000000000..6c01a6b67 --- /dev/null +++ b/node_modules/vinyl-fs/lib/symlink/index.js @@ -0,0 +1,30 @@ +'use strict'; + +var through2 = require('through2'); +var fs = require('graceful-fs'); +var prepareWrite = require('../prepareWrite'); + +function symlink(outFolder, opt) { + function linkFile(file, enc, cb) { + var srcPath = file.path; + var symType = (file.isDirectory() ? 'dir' : 'file'); + prepareWrite(outFolder, file, opt, function(err, writePath) { + if (err) { + return cb(err); + } + fs.symlink(srcPath, writePath, symType, function(err) { + if (err && err.code !== 'EEXIST') { + return cb(err); + } + cb(null, file); + }); + }); + } + + var stream = through2.obj(opt, linkFile); + // TODO: option for either backpressure or lossy + stream.resume(); + return stream; +} + +module.exports = symlink; diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/.npmignore b/node_modules/vinyl-fs/node_modules/glob-parent/.npmignore new file mode 100644 index 000000000..33e391f0e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/.npmignore @@ -0,0 +1,4 @@ +node_modules +.DS_Store +npm-debug.log +coverage diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/.travis.yml b/node_modules/vinyl-fs/node_modules/glob-parent/.travis.yml new file mode 100644 index 000000000..18fc42f69 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/.travis.yml @@ -0,0 +1,8 @@ +language: node_js +node_js: + - "4" + - "iojs-v3" + - "iojs-v2" + - "iojs-v1" + - "0.12" + - "0.10" diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/LICENSE b/node_modules/vinyl-fs/node_modules/glob-parent/LICENSE new file mode 100644 index 000000000..734076d8a --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2015 Elan Shanker + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/README.md b/node_modules/vinyl-fs/node_modules/glob-parent/README.md new file mode 100644 index 000000000..ff5310d3b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/README.md @@ -0,0 +1,43 @@ +glob-parent [![Build Status](https://travis-ci.org/es128/glob-parent.svg)](https://travis-ci.org/es128/glob-parent) [![Coverage Status](https://img.shields.io/coveralls/es128/glob-parent.svg)](https://coveralls.io/r/es128/glob-parent?branch=master) +====== +Javascript module to extract the non-magic parent path from a glob string. + +[![NPM](https://nodei.co/npm/glob-parent.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/glob-parent/) +[![NPM](https://nodei.co/npm-dl/glob-parent.png?height=3&months=9)](https://nodei.co/npm-dl/glob-parent/) + +Usage +----- +```sh +npm install glob-parent --save +``` + +```js +var globParent = require('glob-parent'); + +globParent('path/to/*.js'); // 'path/to' +globParent('/root/path/to/*.js'); // '/root/path/to' +globParent('/*.js'); // '/' +globParent('*.js'); // '.' +globParent('**/*.js'); // '.' +globParent('path/{to,from}'); // 'path' +globParent('path/!(to|from)'); // 'path' +globParent('path/?(to|from)'); // 'path' +globParent('path/+(to|from)'); // 'path' +globParent('path/*(to|from)'); // 'path' +globParent('path/@(to|from)'); // 'path' +globParent('path/**/*'); // 'path' + +// if provided a non-glob path, returns the nearest dir +globParent('path/foo/bar.js'); // 'path/foo' +globParent('path/foo/'); // 'path/foo' +globParent('path/foo'); // 'path' (see issue #3 for details) + +``` + +Change Log +---------- +[See release notes page on GitHub](https://github.com/es128/glob-parent/releases) + +License +------- +[ISC](https://raw.github.com/es128/glob-parent/master/LICENSE) diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/index.js b/node_modules/vinyl-fs/node_modules/glob-parent/index.js new file mode 100644 index 000000000..61615f1ac --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/index.js @@ -0,0 +1,10 @@ +'use strict'; + +var path = require('path'); +var isglob = require('is-glob'); + +module.exports = function globParent(str) { + str += 'a'; // preserves full path in case of trailing path separator + do {str = path.dirname(str)} while (isglob(str)); + return str; +}; diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/package.json b/node_modules/vinyl-fs/node_modules/glob-parent/package.json new file mode 100644 index 000000000..6c0d5d867 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/package.json @@ -0,0 +1,97 @@ +{ + "_args": [ + [ + { + "raw": "glob-parent@^3.0.0", + "scope": null, + "escapedName": "glob-parent", + "name": "glob-parent", + "rawSpec": "^3.0.0", + "spec": ">=3.0.0 <4.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream" + ] + ], + "_from": "glob-parent@>=3.0.0 <4.0.0", + "_id": "glob-parent@3.0.0", + "_inCache": true, + "_location": "/vinyl-fs/glob-parent", + "_nodeVersion": "5.6.0", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/glob-parent-3.0.0.tgz_1473189232576_0.26026900205761194" + }, + "_npmUser": { + "name": "es128", + "email": "elan.shanker+npm@gmail.com" + }, + "_npmVersion": "3.6.0", + "_phantomChildren": {}, + "_requested": { + "raw": "glob-parent@^3.0.0", + "scope": null, + "escapedName": "glob-parent", + "name": "glob-parent", + "rawSpec": "^3.0.0", + "spec": ">=3.0.0 <4.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.0.tgz", + "_shasum": "c7bdeb5260732196c740de9274c08814056014bb", + "_shrinkwrap": null, + "_spec": "glob-parent@^3.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream", + "author": { + "name": "Elan Shanker" + }, + "bugs": { + "url": "https://github.com/es128/glob-parent/issues" + }, + "dependencies": { + "is-glob": "^3.0.0" + }, + "description": "Strips glob magic from a string to provide the parent path", + "devDependencies": { + "coveralls": "^2.11.2", + "istanbul": "^0.3.5", + "mocha": "^2.1.0" + }, + "directories": {}, + "dist": { + "shasum": "c7bdeb5260732196c740de9274c08814056014bb", + "tarball": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.0.0.tgz" + }, + "gitHead": "fd9c64f7696717cb3d440ca9eef5060f64d61c57", + "homepage": "https://github.com/es128/glob-parent", + "keywords": [ + "glob", + "parent", + "strip", + "path", + "directory", + "base" + ], + "license": "ISC", + "main": "index.js", + "maintainers": [ + { + "name": "es128", + "email": "elan.shanker+npm@gmail.com" + } + ], + "name": "glob-parent", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/es128/glob-parent.git" + }, + "scripts": { + "test": "istanbul cover _mocha && cat ./coverage/lcov.info | coveralls" + }, + "version": "3.0.0" +} diff --git a/node_modules/vinyl-fs/node_modules/glob-parent/test.js b/node_modules/vinyl-fs/node_modules/glob-parent/test.js new file mode 100644 index 000000000..f12a5c8fd --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-parent/test.js @@ -0,0 +1,66 @@ +'use strict'; + +var gp = require('./'); +var assert = require('assert'); + +describe('glob-parent', function() { + it('should strip glob magic to return parent path', function() { + assert.equal(gp('path/to/*.js'), 'path/to'); + assert.equal(gp('/root/path/to/*.js'), '/root/path/to'); + assert.equal(gp('/*.js'), '/'); + assert.equal(gp('*.js'), '.'); + assert.equal(gp('**/*.js'), '.'); + assert.equal(gp('path/{to,from}'), 'path'); + assert.equal(gp('path/!(to|from)'), 'path'); + assert.equal(gp('path/?(to|from)'), 'path'); + assert.equal(gp('path/+(to|from)'), 'path'); + assert.equal(gp('path/*(to|from)'), 'path'); + assert.equal(gp('path/@(to|from)'), 'path'); + assert.equal(gp('path/**/*'), 'path'); + assert.equal(gp('path/**/subdir/foo.*'), 'path'); + }); + + it('should return parent dirname from non-glob paths', function() { + assert.equal(gp('path/foo/bar.js'), 'path/foo'); + assert.equal(gp('path/foo/'), 'path/foo'); + assert.equal(gp('path/foo'), 'path'); + }); +}); + +describe('glob2base test patterns', function() { + it('should get a base name', function() { + assert.equal(gp('js/*.js') + '/', 'js/'); + }); + + it('should get a base name from a nested glob', function() { + assert.equal(gp('js/**/test/*.js') + '/', 'js/'); + }); + + it('should get a base name from a flat file', function() { + assert.equal(gp('js/test/wow.js') + '/', 'js/test/'); + }); + + it('should get a base name from character class pattern', function() { + assert.equal(gp('js/t[a-z]st}/*.js') + '/', 'js/'); + }); + + it('should get a base name from brace , expansion', function() { + assert.equal(gp('js/{src,test}/*.js') + '/', 'js/'); + }); + + it('should get a base name from brace .. expansion', function() { + assert.equal(gp('js/test{0..9}/*.js') + '/', 'js/'); + }); + + it('should get a base name from extglob', function() { + assert.equal(gp('js/t+(wo|est)/*.js') + '/', 'js/'); + }); + + it('should get a base name from a complex brace glob', function() { + assert.equal(gp('lib/{components,pages}/**/{test,another}/*.txt') + '/', 'lib/'); + + assert.equal(gp('js/test/**/{images,components}/*.js') + '/', 'js/test/'); + + assert.equal(gp('ooga/{booga,sooga}/**/dooga/{eooga,fooga}') + '/', 'ooga/'); + }); +}); diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/LICENSE b/node_modules/vinyl-fs/node_modules/glob-stream/LICENSE new file mode 100755 index 000000000..9aedc0d72 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Blaine Bublitz, Eric Schoffstall and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/README.md b/node_modules/vinyl-fs/node_modules/glob-stream/README.md new file mode 100644 index 000000000..0481dcc21 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/README.md @@ -0,0 +1,95 @@ +<p align="center"> + <a href="http://gulpjs.com"> + <img height="257" width="114" src="https://raw.githubusercontent.com/gulpjs/artwork/master/gulp-2x.png"> + </a> +</p> + +# glob-stream + +[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Gitter chat][gitter-image]][gitter-url] + +A wrapper around [node-glob][node-glob-url] to make it streamy. + +## Usage + +```javascript +var gs = require('glob-stream'); + +var stream = gs.create('./files/**/*.coffee', { /* options */ }); + +stream.on('data', function(file){ + // file has path, base, and cwd attrs +}); +``` + +You can pass any combination of globs. One caveat is that you can not only pass a glob negation, you must give it at least one positive glob so it knows where to start. All given must match for the file to be returned. + +## API + +### create(globs, options) + +Returns a stream for multiple globs or filters. + +### createStream(positiveGlob, negativeGlobs, options) + +Returns a stream for a single glob or filter. + +### Options + +- cwd + - Default is `process.cwd()` +- base + - Default is everything before a glob starts (see [glob-parent][glob-parent-url]) +- cwdbase + - Default is `false` + - When true it is the same as saying opt.base = opt.cwd +- allowEmpty + - Default is `false` + - If true, won't emit an error when a glob pointing at a single file fails to match +- Any through2 related options are documented in [through2][through2-url] + +This argument is passed directly to [node-glob][node-glob-url] so check there for more options + +### Glob + +```js +var stream = gs.create(['./**/*.js', '!./node_modules/**/*']); +``` + +Globs are executed in order, so negations should follow positive globs. For example: + +```js +gulp.src(['!b*.js', '*.js']) +``` + +would not exclude any files, but this would + +```js +gulp.src(['*.js', '!b*.js']) +``` + +## Related + +- [globby][globby-url] - Non-streaming `glob` wrapper with support for multiple patterns. + +## License + +MIT + +[globby-url]: https://github.com/sindresorhus/globby +[through2-url]: https://github.com/rvagg/through2 +[node-glob-url]: https://github.com/isaacs/node-glob +[glob-parent-url]: https://github.com/es128/glob-parent + +[downloads-image]: http://img.shields.io/npm/dm/glob-stream.svg +[npm-url]: https://www.npmjs.com/package/glob-stream +[npm-image]: https://badge.fury.io/js/glob-stream.svg + +[travis-url]: https://travis-ci.org/gulpjs/glob-stream +[travis-image]: https://travis-ci.org/gulpjs/glob-stream.svg?branch=master + +[coveralls-url]: https://coveralls.io/r/gulpjs/glob-stream +[coveralls-image]: https://coveralls.io/repos/gulpjs/glob-stream/badge.svg + +[gitter-url]: https://gitter.im/gulpjs/gulp +[gitter-image]: https://badges.gitter.im/gulpjs/gulp.png diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/index.js b/node_modules/vinyl-fs/node_modules/glob-stream/index.js new file mode 100644 index 000000000..363a29dac --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/index.js @@ -0,0 +1,209 @@ +'use strict'; + +var through2 = require('through2'); +var Combine = require('ordered-read-streams'); +var unique = require('unique-stream'); + +var glob = require('glob'); +var micromatch = require('micromatch'); +var resolveGlob = require('to-absolute-glob'); +var globParent = require('glob-parent'); +var path = require('path'); +var extend = require('extend'); +var sepRe = (process.platform === 'win32' ? /[\/\\]/ : /\/+/); + +var gs = { + // Creates a stream for a single glob or filter + createStream: function(ourGlob, negatives, opt) { + + var ourOpt = extend({}, opt); + delete ourOpt.root; + + // Extract base path from glob + var basePath = ourOpt.base || getBasePath(ourGlob, opt); + + // Remove path relativity to make globs make sense + ourGlob = resolveGlob(ourGlob, opt); + + // Create globbing stuff + var globber = new glob.Glob(ourGlob, ourOpt); + + // Create stream and map events from globber to it + var stream = through2.obj(opt, + negatives.length ? filterNegatives : undefined); + + var found = false; + + globber.on('error', stream.emit.bind(stream, 'error')); + globber.once('end', function() { + if (opt.allowEmpty !== true && !found && globIsSingular(globber)) { + stream.emit('error', + new Error('File not found with singular glob: ' + ourGlob)); + } + + stream.end(); + }); + globber.on('match', function(filename) { + found = true; + + stream.write({ + cwd: opt.cwd, + base: basePath, + path: path.normalize(filename), + }); + }); + + return stream; + + function filterNegatives(filename, enc, cb) { + var matcha = isMatch.bind(null, filename); + if (negatives.every(matcha)) { + cb(null, filename); // Pass + } else { + cb(); // Ignore + } + } + }, + + // Creates a stream for multiple globs or filters + create: function(globs, opt) { + if (!opt) { + opt = {}; + } + if (typeof opt.cwd !== 'string') { + opt.cwd = process.cwd(); + } + if (typeof opt.dot !== 'boolean') { + opt.dot = false; + } + if (typeof opt.silent !== 'boolean') { + opt.silent = true; + } + if (typeof opt.nonull !== 'boolean') { + opt.nonull = false; + } + if (typeof opt.cwdbase !== 'boolean') { + opt.cwdbase = false; + } + if (opt.cwdbase) { + opt.base = opt.cwd; + } + + // Only one glob no need to aggregate + if (!Array.isArray(globs)) { + globs = [globs]; + } + + var positives = []; + var negatives = []; + + var ourOpt = extend({}, opt); + delete ourOpt.root; + + globs.forEach(function(glob, index) { + if (typeof glob !== 'string' && !(glob instanceof RegExp)) { + throw new Error('Invalid glob at index ' + index); + } + + var globArray = isNegative(glob) ? negatives : positives; + + // Create Minimatch instances for negative glob patterns + if (globArray === negatives && typeof glob === 'string') { + var ourGlob = resolveGlob(glob, opt); + glob = micromatch.matcher(ourGlob, ourOpt); + } + + globArray.push({ + index: index, + glob: glob, + }); + }); + + if (positives.length === 0) { + throw new Error('Missing positive glob'); + } + + // Only one positive glob no need to aggregate + if (positives.length === 1) { + return streamFromPositive(positives[0]); + } + + // Create all individual streams + var streams = positives.map(streamFromPositive); + + // Then just pipe them to a single unique stream and return it + var aggregate = new Combine(streams); + var uniqueStream = unique('path'); + var returnStream = aggregate.pipe(uniqueStream); + + aggregate.on('error', function(err) { + returnStream.emit('error', err); + }); + + return returnStream; + + function streamFromPositive(positive) { + var negativeGlobs = negatives.filter(indexGreaterThan(positive.index)) + .map(toGlob); + return gs.createStream(positive.glob, negativeGlobs, opt); + } + }, +}; + +function isMatch(file, matcher) { + if (typeof matcher === 'function') { + return matcher(file.path); + } + if (matcher instanceof RegExp) { + return matcher.test(file.path); + } +} + +function isNegative(pattern) { + if (typeof pattern === 'string') { + return pattern[0] === '!'; + } + if (pattern instanceof RegExp) { + return true; + } +} + +function indexGreaterThan(index) { + return function(obj) { + return obj.index > index; + }; +} + +function toGlob(obj) { + return obj.glob; +} + +function globIsSingular(glob) { + var globSet = glob.minimatch.set; + + if (globSet.length !== 1) { + return false; + } + + return globSet[0].every(function isString(value) { + return typeof value === 'string'; + }); +} + +function getBasePath(ourGlob, opt) { + var basePath; + var parent = globParent(ourGlob); + + if (parent === '/' && opt && opt.root) { + basePath = path.normalize(opt.root); + } else { + basePath = resolveGlob(parent, opt); + } + + if (!sepRe.test(basePath.charAt(basePath.length - 1))) { + basePath += path.sep; + } + return basePath; +} + +module.exports = gs; diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/README.md b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/README.md new file mode 100644 index 000000000..052a62b8d --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/README.md @@ -0,0 +1,54 @@ + +# isarray + +`Array#isArray` for older browsers. + +## Usage + +```js +var isArray = require('isarray'); + +console.log(isArray([])); // => true +console.log(isArray({})); // => false +``` + +## Installation + +With [npm](http://npmjs.org) do + +```bash +$ npm install isarray +``` + +Then bundle for the browser with +[browserify](https://github.com/substack/browserify). + +With [component](http://component.io) do + +```bash +$ component install juliangruber/isarray +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/component.json b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/component.json new file mode 100644 index 000000000..9e31b6838 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/component.json @@ -0,0 +1,19 @@ +{ + "name" : "isarray", + "description" : "Array#isArray for older browsers", + "version" : "0.0.1", + "repository" : "juliangruber/isarray", + "homepage": "https://github.com/juliangruber/isarray", + "main" : "index.js", + "scripts" : [ + "index.js" + ], + "dependencies" : {}, + "keywords": ["browser","isarray","array"], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT" +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/index.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/index.js new file mode 100644 index 000000000..5f5ad45d4 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/index.js @@ -0,0 +1,3 @@ +module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; +}; diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/package.json b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/package.json new file mode 100644 index 000000000..51bba982e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/isarray/package.json @@ -0,0 +1,98 @@ +{ + "_args": [ + [ + { + "raw": "isarray@0.0.1", + "scope": null, + "escapedName": "isarray", + "name": "isarray", + "rawSpec": "0.0.1", + "spec": "0.0.1", + "type": "version" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/readable-stream" + ], + [ + { + "raw": "isarray@0.0.1", + "scope": null, + "escapedName": "isarray", + "name": "isarray", + "rawSpec": "0.0.1", + "spec": "0.0.1", + "type": "version" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream" + ] + ], + "_from": "isarray@0.0.1", + "_id": "isarray@0.0.1", + "_inCache": true, + "_location": "/vinyl-fs/glob-stream/isarray", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "_npmVersion": "1.2.18", + "_phantomChildren": {}, + "_requested": { + "raw": "isarray@0.0.1", + "scope": null, + "escapedName": "isarray", + "name": "isarray", + "rawSpec": "0.0.1", + "spec": "0.0.1", + "type": "version" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "_shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "_shrinkwrap": null, + "_spec": "isarray@0.0.1", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/isarray/issues" + }, + "dependencies": {}, + "description": "Array#isArray for older browsers", + "devDependencies": { + "tap": "*" + }, + "directories": {}, + "dist": { + "shasum": "8a18acfca9a8f4177e09abfc6038939b05d1eedf", + "tarball": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "homepage": "https://github.com/juliangruber/isarray", + "keywords": [ + "browser", + "isarray", + "array" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + } + ], + "name": "isarray", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/isarray.git" + }, + "scripts": { + "test": "tap test/*.js" + }, + "version": "0.0.1" +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/.npmignore b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/.npmignore new file mode 100644 index 000000000..38344f87a --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/.npmignore @@ -0,0 +1,5 @@ +build/ +test/ +examples/ +fs.js +zlib.js
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/LICENSE b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/LICENSE new file mode 100644 index 000000000..e3d4e695a --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/README.md b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/README.md new file mode 100644 index 000000000..3fb3e8023 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/README.md @@ -0,0 +1,15 @@ +# readable-stream + +***Node-core streams for userland*** + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + +This package is a mirror of the Streams2 and Streams3 implementations in Node-core. + +If you want to guarantee a stable streams base, regardless of what version of Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core. + +**readable-stream** comes in two major versions, v1.0.x and v1.1.x. The former tracks the Streams2 implementation in Node 0.10, including bug-fixes and minor improvements as they are added. The latter tracks Streams3 as it develops in Node 0.11; we will likely see a v1.2.x branch for Node 0.12. + +**readable-stream** uses proper patch-level versioning so if you pin to `"~1.0.0"` you’ll get the latest Node 0.10 Streams2 implementation, including any fixes and minor non-breaking improvements. The patch-level versions of 1.0.x and 1.1.x should mirror the patch-level versions of Node-core releases. You should prefer the **1.0.x** releases for now and when you’re ready to start using Streams3, pin to `"~1.1.0"` + diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/duplex.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/duplex.js new file mode 100644 index 000000000..ca807af87 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 000000000..b513d61a9 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,89 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +module.exports = Duplex; + +/*<replacement>*/ +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) keys.push(key); + return keys; +} +/*</replacement>*/ + + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +forEach(objectKeys(Writable.prototype), function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; +}); + +function Duplex(options) { + if (!(this instanceof Duplex)) + return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) + this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) + return; + + // no more data can be written. + // But allow more writes to happen in this tick. + process.nextTick(this.end.bind(this)); +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 000000000..895ca50a1 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,46 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) + return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); +}; diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 000000000..630722099 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,982 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +module.exports = Readable; + +/*<replacement>*/ +var isArray = require('isarray'); +/*</replacement>*/ + + +/*<replacement>*/ +var Buffer = require('buffer').Buffer; +/*</replacement>*/ + +Readable.ReadableState = ReadableState; + +var EE = require('events').EventEmitter; + +/*<replacement>*/ +if (!EE.listenerCount) EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; +}; +/*</replacement>*/ + +var Stream = require('stream'); + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +var StringDecoder; + +util.inherits(Readable, Stream); + +function ReadableState(options, stream) { + options = options || {}; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = false; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // In streams that never have any data, and do push(null) right away, + // the consumer can miss the 'end' event if they do some I/O before + // consuming the stream. So, we don't emit('end') until some reading + // happens. + this.calledRead = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +function Readable(options) { + if (!(this instanceof Readable)) + return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + + if (typeof chunk === 'string' && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null || chunk === undefined) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var e = new Error('stream.unshift() after end event'); + stream.emit('error', e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) { + state.buffer.unshift(chunk); + } else { + state.reading = false; + state.buffer.push(chunk); + } + + if (state.needReadable) + emitReadable(stream); + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + + + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && + (state.needReadable || + state.length < state.highWaterMark || + state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; +}; + +// Don't raise the hwm > 128MB +var MAX_HWM = 0x800000; +function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 + n--; + for (var p = 1; p < 32; p <<= 1) n |= n >> p; + n++; + } + return n; +} + +function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + + if (state.objectMode) + return n === 0 ? 0 : 1; + + if (n === null || isNaN(n)) { + // only flow one buffer at a time + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + + if (n <= 0) + return 0; + + // If we're asking for more than the target buffer level, + // then raise the water mark. Bump up to the next highest + // power of 2, to prevent increasing it excessively in tiny + // amounts. + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + + // don't have that much. return null, unless we've ended. + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + + return n; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function(n) { + var state = this._readableState; + state.calledRead = true; + var nOrig = n; + var ret; + + if (typeof n !== 'number' || n > 0) + state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && + state.needReadable && + (state.length >= state.highWaterMark || state.ended)) { + emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + ret = null; + + // In cases where the decoder did not receive enough data + // to produce a full chunk, then immediately received an + // EOF, state.buffer will contain [<Buffer >, <Buffer 00 ...>]. + // howMuchToRead will see this and coerce the amount to + // read to zero (because it's looking at the length of the + // first <Buffer > in state.buffer), and we'll end up here. + // + // This can only happen via state.decoder -- no other venue + // exists for pushing a zero-length chunk into state.buffer + // and triggering this behavior. In this case, we return our + // remaining data and end the stream, if appropriate. + if (state.length > 0 && state.decoder) { + ret = fromList(n, state); + state.length -= ret.length; + } + + if (state.length === 0) + endReadable(this); + + return ret; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + + // if we currently have less than the highWaterMark, then also read some + if (state.length - n <= state.highWaterMark) + doRead = true; + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) + doRead = false; + + if (doRead) { + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) + state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + } + + // If _read called its callback synchronously, then `reading` + // will be false, and we need to re-evaluate how much data we + // can return to the user. + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + + if (n > 0) + ret = fromList(n, state); + else + ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } + + state.length -= n; + + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (state.length === 0 && !state.ended) + state.needReadable = true; + + // If we happened to read() exactly the remaining amount in the + // buffer, and the EOF has been seen at this point, then make sure + // that we emit 'end' on the very next tick. + if (state.ended && !state.endEmitted && state.length === 0) + endReadable(this); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + + +function onEofChunk(stream, state) { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // if we've ended and we have some data left, then emit + // 'readable' now to make sure it gets picked up. + if (state.length > 0) + emitReadable(stream); + else + endReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (state.emittedReadable) + return; + + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); +} + +function emitReadable_(stream) { + stream.emit('readable'); +} + + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && + state.length < state.highWaterMark) { + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break; + else + len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function(n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && + dest !== process.stdout && + dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + if (readable !== src) return; + cleanup(); + } + + function onend() { + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + function cleanup() { + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (!dest._writableState || dest._writableState.needDrain) + ondrain(); + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + unpipe(); + dest.removeListener('error', onerror); + if (EE.listenerCount(dest, 'error') === 0) + dest.emit('error', er); + } + // This is a brutally ugly hack to make sure that our error handler + // is attached before any userland ones. NEVER DO THIS. + if (!dest._events || !dest._events.error) + dest.on('error', onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + + + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + // the handler that waits for readable events after all + // the data gets sucked out in flow. + // This would be easier to follow with a .once() handler + // in flow(), but that is too slow. + this.on('readable', pipeOnReadable); + + state.flowing = true; + process.nextTick(function() { + flow(src); + }); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function() { + var dest = this; + var state = src._readableState; + state.awaitDrain--; + if (state.awaitDrain === 0) + flow(src); + }; +} + +function flow(src) { + var state = src._readableState; + var chunk; + state.awaitDrain = 0; + + function write(dest, i, list) { + var written = dest.write(chunk); + if (false === written) { + state.awaitDrain++; + } + } + + while (state.pipesCount && null !== (chunk = src.read())) { + + if (state.pipesCount === 1) + write(state.pipes, 0, null); + else + forEach(state.pipes, write); + + src.emit('data', chunk); + + // if anyone needs a drain, then we have to wait for that. + if (state.awaitDrain > 0) + return; + } + + // if every destination was unpiped, either before entering this + // function, or in the while loop, then stop flowing. + // + // NB: This is a pretty rare edge case. + if (state.pipesCount === 0) { + state.flowing = false; + + // if there were data event listeners added, then switch to old mode. + if (EE.listenerCount(src, 'data') > 0) + emitDataEvents(src); + return; + } + + // at this point, no one needed a drain, so we just ran out of data + // on the next readable event, start it over again. + state.ranOut = true; +} + +function pipeOnReadable() { + if (this._readableState.ranOut) { + this._readableState.ranOut = false; + flow(this); + } +} + + +Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) + return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) + return this; + + if (!dest) + dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + if (dest) + dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + this.removeListener('readable', pipeOnReadable); + state.flowing = false; + + for (var i = 0; i < len; i++) + dests[i].emit('unpipe', this); + return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data' && !this._readableState.flowing) + emitDataEvents(this); + + if (ev === 'readable' && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + this.read(0); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function() { + emitDataEvents(this); + this.read(0); + this.emit('resume'); +}; + +Readable.prototype.pause = function() { + emitDataEvents(this, true); + this.emit('pause'); +}; + +function emitDataEvents(stream, startPaused) { + var state = stream._readableState; + + if (state.flowing) { + // https://github.com/isaacs/readable-stream/issues/16 + throw new Error('Cannot switch to old mode now.'); + } + + var paused = startPaused || false; + var readable = false; + + // convert to an old-style stream. + stream.readable = true; + stream.pipe = Stream.prototype.pipe; + stream.on = stream.addListener = Stream.prototype.on; + + stream.on('readable', function() { + readable = true; + + var c; + while (!paused && (null !== (c = stream.read()))) + stream.emit('data', c); + + if (c === null) { + readable = false; + stream._readableState.needReadable = true; + } + }); + + stream.pause = function() { + paused = true; + this.emit('pause'); + }; + + stream.resume = function() { + paused = false; + if (readable) + process.nextTick(function() { + stream.emit('readable'); + }); + else + this.read(0); + this.emit('resume'); + }; + + // now make it start, just in case it hadn't already. + stream.emit('readable'); +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function() { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function(chunk) { + if (state.decoder) + chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + //if (state.objectMode && util.isNullOrUndefined(chunk)) + if (state.objectMode && (chunk === null || chunk === undefined)) + return; + else if (!state.objectMode && (!chunk || !chunk.length)) + return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (typeof stream[i] === 'function' && + typeof this[i] === 'undefined') { + this[i] = function(method) { return function() { + return stream[method].apply(stream, arguments); + }}(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function(ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function(n) { + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + + + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + + // nothing in the list, definitely empty. + if (list.length === 0) + return null; + + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + // read it all, truncate the array. + if (stringMode) + ret = list.join(''); + else + ret = Buffer.concat(list, length); + list.length = 0; + } else { + // read just some of it. + if (n < list[0].length) { + // just take a part of the first list item. + // slice is the same for buffers and strings. + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + // first list is a perfect match + ret = list.shift(); + } else { + // complex case. + // we have enough to cover it, but it spans past the first buffer. + if (stringMode) + ret = ''; + else + ret = new Buffer(n); + + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + + c += cpy; + } + } + } + + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) + throw new Error('endReadable called on non-empty stream'); + + if (!state.endEmitted && state.calledRead) { + state.ended = true; + process.nextTick(function() { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } + }); + } +} + +function forEach (xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf (xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 000000000..eb188df3e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,210 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + + +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +util.inherits(Transform, Duplex); + + +function TransformState(options, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) + return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) + stream.push(data); + + if (cb) + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + + +function Transform(options) { + if (!(this instanceof Transform)) + return new Transform(options); + + Duplex.call(this, options); + + var ts = this._transformState = new TransformState(options, this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + this.once('finish', function() { + if ('function' === typeof this._flush) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); +} + +Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error('not implemented'); +}; + +Transform.prototype._write = function(chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || + rs.needReadable || + rs.length < rs.highWaterMark) + this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function(n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + + +function done(stream, er) { + if (er) + return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var rs = stream._readableState; + var ts = stream._transformState; + + if (ws.length) + throw new Error('calling transform done when ws.length != 0'); + + if (ts.transforming) + throw new Error('calling transform done when still transforming'); + + return stream.push(null); +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 000000000..4bdaa4fa4 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,386 @@ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// A bit simpler than readable streams. +// Implement an async ._write(chunk, cb), and it'll handle all +// the drain event emission and buffering. + +module.exports = Writable; + +/*<replacement>*/ +var Buffer = require('buffer').Buffer; +/*</replacement>*/ + +Writable.WritableState = WritableState; + + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +var Stream = require('stream'); + +util.inherits(Writable, Stream); + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; +} + +function WritableState(options, stream) { + options = options || {}; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + // cast to ints. + this.highWaterMark = ~~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, becuase any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function(er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.buffer = []; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; +} + +function Writable(options) { + var Duplex = require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function() { + this.emit('error', new Error('Cannot pipe. Not readable.')); +}; + + +function writeAfterEnd(stream, state, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!Buffer.isBuffer(chunk) && + 'string' !== typeof chunk && + chunk !== null && + chunk !== undefined && + !state.objectMode) { + var er = new TypeError('Invalid non-string/buffer chunk'); + stream.emit('error', er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; +} + +Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + else if (!encoding) + encoding = state.defaultEncoding; + + if (typeof cb !== 'function') + cb = function() {}; + + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) + ret = writeOrBuffer(this, state, chunk, encoding, cb); + + return ret; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && + state.decodeStrings !== false && + typeof chunk === 'string') { + chunk = new Buffer(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (Buffer.isBuffer(chunk)) + encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) + state.needDrain = true; + + if (state.writing) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, len, chunk, encoding, cb); + + return ret; +} + +function doWrite(stream, state, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + cb(er); + }); + else + cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) + onwriteError(stream, state, sync, er, cb); + else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(stream, state); + + if (!finished && !state.bufferProcessing && state.buffer.length) + clearBuffer(stream, state); + + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + cb(); + if (finished) + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, len, chunk, encoding, cb); + + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + c++; + break; + } + } + + state.bufferProcessing = false; + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; +} + +Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (typeof chunk !== 'undefined' && chunk !== null) + this.write(chunk, encoding); + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) + endWritable(this, state, cb); +}; + + +function needFinish(stream, state) { + return (state.ending && + state.length === 0 && + !state.finished && + !state.writing); +} + +function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + state.finished = true; + stream.emit('finish'); + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once('finish', cb); + } + state.ended = true; +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/package.json b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/package.json new file mode 100644 index 000000000..8bcd0374b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/package.json @@ -0,0 +1,112 @@ +{ + "_args": [ + [ + { + "raw": "readable-stream@>=1.0.33-1 <1.1.0-0", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": ">=1.0.33-1 <1.1.0-0", + "spec": ">=1.0.33-1 <1.1.0-0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2" + ] + ], + "_from": "readable-stream@>=1.0.33-1 <1.1.0-0", + "_id": "readable-stream@1.0.34", + "_inCache": true, + "_location": "/vinyl-fs/glob-stream/readable-stream", + "_nodeVersion": "5.10.1", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/readable-stream-1.0.34.tgz_1460562521506_0.019665231462568045" + }, + "_npmUser": { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + "_npmVersion": "3.8.3", + "_phantomChildren": {}, + "_requested": { + "raw": "readable-stream@>=1.0.33-1 <1.1.0-0", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": ">=1.0.33-1 <1.1.0-0", + "spec": ">=1.0.33-1 <1.1.0-0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream/through2" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "_shasum": "125820e34bc842d2f2aaafafe4c2916ee32c157c", + "_shrinkwrap": null, + "_spec": "readable-stream@>=1.0.33-1 <1.1.0-0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "browser": { + "util": false + }, + "bugs": { + "url": "https://github.com/isaacs/readable-stream/issues" + }, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "description": "Streams2, a user-land copy of the stream library from Node.js v0.10.x", + "devDependencies": { + "tap": "~0.2.6" + }, + "directories": {}, + "dist": { + "shasum": "125820e34bc842d2f2aaafafe4c2916ee32c157c", + "tarball": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + }, + "gitHead": "1227c7b66deedb1dc5284a89425854d5f7ad9576", + "homepage": "https://github.com/isaacs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "maintainers": [ + { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + }, + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + } + ], + "name": "readable-stream", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/readable-stream.git" + }, + "scripts": { + "test": "tap test/simple/*.js" + }, + "version": "1.0.34" +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/passthrough.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/passthrough.js new file mode 100644 index 000000000..27e8d8a55 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/readable.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/readable.js new file mode 100644 index 000000000..26511e87b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/readable.js @@ -0,0 +1,11 @@ +var Stream = require('stream'); // hack to fix a circular dependency issue when used with browserify +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); +if (!process.browser && process.env.READABLE_STREAM === 'disable') { + module.exports = require('stream'); +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/transform.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/transform.js new file mode 100644 index 000000000..5d482f078 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/writable.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/writable.js new file mode 100644 index 000000000..e1e9efdf3 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/.npmignore b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/.npmignore new file mode 100644 index 000000000..1e1dcab34 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/.npmignore @@ -0,0 +1,3 @@ +test +.jshintrc +.travis.yml
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/LICENSE b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/LICENSE new file mode 100644 index 000000000..f6a0029de --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/LICENSE @@ -0,0 +1,39 @@ +Copyright 2013, Rod Vagg (the "Original Author") +All rights reserved. + +MIT +no-false-attribs License + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +Distributions of all or part of the Software intended to be used +by the recipients as they would use the unmodified Software, +containing modifications that substantially alter, remove, or +disable functionality of the Software, outside of the documented +configuration mechanisms provided by the Software, shall be +modified such that the Original Author's bug reporting email +addresses and urls are either replaced with the contact information +of the parties responsible for the changes, or removed entirely. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +Except where noted, this license applies to any and all software +programs and associated documentation files created by the +Original Author, when distributed with the Software.
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/README.md b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/README.md new file mode 100644 index 000000000..11259a5f7 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/README.md @@ -0,0 +1,132 @@ +# through2 + +[![NPM](https://nodei.co/npm/through2.png?downloads&downloadRank)](https://nodei.co/npm/through2/) + +**A tiny wrapper around Node streams.Transform (Streams2) to avoid explicit subclassing noise** + +Inspired by [Dominic Tarr](https://github.com/dominictarr)'s [through](https://github.com/dominictarr/through) in that it's so much easier to make a stream out of a function than it is to set up the prototype chain properly: `through(function (chunk) { ... })`. + +Note: A **Streams3** version of through2 is available in npm with the tag `"1.0"` rather than `"latest"` so an `npm install through2` will get you the current Streams2 version (version number is 0.x.x). To use a Streams3 version use `npm install through2@1` to fetch the latest version 1.x.x. More information about Streams2 vs Streams3 and recommendations see the article **[Why I don't use Node's core 'stream' module](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html)**. + +```js +fs.createReadStream('ex.txt') + .pipe(through2(function (chunk, enc, callback) { + for (var i = 0; i < chunk.length; i++) + if (chunk[i] == 97) + chunk[i] = 122 // swap 'a' for 'z' + + this.push(chunk) + + callback() + })) + .pipe(fs.createWriteStream('out.txt')) +``` + +Or object streams: + +```js +var all = [] + +fs.createReadStream('data.csv') + .pipe(csv2()) + .pipe(through2.obj(function (chunk, enc, callback) { + var data = { + name : chunk[0] + , address : chunk[3] + , phone : chunk[10] + } + this.push(data) + + callback() + })) + .on('data', function (data) { + all.push(data) + }) + .on('end', function () { + doSomethingSpecial(all) + }) +``` + +Note that `through2.obj(fn)` is a convenience wrapper around `through2({ objectMode: true }, fn)`. + +## API + +<b><code>through2([ options, ] [ transformFunction ] [, flushFunction ])</code></b> + +Consult the **[stream.Transform](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_transform)** documentation for the exact rules of the `transformFunction` (i.e. `this._transform`) and the optional `flushFunction` (i.e. `this._flush`). + +### options + +The options argument is optional and is passed straight through to `stream.Transform`. So you can use `objectMode:true` if you are processing non-binary streams (or just use `through2.obj()`). + +The `options` argument is first, unlike standard convention, because if I'm passing in an anonymous function then I'd prefer for the options argument to not get lost at the end of the call: + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2({ objectMode: true, allowHalfOpen: false }, + function (chunk, enc, cb) { + cb(null, 'wut?') // note we can use the second argument on the callback + // to provide data as an alternative to this.push('wut?') + } + ) + .pipe(fs.createWriteStream('/tmp/wut.txt')) +``` + +### transformFunction + +The `transformFunction` must have the following signature: `function (chunk, encoding, callback) {}`. A minimal implementation should call the `callback` function to indicate that the transformation is done, even if that transformation means discarding the chunk. + +To queue a new chunk, call `this.push(chunk)`—this can be called as many times as required before the `callback()` if you have multiple pieces to send on. + +Alternatively, you may use `callback(err, chunk)` as shorthand for emitting a single chunk or an error. + +If you **do not provide a `transformFunction`** then you will get a simple pass-through stream. + +### flushFunction + +The optional `flushFunction` is provided as the last argument (2nd or 3rd, depending on whether you've supplied options) is called just prior to the stream ending. Can be used to finish up any processing that may be in progress. + +```js +fs.createReadStream('/tmp/important.dat') + .pipe(through2( + function (chunk, enc, cb) { cb(null, chunk) }, // transform is a noop + function (cb) { // flush function + this.push('tacking on an extra buffer to the end'); + cb(); + } + )) + .pipe(fs.createWriteStream('/tmp/wut.txt')); +``` + +<b><code>through2.ctor([ options, ] transformFunction[, flushFunction ])</code></b> + +Instead of returning a `stream.Transform` instance, `through2.ctor()` returns a **constructor** for a custom Transform. This is useful when you want to use the same transform logic in multiple instances. + +```js +var FToC = through2.ctor({objectMode: true}, function (record, encoding, callback) { + if (record.temp != null && record.unit = "F") { + record.temp = ( ( record.temp - 32 ) * 5 ) / 9 + record.unit = "C" + } + this.push(record) + callback() +}) + +// Create instances of FToC like so: +var converter = new FToC() +// Or: +var converter = FToC() +// Or specify/override options when you instantiate, if you prefer: +var converter = FToC({objectMode: true}) +``` + +## See Also + + - [through2-map](https://github.com/brycebaril/through2-map) - Array.prototype.map analog for streams. + - [through2-filter](https://github.com/brycebaril/through2-filter) - Array.prototype.filter analog for streams. + - [through2-reduce](https://github.com/brycebaril/through2-reduce) - Array.prototype.reduce analog for streams. + - [through2-spy](https://github.com/brycebaril/through2-spy) - Wrapper for simple stream.PassThrough spies. + +## License + +**through2** is Copyright (c) 2013 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licenced under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details. diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/package.json b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/package.json new file mode 100644 index 000000000..ec85002e6 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/package.json @@ -0,0 +1,98 @@ +{ + "_args": [ + [ + { + "raw": "through2@^0.6.0", + "scope": null, + "escapedName": "through2", + "name": "through2", + "rawSpec": "^0.6.0", + "spec": ">=0.6.0 <0.7.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream" + ] + ], + "_from": "through2@>=0.6.0 <0.7.0", + "_id": "through2@0.6.5", + "_inCache": true, + "_location": "/vinyl-fs/glob-stream/through2", + "_npmUser": { + "name": "bryce", + "email": "bryce@ravenwall.com" + }, + "_npmVersion": "1.4.28", + "_phantomChildren": {}, + "_requested": { + "raw": "through2@^0.6.0", + "scope": null, + "escapedName": "through2", + "name": "through2", + "rawSpec": "^0.6.0", + "spec": ">=0.6.0 <0.7.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "_shasum": "41ab9c67b29d57209071410e1d7a7a968cd3ad48", + "_shrinkwrap": null, + "_spec": "through2@^0.6.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream", + "author": { + "name": "Rod Vagg", + "email": "r@va.gg", + "url": "https://github.com/rvagg" + }, + "bugs": { + "url": "https://github.com/rvagg/through2/issues" + }, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + }, + "description": "A tiny wrapper around Node streams2 Transform to avoid explicit subclassing noise", + "devDependencies": { + "bl": ">=0.9.0 <0.10.0-0", + "stream-spigot": ">=3.0.4 <3.1.0-0", + "tape": ">=2.14.0 <2.15.0-0" + }, + "directories": {}, + "dist": { + "shasum": "41ab9c67b29d57209071410e1d7a7a968cd3ad48", + "tarball": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz" + }, + "gitHead": "ba4a87875f2c82323c10023e36f4ae4b386c1bf8", + "homepage": "https://github.com/rvagg/through2", + "keywords": [ + "stream", + "streams2", + "through", + "transform" + ], + "license": "MIT", + "main": "through2.js", + "maintainers": [ + { + "name": "rvagg", + "email": "rod@vagg.org" + }, + { + "name": "bryce", + "email": "bryce@ravenwall.com" + } + ], + "name": "through2", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/rvagg/through2.git" + }, + "scripts": { + "test": "node test/test.js", + "test-local": "brtapsauce-local test/basic-test.js" + }, + "version": "0.6.5" +} diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/through2.js b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/through2.js new file mode 100644 index 000000000..5b7a880e8 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/node_modules/through2/through2.js @@ -0,0 +1,96 @@ +var Transform = require('readable-stream/transform') + , inherits = require('util').inherits + , xtend = require('xtend') + +function DestroyableTransform(opts) { + Transform.call(this, opts) + this._destroyed = false +} + +inherits(DestroyableTransform, Transform) + +DestroyableTransform.prototype.destroy = function(err) { + if (this._destroyed) return + this._destroyed = true + + var self = this + process.nextTick(function() { + if (err) + self.emit('error', err) + self.emit('close') + }) +} + +// a noop _transform function +function noop (chunk, enc, callback) { + callback(null, chunk) +} + + +// create a new export function, used by both the main export and +// the .ctor export, contains common logic for dealing with arguments +function through2 (construct) { + return function (options, transform, flush) { + if (typeof options == 'function') { + flush = transform + transform = options + options = {} + } + + if (typeof transform != 'function') + transform = noop + + if (typeof flush != 'function') + flush = null + + return construct(options, transform, flush) + } +} + + +// main export, just make me a transform stream! +module.exports = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(options) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) + + +// make me a reusable prototype that I can `new`, or implicitly `new` +// with a constructor call +module.exports.ctor = through2(function (options, transform, flush) { + function Through2 (override) { + if (!(this instanceof Through2)) + return new Through2(override) + + this.options = xtend(options, override) + + DestroyableTransform.call(this, this.options) + } + + inherits(Through2, DestroyableTransform) + + Through2.prototype._transform = transform + + if (flush) + Through2.prototype._flush = flush + + return Through2 +}) + + +module.exports.obj = through2(function (options, transform, flush) { + var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options)) + + t2._transform = transform + + if (flush) + t2._flush = flush + + return t2 +}) diff --git a/node_modules/vinyl-fs/node_modules/glob-stream/package.json b/node_modules/vinyl-fs/node_modules/glob-stream/package.json new file mode 100644 index 000000000..5b24b0faf --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob-stream/package.json @@ -0,0 +1,134 @@ +{ + "_args": [ + [ + { + "raw": "glob-stream@^5.3.2", + "scope": null, + "escapedName": "glob-stream", + "name": "glob-stream", + "rawSpec": "^5.3.2", + "spec": ">=5.3.2 <6.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs" + ] + ], + "_from": "glob-stream@>=5.3.2 <6.0.0", + "_id": "glob-stream@5.3.5", + "_inCache": true, + "_location": "/vinyl-fs/glob-stream", + "_nodeVersion": "0.10.41", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/glob-stream-5.3.5.tgz_1473289908031_0.9770245924592018" + }, + "_npmUser": { + "name": "phated", + "email": "blaine.bublitz@gmail.com" + }, + "_npmVersion": "2.15.2", + "_phantomChildren": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "string_decoder": "0.10.31", + "xtend": "4.0.1" + }, + "_requested": { + "raw": "glob-stream@^5.3.2", + "scope": null, + "escapedName": "glob-stream", + "name": "glob-stream", + "rawSpec": "^5.3.2", + "spec": ">=5.3.2 <6.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "_shasum": "a55665a9a8ccdc41915a87c701e32d4e016fad22", + "_shrinkwrap": null, + "_spec": "glob-stream@^5.3.2", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs", + "author": { + "name": "Gulp Team", + "email": "team@gulpjs.com", + "url": "http://gulpjs.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/glob-stream/issues" + }, + "contributors": [], + "dependencies": { + "extend": "^3.0.0", + "glob": "^5.0.3", + "glob-parent": "^3.0.0", + "micromatch": "^2.3.7", + "ordered-read-streams": "^0.3.0", + "through2": "^0.6.0", + "to-absolute-glob": "^0.1.1", + "unique-stream": "^2.0.2" + }, + "description": "A wrapper around node-glob to make it streamy", + "devDependencies": { + "coveralls": "^2.11.2", + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "istanbul": "^0.3.0", + "istanbul-coveralls": "^1.0.1", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.0.0", + "mocha-lcov-reporter": "^0.0.2", + "rimraf": "^2.2.5", + "should": "^7.1.0", + "stream-sink": "^1.2.0" + }, + "directories": {}, + "dist": { + "shasum": "a55665a9a8ccdc41915a87c701e32d4e016fad22", + "tarball": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz" + }, + "engines": { + "node": ">= 0.10" + }, + "files": [ + "index.js" + ], + "gitHead": "cd3a0c423a3c4a8b5e847320a868738113248575", + "homepage": "http://gulpjs.com", + "keywords": [ + "glob", + "stream" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "contra", + "email": "contra@wearefractal.com" + }, + { + "name": "fractal", + "email": "contact@wearefractal.com" + }, + { + "name": "phated", + "email": "blaine.bublitz@gmail.com" + } + ], + "name": "glob-stream", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/gulpjs/glob-stream.git" + }, + "scripts": { + "coveralls": "istanbul cover _mocha --report lcovonly && istanbul-coveralls", + "lint": "eslint . && jscs . test/", + "pretest": "npm run lint", + "test": "mocha" + }, + "version": "5.3.5" +} diff --git a/node_modules/vinyl-fs/node_modules/glob/LICENSE b/node_modules/vinyl-fs/node_modules/glob/LICENSE new file mode 100644 index 000000000..19129e315 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/glob/README.md b/node_modules/vinyl-fs/node_modules/glob/README.md new file mode 100644 index 000000000..063cf950a --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/README.md @@ -0,0 +1,377 @@ +[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Dependency Status](https://david-dm.org/isaacs/node-glob.svg)](https://david-dm.org/isaacs/node-glob) [![devDependency Status](https://david-dm.org/isaacs/node-glob/dev-status.svg)](https://david-dm.org/isaacs/node-glob#info=devDependencies) [![optionalDependency Status](https://david-dm.org/isaacs/node-glob/optional-status.svg)](https://david-dm.org/isaacs/node-glob#info=optionalDependencies) + +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +This is a glob implementation in JavaScript. It uses the `minimatch` +library to do its matching. + +![](oh-my-glob.gif) + +## Usage + +```javascript +var glob = require("glob") + +// options is optional +glob("**/*.js", options, function (er, files) { + // files is an array of filenames. + // If the `nonull` option is set, and nothing + // was found, then files is ["**/*.js"] + // er is an error object or null. +}) +``` + +## Glob Primer + +"Globs" are the patterns you type when you do stuff like `ls *.js` on +the command line, or put `build/*` in a `.gitignore` file. + +Before parsing the path part patterns, braced sections are expanded +into a set. Braced sections start with `{` and end with `}`, with any +number of comma-delimited sections within. Braced sections may contain +slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. + +The following characters have special magic meaning when used in a +path portion: + +* `*` Matches 0 or more characters in a single path portion +* `?` Matches 1 character +* `[...]` Matches a range of characters, similar to a RegExp range. + If the first character of the range is `!` or `^` then it matches + any character not in the range. +* `!(pattern|pattern|pattern)` Matches anything that does not match + any of the patterns provided. +* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the + patterns provided. +* `+(pattern|pattern|pattern)` Matches one or more occurrences of the + patterns provided. +* `*(a|b|c)` Matches zero or more occurrences of the patterns provided +* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns + provided +* `**` If a "globstar" is alone in a path portion, then it matches + zero or more directories and subdirectories searching for matches. + It does not crawl symlinked directories. + +### Dots + +If a file or directory path portion has a `.` as the first character, +then it will not match any glob pattern unless that pattern's +corresponding path part also has a `.` as its first character. + +For example, the pattern `a/.*/c` would match the file at `a/.b/c`. +However the pattern `a/*/c` would not, because `*` does not start with +a dot character. + +You can make glob treat dots as normal characters by setting +`dot:true` in the options. + +### Basename Matching + +If you set `matchBase:true` in the options, and the pattern has no +slashes in it, then it will seek for any file anywhere in the tree +with a matching basename. For example, `*.js` would match +`test/simple/basic.js`. + +### Negation + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird, and for the time being, this should be +avoided. The behavior is deprecated in version 5, and will be removed +entirely in version 6. + +### Empty Sets + +If no matching files are found, then an empty array is returned. This +differs from the shell, where the pattern itself is returned. For +example: + + $ echo a*s*d*f + a*s*d*f + +To get the bash-style behavior, set the `nonull:true` in the options. + +### See Also: + +* `man sh` +* `man bash` (Search for "Pattern Matching") +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob.hasMagic(pattern, [options]) + +Returns `true` if there are any special characters in the pattern, and +`false` otherwise. + +Note that the options affect the results. If `noext:true` is set in +the options object, then `+(a|b)` will not be considered a magic +pattern. If the pattern has a brace expansion, like `a/{b/c,x/y}` +then that is considered magical, unless `nobrace:true` is set in the +options. + +## glob(pattern, [options], cb) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* `cb` {Function} + * `err` {Error | null} + * `matches` {Array<String>} filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` {String} Pattern to be matched +* `options` {Object} +* return: {Array<String>} filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instantiating the `glob.Glob` class. + +```javascript +var Glob = require("glob").Glob +var mg = new Glob(pattern, options, cb) +``` + +It's an EventEmitter, and starts walking the filesystem to find matches +immediately. + +### new glob.Glob(pattern, [options], [cb]) + +* `pattern` {String} pattern to search for +* `options` {Object} +* `cb` {Function} Called when an error occurs, or matches are found + * `err` {Error | null} + * `matches` {Array<String>} filenames found matching the pattern + +Note that if the `sync` flag is set in the options, then matches will +be immediately available on the `g.found` member. + +### Properties + +* `minimatch` The minimatch object that the glob uses. +* `options` The options object passed in. +* `aborted` Boolean which is set to true when calling `abort()`. There + is no way at this time to continue a glob search after aborting, but + you can re-use the statCache to avoid having to duplicate syscalls. +* `cache` Convenience object. Each field has the following possible + values: + * `false` - Path does not exist + * `true` - Path exists + * `'DIR'` - Path exists, and is not a directory + * `'FILE'` - Path exists, and is a directory + * `[file, entries, ...]` - Path exists, is a directory, and the + array value is the results of `fs.readdir` +* `statCache` Cache of `fs.stat` results, to prevent statting the same + path multiple times. +* `symlinks` A record of which paths are symbolic links, which is + relevant in resolving `**` patterns. +* `realpathCache` An optional object which is passed to `fs.realpath` + to minimize unnecessary syscalls. It is stored on the instantiated + Glob object, and may be re-used. + +### Events + +* `end` When the matching is finished, this is emitted with all the + matches found. If the `nonull` option is set, and no match was found, + then the `matches` list contains the original pattern. The matches + are sorted, unless the `nosort` flag is set. +* `match` Every time a match is found, this is emitted with the matched. +* `error` Emitted when an unexpected error is encountered, or whenever + any fs error occurs if `options.strict` is set. +* `abort` When `abort()` is called, this event is raised. + +### Methods + +* `pause` Temporarily stop the search +* `resume` Resume the search +* `abort` Stop the search forever + +### Options + +All the options that can be passed to Minimatch can also be passed to +Glob to change pattern matching behavior. Also, some have been added, +or have glob-specific ramifications. + +All options are false by default, unless otherwise noted. + +All options are added to the Glob object, as well. + +If you are running many `glob` operations, you can pass a Glob object +as the `options` argument to a subsequent operation to shortcut some +`stat` and `readdir` calls. At the very least, you may pass in shared +`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that +parallel glob operations will be sped up by sharing information about +the filesystem. + +* `cwd` The current working directory in which to search. Defaults + to `process.cwd()`. +* `root` The place where patterns starting with `/` will be mounted + onto. Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix + systems, and `C:\` or some such on Windows.) +* `dot` Include `.dot` files in normal matches and `globstar` matches. + Note that an explicit dot in a portion of the pattern will always + match dot files. +* `nomount` By default, a pattern starting with a forward-slash will be + "mounted" onto the root setting, so that a valid filesystem path is + returned. Set this flag to disable that behavior. +* `mark` Add a `/` character to directory matches. Note that this + requires additional stat calls. +* `nosort` Don't sort the results. +* `stat` Set to true to stat *all* results. This reduces performance + somewhat, and is completely unnecessary, unless `readdir` is presumed + to be an untrustworthy indicator of file existence. +* `silent` When an unusual error is encountered when attempting to + read a directory, a warning will be printed to stderr. Set the + `silent` option to true to suppress these warnings. +* `strict` When an unusual error is encountered when attempting to + read a directory, the process will just continue on in search of + other matches. Set the `strict` option to raise an error in these + cases. +* `cache` See `cache` property above. Pass in a previously generated + cache object to save some fs calls. +* `statCache` A cache of results of filesystem information, to prevent + unnecessary stat calls. While it should not normally be necessary + to set this, you may pass the statCache from one glob() call to the + options object of another, if you know that the filesystem will not + change between calls. (See "Race Conditions" below.) +* `symlinks` A cache of known symbolic links. You may pass in a + previously generated `symlinks` object to save `lstat` calls when + resolving `**` matches. +* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. +* `nounique` In some cases, brace-expanded patterns can result in the + same file showing up multiple times in the result set. By default, + this implementation prevents duplicates in the result set. Set this + flag to disable that behavior. +* `nonull` Set to never return an empty set, instead returning a set + containing the pattern itself. This is the default in glob(3). +* `debug` Set to enable debug logging in minimatch and glob. +* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. +* `noglobstar` Do not match `**` against multiple filenames. (Ie, + treat it as a normal `*` instead.) +* `noext` Do not match `+(a|b)` "extglob" patterns. +* `nocase` Perform a case-insensitive match. Note: on + case-insensitive filesystems, non-magic patterns will match by + default, since `stat` and `readdir` will not raise errors. +* `matchBase` Perform a basename-only match if the pattern does not + contain any slash characters. That is, `*.js` would be treated as + equivalent to `**/*.js`, matching all js files in all directories. +* `nodir` Do not match directories, only files. (Note: to match + *only* directories, simply put a `/` at the end of the pattern.) +* `ignore` Add a pattern or an array of patterns to exclude matches. +* `follow` Follow symlinked directories when expanding `**` patterns. + Note that this can result in a lot of duplicate references in the + presence of cyclic links. +* `realpath` Set to true to call `fs.realpath` on all of the results. + In the case of a symlink that cannot be resolved, the full absolute + path to the matched entry is returned (though it will usually be a + broken symlink) +* `nonegate` Suppress deprecated `negate` behavior. (See below.) + Default=true +* `nocomment` Suppress deprecated `comment` behavior. (See below.) + Default=true + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between node-glob and other +implementations, and are intentional. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set. This is supported in the manner of bsdglob +and bash 4.3, where `**` only has special significance if it is the only +thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +Note that symlinked directories are not crawled as part of a `**`, +though their contents may match against subsequent portions of the +pattern. This prevents infinite loops and duplicates and the like. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then glob returns the pattern as-provided, rather than +interpreting the character escapes. For example, +`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`. This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern. Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity. Since those two are valid, matching proceeds. + +### Comments and Negation + +**Note**: In version 5 of this module, negation and comments are +**disabled** by default. You can explicitly set `nonegate:false` or +`nocomment:false` to re-enable them. They are going away entirely in +version 6. + +The intent for negation would be for a pattern starting with `!` to +match everything that *doesn't* match the supplied pattern. However, +the implementation is weird. It is better to use the `ignore` option +to set a pattern or set of patterns to exclude from matches. If you +want the "everything except *x*" type of behavior, you can use `**` as +the main pattern, and set an `ignore` for the things to exclude. + +The comments feature is added in minimatch, primarily to more easily +support use cases like ignore files, where a `#` at the start of a +line makes the pattern "empty". However, in the context of a +straightforward filesystem globber, "comments" don't make much sense. + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation. You must use +forward-slashes **only** in glob expressions. Back-slashes will always +be interpreted as escape characters, not path separators. + +Results from absolute patterns such as `/foo/*` are mounted onto the +root setting using `path.join`. On windows, this will by default result +in `/foo/*` matching `C:\foo\bar.txt`. + +## Race Conditions + +Glob searching, by its very nature, is susceptible to race conditions, +since it relies on directory walking and such. + +As a result, it is possible that a file that exists when glob looks for +it may have been deleted or modified by the time it returns the result. + +As part of its internal implementation, this program caches all stat +and readdir calls that it makes, in order to cut down on system +overhead. However, this also makes it even more susceptible to races, +especially if the cache or statCache objects are reused between glob +calls. + +Users are thus advised not to use a glob result as a guarantee of +filesystem state in the face of rapid changes. For the vast majority +of operations, this is never a problem. + +## Contributing + +Any change to behavior (including bugfixes) must come with a test. + +Patches that fail tests or reduce performance will be rejected. + +``` +# to run tests +npm test + +# to re-generate test fixtures +npm run test-regen + +# to benchmark against bash/zsh +npm run bench + +# to profile javascript +npm run prof +``` diff --git a/node_modules/vinyl-fs/node_modules/glob/common.js b/node_modules/vinyl-fs/node_modules/glob/common.js new file mode 100644 index 000000000..e36a631ca --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/common.js @@ -0,0 +1,245 @@ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} diff --git a/node_modules/vinyl-fs/node_modules/glob/glob.js b/node_modules/vinyl-fs/node_modules/glob/glob.js new file mode 100644 index 000000000..022d2ac8c --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/glob.js @@ -0,0 +1,752 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {<filename>: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} diff --git a/node_modules/vinyl-fs/node_modules/glob/package.json b/node_modules/vinyl-fs/node_modules/glob/package.json new file mode 100644 index 000000000..4a5531547 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/package.json @@ -0,0 +1,106 @@ +{ + "_args": [ + [ + { + "raw": "glob@^5.0.3", + "scope": null, + "escapedName": "glob", + "name": "glob", + "rawSpec": "^5.0.3", + "spec": ">=5.0.3 <6.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream" + ] + ], + "_from": "glob@>=5.0.3 <6.0.0", + "_id": "glob@5.0.15", + "_inCache": true, + "_location": "/vinyl-fs/glob", + "_nodeVersion": "4.0.0", + "_npmUser": { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + "_npmVersion": "3.3.2", + "_phantomChildren": {}, + "_requested": { + "raw": "glob@^5.0.3", + "scope": null, + "escapedName": "glob", + "name": "glob", + "rawSpec": "^5.0.3", + "spec": ">=5.0.3 <6.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "_shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", + "_shrinkwrap": null, + "_spec": "glob@^5.0.3", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream", + "author": { + "name": "Isaac Z. Schlueter", + "email": "i@izs.me", + "url": "http://blog.izs.me/" + }, + "bugs": { + "url": "https://github.com/isaacs/node-glob/issues" + }, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "description": "a little globber", + "devDependencies": { + "mkdirp": "0", + "rimraf": "^2.2.8", + "tap": "^1.1.4", + "tick": "0.0.6" + }, + "directories": {}, + "dist": { + "shasum": "1bc936b9e02f4a603fcc222ecf7633d30b8b93b1", + "tarball": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" + }, + "engines": { + "node": "*" + }, + "files": [ + "glob.js", + "sync.js", + "common.js" + ], + "gitHead": "3a7e71d453dd80e75b196fd262dd23ed54beeceb", + "homepage": "https://github.com/isaacs/node-glob#readme", + "license": "ISC", + "main": "glob.js", + "maintainers": [ + { + "name": "isaacs", + "email": "i@izs.me" + } + ], + "name": "glob", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/isaacs/node-glob.git" + }, + "scripts": { + "bench": "bash benchmark.sh", + "benchclean": "node benchclean.js", + "prepublish": "npm run benchclean", + "prof": "bash prof.sh && cat profile.txt", + "profclean": "rm -f v8.log profile.txt", + "test": "tap test/*.js --cov", + "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js" + }, + "version": "5.0.15" +} diff --git a/node_modules/vinyl-fs/node_modules/glob/sync.js b/node_modules/vinyl-fs/node_modules/glob/sync.js new file mode 100644 index 000000000..09883d2ce --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/glob/sync.js @@ -0,0 +1,460 @@ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} diff --git a/node_modules/vinyl-fs/node_modules/is-extglob/LICENSE b/node_modules/vinyl-fs/node_modules/is-extglob/LICENSE new file mode 100644 index 000000000..842218cf0 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-extglob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/is-extglob/README.md b/node_modules/vinyl-fs/node_modules/is-extglob/README.md new file mode 100644 index 000000000..416faa88b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-extglob/README.md @@ -0,0 +1,107 @@ +# is-extglob [![NPM version](https://img.shields.io/npm/v/is-extglob.svg?style=flat)](https://www.npmjs.com/package/is-extglob) [![NPM downloads](https://img.shields.io/npm/dm/is-extglob.svg?style=flat)](https://npmjs.org/package/is-extglob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-extglob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-extglob) + +> Returns true if a string has an extglob. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-extglob +``` + +## Usage + +```js +var isExtglob = require('is-extglob'); +``` + +**True** + +```js +isExtglob('?(abc)'); +isExtglob('@(abc)'); +isExtglob('!(abc)'); +isExtglob('*(abc)'); +isExtglob('+(abc)'); +``` + +**False** + +Escaped extglobs: + +```js +isExtglob('\\?(abc)'); +isExtglob('\\@(abc)'); +isExtglob('\\!(abc)'); +isExtglob('\\*(abc)'); +isExtglob('\\+(abc)'); +``` + +Everything else... + +```js +isExtglob('foo.js'); +isExtglob('!foo.js'); +isExtglob('*.js'); +isExtglob('**/abc.js'); +isExtglob('abc/*.js'); +isExtglob('abc/(aaa|bbb).js'); +isExtglob('abc/[a-z].js'); +isExtglob('abc/{a,b}.js'); +isExtglob('abc/?.js'); +isExtglob('abc.js'); +isExtglob('abc/def/ghi.js'); +``` + +## History + +**v2.0** + +Adds support for escaping. Escaped exglobs no longer return true. + +## About + +### Related projects + +* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.") +* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") +* [micromatch](https://www.npmjs.com/package/micromatch): Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. | [homepage](https://github.com/jonschlinkert/micromatch "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/is-extglob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.30, on September 03, 2016._
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/is-extglob/index.js b/node_modules/vinyl-fs/node_modules/is-extglob/index.js new file mode 100644 index 000000000..69e085881 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-extglob/index.js @@ -0,0 +1,19 @@ +/*! + * is-extglob <https://github.com/jonschlinkert/is-extglob> + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +module.exports = function isExtglob(str) { + if (!str || typeof str !== 'string') { + return false; + } + + var m, matches = []; + while ((m = /(\\).|([@?!+*]\(.*\))/g.exec(str))) { + if (m[2]) matches.push(m[2]); + str = str.slice(m.index + m[0].length); + } + return matches.length; +}; diff --git a/node_modules/vinyl-fs/node_modules/is-extglob/package.json b/node_modules/vinyl-fs/node_modules/is-extglob/package.json new file mode 100644 index 000000000..319da898b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-extglob/package.json @@ -0,0 +1,138 @@ +{ + "_args": [ + [ + { + "raw": "is-extglob@^2.0.0", + "scope": null, + "escapedName": "is-extglob", + "name": "is-extglob", + "rawSpec": "^2.0.0", + "spec": ">=2.0.0 <3.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/is-glob" + ] + ], + "_from": "is-extglob@>=2.0.0 <3.0.0", + "_id": "is-extglob@2.0.0", + "_inCache": true, + "_location": "/vinyl-fs/is-extglob", + "_nodeVersion": "6.3.0", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/is-extglob-2.0.0.tgz_1472929957338_0.5954867014661431" + }, + "_npmUser": { + "name": "jonschlinkert", + "email": "github@sellside.com" + }, + "_npmVersion": "3.10.3", + "_phantomChildren": {}, + "_requested": { + "raw": "is-extglob@^2.0.0", + "scope": null, + "escapedName": "is-extglob", + "name": "is-extglob", + "rawSpec": "^2.0.0", + "spec": ">=2.0.0 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/is-glob" + ], + "_resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.0.0.tgz", + "_shasum": "a9b92c1ae2d7a975ad307be0722049c7e4ea2f13", + "_shrinkwrap": null, + "_spec": "is-extglob@^2.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/is-glob", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/is-extglob/issues" + }, + "dependencies": {}, + "description": "Returns true if a string has an extglob.", + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "directories": {}, + "dist": { + "shasum": "a9b92c1ae2d7a975ad307be0722049c7e4ea2f13", + "tarball": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.0.0.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "LICENSE", + "README.md" + ], + "gitHead": "fd18206880e6f1d7fa586d1cd51c4e0371008637", + "homepage": "https://github.com/jonschlinkert/is-extglob", + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "jonschlinkert", + "email": "github@sellside.com" + } + ], + "name": "is-extglob", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/is-extglob.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "toc": false, + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "is-glob", + "micromatch", + "has-glob" + ] + }, + "reflinks": [ + "verb", + "verb-generate-readme" + ], + "lint": { + "reflinks": true + } + }, + "version": "2.0.0" +} diff --git a/node_modules/vinyl-fs/node_modules/is-glob/LICENSE b/node_modules/vinyl-fs/node_modules/is-glob/LICENSE new file mode 100644 index 000000000..39245ac1c --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-glob/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014-2016, Jon Schlinkert. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/is-glob/README.md b/node_modules/vinyl-fs/node_modules/is-glob/README.md new file mode 100644 index 000000000..3d9931617 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-glob/README.md @@ -0,0 +1,135 @@ +# is-glob [![NPM version](https://img.shields.io/npm/v/is-glob.svg?style=flat)](https://www.npmjs.com/package/is-glob) [![NPM downloads](https://img.shields.io/npm/dm/is-glob.svg?style=flat)](https://npmjs.org/package/is-glob) [![Build Status](https://img.shields.io/travis/jonschlinkert/is-glob.svg?style=flat)](https://travis-ci.org/jonschlinkert/is-glob) + +> Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a better user experience. + +## Install + +Install with [npm](https://www.npmjs.com/): + +```sh +$ npm install --save is-glob +``` + +You might also be interested in [is-valid-glob](https://github.com/jonschlinkert/is-valid-glob) and [has-glob](https://github.com/jonschlinkert/has-glob). + +## Usage + +```js +var isGlob = require('is-glob'); +``` + +**True** + +Patterns that have glob characters or regex patterns will return `true`: + +```js +isGlob('!foo.js'); +isGlob('*.js'); +isGlob('**/abc.js'); +isGlob('abc/*.js'); +isGlob('abc/(aaa|bbb).js'); +isGlob('abc/[a-z].js'); +isGlob('abc/{a,b}.js'); +isGlob('abc/?.js'); +//=> true +``` + +Extglobs + +```js +isGlob('abc/@(a).js'); +isGlob('abc/!(a).js'); +isGlob('abc/+(a).js'); +isGlob('abc/*(a).js'); +isGlob('abc/?(a).js'); +//=> true +``` + +**False** + +Escaped globs or extglobs return `false`: + +```js +isGlob('abc/\\@(a).js'); +isGlob('abc/\\!(a).js'); +isGlob('abc/\\+(a).js'); +isGlob('abc/\\*(a).js'); +isGlob('abc/\\?(a).js'); +isGlob('\\!foo.js'); +isGlob('\\*.js'); +isGlob('\\*\\*/abc.js'); +isGlob('abc/\\*.js'); +isGlob('abc/\\(aaa|bbb).js'); +isGlob('abc/\\[a-z].js'); +isGlob('abc/\\{a,b}.js'); +isGlob('abc/\\?.js'); +//=> false +``` + +Patterns that do not have glob patterns return `false`: + +```js +isGlob('abc.js'); +isGlob('abc/def/ghi.js'); +isGlob('foo.js'); +isGlob('abc/@.js'); +isGlob('abc/+.js'); +isGlob(); +isGlob(null); +//=> false +``` + +Arrays are also `false` (If you want to check if an array has a glob pattern, use [has-glob](https://github.com/jonschlinkert/has-glob)): + +```js +isGlob(['**/*.js']); +isGlob(['foo.js']); +//=> false +``` + +## About + +### Related projects + +* [assemble](https://www.npmjs.com/package/assemble): Get the rocks out of your socks! Assemble makes you fast at creating web projects… [more](https://github.com/assemble/assemble) | [homepage](https://github.com/assemble/assemble "Get the rocks out of your socks! Assemble makes you fast at creating web projects. Assemble is used by thousands of projects for rapid prototyping, creating themes, scaffolds, boilerplates, e-books, UI components, API documentation, blogs, building websit") +* [base](https://www.npmjs.com/package/base): base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting… [more](https://github.com/node-base/base) | [homepage](https://github.com/node-base/base "base is the foundation for creating modular, unit testable and highly pluggable node.js applications, starting with a handful of common methods, like `set`, `get`, `del` and `use`.") +* [update](https://www.npmjs.com/package/update): Be scalable! Update is a new, open source developer framework and CLI for automating updates… [more](https://github.com/update/update) | [homepage](https://github.com/update/update "Be scalable! Update is a new, open source developer framework and CLI for automating updates of any kind in code projects.") +* [verb](https://www.npmjs.com/package/verb): Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used… [more](https://github.com/verbose/verb) | [homepage](https://github.com/verbose/verb "Documentation generator for GitHub projects. Verb is extremely powerful, easy to use, and is used on hundreds of projects of all sizes to generate everything from API docs to readmes.") + +### Contributing + +Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). + +### Building docs + +_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ + +To generate the readme and API documentation with [verb](https://github.com/verbose/verb): + +```sh +$ npm install -g verb verb-generate-readme && verb +``` + +### Running tests + +Install dev dependencies: + +```sh +$ npm install -d && npm test +``` + +### Author + +**Jon Schlinkert** + +* [github/jonschlinkert](https://github.com/jonschlinkert) +* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) + +### License + +Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT license](https://github.com/jonschlinkert/is-glob/blob/master/LICENSE). + +*** + +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.1.30, on September 03, 2016._
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/is-glob/index.js b/node_modules/vinyl-fs/node_modules/is-glob/index.js new file mode 100644 index 000000000..e34881928 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-glob/index.js @@ -0,0 +1,23 @@ +/*! + * is-glob <https://github.com/jonschlinkert/is-glob> + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + +var isExtglob = require('is-extglob'); + +module.exports = function isGlob(str) { + if (!str || typeof str !== 'string') { + return false; + } + + if (isExtglob(str)) return true; + var m, matches = []; + + while ((m = /(\\).|([*?]|\[.*\]|\{.*\}|\(.*\|.*\)|^!)/g.exec(str))) { + if (m[2]) matches.push(m[2]); + str = str.slice(m.index + m[0].length); + } + return matches.length > 0; +}; diff --git a/node_modules/vinyl-fs/node_modules/is-glob/package.json b/node_modules/vinyl-fs/node_modules/is-glob/package.json new file mode 100644 index 000000000..d1bf36fa0 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/is-glob/package.json @@ -0,0 +1,160 @@ +{ + "_args": [ + [ + { + "raw": "is-glob@^3.0.0", + "scope": null, + "escapedName": "is-glob", + "name": "is-glob", + "rawSpec": "^3.0.0", + "spec": ">=3.0.0 <4.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-parent" + ] + ], + "_from": "is-glob@>=3.0.0 <4.0.0", + "_id": "is-glob@3.0.0", + "_inCache": true, + "_location": "/vinyl-fs/is-glob", + "_nodeVersion": "6.3.0", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/is-glob-3.0.0.tgz_1472932646404_0.7158155627548695" + }, + "_npmUser": { + "name": "jonschlinkert", + "email": "github@sellside.com" + }, + "_npmVersion": "3.10.3", + "_phantomChildren": {}, + "_requested": { + "raw": "is-glob@^3.0.0", + "scope": null, + "escapedName": "is-glob", + "name": "is-glob", + "rawSpec": "^3.0.0", + "spec": ">=3.0.0 <4.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-parent" + ], + "_resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.0.0.tgz", + "_shasum": "e433c222db9d77844084d72db1eff047845985c1", + "_shrinkwrap": null, + "_spec": "is-glob@^3.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-parent", + "author": { + "name": "Jon Schlinkert", + "url": "https://github.com/jonschlinkert" + }, + "bugs": { + "url": "https://github.com/jonschlinkert/is-glob/issues" + }, + "contributors": [ + { + "name": "Daniel Perez", + "email": "daniel@claudetech.com", + "url": "http://tuvistavie.com" + }, + { + "name": "Jon Schlinkert", + "email": "jon.schlinkert@sellside.com", + "url": "http://twitter.com/jonschlinkert" + } + ], + "dependencies": { + "is-extglob": "^2.0.0" + }, + "description": "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet", + "devDependencies": { + "gulp-format-md": "^0.1.10", + "mocha": "^3.0.2" + }, + "directories": {}, + "dist": { + "shasum": "e433c222db9d77844084d72db1eff047845985c1", + "tarball": "https://registry.npmjs.org/is-glob/-/is-glob-3.0.0.tgz" + }, + "engines": { + "node": ">=0.10.0" + }, + "files": [ + "index.js", + "LICENSE", + "README.md" + ], + "gitHead": "57657ef7749e447571b01ea6b068e8288ed539a4", + "homepage": "https://github.com/jonschlinkert/is-glob", + "keywords": [ + "bash", + "braces", + "check", + "exec", + "expression", + "extglob", + "glob", + "globbing", + "globstar", + "is", + "match", + "matches", + "pattern", + "regex", + "regular", + "string", + "test" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "jonschlinkert", + "email": "github@sellside.com" + }, + { + "name": "doowb", + "email": "brian.woodward@gmail.com" + } + ], + "name": "is-glob", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/jonschlinkert/is-glob.git" + }, + "scripts": { + "test": "mocha" + }, + "verb": { + "layout": "default", + "plugins": [ + "gulp-format-md" + ], + "related": { + "list": [ + "assemble", + "base", + "update", + "verb" + ] + }, + "reflinks": [ + "assemble", + "bach", + "base", + "composer", + "gulp", + "has-glob", + "is-valid-glob", + "micromatch", + "npm", + "scaffold", + "verb", + "vinyl" + ] + }, + "version": "3.0.0" +} diff --git a/node_modules/vinyl-fs/node_modules/isarray/.npmignore b/node_modules/vinyl-fs/node_modules/isarray/.npmignore new file mode 100644 index 000000000..3c3629e64 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/.npmignore @@ -0,0 +1 @@ +node_modules diff --git a/node_modules/vinyl-fs/node_modules/isarray/.travis.yml b/node_modules/vinyl-fs/node_modules/isarray/.travis.yml new file mode 100644 index 000000000..cc4dba29d --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - "0.8" + - "0.10" diff --git a/node_modules/vinyl-fs/node_modules/isarray/Makefile b/node_modules/vinyl-fs/node_modules/isarray/Makefile new file mode 100644 index 000000000..787d56e1e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/Makefile @@ -0,0 +1,6 @@ + +test: + @node_modules/.bin/tape test.js + +.PHONY: test + diff --git a/node_modules/vinyl-fs/node_modules/isarray/README.md b/node_modules/vinyl-fs/node_modules/isarray/README.md new file mode 100644 index 000000000..16d2c59c6 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/README.md @@ -0,0 +1,60 @@ + +# isarray + +`Array#isArray` for older browsers. + +[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray) +[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray) + +[![browser support](https://ci.testling.com/juliangruber/isarray.png) +](https://ci.testling.com/juliangruber/isarray) + +## Usage + +```js +var isArray = require('isarray'); + +console.log(isArray([])); // => true +console.log(isArray({})); // => false +``` + +## Installation + +With [npm](http://npmjs.org) do + +```bash +$ npm install isarray +``` + +Then bundle for the browser with +[browserify](https://github.com/substack/browserify). + +With [component](http://component.io) do + +```bash +$ component install juliangruber/isarray +``` + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/isarray/component.json b/node_modules/vinyl-fs/node_modules/isarray/component.json new file mode 100644 index 000000000..9e31b6838 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/component.json @@ -0,0 +1,19 @@ +{ + "name" : "isarray", + "description" : "Array#isArray for older browsers", + "version" : "0.0.1", + "repository" : "juliangruber/isarray", + "homepage": "https://github.com/juliangruber/isarray", + "main" : "index.js", + "scripts" : [ + "index.js" + ], + "dependencies" : {}, + "keywords": ["browser","isarray","array"], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT" +} diff --git a/node_modules/vinyl-fs/node_modules/isarray/index.js b/node_modules/vinyl-fs/node_modules/isarray/index.js new file mode 100644 index 000000000..a57f63495 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/index.js @@ -0,0 +1,5 @@ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; diff --git a/node_modules/vinyl-fs/node_modules/isarray/package.json b/node_modules/vinyl-fs/node_modules/isarray/package.json new file mode 100644 index 000000000..e964cc50b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/package.json @@ -0,0 +1,104 @@ +{ + "_args": [ + [ + { + "raw": "isarray@~1.0.0", + "scope": null, + "escapedName": "isarray", + "name": "isarray", + "rawSpec": "~1.0.0", + "spec": ">=1.0.0 <1.1.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/readable-stream" + ] + ], + "_from": "isarray@>=1.0.0 <1.1.0", + "_id": "isarray@1.0.0", + "_inCache": true, + "_location": "/vinyl-fs/isarray", + "_nodeVersion": "5.1.0", + "_npmUser": { + "name": "juliangruber", + "email": "julian@juliangruber.com" + }, + "_npmVersion": "3.3.12", + "_phantomChildren": {}, + "_requested": { + "raw": "isarray@~1.0.0", + "scope": null, + "escapedName": "isarray", + "name": "isarray", + "rawSpec": "~1.0.0", + "spec": ">=1.0.0 <1.1.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/readable-stream" + ], + "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "_shasum": "bb935d48582cba168c06834957a54a3e07124f11", + "_shrinkwrap": null, + "_spec": "isarray@~1.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/readable-stream", + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "bugs": { + "url": "https://github.com/juliangruber/isarray/issues" + }, + "dependencies": {}, + "description": "Array#isArray for older browsers", + "devDependencies": { + "tape": "~2.13.4" + }, + "directories": {}, + "dist": { + "shasum": "bb935d48582cba168c06834957a54a3e07124f11", + "tarball": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "gitHead": "2a23a281f369e9ae06394c0fb4d2381355a6ba33", + "homepage": "https://github.com/juliangruber/isarray", + "keywords": [ + "browser", + "isarray", + "array" + ], + "license": "MIT", + "main": "index.js", + "maintainers": [ + { + "name": "juliangruber", + "email": "julian@juliangruber.com" + } + ], + "name": "isarray", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/isarray.git" + }, + "scripts": { + "test": "tape test.js" + }, + "testling": { + "files": "test.js", + "browsers": [ + "ie/8..latest", + "firefox/17..latest", + "firefox/nightly", + "chrome/22..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + }, + "version": "1.0.0" +} diff --git a/node_modules/vinyl-fs/node_modules/isarray/test.js b/node_modules/vinyl-fs/node_modules/isarray/test.js new file mode 100644 index 000000000..e0c3444d8 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/isarray/test.js @@ -0,0 +1,20 @@ +var isArray = require('./'); +var test = require('tape'); + +test('is array', function(t){ + t.ok(isArray([])); + t.notOk(isArray({})); + t.notOk(isArray(null)); + t.notOk(isArray(false)); + + var obj = {}; + obj[0] = true; + t.notOk(isArray(obj)); + + var arr = []; + arr.foo = 'bar'; + t.ok(isArray(arr)); + + t.end(); +}); + diff --git a/node_modules/vinyl-fs/node_modules/ordered-read-streams/LICENSE b/node_modules/vinyl-fs/node_modules/ordered-read-streams/LICENSE new file mode 100644 index 000000000..16fd42818 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/ordered-read-streams/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 Artem Medeusheyev + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/ordered-read-streams/README.md b/node_modules/vinyl-fs/node_modules/ordered-read-streams/README.md new file mode 100644 index 000000000..8f8be53b3 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/ordered-read-streams/README.md @@ -0,0 +1,65 @@ +# ordered-read-streams [![NPM version](https://badge.fury.io/js/ordered-read-streams.png)](http://badge.fury.io/js/ordered-read-streams) [![Build Status](https://travis-ci.org/armed/ordered-read-streams.png?branch=master)](https://travis-ci.org/armed/ordered-read-streams) + +Combines array of streams into one read stream in strict order. + +## Installation + +`npm install ordered-read-streams` + +## Overview + +`ordered-read-streams` handles all data/errors from input streams in parallel, but emits data/errors in strict order in which streams are passed to constructor. This is `objectMode = true` stream. + +## Example + +```js +var through = require('through2'); +var Ordered = require('ordered-read-streams'); + +var s1 = through.obj(function (data, enc, next) { + var self = this; + setTimeout(function () { + self.push(data); + next(); + }, 200) +}); +var s2 = through.obj(function (data, enc, next) { + var self = this; + setTimeout(function () { + self.push(data); + next(); + }, 30) +}); +var s3 = through.obj(function (data, enc, next) { + var self = this; + setTimeout(function () { + self.push(data); + next(); + }, 100) +}); + +var streams = new Ordered([s1, s2, s3]); +streams.on('data', function (data) { + console.log(data); +}) + +s1.write('stream 1'); +s1.end(); + +s2.write('stream 2'); +s2.end(); + +s3.write('stream 3'); +s3.end(); +``` +Ouput will be: + +``` +stream 1 +stream 2 +stream 3 +``` + +## Licence + +MIT diff --git a/node_modules/vinyl-fs/node_modules/ordered-read-streams/index.js b/node_modules/vinyl-fs/node_modules/ordered-read-streams/index.js new file mode 100644 index 000000000..03e936b65 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/ordered-read-streams/index.js @@ -0,0 +1,81 @@ +var Readable = require('readable-stream/readable'); +var isReadable = require('is-stream').readable; +var util = require('util'); + +function addStream(streams, stream) +{ + if(!isReadable(stream)) throw new Error('All input streams must be readable'); + + var self = this; + + stream._buffer = []; + + stream.on('readable', function() + { + var chunk = stream.read(); + if (chunk === null) + return; + + if(this === streams[0]) + self.push(chunk); + + else + this._buffer.push(chunk); + }); + + stream.on('end', function() + { + for(var stream = streams[0]; + stream && stream._readableState.ended; + stream = streams[0]) + { + while(stream._buffer.length) + self.push(stream._buffer.shift()); + + streams.shift(); + } + + if(!streams.length) self.push(null); + }); + + stream.on('error', this.emit.bind(this, 'error')); + + streams.push(stream); +} + + +function OrderedStreams(streams, options) { + if (!(this instanceof(OrderedStreams))) { + return new OrderedStreams(streams, options); + } + + streams = streams || []; + options = options || {}; + + options.objectMode = true; + + Readable.call(this, options); + + + if(!Array.isArray(streams)) streams = [streams]; + if(!streams.length) return this.push(null); // no streams, close + + + var addStream_bind = addStream.bind(this, []); + + + streams.forEach(function(item) + { + if(Array.isArray(item)) + item.forEach(addStream_bind); + + else + addStream_bind(item); + }); +} +util.inherits(OrderedStreams, Readable); + +OrderedStreams.prototype._read = function () {}; + + +module.exports = OrderedStreams; diff --git a/node_modules/vinyl-fs/node_modules/ordered-read-streams/package.json b/node_modules/vinyl-fs/node_modules/ordered-read-streams/package.json new file mode 100644 index 000000000..57c0859c7 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/ordered-read-streams/package.json @@ -0,0 +1,91 @@ +{ + "_args": [ + [ + { + "raw": "ordered-read-streams@^0.3.0", + "scope": null, + "escapedName": "ordered-read-streams", + "name": "ordered-read-streams", + "rawSpec": "^0.3.0", + "spec": ">=0.3.0 <0.4.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream" + ] + ], + "_from": "ordered-read-streams@>=0.3.0 <0.4.0", + "_id": "ordered-read-streams@0.3.0", + "_inCache": true, + "_location": "/vinyl-fs/ordered-read-streams", + "_nodeVersion": "2.2.1", + "_npmUser": { + "name": "armed", + "email": "artem.medeusheyev@gmail.com" + }, + "_npmVersion": "2.11.2", + "_phantomChildren": {}, + "_requested": { + "raw": "ordered-read-streams@^0.3.0", + "scope": null, + "escapedName": "ordered-read-streams", + "name": "ordered-read-streams", + "rawSpec": "^0.3.0", + "spec": ">=0.3.0 <0.4.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "_shasum": "7137e69b3298bb342247a1bbee3881c80e2fd78b", + "_shrinkwrap": null, + "_spec": "ordered-read-streams@^0.3.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream", + "author": { + "name": "Artem Medeusheyev", + "email": "artem.medeusheyev@gmail.com" + }, + "bugs": { + "url": "https://github.com/armed/ordered-read-streams/issues" + }, + "dependencies": { + "is-stream": "^1.0.1", + "readable-stream": "^2.0.1" + }, + "description": "Combines array of streams into one read stream in strict order", + "devDependencies": { + "jshint": "^2.8.0", + "mocha": "^2.2.5", + "pre-commit": "^1.0.10", + "should": "^7.0.1", + "through2": "^2.0.0" + }, + "directories": {}, + "dist": { + "shasum": "7137e69b3298bb342247a1bbee3881c80e2fd78b", + "tarball": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz" + }, + "files": [ + "index.js" + ], + "gitHead": "d1d4cb9437b1afc750fb0cb7f8f438ba6d9c4406", + "homepage": "https://github.com/armed/ordered-read-streams#readme", + "license": "MIT", + "maintainers": [ + { + "name": "armed", + "email": "artem.medeusheyev@gmail.com" + } + ], + "name": "ordered-read-streams", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/armed/ordered-read-streams.git" + }, + "scripts": { + "test": "jshint *.js test/*.js && mocha" + }, + "version": "0.3.0" +} diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/.npmignore b/node_modules/vinyl-fs/node_modules/readable-stream/.npmignore new file mode 100644 index 000000000..265ff739e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/.npmignore @@ -0,0 +1,8 @@ +build/ +test/ +examples/ +fs.js +zlib.js +.zuul.yml +.nyc_output +coverage diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/.travis.yml b/node_modules/vinyl-fs/node_modules/readable-stream/.travis.yml new file mode 100644 index 000000000..84504c98f --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/.travis.yml @@ -0,0 +1,49 @@ +sudo: false +language: node_js +before_install: + - npm install -g npm@2 + - npm install -g npm +notifications: + email: false +matrix: + fast_finish: true + include: + - node_js: '0.8' + env: TASK=test + - node_js: '0.10' + env: TASK=test + - node_js: '0.11' + env: TASK=test + - node_js: '0.12' + env: TASK=test + - node_js: 1 + env: TASK=test + - node_js: 2 + env: TASK=test + - node_js: 3 + env: TASK=test + - node_js: 4 + env: TASK=test + - node_js: 5 + env: TASK=test + - node_js: 6 + env: TASK=test + - node_js: 5 + env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="-3..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="-3..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest" + - node_js: 5 + env: TASK=browser BROWSER_NAME=microsoftedge BROWSER_VERSION=latest +script: "npm run $TASK" +env: + global: + - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc= + - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI= diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/LICENSE b/node_modules/vinyl-fs/node_modules/readable-stream/LICENSE new file mode 100644 index 000000000..e3d4e695a --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/LICENSE @@ -0,0 +1,18 @@ +Copyright Joyent, Inc. and other Node contributors. All rights reserved. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/README.md b/node_modules/vinyl-fs/node_modules/readable-stream/README.md new file mode 100644 index 000000000..9fb4feaaa --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/README.md @@ -0,0 +1,36 @@ +# readable-stream + +***Node-core v6.3.1 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream) + + +[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/) +[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/) + + +[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream) + +```bash +npm install --save readable-stream +``` + +***Node-core streams for userland*** + +This package is a mirror of the Streams2 and Streams3 implementations in +Node-core, including [documentation](doc/stream.md). + +If you want to guarantee a stable streams base, regardless of what version of +Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html). + +As of version 2.0.0 **readable-stream** uses semantic versioning. + +# Streams WG Team Members + +* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) <christopher.s.dickinson@gmail.com> + - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B +* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) <calvin.metcalf@gmail.com> + - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242 +* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) <rod@vagg.org> + - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D +* **Sam Newman** ([@sonewman](https://github.com/sonewman)) <newmansam@outlook.com> +* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) <mathiasbuus@gmail.com> +* **Domenic Denicola** ([@domenic](https://github.com/domenic)) <d@domenic.me> diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/doc/stream.md b/node_modules/vinyl-fs/node_modules/readable-stream/doc/stream.md new file mode 100644 index 000000000..fc269c8e3 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/doc/stream.md @@ -0,0 +1,2015 @@ +# Stream + + Stability: 2 - Stable + +A stream is an abstract interface for working with streaming data in Node.js. +The `stream` module provides a base API that makes it easy to build objects +that implement the stream interface. + +There are many stream objects provided by Node.js. For instance, a +[request to an HTTP server][http-incoming-message] and [`process.stdout`][] +are both stream instances. + +Streams can be readable, writable, or both. All streams are instances of +[`EventEmitter`][]. + +The `stream` module can be accessed using: + +```js +const stream = require('stream'); +``` + +While it is important for all Node.js users to understand how streams works, +the `stream` module itself is most useful for developer's that are creating new +types of stream instances. Developer's who are primarily *consuming* stream +objects will rarely (if ever) have need to use the `stream` module directly. + +## Organization of this document + +This document is divided into two primary sections and third section for +additional notes. The first section explains the elements of the stream API that +are required to *use* streams within an application. The second section explains +the elements of the API that are required to *implement* new types of streams. + +## Types of Streams + +There are four fundamental stream types within Node.js: + +* [Readable][] - streams from which data can be read (for example + [`fs.createReadStream()`][]). +* [Writable][] - streams to which data can be written (for example + [`fs.createWriteStream()`][]). +* [Duplex][] - streams that are both Readable and Writable (for example + [`net.Socket`][]). +* [Transform][] - Duplex streams that can modify or transform the data as it + is written and read (for example [`zlib.createDeflate()`][]). + +### Object Mode + +All streams created by Node.js APIs operate exclusively on strings and `Buffer` +objects. It is possible, however, for stream implementations to work with other +types of JavaScript values (with the exception of `null` which serves a special +purpose within streams). Such streams are considered to operate in "object +mode". + +Stream instances are switched into object mode using the `objectMode` option +when the stream is created. Attempting to switch an existing stream into +object mode is not safe. + +### Buffering + +<!--type=misc--> + +Both [Writable][] and [Readable][] streams will store data in an internal +buffer that can be retrieved using `writable._writableState.getBuffer()` or +`readable._readableState.buffer`, respectively. + +The amount of data potentially buffered depends on the `highWaterMark` option +passed into the streams constructor. For normal streams, the `highWaterMark` +option specifies a total number of bytes. For streams operating in object mode, +the `highWaterMark` specifies a total number of objects. + +Data is buffered in Readable streams when the implementation calls +[`stream.push(chunk)`][stream-push]. If the consumer of the Stream does not +call [`stream.read()`][stream-read], the data will sit in the internal +queue until it is consumed. + +Once the total size of the internal read buffer reaches the threshold specified +by `highWaterMark`, the stream will temporarily stop reading data from the +underlying resource until the data currently buffered can be consumed (that is, +the stream will stop calling the internal `readable._read()` method that is +used to fill the read buffer). + +Data is buffered in Writable streams when the +[`writable.write(chunk)`][stream-write] method is called repeatedly. While the +total size of the internal write buffer is below the threshold set by +`highWaterMark`, calls to `writable.write()` will return `true`. Once the +the size of the internal buffer reaches or exceeds the `highWaterMark`, `false` +will be returned. + +A key goal of the `stream` API, and in particular the [`stream.pipe()`] method, +is to limit the buffering of data to acceptable levels such that sources and +destinations of differing speeds will not overwhelm the available memory. + +Because [Duplex][] and [Transform][] streams are both Readable and Writable, +each maintain *two* separate internal buffers used for reading and writing, +allowing each side to operate independently of the other while maintaining an +appropriate and efficient flow of data. For example, [`net.Socket`][] instances +are [Duplex][] streams whose Readable side allows consumption of data received +*from* the socket and whose Writable side allows writing data *to* the socket. +Because data may be written to the socket at a faster or slower rate than data +is received, it is important each side operate (and buffer) independently of +the other. + +## API for Stream Consumers + +<!--type=misc--> + +Almost all Node.js applications, no matter how simple, use streams in some +manner. The following is an example of using streams in a Node.js application +that implements an HTTP server: + +```js +const http = require('http'); + +const server = http.createServer( (req, res) => { + // req is an http.IncomingMessage, which is a Readable Stream + // res is an http.ServerResponse, which is a Writable Stream + + let body = ''; + // Get the data as utf8 strings. + // If an encoding is not set, Buffer objects will be received. + req.setEncoding('utf8'); + + // Readable streams emit 'data' events once a listener is added + req.on('data', (chunk) => { + body += chunk; + }); + + // the end event indicates that the entire body has been received + req.on('end', () => { + try { + const data = JSON.parse(body); + } catch (er) { + // uh oh! bad json! + res.statusCode = 400; + return res.end(`error: ${er.message}`); + } + + // write back something interesting to the user: + res.write(typeof data); + res.end(); + }); +}); + +server.listen(1337); + +// $ curl localhost:1337 -d '{}' +// object +// $ curl localhost:1337 -d '"foo"' +// string +// $ curl localhost:1337 -d 'not json' +// error: Unexpected token o +``` + +[Writable][] streams (such as `res` in the example) expose methods such as +`write()` and `end()` that are used to write data onto the stream. + +[Readable][] streams use the [`EventEmitter`][] API for notifying application +code when data is available to be read off the stream. That available data can +be read from the stream in multiple ways. + +Both [Writable][] and [Readable][] streams use the [`EventEmitter`][] API in +various ways to communicate the current state of the stream. + +[Duplex][] and [Transform][] streams are both [Writable][] and [Readable][]. + +Applications that are either writing data to or consuming data from a stream +are not required to implement the stream interfaces directly and will generally +have no reason to call `require('stream')`. + +Developers wishing to implement new types of streams should refer to the +section [API for Stream Implementers][]. + +### Writable Streams + +Writable streams are an abstraction for a *destination* to which data is +written. + +Examples of [Writable][] streams include: + +* [HTTP requests, on the client][] +* [HTTP responses, on the server][] +* [fs write streams][] +* [zlib streams][zlib] +* [crypto streams][crypto] +* [TCP sockets][] +* [child process stdin][] +* [`process.stdout`][], [`process.stderr`][] + +*Note*: Some of these examples are actually [Duplex][] streams that implement +the [Writable][] interface. + +All [Writable][] streams implement the interface defined by the +`stream.Writable` class. + +While specific instances of [Writable][] streams may differ in various ways, +all Writable streams follow the same fundamental usage pattern as illustrated +in the example below: + +```js +const myStream = getWritableStreamSomehow(); +myStream.write('some data'); +myStream.write('some more data'); +myStream.end('done writing data'); +``` + +#### Class: stream.Writable +<!-- YAML +added: v0.9.4 +--> + +<!--type=class--> + +##### Event: 'close' +<!-- YAML +added: v0.9.4 +--> + +The `'close'` event is emitted when the stream and any of its underlying +resources (a file descriptor, for example) have been closed. The event indicates +that no more events will be emitted, and no further computation will occur. + +Not all Writable streams will emit the `'close'` event. + +##### Event: 'drain' +<!-- YAML +added: v0.9.4 +--> + +If a call to [`stream.write(chunk)`][stream-write] returns `false`, the +`'drain'` event will be emitted when it is appropriate to resume writing data +to the stream. + +```js +// Write the data to the supplied writable stream one million times. +// Be attentive to back-pressure. +function writeOneMillionTimes(writer, data, encoding, callback) { + let i = 1000000; + write(); + function write() { + var ok = true; + do { + i--; + if (i === 0) { + // last time! + writer.write(data, encoding, callback); + } else { + // see if we should continue, or wait + // don't pass the callback, because we're not done yet. + ok = writer.write(data, encoding); + } + } while (i > 0 && ok); + if (i > 0) { + // had to stop early! + // write some more once it drains + writer.once('drain', write); + } + } +} +``` + +##### Event: 'error' +<!-- YAML +added: v0.9.4 +--> + +* {Error} + +The `'error'` event is emitted if an error occurred while writing or piping +data. The listener callback is passed a single `Error` argument when called. + +*Note*: The stream is not closed when the `'error'` event is emitted. + +##### Event: 'finish' +<!-- YAML +added: v0.9.4 +--> + +The `'finish'` event is emitted after the [`stream.end()`][stream-end] method +has been called, and all data has been flushed to the underlying system. + +```js +const writer = getWritableStreamSomehow(); +for (var i = 0; i < 100; i ++) { + writer.write('hello, #${i}!\n'); +} +writer.end('This is the end\n'); +writer.on('finish', () => { + console.error('All writes are now complete.'); +}); +``` + +##### Event: 'pipe' +<!-- YAML +added: v0.9.4 +--> + +* `src` {stream.Readable} source stream that is piping to this writable + +The `'pipe'` event is emitted when the [`stream.pipe()`][] method is called on +a readable stream, adding this writable to its set of destinations. + +```js +const writer = getWritableStreamSomehow(); +const reader = getReadableStreamSomehow(); +writer.on('pipe', (src) => { + console.error('something is piping into the writer'); + assert.equal(src, reader); +}); +reader.pipe(writer); +``` + +##### Event: 'unpipe' +<!-- YAML +added: v0.9.4 +--> + +* `src` {[Readable][] Stream} The source stream that + [unpiped][`stream.unpipe()`] this writable + +The `'unpipe'` event is emitted when the [`stream.unpipe()`][] method is called +on a [Readable][] stream, removing this [Writable][] from its set of +destinations. + +```js +const writer = getWritableStreamSomehow(); +const reader = getReadableStreamSomehow(); +writer.on('unpipe', (src) => { + console.error('Something has stopped piping into the writer.'); + assert.equal(src, reader); +}); +reader.pipe(writer); +reader.unpipe(writer); +``` + +##### writable.cork() +<!-- YAML +added: v0.11.2 +--> + +The `writable.cork()` method forces all written data to be buffered in memory. +The buffered data will be flushed when either the [`stream.uncork()`][] or +[`stream.end()`][stream-end] methods are called. + +The primary intent of `writable.cork()` is to avoid a situation where writing +many small chunks of data to a stream do not cause an backup in the internal +buffer that would have an adverse impact on performance. In such situations, +implementations that implement the `writable._writev()` method can perform +buffered writes in a more optimized manner. + +##### writable.end([chunk][, encoding][, callback]) +<!-- YAML +added: v0.9.4 +--> + +* `chunk` {String|Buffer|any} Optional data to write. For streams not operating + in object mode, `chunk` must be a string or a `Buffer`. For object mode + streams, `chunk` may be any JavaScript value other than `null`. +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Optional callback for when the stream is finished + +Calling the `writable.end()` method signals that no more data will be written +to the [Writable][]. The optional `chunk` and `encoding` arguments allow one +final additional chunk of data to be written immediately before closing the +stream. If provided, the optional `callback` function is attached as a listener +for the [`'finish'`][] event. + +Calling the [`stream.write()`][stream-write] method after calling +[`stream.end()`][stream-end] will raise an error. + +```js +// write 'hello, ' and then end with 'world!' +const file = fs.createWriteStream('example.txt'); +file.write('hello, '); +file.end('world!'); +// writing more now is not allowed! +``` + +##### writable.setDefaultEncoding(encoding) +<!-- YAML +added: v0.11.15 +--> + +* `encoding` {String} The new default encoding +* Return: `this` + +The `writable.setDefaultEncoding()` method sets the default `encoding` for a +[Writable][] stream. + +##### writable.uncork() +<!-- YAML +added: v0.11.2 +--> + +The `writable.uncork()` method flushes all data buffered since +[`stream.cork()`][] was called. + +When using `writable.cork()` and `writable.uncork()` to manage the buffering +of writes to a stream, it is recommended that calls to `writable.uncork()` be +deferred using `process.nextTick()`. Doing so allows batching of all +`writable.write()` calls that occur within a given Node.js event loop phase. + +```js +stream.cork(); +stream.write('some '); +stream.write('data '); +process.nextTick(() => stream.uncork()); +``` + +If the `writable.cork()` method is called multiple times on a stream, the same +number of calls to `writable.uncork()` must be called to flush the buffered +data. + +``` +stream.cork(); +stream.write('some '); +stream.cork(); +stream.write('data '); +process.nextTick(() => { + stream.uncork(); + // The data will not be flushed until uncork() is called a second time. + stream.uncork(); +}); +``` + +##### writable.write(chunk[, encoding][, callback]) +<!-- YAML +added: v0.9.4 +--> + +* `chunk` {String|Buffer} The data to write +* `encoding` {String} The encoding, if `chunk` is a String +* `callback` {Function} Callback for when this chunk of data is flushed +* Returns: {Boolean} `false` if the stream wishes for the calling code to + wait for the `'drain'` event to be emitted before continuing to write + additional data; otherwise `true`. + +The `writable.write()` method writes some data to the stream, and calls the +supplied `callback` once the data has been fully handled. If an error +occurs, the `callback` *may or may not* be called with the error as its +first argument. To reliably detect write errors, add a listener for the +`'error'` event. + +The return value indicates whether the written `chunk` was buffered internally +and the buffer has exceeded the `highWaterMark` configured when the stream was +created. If `false` is returned, further attempts to write data to the stream +should be paused until the `'drain'` event is emitted. + +A Writable stream in object mode will always ignore the `encoding` argument. + +### Readable Streams + +Readable streams are an abstraction for a *source* from which data is +consumed. + +Examples of Readable streams include: + +* [HTTP responses, on the client][http-incoming-message] +* [HTTP requests, on the server][http-incoming-message] +* [fs read streams][] +* [zlib streams][zlib] +* [crypto streams][crypto] +* [TCP sockets][] +* [child process stdout and stderr][] +* [`process.stdin`][] + +All [Readable][] streams implement the interface defined by the +`stream.Readable` class. + +#### Two Modes + +Readable streams effectively operate in one of two modes: flowing and paused. + +When in flowing mode, data is read from the underlying system automatically +and provided to an application as quickly as possible using events via the +[`EventEmitter`][] interface. + +In paused mode, the [`stream.read()`][stream-read] method must be called +explicitly to read chunks of data from the stream. + +All [Readable][] streams begin in paused mode but can be switched to flowing +mode in one of the following ways: + +* Adding a [`'data'`][] event handler. +* Calling the [`stream.resume()`][stream-resume] method. +* Calling the [`stream.pipe()`][] method to send the data to a [Writable][]. + +The Readable can switch back to paused mode using one of the following: + +* If there are no pipe destinations, by calling the + [`stream.pause()`][stream-pause] method. +* If there are pipe destinations, by removing any [`'data'`][] event + handlers, and removing all pipe destinations by calling the + [`stream.unpipe()`][] method. + +The important concept to remember is that a Readable will not generate data +until a mechanism for either consuming or ignoring that data is provided. If +the consuming mechanism is disabled or taken away, the Readable will *attempt* +to stop generating the data. + +*Note*: For backwards compatibility reasons, removing [`'data'`][] event +handlers will **not** automatically pause the stream. Also, if there are piped +destinations, then calling [`stream.pause()`][stream-pause] will not guarantee +that the stream will *remain* paused once those destinations drain and ask for +more data. + +*Note*: If a [Readable][] is switched into flowing mode and there are no +consumers available handle the data, that data will be lost. This can occur, +for instance, when the `readable.resume()` method is called without a listener +attached to the `'data'` event, or when a `'data'` event handler is removed +from the stream. + +#### Three States + +The "two modes" of operation for a Readable stream are a simplified abstraction +for the more complicated internal state management that is happening within the +Readable stream implementation. + +Specifically, at any given point in time, every Readable is in one of three +possible states: + +* `readable._readableState.flowing = null` +* `readable._readableState.flowing = false` +* `readable._readableState.flowing = true` + +When `readable._readableState.flowing` is `null`, no mechanism for consuming the +streams data is provided so the stream will not generate its data. + +Attaching a listener for the `'data'` event, calling the `readable.pipe()` +method, or calling the `readable.resume()` method will switch +`readable._readableState.flowing` to `true`, causing the Readable to begin +actively emitting events as data is generated. + +Calling `readable.pause()`, `readable.unpipe()`, or receiving "back pressure" +will cause the `readable._readableState.flowing` to be set as `false`, +temporarily halting the flowing of events but *not* halting the generation of +data. + +While `readable._readableState.flowing` is `false`, data may be accumulating +within the streams internal buffer. + +#### Choose One + +The Readable stream API evolved across multiple Node.js versions and provides +multiple methods of consuming stream data. In general, developers should choose +*one* of the methods of consuming data and *should never* use multiple methods +to consume data from a single stream. + +Use of the `readable.pipe()` method is recommended for most users as it has been +implemented to provide the easiest way of consuming stream data. Developers that +require more fine-grained control over the transfer and generation of data can +use the [`EventEmitter`][] and `readable.pause()`/`readable.resume()` APIs. + +#### Class: stream.Readable +<!-- YAML +added: v0.9.4 +--> + +<!--type=class--> + +##### Event: 'close' +<!-- YAML +added: v0.9.4 +--> + +The `'close'` event is emitted when the stream and any of its underlying +resources (a file descriptor, for example) have been closed. The event indicates +that no more events will be emitted, and no further computation will occur. + +Not all [Readable][] streams will emit the `'close'` event. + +##### Event: 'data' +<!-- YAML +added: v0.9.4 +--> + +* `chunk` {Buffer|String|any} The chunk of data. For streams that are not + operating in object mode, the chunk will be either a string or `Buffer`. + For streams that are in object mode, the chunk can be any JavaScript value + other than `null`. + +The `'data'` event is emitted whenever the stream is relinquishing ownership of +a chunk of data to a consumer. This may occur whenever the stream is switched +in flowing mode by calling `readable.pipe()`, `readable.resume()`, or by +attaching a listener callback to the `'data'` event. The `'data'` event will +also be emitted whenever the `readable.read()` method is called and a chunk of +data is available to be returned. + +Attaching a `'data'` event listener to a stream that has not been explicitly +paused will switch the stream into flowing mode. Data will then be passed as +soon as it is available. + +The listener callback will be passed the chunk of data as a string if a default +encoding has been specified for the stream using the +`readable.setEncoding()` method; otherwise the data will be passed as a +`Buffer`. + +```js +const readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log(`Received ${chunk.length} bytes of data.`); +}); +``` + +##### Event: 'end' +<!-- YAML +added: v0.9.4 +--> + +The `'end'` event is emitted when there is no more data to be consumed from +the stream. + +*Note*: The `'end'` event **will not be emitted** unless the data is +completely consumed. This can be accomplished by switching the stream into +flowing mode, or by calling [`stream.read()`][stream-read] repeatedly until +all data has been consumed. + +```js +const readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log(`Received ${chunk.length} bytes of data.`); +}); +readable.on('end', () => { + console.log('There will be no more data.'); +}); +``` + +##### Event: 'error' +<!-- YAML +added: v0.9.4 +--> + +* {Error} + +The `'error'` event may be emitted by a Readable implementation at any time. +Typically, this may occur if the underlying stream in unable to generate data +due to an underlying internal failure, or when a stream implementation attempts +to push an invalid chunk of data. + +The listener callback will be passed a single `Error` object. + +##### Event: 'readable' +<!-- YAML +added: v0.9.4 +--> + +The `'readable'` event is emitted when there is data available to be read from +the stream. In some cases, attaching a listener for the `'readable'` event will +cause some amount of data to be read into an internal buffer. + +```javascript +const readable = getReadableStreamSomehow(); +readable.on('readable', () => { + // there is some data to read now +}); +``` +The `'readable'` event will also be emitted once the end of the stream data +has been reached but before the `'end'` event is emitted. + +Effectively, the `'readable'` event indicates that the stream has new +information: either new data is available or the end of the stream has been +reached. In the former case, [`stream.read()`][stream-read] will return the +available data. In the latter case, [`stream.read()`][stream-read] will return +`null`. For instance, in the following example, `foo.txt` is an empty file: + +```js +const fs = require('fs'); +const rr = fs.createReadStream('foo.txt'); +rr.on('readable', () => { + console.log('readable:', rr.read()); +}); +rr.on('end', () => { + console.log('end'); +}); +``` + +The output of running this script is: + +``` +$ node test.js +readable: null +end +``` + +*Note*: In general, the `readable.pipe()` and `'data'` event mechanisms are +preferred over the use of the `'readable'` event. + +##### readable.isPaused() +<!-- +added: v0.11.14 +--> + +* Return: {Boolean} + +The `readable.isPaused()` method returns the current operating state of the +Readable. This is used primarily by the mechanism that underlies the +`readable.pipe()` method. In most typical cases, there will be no reason to +use this method directly. + +```js +const readable = new stream.Readable + +readable.isPaused() // === false +readable.pause() +readable.isPaused() // === true +readable.resume() +readable.isPaused() // === false +``` + +##### readable.pause() +<!-- YAML +added: v0.9.4 +--> + +* Return: `this` + +The `readable.pause()` method will cause a stream in flowing mode to stop +emitting [`'data'`][] events, switching out of flowing mode. Any data that +becomes available will remain in the internal buffer. + +```js +const readable = getReadableStreamSomehow(); +readable.on('data', (chunk) => { + console.log(`Received ${chunk.length} bytes of data.`); + readable.pause(); + console.log('There will be no additional data for 1 second.'); + setTimeout(() => { + console.log('Now data will start flowing again.'); + readable.resume(); + }, 1000); +}); +``` + +##### readable.pipe(destination[, options]) +<!-- YAML +added: v0.9.4 +--> + +* `destination` {stream.Writable} The destination for writing data +* `options` {Object} Pipe options + * `end` {Boolean} End the writer when the reader ends. Defaults to `true`. + +The `readable.pipe()` method attaches a [Writable][] stream to the `readable`, +causing it to switch automatically into flowing mode and push all of its data +to the attached [Writable][]. The flow of data will be automatically managed so +that the destination Writable stream is not overwhelmed by a faster Readable +stream. + +The following example pipes all of the data from the `readable` into a file +named `file.txt`: + +```js +const readable = getReadableStreamSomehow(); +const writable = fs.createWriteStream('file.txt'); +// All the data from readable goes into 'file.txt' +readable.pipe(writable); +``` +It is possible to attach multiple Writable streams to a single Readable stream. + +The `readable.pipe()` method returns a reference to the *destination* stream +making it possible to set up chains of piped streams: + +```js +const r = fs.createReadStream('file.txt'); +const z = zlib.createGzip(); +const w = fs.createWriteStream('file.txt.gz'); +r.pipe(z).pipe(w); +``` + +By default, [`stream.end()`][stream-end] is called on the destination Writable +stream when the source Readable stream emits [`'end'`][], so that the +destination is no longer writable. To disable this default behavior, the `end` +option can be passed as `false`, causing the destination stream to remain open, +as illustrated in the following example: + +```js +reader.pipe(writer, { end: false }); +reader.on('end', () => { + writer.end('Goodbye\n'); +}); +``` + +One important caveat is that if the Readable stream emits an error during +processing, the Writable destination *is not closed* automatically. If an +error occurs, it will be necessary to *manually* close each stream in order +to prevent memory leaks. + +*Note*: The [`process.stderr`][] and [`process.stdout`][] Writable streams are +never closed until the Node.js process exits, regardless of the specified +options. + +##### readable.read([size]) +<!-- YAML +added: v0.9.4 +--> + +* `size` {Number} Optional argument to specify how much data to read. +* Return {String|Buffer|Null} + +The `readable.read()` method pulls some data out of the internal buffer and +returns it. If no data available to be read, `null` is returned. By default, +the data will be returned as a `Buffer` object unless an encoding has been +specified using the `readable.setEncoding()` method or the stream is operating +in object mode. + +The optional `size` argument specifies a specific number of bytes to read. If +`size` bytes are not available to be read, `null` will be returned *unless* +the stream has ended, in which case all of the data remaining in the internal +buffer will be returned (*even if it exceeds `size` bytes*). + +If the `size` argument is not specified, all of the data contained in the +internal buffer will be returned. + +The `readable.read()` method should only be called on Readable streams operating +in paused mode. In flowing mode, `readable.read()` is called automatically until +the internal buffer is fully drained. + +```js +const readable = getReadableStreamSomehow(); +readable.on('readable', () => { + var chunk; + while (null !== (chunk = readable.read())) { + console.log(`Received ${chunk.length} bytes of data.`); + } +}); +``` + +In general, it is recommended that developers avoid the use of the `'readable'` +event and the `readable.read()` method in favor of using either +`readable.pipe()` or the `'data'` event. + +A Readable stream in object mode will always return a single item from +a call to [`readable.read(size)`][stream-read], regardless of the value of the +`size` argument. + +*Note:* If the `readable.read()` method returns a chunk of data, a `'data'` +event will also be emitted. + +*Note*: Calling [`stream.read([size])`][stream-read] after the [`'end'`][] +event has been emitted will return `null`. No runtime error will be raised. + +##### readable.resume() +<!-- YAML +added: v0.9.4 +--> + +* Return: `this` + +The `readable.resume()` method causes an explicitly paused Readable stream to +resume emitting [`'data'`][] events, switching the stream into flowing mode. + +The `readable.resume()` method can be used to fully consume the data from a +stream without actually processing any of that data as illustrated in the +following example: + +```js +getReadableStreamSomehow() + .resume() + .on('end', () => { + console.log('Reached the end, but did not read anything.'); + }); +``` + +##### readable.setEncoding(encoding) +<!-- YAML +added: v0.9.4 +--> + +* `encoding` {String} The encoding to use. +* Return: `this` + +The `readable.setEncoding()` method sets the default character encoding for +data read from the Readable stream. + +Setting an encoding causes the stream data +to be returned as string of the specified encoding rather than as `Buffer` +objects. For instance, calling `readable.setEncoding('utf8')` will cause the +output data will be interpreted as UTF-8 data, and passed as strings. Calling +`readable.setEncoding('hex')` will cause the data to be encoded in hexadecimal +string format. + +The Readable stream will properly handle multi-byte characters delivered through +the stream that would otherwise become improperly decoded if simply pulled from +the stream as `Buffer` objects. + +Encoding can be disabled by calling `readable.setEncoding(null)`. This approach +is useful when working with binary data or with large multi-byte strings spread +out over multiple chunks. + +```js +const readable = getReadableStreamSomehow(); +readable.setEncoding('utf8'); +readable.on('data', (chunk) => { + assert.equal(typeof chunk, 'string'); + console.log('got %d characters of string data', chunk.length); +}); +``` + +##### readable.unpipe([destination]) +<!-- YAML +added: v0.9.4 +--> + +* `destination` {stream.Writable} Optional specific stream to unpipe + +The `readable.unpipe()` method detaches a Writable stream previously attached +using the [`stream.pipe()`][] method. + +If the `destination` is not specified, then *all* pipes are detached. + +If the `destination` is specified, but no pipe is set up for it, then +the method does nothing. + +```js +const readable = getReadableStreamSomehow(); +const writable = fs.createWriteStream('file.txt'); +// All the data from readable goes into 'file.txt', +// but only for the first second +readable.pipe(writable); +setTimeout(() => { + console.log('Stop writing to file.txt'); + readable.unpipe(writable); + console.log('Manually close the file stream'); + writable.end(); +}, 1000); +``` + +##### readable.unshift(chunk) +<!-- YAML +added: v0.9.11 +--> + +* `chunk` {Buffer|String} Chunk of data to unshift onto the read queue + +The `readable.unshift()` method pushes a chunk of data back into the internal +buffer. This is useful in certain situations where a stream is being consumed by +code that needs to "un-consume" some amount of data that it has optimistically +pulled out of the source, so that the data can be passed on to some other party. + +*Note*: The `stream.unshift(chunk)` method cannot be called after the +[`'end'`][] event has been emitted or a runtime error will be thrown. + +Developers using `stream.unshift()` often should consider switching to +use of a [Transform][] stream instead. See the [API for Stream Implementers][] +section for more information. + +```js +// Pull off a header delimited by \n\n +// use unshift() if we get too much +// Call the callback with (error, header, stream) +const StringDecoder = require('string_decoder').StringDecoder; +function parseHeader(stream, callback) { + stream.on('error', callback); + stream.on('readable', onReadable); + const decoder = new StringDecoder('utf8'); + var header = ''; + function onReadable() { + var chunk; + while (null !== (chunk = stream.read())) { + var str = decoder.write(chunk); + if (str.match(/\n\n/)) { + // found the header boundary + var split = str.split(/\n\n/); + header += split.shift(); + const remaining = split.join('\n\n'); + const buf = Buffer.from(remaining, 'utf8'); + if (buf.length) + stream.unshift(buf); + stream.removeListener('error', callback); + stream.removeListener('readable', onReadable); + // now the body of the message can be read from the stream. + callback(null, header, stream); + } else { + // still reading the header. + header += str; + } + } + } +} +``` + +*Note*: Unlike [`stream.push(chunk)`][stream-push], `stream.unshift(chunk)` +will not end the reading process by resetting the internal reading state of the +stream. This can cause unexpected results if `readable.unshift()` is called +during a read (i.e. from within a [`stream._read()`][stream-_read] +implementation on a custom stream). Following the call to `readable.unshift()` +with an immediate [`stream.push('')`][stream-push] will reset the reading state +appropriately, however it is best to simply avoid calling `readable.unshift()` +while in the process of performing a read. + +##### readable.wrap(stream) +<!-- YAML +added: v0.9.4 +--> + +* `stream` {Stream} An "old style" readable stream + +Versions of Node.js prior to v0.10 had streams that did not implement the +entire `stream` module API as it is currently defined. (See [Compatibility][] +for more information.) + +When using an older Node.js library that emits [`'data'`][] events and has a +[`stream.pause()`][stream-pause] method that is advisory only, the +`readable.wrap()` method can be used to create a [Readable][] stream that uses +the old stream as its data source. + +It will rarely be necessary to use `readable.wrap()` but the method has been +provided as a convenience for interacting with older Node.js applications and +libraries. + +For example: + +```js +const OldReader = require('./old-api-module.js').OldReader; +const Readable = require('stream').Readable; +const oreader = new OldReader; +const myReader = new Readable().wrap(oreader); + +myReader.on('readable', () => { + myReader.read(); // etc. +}); +``` + +### Duplex and Transform Streams + +#### Class: stream.Duplex +<!-- YAML +added: v0.9.4 +--> + +<!--type=class--> + +Duplex streams are streams that implement both the [Readable][] and +[Writable][] interfaces. + +Examples of Duplex streams include: + +* [TCP sockets][] +* [zlib streams][zlib] +* [crypto streams][crypto] + +#### Class: stream.Transform +<!-- YAML +added: v0.9.4 +--> + +<!--type=class--> + +Transform streams are [Duplex][] streams where the output is in some way +related to the input. Like all [Duplex][] streams, Transform streams +implement both the [Readable][] and [Writable][] interfaces. + +Examples of Transform streams include: + +* [zlib streams][zlib] +* [crypto streams][crypto] + + +## API for Stream Implementers + +<!--type=misc--> + +The `stream` module API has been designed to make it possible to easily +implement streams using JavaScript's prototypical inheritance model. + +First, a stream developer would declare a new JavaScript class that extends one +of the four basic stream classes (`stream.Writable`, `stream.Readable`, +`stream.Duplex`, or `stream.Transform`), making sure the call the appropriate +parent class constructor: + +```js +const Writable = require('stream').Writable; + +class MyWritable extends Writable { + constructor(options) { + super(options); + } +} +``` + +The new stream class must then implement one or more specific methods, depending +on the type of stream being created, as detailed in the chart below: + +<table> + <thead> + <tr> + <th> + <p>Use-case</p> + </th> + <th> + <p>Class</p> + </th> + <th> + <p>Method(s) to implement</p> + </th> + </tr> + </thead> + <tr> + <td> + <p>Reading only</p> + </td> + <td> + <p>[Readable](#stream_class_stream_readable)</p> + </td> + <td> + <p><code>[_read][stream-_read]</code></p> + </td> + </tr> + <tr> + <td> + <p>Writing only</p> + </td> + <td> + <p>[Writable](#stream_class_stream_writable)</p> + </td> + <td> + <p><code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p> + </td> + </tr> + <tr> + <td> + <p>Reading and writing</p> + </td> + <td> + <p>[Duplex](#stream_class_stream_duplex)</p> + </td> + <td> + <p><code>[_read][stream-_read]</code>, <code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p> + </td> + </tr> + <tr> + <td> + <p>Operate on written data, then read the result</p> + </td> + <td> + <p>[Transform](#stream_class_stream_transform)</p> + </td> + <td> + <p><code>[_transform][stream-_transform]</code>, <code>[_flush][stream-_flush]</code></p> + </td> + </tr> +</table> + +*Note*: The implementation code for a stream should *never* call the "public" +methods of a stream that are intended for use by consumers (as described in +the [API for Stream Consumers][] section). Doing so may lead to adverse +side effects in application code consuming the stream. + +### Simplified Construction + +For many simple cases, it is possible to construct a stream without relying on +inheritance. This can be accomplished by directly creating instances of the +`stream.Writable`, `stream.Readable`, `stream.Duplex` or `stream.Transform` +objects and passing appropriate methods as constructor options. + +For example: + +```js +const Writable = require('stream').Writable; + +const myWritable = new Writable({ + write(chunk, encoding, callback) { + // ... + } +}); +``` + +### Implementing a Writable Stream + +The `stream.Writable` class is extended to implement a [Writable][] stream. + +Custom Writable streams *must* call the `new stream.Writable([options])` +constructor and implement the `writable._write()` method. The +`writable._writev()` method *may* also be implemented. + +#### Constructor: new stream.Writable([options]) + +* `options` {Object} + * `highWaterMark` {Number} Buffer level when + [`stream.write()`][stream-write] starts returning `false`. Defaults to + `16384` (16kb), or `16` for `objectMode` streams. + * `decodeStrings` {Boolean} Whether or not to decode strings into + Buffers before passing them to [`stream._write()`][stream-_write]. + Defaults to `true` + * `objectMode` {Boolean} Whether or not the + [`stream.write(anyObj)`][stream-write] is a valid operation. When set, + it becomes possible to write JavaScript values other than string or + `Buffer` if supported by the stream implementation. Defaults to `false` + * `write` {Function} Implementation for the + [`stream._write()`][stream-_write] method. + * `writev` {Function} Implementation for the + [`stream._writev()`][stream-_writev] method. + +For example: + +```js +const Writable = require('stream').Writable; + +class MyWritable extends Writable { + constructor(options) { + // Calls the stream.Writable() constructor + super(options); + } +} +``` + +Or, when using pre-ES6 style constructors: + +```js +const Writable = require('stream').Writable; +const util = require('util'); + +function MyWritable(options) { + if (!(this instanceof MyWritable)) + return new MyWritable(options); + Writable.call(this, options); +} +util.inherits(MyWritable, Writable); +``` + +Or, using the Simplified Constructor approach: + +```js +const Writable = require('stream').Writable; + +const myWritable = new Writable({ + write(chunk, encoding, callback) { + // ... + }, + writev(chunks, callback) { + // ... + } +}); +``` + +#### writable.\_write(chunk, encoding, callback) + +* `chunk` {Buffer|String} The chunk to be written. Will **always** + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then `encoding` is the + character encoding of that string. If chunk is a `Buffer`, or if the + stream is operating in object mode, `encoding` may be ignored. +* `callback` {Function} Call this function (optionally with an error + argument) when processing is complete for the supplied chunk. + +All Writable stream implementations must provide a +[`writable._write()`][stream-_write] method to send data to the underlying +resource. + +*Note*: [Transform][] streams provide their own implementation of the +[`writable._write()`][stream-_write]. + +*Note*: **This function MUST NOT be called by application code directly.** It +should be implemented by child classes, and called only by the internal Writable +class methods only. + +The `callback` method must be called to signal either that the write completed +successfully or failed with an error. The first argument passed to the +`callback` must be the `Error` object if the call failed or `null` if the +write succeeded. + +It is important to note that all calls to `writable.write()` that occur between +the time `writable._write()` is called and the `callback` is called will cause +the written data to be buffered. Once the `callback` is invoked, the stream will +emit a `'drain'` event. If a stream implementation is capable of processing +multiple chunks of data at once, the `writable._writev()` method should be +implemented. + +If the `decodeStrings` property is set in the constructor options, then +`chunk` may be a string rather than a Buffer, and `encoding` will +indicate the character encoding of the string. This is to support +implementations that have an optimized handling for certain string +data encodings. If the `decodeStrings` property is explicitly set to `false`, +the `encoding` argument can be safely ignored, and `chunk` will always be a +`Buffer`. + +The `writable._write()` method is prefixed with an underscore because it is +internal to the class that defines it, and should never be called directly by +user programs. + +#### writable.\_writev(chunks, callback) + +* `chunks` {Array} The chunks to be written. Each chunk has following + format: `{ chunk: ..., encoding: ... }`. +* `callback` {Function} A callback function (optionally with an error + argument) to be invoked when processing is complete for the supplied chunks. + +*Note*: **This function MUST NOT be called by application code directly.** It +should be implemented by child classes, and called only by the internal Writable +class methods only. + +The `writable._writev()` method may be implemented in addition to +`writable._write()` in stream implementations that are capable of processing +multiple chunks of data at once. If implemented, the method will be called with +all chunks of data currently buffered in the write queue. + +The `writable._writev()` method is prefixed with an underscore because it is +internal to the class that defines it, and should never be called directly by +user programs. + +#### Errors While Writing + +It is recommended that errors occurring during the processing of the +`writable._write()` and `writable._writev()` methods are reported by invoking +the callback and passing the error as the first argument. This will cause an +`'error'` event to be emitted by the Writable. Throwing an Error from within +`writable._write()` can result in expected and inconsistent behavior depending +on how the stream is being used. Using the callback ensures consistent and +predictable handling of errors. + +```js +const Writable = require('stream').Writable; + +const myWritable = new Writable({ + write(chunk, encoding, callback) { + if (chunk.toString().indexOf('a') >= 0) { + callback(new Error('chunk is invalid')); + } else { + callback(); + } + } +}); +``` + +#### An Example Writable Stream + +The following illustrates a rather simplistic (and somewhat pointless) custom +Writable stream implementation. While this specific Writable stream instance +is not of any real particular usefulness, the example illustrates each of the +required elements of a custom [Writable][] stream instance: + +```js +const Writable = require('stream').Writable; + +class MyWritable extends Writable { + constructor(options) { + super(options); + } + + _write(chunk, encoding, callback) { + if (chunk.toString().indexOf('a') >= 0) { + callback(new Error('chunk is invalid')); + } else { + callback(); + } + } +} +``` + +### Implementing a Readable Stream + +The `stream.Readable` class is extended to implement a [Readable][] stream. + +Custom Readable streams *must* call the `new stream.Readable([options])` +constructor and implement the `readable._read()` method. + +#### new stream.Readable([options]) + +* `options` {Object} + * `highWaterMark` {Number} The maximum number of bytes to store in + the internal buffer before ceasing to read from the underlying + resource. Defaults to `16384` (16kb), or `16` for `objectMode` streams + * `encoding` {String} If specified, then buffers will be decoded to + strings using the specified encoding. Defaults to `null` + * `objectMode` {Boolean} Whether this stream should behave + as a stream of objects. Meaning that [`stream.read(n)`][stream-read] returns + a single value instead of a Buffer of size n. Defaults to `false` + * `read` {Function} Implementation for the [`stream._read()`][stream-_read] + method. + +For example: + +```js +const Readable = require('stream').Readable; + +class MyReadable extends Readable { + constructor(options) { + // Calls the stream.Readable(options) constructor + super(options); + } +} +``` + +Or, when using pre-ES6 style constructors: + +```js +const Readable = require('stream').Readable; +const util = require('util'); + +function MyReadable(options) { + if (!(this instanceof MyReadable)) + return new MyReadable(options); + Readable.call(this, options); +} +util.inherits(MyReadable, Readable); +``` + +Or, using the Simplified Constructor approach: + +```js +const Readable = require('stream').Readable; + +const myReadable = new Readable({ + read(size) { + // ... + } +}); +``` + +#### readable.\_read(size) + +* `size` {Number} Number of bytes to read asynchronously + +*Note*: **This function MUST NOT be called by application code directly.** It +should be implemented by child classes, and called only by the internal Readable +class methods only. + +All Readable stream implementations must provide an implementation of the +`readable._read()` method to fetch data from the underlying resource. + +When `readable._read()` is called, if data is available from the resource, the +implementation should begin pushing that data into the read queue using the +[`this.push(dataChunk)`][stream-push] method. `_read()` should continue reading +from the resource and pushing data until `readable.push()` returns `false`. Only +when `_read()` is called again after it has stopped should it resume pushing +additional data onto the queue. + +*Note*: Once the `readable._read()` method has been called, it will not be +called again until the [`readable.push()`][stream-push] method is called. + +The `size` argument is advisory. For implementations where a "read" is a +single operation that returns data can use the `size` argument to determine how +much data to fetch. Other implementations may ignore this argument and simply +provide data whenever it becomes available. There is no need to "wait" until +`size` bytes are available before calling [`stream.push(chunk)`][stream-push]. + +The `readable._read()` method is prefixed with an underscore because it is +internal to the class that defines it, and should never be called directly by +user programs. + +#### readable.push(chunk[, encoding]) + +* `chunk` {Buffer|Null|String} Chunk of data to push into the read queue +* `encoding` {String} Encoding of String chunks. Must be a valid + Buffer encoding, such as `'utf8'` or `'ascii'` +* Returns {Boolean} `true` if additional chunks of data may continued to be + pushed; `false` otherwise. + +When `chunk` is a `Buffer` or `string`, the `chunk` of data will be added to the +internal queue for users of the stream to consume. Passing `chunk` as `null` +signals the end of the stream (EOF), after which no more data can be written. + +When the Readable is operating in paused mode, the data added with +`readable.push()` can be read out by calling the +[`readable.read()`][stream-read] method when the [`'readable'`][] event is +emitted. + +When the Readable is operating in flowing mode, the data added with +`readable.push()` will be delivered by emitting a `'data'` event. + +The `readable.push()` method is designed to be as flexible as possible. For +example, when wrapping a lower-level source that provides some form of +pause/resume mechanism, and a data callback, the low-level source can be wrapped +by the custom Readable instance as illustrated in the following example: + +```js +// source is an object with readStop() and readStart() methods, +// and an `ondata` member that gets called when it has data, and +// an `onend` member that gets called when the data is over. + +class SourceWrapper extends Readable { + constructor(options) { + super(options); + + this._source = getLowlevelSourceObject(); + + // Every time there's data, push it into the internal buffer. + this._source.ondata = (chunk) => { + // if push() returns false, then stop reading from source + if (!this.push(chunk)) + this._source.readStop(); + }; + + // When the source ends, push the EOF-signaling `null` chunk + this._source.onend = () => { + this.push(null); + }; + } + // _read will be called when the stream wants to pull more data in + // the advisory size argument is ignored in this case. + _read(size) { + this._source.readStart(); + } +} +``` +*Note*: The `readable.push()` method is intended be called only by Readable +Implementers, and only from within the `readable._read()` method. + +#### Errors While Reading + +It is recommended that errors occurring during the processing of the +`readable._read()` method are emitted using the `'error'` event rather than +being thrown. Throwing an Error from within `readable._read()` can result in +expected and inconsistent behavior depending on whether the stream is operating +in flowing or paused mode. Using the `'error'` event ensures consistent and +predictable handling of errors. + +```js +const Readable = require('stream').Readable; + +const myReadable = new Readable({ + read(size) { + if (checkSomeErrorCondition()) { + process.nextTick(() => this.emit('error', err)); + return; + } + // do some work + } +}); +``` + +#### An Example Counting Stream + +<!--type=example--> + +The following is a basic example of a Readable stream that emits the numerals +from 1 to 1,000,000 in ascending order, and then ends. + +```js +const Readable = require('stream').Readable; + +class Counter extends Readable { + constructor(opt) { + super(opt); + this._max = 1000000; + this._index = 1; + } + + _read() { + var i = this._index++; + if (i > this._max) + this.push(null); + else { + var str = '' + i; + var buf = Buffer.from(str, 'ascii'); + this.push(buf); + } + } +} +``` + +### Implementing a Duplex Stream + +A [Duplex][] stream is one that implements both [Readable][] and [Writable][], +such as a TCP socket connection. + +Because Javascript does not have support for multiple inheritance, the +`stream.Duplex` class is extended to implement a [Duplex][] stream (as opposed +to extending the `stream.Readable` *and* `stream.Writable` classes). + +*Note*: The `stream.Duplex` class prototypically inherits from `stream.Readable` +and parasitically from `stream.Writable`. + +Custom Duplex streams *must* call the `new stream.Duplex([options])` +constructor and implement *both* the `readable._read()` and +`writable._write()` methods. + +#### new stream.Duplex(options) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `allowHalfOpen` {Boolean} Defaults to `true`. If set to `false`, then + the stream will automatically end the readable side when the + writable side ends and vice versa. + * `readableObjectMode` {Boolean} Defaults to `false`. Sets `objectMode` + for readable side of the stream. Has no effect if `objectMode` + is `true`. + * `writableObjectMode` {Boolean} Defaults to `false`. Sets `objectMode` + for writable side of the stream. Has no effect if `objectMode` + is `true`. + +For example: + +```js +const Duplex = require('stream').Duplex; + +class MyDuplex extends Duplex { + constructor(options) { + super(options); + } +} +``` + +Or, when using pre-ES6 style constructors: + +```js +const Duplex = require('stream').Duplex; +const util = require('util'); + +function MyDuplex(options) { + if (!(this instanceof MyDuplex)) + return new MyDuplex(options); + Duplex.call(this, options); +} +util.inherits(MyDuplex, Duplex); +``` + +Or, using the Simplified Constructor approach: + +```js +const Duplex = require('stream').Duplex; + +const myDuplex = new Duplex({ + read(size) { + // ... + }, + write(chunk, encoding, callback) { + // ... + } +}); +``` + +#### An Example Duplex Stream + +The following illustrates a simple example of a Duplex stream that wraps a +hypothetical lower-level source object to which data can be written, and +from which data can be read, albeit using an API that is not compatible with +Node.js streams. +The following illustrates a simple example of a Duplex stream that buffers +incoming written data via the [Writable][] interface that is read back out +via the [Readable][] interface. + +```js +const Duplex = require('stream').Duplex; +const kSource = Symbol('source'); + +class MyDuplex extends Duplex { + constructor(source, options) { + super(options); + this[kSource] = source; + } + + _write(chunk, encoding, callback) { + // The underlying source only deals with strings + if (Buffer.isBuffer(chunk)) + chunk = chunk.toString(encoding); + this[kSource].writeSomeData(chunk, encoding); + callback(); + } + + _read(size) { + this[kSource].fetchSomeData(size, (data, encoding) => { + this.push(Buffer.from(data, encoding)); + }); + } +} +``` + +The most important aspect of a Duplex stream is that the Readable and Writable +sides operate independently of one another despite co-existing within a single +object instance. + +#### Object Mode Duplex Streams + +For Duplex streams, `objectMode` can be set exclusively for either the Readable +or Writable side using the `readableObjectMode` and `writableObjectMode` options +respectively. + +In the following example, for instance, a new Transform stream (which is a +type of [Duplex][] stream) is created that has an object mode Writable side +that accepts JavaScript numbers that are converted to hexidecimal strings on +the Readable side. + +```js +const Transform = require('stream').Transform; + +// All Transform streams are also Duplex Streams +const myTransform = new Transform({ + writableObjectMode: true, + + transform(chunk, encoding, callback) { + // Coerce the chunk to a number if necessary + chunk |= 0; + + // Transform the chunk into something else. + const data = chunk.toString(16); + + // Push the data onto the readable queue. + callback(null, '0'.repeat(data.length % 2) + data); + } +}); + +myTransform.setEncoding('ascii'); +myTransform.on('data', (chunk) => console.log(chunk)); + +myTransform.write(1); + // Prints: 01 +myTransform.write(10); + // Prints: 0a +myTransform.write(100); + // Prints: 64 +``` + +### Implementing a Transform Stream + +A [Transform][] stream is a [Duplex][] stream where the output is computed +in some way from the input. Examples include [zlib][] streams or [crypto][] +streams that compress, encrypt, or decrypt data. + +*Note*: There is no requirement that the output be the same size as the input, +the same number of chunks, or arrive at the same time. For example, a +Hash stream will only ever have a single chunk of output which is +provided when the input is ended. A `zlib` stream will produce output +that is either much smaller or much larger than its input. + +The `stream.Transform` class is extended to implement a [Transform][] stream. + +The `stream.Transform` class prototypically inherits from `stream.Duplex` and +implements its own versions of the `writable._write()` and `readable._read()` +methods. Custom Transform implementations *must* implement the +[`transform._transform()`][stream-_transform] method and *may* also implement +the [`transform._flush()`][stream-_flush] method. + +*Note*: Care must be taken when using Transform streams in that data written +to the stream can cause the Writable side of the stream to become paused if +the output on the Readable side is not consumed. + +#### new stream.Transform([options]) + +* `options` {Object} Passed to both Writable and Readable + constructors. Also has the following fields: + * `transform` {Function} Implementation for the + [`stream._transform()`][stream-_transform] method. + * `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush] + method. + +For example: + +```js +const Transform = require('stream').Transform; + +class MyTransform extends Transform { + constructor(options) { + super(options); + } +} +``` + +Or, when using pre-ES6 style constructors: + +```js +const Transform = require('stream').Transform; +const util = require('util'); + +function MyTransform(options) { + if (!(this instanceof MyTransform)) + return new MyTransform(options); + Transform.call(this, options); +} +util.inherits(MyTransform, Transform); +``` + +Or, using the Simplified Constructor approach: + +```js +const Transform = require('stream').Transform; + +const myTransform = new Transform({ + transform(chunk, encoding, callback) { + // ... + } +}); +``` + +#### Events: 'finish' and 'end' + +The [`'finish'`][] and [`'end'`][] events are from the `stream.Writable` +and `stream.Readable` classes, respectively. The `'finish'` event is emitted +after [`stream.end()`][stream-end] is called and all chunks have been processed +by [`stream._transform()`][stream-_transform]. The `'end'` event is emitted +after all data has been output, which occurs after the callback in +[`transform._flush()`][stream-_flush] has been called. + +#### transform.\_flush(callback) + +* `callback` {Function} A callback function (optionally with an error + argument) to be called when remaining data has been flushed. + +*Note*: **This function MUST NOT be called by application code directly.** It +should be implemented by child classes, and called only by the internal Readable +class methods only. + +In some cases, a transform operation may need to emit an additional bit of +data at the end of the stream. For example, a `zlib` compression stream will +store an amount of internal state used to optimally compress the output. When +the stream ends, however, that additional data needs to be flushed so that the +compressed data will be complete. + +Custom [Transform][] implementations *may* implement the `transform._flush()` +method. This will be called when there is no more written data to be consumed, +but before the [`'end'`][] event is emitted signaling the end of the +[Readable][] stream. + +Within the `transform._flush()` implementation, the `readable.push()` method +may be called zero or more times, as appropriate. The `callback` function must +be called when the flush operation is complete. + +The `transform._flush()` method is prefixed with an underscore because it is +internal to the class that defines it, and should never be called directly by +user programs. + +#### transform.\_transform(chunk, encoding, callback) + +* `chunk` {Buffer|String} The chunk to be transformed. Will **always** + be a buffer unless the `decodeStrings` option was set to `false`. +* `encoding` {String} If the chunk is a string, then this is the + encoding type. If chunk is a buffer, then this is the special + value - 'buffer', ignore it in this case. +* `callback` {Function} A callback function (optionally with an error + argument and data) to be called after the supplied `chunk` has been + processed. + +*Note*: **This function MUST NOT be called by application code directly.** It +should be implemented by child classes, and called only by the internal Readable +class methods only. + +All Transform stream implementations must provide a `_transform()` +method to accept input and produce output. The `transform._transform()` +implementation handles the bytes being written, computes an output, then passes +that output off to the readable portion using the `readable.push()` method. + +The `transform.push()` method may be called zero or more times to generate +output from a single input chunk, depending on how much is to be output +as a result of the chunk. + +It is possible that no output is generated from any given chunk of input data. + +The `callback` function must be called only when the current chunk is completely +consumed. The first argument passed to the `callback` must be an `Error` object +if an error occurred while processing the input or `null` otherwise. If a second +argument is passed to the `callback`, it will be forwarded on to the +`readable.push()` method. In other words the following are equivalent: + +```js +transform.prototype._transform = function (data, encoding, callback) { + this.push(data); + callback(); +}; + +transform.prototype._transform = function (data, encoding, callback) { + callback(null, data); +}; +``` + +The `transform._transform()` method is prefixed with an underscore because it +is internal to the class that defines it, and should never be called directly by +user programs. + +#### Class: stream.PassThrough + +The `stream.PassThrough` class is a trivial implementation of a [Transform][] +stream that simply passes the input bytes across to the output. Its purpose is +primarily for examples and testing, but there are some use cases where +`stream.PassThrough` is useful as a building block for novel sorts of streams. + +## Additional Notes + +<!--type=misc--> + +### Compatibility with Older Node.js Versions + +<!--type=misc--> + +In versions of Node.js prior to v0.10, the Readable stream interface was +simpler, but also less powerful and less useful. + +* Rather than waiting for calls the [`stream.read()`][stream-read] method, + [`'data'`][] events would begin emitting immediately. Applications that + would need to perform some amount of work to decide how to handle data + were required to store read data into buffers so the data would not be lost. +* The [`stream.pause()`][stream-pause] method was advisory, rather than + guaranteed. This meant that it was still necessary to be prepared to receive + [`'data'`][] events *even when the stream was in a paused state*. + +In Node.js v0.10, the [Readable][] class was added. For backwards compatibility +with older Node.js programs, Readable streams switch into "flowing mode" when a +[`'data'`][] event handler is added, or when the +[`stream.resume()`][stream-resume] method is called. The effect is that, even +when not using the new [`stream.read()`][stream-read] method and +[`'readable'`][] event, it is no longer necessary to worry about losing +[`'data'`][] chunks. + +While most applications will continue to function normally, this introduces an +edge case in the following conditions: + +* No [`'data'`][] event listener is added. +* The [`stream.resume()`][stream-resume] method is never called. +* The stream is not piped to any writable destination. + +For example, consider the following code: + +```js +// WARNING! BROKEN! +net.createServer((socket) => { + + // we add an 'end' method, but never consume the data + socket.on('end', () => { + // It will never get here. + socket.end('The message was received but was not processed.\n'); + }); + +}).listen(1337); +``` + +In versions of Node.js prior to v0.10, the incoming message data would be +simply discarded. However, in Node.js v0.10 and beyond, the socket remains +paused forever. + +The workaround in this situation is to call the +[`stream.resume()`][stream-resume] method to begin the flow of data: + +```js +// Workaround +net.createServer((socket) => { + + socket.on('end', () => { + socket.end('The message was received but was not processed.\n'); + }); + + // start the flow of data, discarding it. + socket.resume(); + +}).listen(1337); +``` + +In addition to new Readable streams switching into flowing mode, +pre-v0.10 style streams can be wrapped in a Readable class using the +[`readable.wrap()`][`stream.wrap()`] method. + + +### `readable.read(0)` + +There are some cases where it is necessary to trigger a refresh of the +underlying readable stream mechanisms, without actually consuming any +data. In such cases, it is possible to call `readable.read(0)`, which will +always return `null`. + +If the internal read buffer is below the `highWaterMark`, and the +stream is not currently reading, then calling `stream.read(0)` will trigger +a low-level [`stream._read()`][stream-_read] call. + +While most applications will almost never need to do this, there are +situations within Node.js where this is done, particularly in the +Readable stream class internals. + +### `readable.push('')` + +Use of `readable.push('')` is not recommended. + +Pushing a zero-byte string or `Buffer` to a stream that is not in object mode +has an interesting side effect. Because it *is* a call to +[`readable.push()`][stream-push], the call will end the reading process. +However, because the argument is an empty string, no data is added to the +readable buffer so there is nothing for a user to consume. + +[`'data'`]: #stream_event_data +[`'drain'`]: #stream_event_drain +[`'end'`]: #stream_event_end +[`'finish'`]: #stream_event_finish +[`'readable'`]: #stream_event_readable +[`buf.toString(encoding)`]: https://nodejs.org/docs/v6.3.1/api/buffer.html#buffer_buf_tostring_encoding_start_end +[`EventEmitter`]: https://nodejs.org/docs/v6.3.1/api/events.html#events_class_eventemitter +[`process.stderr`]: https://nodejs.org/docs/v6.3.1/api/process.html#process_process_stderr +[`process.stdin`]: https://nodejs.org/docs/v6.3.1/api/process.html#process_process_stdin +[`process.stdout`]: https://nodejs.org/docs/v6.3.1/api/process.html#process_process_stdout +[`stream.cork()`]: #stream_writable_cork +[`stream.pipe()`]: #stream_readable_pipe_destination_options +[`stream.uncork()`]: #stream_writable_uncork +[`stream.unpipe()`]: #stream_readable_unpipe_destination +[`stream.wrap()`]: #stream_readable_wrap_stream +[`tls.CryptoStream`]: https://nodejs.org/docs/v6.3.1/api/tls.html#tls_class_cryptostream +[API for Stream Consumers]: #stream_api_for_stream_consumers +[API for Stream Implementers]: #stream_api_for_stream_implementers +[child process stdin]: https://nodejs.org/docs/v6.3.1/api/child_process.html#child_process_child_stdin +[child process stdout and stderr]: https://nodejs.org/docs/v6.3.1/api/child_process.html#child_process_child_stdout +[Compatibility]: #stream_compatibility_with_older_node_js_versions +[crypto]: crypto.html +[Duplex]: #stream_class_stream_duplex +[fs read streams]: https://nodejs.org/docs/v6.3.1/api/fs.html#fs_class_fs_readstream +[fs write streams]: https://nodejs.org/docs/v6.3.1/api/fs.html#fs_class_fs_writestream +[`fs.createReadStream()`]: https://nodejs.org/docs/v6.3.1/api/fs.html#fs_fs_createreadstream_path_options +[`fs.createWriteStream()`]: https://nodejs.org/docs/v6.3.1/api/fs.html#fs_fs_createwritestream_path_options +[`net.Socket`]: https://nodejs.org/docs/v6.3.1/api/net.html#net_class_net_socket +[`zlib.createDeflate()`]: https://nodejs.org/docs/v6.3.1/api/zlib.html#zlib_zlib_createdeflate_options +[HTTP requests, on the client]: https://nodejs.org/docs/v6.3.1/api/http.html#http_class_http_clientrequest +[HTTP responses, on the server]: https://nodejs.org/docs/v6.3.1/api/http.html#http_class_http_serverresponse +[http-incoming-message]: https://nodejs.org/docs/v6.3.1/api/http.html#http_class_http_incomingmessage +[Object mode]: #stream_object_mode +[Readable]: #stream_class_stream_readable +[SimpleProtocol v2]: #stream_example_simpleprotocol_parser_v2 +[stream-_flush]: #stream_transform_flush_callback +[stream-_read]: #stream_readable_read_size_1 +[stream-_transform]: #stream_transform_transform_chunk_encoding_callback +[stream-_write]: #stream_writable_write_chunk_encoding_callback_1 +[stream-_writev]: #stream_writable_writev_chunks_callback +[stream-end]: #stream_writable_end_chunk_encoding_callback +[stream-pause]: #stream_readable_pause +[stream-push]: #stream_readable_push_chunk_encoding +[stream-read]: #stream_readable_read_size +[stream-resume]: #stream_readable_resume +[stream-write]: #stream_writable_write_chunk_encoding_callback +[TCP sockets]: https://nodejs.org/docs/v6.3.1/api/net.html#net_class_net_socket +[Transform]: #stream_class_stream_transform +[Writable]: #stream_class_stream_writable +[zlib]: zlib.html diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/node_modules/vinyl-fs/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md new file mode 100644 index 000000000..83275f192 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md @@ -0,0 +1,60 @@ +# streams WG Meeting 2015-01-30 + +## Links + +* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg +* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106 +* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/ + +## Agenda + +Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting. + +* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105) +* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101) +* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102) +* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99) + +## Minutes + +### adopt a charter + +* group: +1's all around + +### What versioning scheme should be adopted? +* group: +1’s 3.0.0 +* domenic+group: pulling in patches from other sources where appropriate +* mikeal: version independently, suggesting versions for io.js +* mikeal+domenic: work with TC to notify in advance of changes +simpler stream creation + +### streamline creation of streams +* sam: streamline creation of streams +* domenic: nice simple solution posted + but, we lose the opportunity to change the model + may not be backwards incompatible (double check keys) + + **action item:** domenic will check + +### remove implicit flowing of streams on(‘data’) +* add isFlowing / isPaused +* mikeal: worrying that we’re documenting polyfill methods – confuses users +* domenic: more reflective API is probably good, with warning labels for users +* new section for mad scientists (reflective stream access) +* calvin: name the “third state” +* mikeal: maybe borrow the name from whatwg? +* domenic: we’re missing the “third state” +* consensus: kind of difficult to name the third state +* mikeal: figure out differences in states / compat +* mathias: always flow on data – eliminates third state + * explore what it breaks + +**action items:** +* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream) +* ask rod/build for infrastructure +* **chris**: explore the “flow on data” approach +* add isPaused/isFlowing +* add new docs section +* move isPaused to that section + + diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/duplex.js b/node_modules/vinyl-fs/node_modules/readable-stream/duplex.js new file mode 100644 index 000000000..ca807af87 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/duplex.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_duplex.js") diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_duplex.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_duplex.js new file mode 100644 index 000000000..736693b84 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_duplex.js @@ -0,0 +1,75 @@ +// a duplex stream is just a stream that is both readable and writable. +// Since JS doesn't have multiple prototypal inheritance, this class +// prototypally inherits from Readable, and then parasitically from +// Writable. + +'use strict'; + +/*<replacement>*/ + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + keys.push(key); + }return keys; +}; +/*</replacement>*/ + +module.exports = Duplex; + +/*<replacement>*/ +var processNextTick = require('process-nextick-args'); +/*</replacement>*/ + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +var Readable = require('./_stream_readable'); +var Writable = require('./_stream_writable'); + +util.inherits(Duplex, Readable); + +var keys = objectKeys(Writable.prototype); +for (var v = 0; v < keys.length; v++) { + var method = keys[v]; + if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method]; +} + +function Duplex(options) { + if (!(this instanceof Duplex)) return new Duplex(options); + + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) this.readable = false; + + if (options && options.writable === false) this.writable = false; + + this.allowHalfOpen = true; + if (options && options.allowHalfOpen === false) this.allowHalfOpen = false; + + this.once('end', onend); +} + +// the no-half-open enforcer +function onend() { + // if we allow half-open state, or if the writable side ended, + // then we're ok. + if (this.allowHalfOpen || this._writableState.ended) return; + + // no more data can be written. + // But allow more writes to happen in this tick. + processNextTick(onEndNT, this); +} + +function onEndNT(self) { + self.end(); +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +}
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_passthrough.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_passthrough.js new file mode 100644 index 000000000..d06f71f18 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_passthrough.js @@ -0,0 +1,26 @@ +// a passthrough stream. +// basically just the most minimal sort of Transform stream. +// Every written chunk gets output as-is. + +'use strict'; + +module.exports = PassThrough; + +var Transform = require('./_stream_transform'); + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +util.inherits(PassThrough, Transform); + +function PassThrough(options) { + if (!(this instanceof PassThrough)) return new PassThrough(options); + + Transform.call(this, options); +} + +PassThrough.prototype._transform = function (chunk, encoding, cb) { + cb(null, chunk); +};
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_readable.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_readable.js new file mode 100644 index 000000000..208cc65f1 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_readable.js @@ -0,0 +1,937 @@ +'use strict'; + +module.exports = Readable; + +/*<replacement>*/ +var processNextTick = require('process-nextick-args'); +/*</replacement>*/ + +/*<replacement>*/ +var isArray = require('isarray'); +/*</replacement>*/ + +Readable.ReadableState = ReadableState; + +/*<replacement>*/ +var EE = require('events').EventEmitter; + +var EElistenerCount = function (emitter, type) { + return emitter.listeners(type).length; +}; +/*</replacement>*/ + +/*<replacement>*/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/*</replacement>*/ + +var Buffer = require('buffer').Buffer; +/*<replacement>*/ +var bufferShim = require('buffer-shims'); +/*</replacement>*/ + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +/*<replacement>*/ +var debugUtil = require('util'); +var debug = void 0; +if (debugUtil && debugUtil.debuglog) { + debug = debugUtil.debuglog('stream'); +} else { + debug = function () {}; +} +/*</replacement>*/ + +var BufferList = require('./internal/streams/BufferList'); +var StringDecoder; + +util.inherits(Readable, Stream); + +function prependListener(emitter, event, fn) { + if (typeof emitter.prependListener === 'function') { + return emitter.prependListener(event, fn); + } else { + // This is a hack to make sure that our error handler is attached before any + // userland ones. NEVER DO THIS. This is here only because this code needs + // to continue to work with older versions of Node.js that do not include + // the prependListener() method. The goal is to eventually remove this hack. + if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]]; + } +} + +var Duplex; +function ReadableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag. Used to make read(n) ignore n and to + // make all the buffer merging and length checks go away + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode; + + // the point at which it stops calling _read() to fill the buffer + // Note: 0 is a valid value, means "don't call _read preemptively ever" + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + // A linked list is used to store data chunks instead of an array because the + // linked list can remove elements from the beginning faster than + // array.shift() + this.buffer = new BufferList(); + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // whenever we return null, then we set a flag to say + // that we're awaiting a 'readable' event emission. + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.resumeScheduled = false; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // when piping, we only care about 'readable' events that happen + // after read()ing all the bytes and not getting any pushback. + this.ranOut = false; + + // the number of writers that are awaiting a drain event in .pipe()s + this.awaitDrain = 0; + + // if true, a maybeReadMore has been scheduled + this.readingMore = false; + + this.decoder = null; + this.encoding = null; + if (options.encoding) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this.decoder = new StringDecoder(options.encoding); + this.encoding = options.encoding; + } +} + +var Duplex; +function Readable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + if (!(this instanceof Readable)) return new Readable(options); + + this._readableState = new ReadableState(options, this); + + // legacy + this.readable = true; + + if (options && typeof options.read === 'function') this._read = options.read; + + Stream.call(this); +} + +// Manually shove something into the read() buffer. +// This returns true if the highWaterMark has not been hit yet, +// similar to how Writable.write() returns true if you should +// write() some more. +Readable.prototype.push = function (chunk, encoding) { + var state = this._readableState; + + if (!state.objectMode && typeof chunk === 'string') { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = bufferShim.from(chunk, encoding); + encoding = ''; + } + } + + return readableAddChunk(this, state, chunk, encoding, false); +}; + +// Unshift should *always* be something directly out of read() +Readable.prototype.unshift = function (chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, '', true); +}; + +Readable.prototype.isPaused = function () { + return this._readableState.flowing === false; +}; + +function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit('error', er); + } else if (chunk === null) { + state.reading = false; + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error('stream.push() after EOF'); + stream.emit('error', e); + } else if (state.endEmitted && addToFront) { + var _e = new Error('stream.unshift() after end event'); + stream.emit('error', _e); + } else { + var skipAdd; + if (state.decoder && !addToFront && !encoding) { + chunk = state.decoder.write(chunk); + skipAdd = !state.objectMode && chunk.length === 0; + } + + if (!addToFront) state.reading = false; + + // Don't add to the buffer if we've decoded to an empty string chunk and + // we're not in object mode + if (!skipAdd) { + // if we want the data now, just emit it. + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit('data', chunk); + stream.read(0); + } else { + // update the buffer info. + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk); + + if (state.needReadable) emitReadable(stream); + } + } + + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + + return needMoreData(state); +} + +// if it's past the high water mark, we can push in some more. +// Also, if we have no data yet, we can stand some +// more bytes. This is to work around cases where hwm=0, +// such as the repl. Also, if the push() triggered a +// readable event, and the user called read(largeNumber) such that +// needReadable was set, then we ought to push more, so that another +// 'readable' event will be triggered. +function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); +} + +// backwards compatibility. +Readable.prototype.setEncoding = function (enc) { + if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; +}; + +// Don't raise the hwm > 8MB +var MAX_HWM = 0x800000; +function computeNewHighWaterMark(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + // Get the next highest power of 2 to prevent increasing hwm excessively in + // tiny amounts + n--; + n |= n >>> 1; + n |= n >>> 2; + n |= n >>> 4; + n |= n >>> 8; + n |= n >>> 16; + n++; + } + return n; +} + +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function howMuchToRead(n, state) { + if (n <= 0 || state.length === 0 && state.ended) return 0; + if (state.objectMode) return 1; + if (n !== n) { + // Only flow one buffer at a time + if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length; + } + // If we're asking for more than the current hwm, then raise the hwm. + if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n); + if (n <= state.length) return n; + // Don't have enough + if (!state.ended) { + state.needReadable = true; + return 0; + } + return state.length; +} + +// you can override either this method, or the async _read(n) below. +Readable.prototype.read = function (n) { + debug('read', n); + n = parseInt(n, 10); + var state = this._readableState; + var nOrig = n; + + if (n !== 0) state.emittedReadable = false; + + // if we're doing read(0) to trigger a readable event, but we + // already have a bunch of data in the buffer, then just trigger + // the 'readable' event and move on. + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug('read: emitReadable', state.length, state.ended); + if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this); + return null; + } + + n = howMuchToRead(n, state); + + // if we've ended, and we're now clear, then finish it up. + if (n === 0 && state.ended) { + if (state.length === 0) endReadable(this); + return null; + } + + // All the actual chunk generation logic needs to be + // *below* the call to _read. The reason is that in certain + // synthetic stream cases, such as passthrough streams, _read + // may be a completely synchronous operation which may change + // the state of the read buffer, providing enough data when + // before there was *not* enough. + // + // So, the steps are: + // 1. Figure out what the state of things will be after we do + // a read from the buffer. + // + // 2. If that resulting state will trigger a _read, then call _read. + // Note that this may be asynchronous, or synchronous. Yes, it is + // deeply ugly to write APIs this way, but that still doesn't mean + // that the Readable class should behave improperly, as streams are + // designed to be sync/async agnostic. + // Take note if the _read call is sync or async (ie, if the read call + // has returned yet), so that we know whether or not it's safe to emit + // 'readable' etc. + // + // 3. Actually pull the requested chunks out of the buffer and return. + + // if we need a readable event, then we need to do some reading. + var doRead = state.needReadable; + debug('need readable', doRead); + + // if we currently have less than the highWaterMark, then also read some + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug('length less than watermark', doRead); + } + + // however, if we've ended, then there's no point, and if we're already + // reading, then it's unnecessary. + if (state.ended || state.reading) { + doRead = false; + debug('reading or ended', doRead); + } else if (doRead) { + debug('do read'); + state.reading = true; + state.sync = true; + // if the length is currently zero, then we *need* a readable event. + if (state.length === 0) state.needReadable = true; + // call internal read method + this._read(state.highWaterMark); + state.sync = false; + // If _read pushed data synchronously, then `reading` will be false, + // and we need to re-evaluate how much data we can return to the user. + if (!state.reading) n = howMuchToRead(nOrig, state); + } + + var ret; + if (n > 0) ret = fromList(n, state);else ret = null; + + if (ret === null) { + state.needReadable = true; + n = 0; + } else { + state.length -= n; + } + + if (state.length === 0) { + // If we have nothing in the buffer, then we want to know + // as soon as we *do* get something into the buffer. + if (!state.ended) state.needReadable = true; + + // If we tried to read() past the EOF, then emit end on the next tick. + if (nOrig !== n && state.ended) endReadable(this); + } + + if (ret !== null) this.emit('data', ret); + + return ret; +}; + +function chunkInvalid(state, chunk) { + var er = null; + if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + return er; +} + +function onEofChunk(stream, state) { + if (state.ended) return; + if (state.decoder) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + + // emit 'readable' now to make sure it gets picked up. + emitReadable(stream); +} + +// Don't emit readable right away in sync mode, because this can trigger +// another read() call => stack overflow. This way, it might trigger +// a nextTick recursion warning, but that's not so bad. +function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug('emitReadable', state.flowing); + state.emittedReadable = true; + if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + } +} + +function emitReadable_(stream) { + debug('emit readable'); + stream.emit('readable'); + flow(stream); +} + +// at this point, the user has presumably seen the 'readable' event, +// and called read() to consume some data. that may have triggered +// in turn another _read(n) call, in which case reading = true if +// it's in progress. +// However, if we're not ended, or reading, and the length < hwm, +// then go ahead and try to read some more preemptively. +function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + processNextTick(maybeReadMore_, stream, state); + } +} + +function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug('maybeReadMore read 0'); + stream.read(0); + if (len === state.length) + // didn't get any data, stop spinning. + break;else len = state.length; + } + state.readingMore = false; +} + +// abstract method. to be overridden in specific implementation classes. +// call cb(er, data) where data is <= n in length. +// for virtual (non-string, non-buffer) streams, "length" is somewhat +// arbitrary, and perhaps not very meaningful. +Readable.prototype._read = function (n) { + this.emit('error', new Error('not implemented')); +}; + +Readable.prototype.pipe = function (dest, pipeOpts) { + var src = this; + var state = this._readableState; + + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts); + + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); + + dest.on('unpipe', onunpipe); + function onunpipe(readable) { + debug('onunpipe'); + if (readable === src) { + cleanup(); + } + } + + function onend() { + debug('onend'); + dest.end(); + } + + // when the dest drains, it reduces the awaitDrain counter + // on the source. This would be more elegant with a .once() + // handler in flow(), but adding and removing repeatedly is + // too slow. + var ondrain = pipeOnDrain(src); + dest.on('drain', ondrain); + + var cleanedUp = false; + function cleanup() { + debug('cleanup'); + // cleanup event handlers once the pipe is broken + dest.removeListener('close', onclose); + dest.removeListener('finish', onfinish); + dest.removeListener('drain', ondrain); + dest.removeListener('error', onerror); + dest.removeListener('unpipe', onunpipe); + src.removeListener('end', onend); + src.removeListener('end', cleanup); + src.removeListener('data', ondata); + + cleanedUp = true; + + // if the reader is waiting for a drain event from this + // specific writer, then it would cause it to never start + // flowing again. + // So, if this is awaiting a drain, then we just call it now. + // If we don't know, then assume that we are waiting for one. + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain(); + } + + // If the user pushes more data while we're writing to dest then we'll end up + // in ondata again. However, we only want to increase awaitDrain once because + // dest will only emit one 'drain' event for the multiple writes. + // => Introduce a guard on increasing awaitDrain. + var increasedAwaitDrain = false; + src.on('data', ondata); + function ondata(chunk) { + debug('ondata'); + increasedAwaitDrain = false; + var ret = dest.write(chunk); + if (false === ret && !increasedAwaitDrain) { + // If the user unpiped during `dest.write()`, it is possible + // to get stuck in a permanently paused state if that write + // also returned false. + // => Check whether `dest` is still a piping destination. + if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) { + debug('false write response, pause', src._readableState.awaitDrain); + src._readableState.awaitDrain++; + increasedAwaitDrain = true; + } + src.pause(); + } + } + + // if the dest has an error, then stop piping into it. + // however, don't suppress the throwing behavior for this. + function onerror(er) { + debug('onerror', er); + unpipe(); + dest.removeListener('error', onerror); + if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er); + } + + // Make sure our error handler is attached before userland ones. + prependListener(dest, 'error', onerror); + + // Both close and finish should trigger unpipe, but only once. + function onclose() { + dest.removeListener('finish', onfinish); + unpipe(); + } + dest.once('close', onclose); + function onfinish() { + debug('onfinish'); + dest.removeListener('close', onclose); + unpipe(); + } + dest.once('finish', onfinish); + + function unpipe() { + debug('unpipe'); + src.unpipe(dest); + } + + // tell the dest that it's being piped to + dest.emit('pipe', src); + + // start the flow if it hasn't been started already. + if (!state.flowing) { + debug('pipe resume'); + src.resume(); + } + + return dest; +}; + +function pipeOnDrain(src) { + return function () { + var state = src._readableState; + debug('pipeOnDrain', state.awaitDrain); + if (state.awaitDrain) state.awaitDrain--; + if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) { + state.flowing = true; + flow(src); + } + }; +} + +Readable.prototype.unpipe = function (dest) { + var state = this._readableState; + + // if we're not piping anywhere, then do nothing. + if (state.pipesCount === 0) return this; + + // just one destination. most common case. + if (state.pipesCount === 1) { + // passed in one, but it's not the right one. + if (dest && dest !== state.pipes) return this; + + if (!dest) dest = state.pipes; + + // got a match. + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) dest.emit('unpipe', this); + return this; + } + + // slow case. multiple pipe destinations. + + if (!dest) { + // remove all. + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + + for (var _i = 0; _i < len; _i++) { + dests[_i].emit('unpipe', this); + }return this; + } + + // try to find the right one. + var i = indexOf(state.pipes, dest); + if (i === -1) return this; + + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) state.pipes = state.pipes[0]; + + dest.emit('unpipe', this); + + return this; +}; + +// set up data events if they are asked for +// Ensure readable listeners eventually get something +Readable.prototype.on = function (ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + + if (ev === 'data') { + // Start flowing on next tick if stream isn't explicitly paused + if (this._readableState.flowing !== false) this.resume(); + } else if (ev === 'readable') { + var state = this._readableState; + if (!state.endEmitted && !state.readableListening) { + state.readableListening = state.needReadable = true; + state.emittedReadable = false; + if (!state.reading) { + processNextTick(nReadingNextTick, this); + } else if (state.length) { + emitReadable(this, state); + } + } + } + + return res; +}; +Readable.prototype.addListener = Readable.prototype.on; + +function nReadingNextTick(self) { + debug('readable nexttick read 0'); + self.read(0); +} + +// pause() and resume() are remnants of the legacy readable stream API +// If the user uses them, then switch into old mode. +Readable.prototype.resume = function () { + var state = this._readableState; + if (!state.flowing) { + debug('resume'); + state.flowing = true; + resume(this, state); + } + return this; +}; + +function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + processNextTick(resume_, stream, state); + } +} + +function resume_(stream, state) { + if (!state.reading) { + debug('resume read 0'); + stream.read(0); + } + + state.resumeScheduled = false; + state.awaitDrain = 0; + stream.emit('resume'); + flow(stream); + if (state.flowing && !state.reading) stream.read(0); +} + +Readable.prototype.pause = function () { + debug('call pause flowing=%j', this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug('pause'); + this._readableState.flowing = false; + this.emit('pause'); + } + return this; +}; + +function flow(stream) { + var state = stream._readableState; + debug('flow', state.flowing); + while (state.flowing && stream.read() !== null) {} +} + +// wrap an old-style stream as the async data source. +// This is *not* part of the readable stream interface. +// It is an ugly unfortunate mess of history. +Readable.prototype.wrap = function (stream) { + var state = this._readableState; + var paused = false; + + var self = this; + stream.on('end', function () { + debug('wrapped end'); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) self.push(chunk); + } + + self.push(null); + }); + + stream.on('data', function (chunk) { + debug('wrapped data'); + if (state.decoder) chunk = state.decoder.write(chunk); + + // don't skip over falsy values in objectMode + if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return; + + var ret = self.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + + // proxy all the other methods. + // important when wrapping filters and duplexes. + for (var i in stream) { + if (this[i] === undefined && typeof stream[i] === 'function') { + this[i] = function (method) { + return function () { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + + // proxy certain important events. + var events = ['error', 'close', 'destroy', 'pause', 'resume']; + forEach(events, function (ev) { + stream.on(ev, self.emit.bind(self, ev)); + }); + + // when we try to consume some more bytes, simply unpause the + // underlying stream. + self._read = function (n) { + debug('wrapped _read', n); + if (paused) { + paused = false; + stream.resume(); + } + }; + + return self; +}; + +// exposed for testing purposes only. +Readable._fromList = fromList; + +// Pluck off n bytes from an array of buffers. +// Length is the combined lengths of all the buffers in the list. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromList(n, state) { + // nothing buffered + if (state.length === 0) return null; + + var ret; + if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) { + // read it all, truncate the list + if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length); + state.buffer.clear(); + } else { + // read part of list + ret = fromListPartial(n, state.buffer, state.decoder); + } + + return ret; +} + +// Extracts only enough buffered data to satisfy the amount requested. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function fromListPartial(n, list, hasStrings) { + var ret; + if (n < list.head.data.length) { + // slice is the same for buffers and strings + ret = list.head.data.slice(0, n); + list.head.data = list.head.data.slice(n); + } else if (n === list.head.data.length) { + // first chunk is a perfect match + ret = list.shift(); + } else { + // result spans more than one buffer + ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list); + } + return ret; +} + +// Copies a specified amount of characters from the list of buffered data +// chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBufferString(n, list) { + var p = list.head; + var c = 1; + var ret = p.data; + n -= ret.length; + while (p = p.next) { + var str = p.data; + var nb = n > str.length ? str.length : n; + if (nb === str.length) ret += str;else ret += str.slice(0, n); + n -= nb; + if (n === 0) { + if (nb === str.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = str.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +// Copies a specified amount of bytes from the list of buffered data chunks. +// This function is designed to be inlinable, so please take care when making +// changes to the function body. +function copyFromBuffer(n, list) { + var ret = bufferShim.allocUnsafe(n); + var p = list.head; + var c = 1; + p.data.copy(ret); + n -= p.data.length; + while (p = p.next) { + var buf = p.data; + var nb = n > buf.length ? buf.length : n; + buf.copy(ret, ret.length - n, 0, nb); + n -= nb; + if (n === 0) { + if (nb === buf.length) { + ++c; + if (p.next) list.head = p.next;else list.head = list.tail = null; + } else { + list.head = p; + p.data = buf.slice(nb); + } + break; + } + ++c; + } + list.length -= c; + return ret; +} + +function endReadable(stream) { + var state = stream._readableState; + + // If we get here before consuming all the bytes, then that is a + // bug in node. Should never happen. + if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream'); + + if (!state.endEmitted) { + state.ended = true; + processNextTick(endReadableNT, state, stream); + } +} + +function endReadableNT(state, stream) { + // Check that we didn't get one last unshift. + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit('end'); + } +} + +function forEach(xs, f) { + for (var i = 0, l = xs.length; i < l; i++) { + f(xs[i], i); + } +} + +function indexOf(xs, x) { + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) return i; + } + return -1; +}
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_transform.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_transform.js new file mode 100644 index 000000000..dbc996ede --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_transform.js @@ -0,0 +1,180 @@ +// a transform stream is a readable/writable stream where you do +// something with the data. Sometimes it's called a "filter", +// but that's not a great name for it, since that implies a thing where +// some bits pass through, and others are simply ignored. (That would +// be a valid example of a transform, of course.) +// +// While the output is causally related to the input, it's not a +// necessarily symmetric or synchronous transformation. For example, +// a zlib stream might take multiple plain-text writes(), and then +// emit a single compressed chunk some time in the future. +// +// Here's how this works: +// +// The Transform stream has all the aspects of the readable and writable +// stream classes. When you write(chunk), that calls _write(chunk,cb) +// internally, and returns false if there's a lot of pending writes +// buffered up. When you call read(), that calls _read(n) until +// there's enough pending readable data buffered up. +// +// In a transform stream, the written data is placed in a buffer. When +// _read(n) is called, it transforms the queued up data, calling the +// buffered _write cb's as it consumes chunks. If consuming a single +// written chunk would result in multiple output chunks, then the first +// outputted bit calls the readcb, and subsequent chunks just go into +// the read buffer, and will cause it to emit 'readable' if necessary. +// +// This way, back-pressure is actually determined by the reading side, +// since _read has to be called to start processing a new chunk. However, +// a pathological inflate type of transform can cause excessive buffering +// here. For example, imagine a stream where every byte of input is +// interpreted as an integer from 0-255, and then results in that many +// bytes of output. Writing the 4 bytes {ff,ff,ff,ff} would result in +// 1kb of data being output. In this case, you could write a very small +// amount of input, and end up with a very large amount of output. In +// such a pathological inflating mechanism, there'd be no way to tell +// the system to stop doing the transform. A single 4MB write could +// cause the system to run out of memory. +// +// However, even in such a pathological case, only a single written chunk +// would be consumed, and then the rest would wait (un-transformed) until +// the results of the previous transformed chunk were consumed. + +'use strict'; + +module.exports = Transform; + +var Duplex = require('./_stream_duplex'); + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +util.inherits(Transform, Duplex); + +function TransformState(stream) { + this.afterTransform = function (er, data) { + return afterTransform(stream, er, data); + }; + + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + this.writeencoding = null; +} + +function afterTransform(stream, er, data) { + var ts = stream._transformState; + ts.transforming = false; + + var cb = ts.writecb; + + if (!cb) return stream.emit('error', new Error('no writecb in Transform class')); + + ts.writechunk = null; + ts.writecb = null; + + if (data !== null && data !== undefined) stream.push(data); + + cb(er); + + var rs = stream._readableState; + rs.reading = false; + if (rs.needReadable || rs.length < rs.highWaterMark) { + stream._read(rs.highWaterMark); + } +} + +function Transform(options) { + if (!(this instanceof Transform)) return new Transform(options); + + Duplex.call(this, options); + + this._transformState = new TransformState(this); + + // when the writable side finishes, then flush out anything remaining. + var stream = this; + + // start out asking for a readable event once data is transformed. + this._readableState.needReadable = true; + + // we have implemented the _read method, and done the other things + // that Readable wants before the first _read call, so unset the + // sync guard flag. + this._readableState.sync = false; + + if (options) { + if (typeof options.transform === 'function') this._transform = options.transform; + + if (typeof options.flush === 'function') this._flush = options.flush; + } + + this.once('prefinish', function () { + if (typeof this._flush === 'function') this._flush(function (er) { + done(stream, er); + });else done(stream); + }); +} + +Transform.prototype.push = function (chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); +}; + +// This is the part where you do stuff! +// override this function in implementation classes. +// 'chunk' is an input chunk. +// +// Call `push(newChunk)` to pass along transformed output +// to the readable side. You may call 'push' zero or more times. +// +// Call `cb(err)` when you are done with this chunk. If you pass +// an error, then that'll put the hurt on the whole operation. If you +// never call cb(), then you'll never get another chunk. +Transform.prototype._transform = function (chunk, encoding, cb) { + throw new Error('Not implemented'); +}; + +Transform.prototype._write = function (chunk, encoding, cb) { + var ts = this._transformState; + ts.writecb = cb; + ts.writechunk = chunk; + ts.writeencoding = encoding; + if (!ts.transforming) { + var rs = this._readableState; + if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark); + } +}; + +// Doesn't matter what the args are here. +// _transform does all the work. +// That we got here means that the readable side wants more data. +Transform.prototype._read = function (n) { + var ts = this._transformState; + + if (ts.writechunk !== null && ts.writecb && !ts.transforming) { + ts.transforming = true; + this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform); + } else { + // mark that we need a transform, so that any data that comes in + // will get processed, now that we've asked for it. + ts.needTransform = true; + } +}; + +function done(stream, er) { + if (er) return stream.emit('error', er); + + // if there's nothing in the write buffer, then that means + // that nothing more will ever be provided + var ws = stream._writableState; + var ts = stream._transformState; + + if (ws.length) throw new Error('Calling transform done when ws.length != 0'); + + if (ts.transforming) throw new Error('Calling transform done when still transforming'); + + return stream.push(null); +}
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_writable.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_writable.js new file mode 100644 index 000000000..ed5efcbd2 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/_stream_writable.js @@ -0,0 +1,526 @@ +// A bit simpler than readable streams. +// Implement an async ._write(chunk, encoding, cb), and it'll handle all +// the drain event emission and buffering. + +'use strict'; + +module.exports = Writable; + +/*<replacement>*/ +var processNextTick = require('process-nextick-args'); +/*</replacement>*/ + +/*<replacement>*/ +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +/*</replacement>*/ + +Writable.WritableState = WritableState; + +/*<replacement>*/ +var util = require('core-util-is'); +util.inherits = require('inherits'); +/*</replacement>*/ + +/*<replacement>*/ +var internalUtil = { + deprecate: require('util-deprecate') +}; +/*</replacement>*/ + +/*<replacement>*/ +var Stream; +(function () { + try { + Stream = require('st' + 'ream'); + } catch (_) {} finally { + if (!Stream) Stream = require('events').EventEmitter; + } +})(); +/*</replacement>*/ + +var Buffer = require('buffer').Buffer; +/*<replacement>*/ +var bufferShim = require('buffer-shims'); +/*</replacement>*/ + +util.inherits(Writable, Stream); + +function nop() {} + +function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + this.next = null; +} + +var Duplex; +function WritableState(options, stream) { + Duplex = Duplex || require('./_stream_duplex'); + + options = options || {}; + + // object stream flag to indicate whether or not this stream + // contains buffers or objects. + this.objectMode = !!options.objectMode; + + if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode; + + // the point at which write() starts returning false + // Note: 0 is a valid value, means that we always return false if + // the entire buffer is not flushed immediately on write() + var hwm = options.highWaterMark; + var defaultHwm = this.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + + // cast to ints. + this.highWaterMark = ~ ~this.highWaterMark; + + this.needDrain = false; + // at the start of calling end() + this.ending = false; + // when end() has been called, and returned + this.ended = false; + // when 'finish' is emitted + this.finished = false; + + // should we decode strings into buffers before passing to _write? + // this is here so that some node-core streams can optimize string + // handling at a lower level. + var noDecode = options.decodeStrings === false; + this.decodeStrings = !noDecode; + + // Crypto is kind of old and crusty. Historically, its default string + // encoding is 'binary' so we have to make this configurable. + // Everything else in the universe uses 'utf8', though. + this.defaultEncoding = options.defaultEncoding || 'utf8'; + + // not an actual buffer we keep track of, but a measurement + // of how much we're waiting to get pushed to some underlying + // socket or file. + this.length = 0; + + // a flag to see when we're in the middle of a write. + this.writing = false; + + // when true all writes will be buffered until .uncork() call + this.corked = 0; + + // a flag to be able to tell if the onwrite cb is called immediately, + // or on a later tick. We set this to true at first, because any + // actions that shouldn't happen until "later" should generally also + // not happen before the first write call. + this.sync = true; + + // a flag to know if we're processing previously buffered items, which + // may call the _write() callback in the same tick, so that we don't + // end up in an overlapped onwrite situation. + this.bufferProcessing = false; + + // the callback that's passed to _write(chunk,cb) + this.onwrite = function (er) { + onwrite(stream, er); + }; + + // the callback that the user supplies to write(chunk,encoding,cb) + this.writecb = null; + + // the amount that is being written when _write is called. + this.writelen = 0; + + this.bufferedRequest = null; + this.lastBufferedRequest = null; + + // number of pending user-supplied write callbacks + // this must be 0 before 'finish' can be emitted + this.pendingcb = 0; + + // emit prefinish if the only thing we're waiting for is _write cbs + // This is relevant for synchronous Transform streams + this.prefinished = false; + + // True if the error was already emitted and should not be thrown again + this.errorEmitted = false; + + // count buffered requests + this.bufferedRequestCount = 0; + + // allocate the first CorkedRequest, there is always + // one allocated and free to use, and we maintain at most two + this.corkedRequestsFree = new CorkedRequest(this); +} + +WritableState.prototype.getBuffer = function writableStateGetBuffer() { + var current = this.bufferedRequest; + var out = []; + while (current) { + out.push(current); + current = current.next; + } + return out; +}; + +(function () { + try { + Object.defineProperty(WritableState.prototype, 'buffer', { + get: internalUtil.deprecate(function () { + return this.getBuffer(); + }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.') + }); + } catch (_) {} +})(); + +var Duplex; +function Writable(options) { + Duplex = Duplex || require('./_stream_duplex'); + + // Writable ctor is applied to Duplexes, though they're not + // instanceof Writable, they're instanceof Readable. + if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options); + + this._writableState = new WritableState(options, this); + + // legacy. + this.writable = true; + + if (options) { + if (typeof options.write === 'function') this._write = options.write; + + if (typeof options.writev === 'function') this._writev = options.writev; + } + + Stream.call(this); +} + +// Otherwise people can pipe Writable streams, which is just wrong. +Writable.prototype.pipe = function () { + this.emit('error', new Error('Cannot pipe, not readable')); +}; + +function writeAfterEnd(stream, cb) { + var er = new Error('write after end'); + // TODO: defer error events consistently everywhere, not just the cb + stream.emit('error', er); + processNextTick(cb, er); +} + +// If we get something that is not a buffer, string, null, or undefined, +// and we're not in objectMode, then that's an error. +// Otherwise stream chunks are all considered to be of length=1, and the +// watermarks determine how many objects to keep in the buffer, rather than +// how many bytes or characters. +function validChunk(stream, state, chunk, cb) { + var valid = true; + var er = false; + // Always throw error if a null is written + // if we are not in object mode then throw + // if it is not a buffer, string, or undefined. + if (chunk === null) { + er = new TypeError('May not write null values to stream'); + } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) { + er = new TypeError('Invalid non-string/buffer chunk'); + } + if (er) { + stream.emit('error', er); + processNextTick(cb, er); + valid = false; + } + return valid; +} + +Writable.prototype.write = function (chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + + if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding; + + if (typeof cb !== 'function') cb = nop; + + if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + + return ret; +}; + +Writable.prototype.cork = function () { + var state = this._writableState; + + state.corked++; +}; + +Writable.prototype.uncork = function () { + var state = this._writableState; + + if (state.corked) { + state.corked--; + + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state); + } +}; + +Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) { + // node::ParseEncoding() requires lower case. + if (typeof encoding === 'string') encoding = encoding.toLowerCase(); + if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding); + this._writableState.defaultEncoding = encoding; + return this; +}; + +function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') { + chunk = bufferShim.from(chunk, encoding); + } + return chunk; +} + +// if we're already writing something, then just put this +// in the queue, and wait our turn. Otherwise, call _write +// If we return false, then we need a drain event, so set that flag. +function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + + if (Buffer.isBuffer(chunk)) encoding = 'buffer'; + var len = state.objectMode ? 1 : chunk.length; + + state.length += len; + + var ret = state.length < state.highWaterMark; + // we must ensure that previous needDrain will not be reset to false. + if (!ret) state.needDrain = true; + + if (state.writing || state.corked) { + var last = state.lastBufferedRequest; + state.lastBufferedRequest = new WriteReq(chunk, encoding, cb); + if (last) { + last.next = state.lastBufferedRequest; + } else { + state.bufferedRequest = state.lastBufferedRequest; + } + state.bufferedRequestCount += 1; + } else { + doWrite(stream, state, false, len, chunk, encoding, cb); + } + + return ret; +} + +function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite); + state.sync = false; +} + +function onwriteError(stream, state, sync, er, cb) { + --state.pendingcb; + if (sync) processNextTick(cb, er);else cb(er); + + stream._writableState.errorEmitted = true; + stream.emit('error', er); +} + +function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; +} + +function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + + onwriteStateUpdate(state); + + if (er) onwriteError(stream, state, sync, er, cb);else { + // Check if we're actually ready to finish, but don't emit yet + var finished = needFinish(state); + + if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) { + clearBuffer(stream, state); + } + + if (sync) { + /*<replacement>*/ + asyncWrite(afterWrite, stream, state, finished, cb); + /*</replacement>*/ + } else { + afterWrite(stream, state, finished, cb); + } + } +} + +function afterWrite(stream, state, finished, cb) { + if (!finished) onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); +} + +// Must force callback to be called on nextTick, so that we don't +// emit 'drain' before the write() consumer gets the 'false' return +// value, and has a chance to attach a 'drain' listener. +function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit('drain'); + } +} + +// if there's something in the buffer waiting, then process it +function clearBuffer(stream, state) { + state.bufferProcessing = true; + var entry = state.bufferedRequest; + + if (stream._writev && entry && entry.next) { + // Fast case, write everything using _writev() + var l = state.bufferedRequestCount; + var buffer = new Array(l); + var holder = state.corkedRequestsFree; + holder.entry = entry; + + var count = 0; + while (entry) { + buffer[count] = entry; + entry = entry.next; + count += 1; + } + + doWrite(stream, state, true, state.length, buffer, '', holder.finish); + + // doWrite is almost always async, defer these to save a bit of time + // as the hot path ends with doWrite + state.pendingcb++; + state.lastBufferedRequest = null; + if (holder.next) { + state.corkedRequestsFree = holder.next; + holder.next = null; + } else { + state.corkedRequestsFree = new CorkedRequest(state); + } + } else { + // Slow case, write chunks one-by-one + while (entry) { + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + + doWrite(stream, state, false, len, chunk, encoding, cb); + entry = entry.next; + // if we didn't call the onwrite immediately, then + // it means that we need to wait until it does. + // also, that means that the chunk and cb are currently + // being processed, so move the buffer counter past them. + if (state.writing) { + break; + } + } + + if (entry === null) state.lastBufferedRequest = null; + } + + state.bufferedRequestCount = 0; + state.bufferedRequest = entry; + state.bufferProcessing = false; +} + +Writable.prototype._write = function (chunk, encoding, cb) { + cb(new Error('not implemented')); +}; + +Writable.prototype._writev = null; + +Writable.prototype.end = function (chunk, encoding, cb) { + var state = this._writableState; + + if (typeof chunk === 'function') { + cb = chunk; + chunk = null; + encoding = null; + } else if (typeof encoding === 'function') { + cb = encoding; + encoding = null; + } + + if (chunk !== null && chunk !== undefined) this.write(chunk, encoding); + + // .end() fully uncorks + if (state.corked) { + state.corked = 1; + this.uncork(); + } + + // ignore unnecessary end() calls. + if (!state.ending && !state.finished) endWritable(this, state, cb); +}; + +function needFinish(state) { + return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing; +} + +function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit('prefinish'); + } +} + +function finishMaybe(stream, state) { + var need = needFinish(state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit('finish'); + } else { + prefinish(stream, state); + } + } + return need; +} + +function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) processNextTick(cb);else stream.once('finish', cb); + } + state.ended = true; + stream.writable = false; +} + +// It seems a linked list but it is not +// there will be only 2 of these for each stream +function CorkedRequest(state) { + var _this = this; + + this.next = null; + this.entry = null; + + this.finish = function (err) { + var entry = _this.entry; + _this.entry = null; + while (entry) { + var cb = entry.callback; + state.pendingcb--; + cb(err); + entry = entry.next; + } + if (state.corkedRequestsFree) { + state.corkedRequestsFree.next = _this; + } else { + state.corkedRequestsFree = _this; + } + }; +}
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/lib/internal/streams/BufferList.js b/node_modules/vinyl-fs/node_modules/readable-stream/lib/internal/streams/BufferList.js new file mode 100644 index 000000000..e4bfcf02d --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/lib/internal/streams/BufferList.js @@ -0,0 +1,64 @@ +'use strict'; + +var Buffer = require('buffer').Buffer; +/*<replacement>*/ +var bufferShim = require('buffer-shims'); +/*</replacement>*/ + +module.exports = BufferList; + +function BufferList() { + this.head = null; + this.tail = null; + this.length = 0; +} + +BufferList.prototype.push = function (v) { + var entry = { data: v, next: null }; + if (this.length > 0) this.tail.next = entry;else this.head = entry; + this.tail = entry; + ++this.length; +}; + +BufferList.prototype.unshift = function (v) { + var entry = { data: v, next: this.head }; + if (this.length === 0) this.tail = entry; + this.head = entry; + ++this.length; +}; + +BufferList.prototype.shift = function () { + if (this.length === 0) return; + var ret = this.head.data; + if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next; + --this.length; + return ret; +}; + +BufferList.prototype.clear = function () { + this.head = this.tail = null; + this.length = 0; +}; + +BufferList.prototype.join = function (s) { + if (this.length === 0) return ''; + var p = this.head; + var ret = '' + p.data; + while (p = p.next) { + ret += s + p.data; + }return ret; +}; + +BufferList.prototype.concat = function (n) { + if (this.length === 0) return bufferShim.alloc(0); + if (this.length === 1) return this.head.data; + var ret = bufferShim.allocUnsafe(n >>> 0); + var p = this.head; + var i = 0; + while (p) { + p.data.copy(ret, i); + i += p.data.length; + p = p.next; + } + return ret; +};
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/package.json b/node_modules/vinyl-fs/node_modules/readable-stream/package.json new file mode 100644 index 000000000..e817a86a9 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/package.json @@ -0,0 +1,126 @@ +{ + "_args": [ + [ + { + "raw": "readable-stream@^2.0.4", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": "^2.0.4", + "spec": ">=2.0.4 <3.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs" + ] + ], + "_from": "readable-stream@>=2.0.4 <3.0.0", + "_id": "readable-stream@2.1.5", + "_inCache": true, + "_location": "/vinyl-fs/readable-stream", + "_nodeVersion": "5.12.0", + "_npmOperationalInternal": { + "host": "packages-16-east.internal.npmjs.com", + "tmp": "tmp/readable-stream-2.1.5.tgz_1471463532993_0.15824943827465177" + }, + "_npmUser": { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + }, + "_npmVersion": "3.8.6", + "_phantomChildren": {}, + "_requested": { + "raw": "readable-stream@^2.0.4", + "scope": null, + "escapedName": "readable-stream", + "name": "readable-stream", + "rawSpec": "^2.0.4", + "spec": ">=2.0.4 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs", + "/vinyl-fs/ordered-read-streams" + ], + "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "_shasum": "66fa8b720e1438b364681f2ad1a63c618448c9d0", + "_shrinkwrap": null, + "_spec": "readable-stream@^2.0.4", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs", + "browser": { + "util": false + }, + "bugs": { + "url": "https://github.com/nodejs/readable-stream/issues" + }, + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "description": "Streams3, a user-land copy of the stream library from Node.js", + "devDependencies": { + "assert": "~1.4.0", + "babel-polyfill": "^6.9.1", + "nyc": "^6.4.0", + "tap": "~0.7.1", + "tape": "~4.5.1", + "zuul": "~3.10.0" + }, + "directories": {}, + "dist": { + "shasum": "66fa8b720e1438b364681f2ad1a63c618448c9d0", + "tarball": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz" + }, + "gitHead": "758c8b3845af855fde736b6a7f58a15fba00d1e7", + "homepage": "https://github.com/nodejs/readable-stream#readme", + "keywords": [ + "readable", + "stream", + "pipe" + ], + "license": "MIT", + "main": "readable.js", + "maintainers": [ + { + "name": "isaacs", + "email": "isaacs@npmjs.com" + }, + { + "name": "tootallnate", + "email": "nathan@tootallnate.net" + }, + { + "name": "rvagg", + "email": "rod@vagg.org" + }, + { + "name": "cwmma", + "email": "calvin.metcalf@gmail.com" + } + ], + "name": "readable-stream", + "nyc": { + "include": [ + "lib/**.js" + ] + }, + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/nodejs/readable-stream.git" + }, + "scripts": { + "browser": "npm run write-zuul && zuul --browser-retries 2 -- test/browser.js", + "cover": "nyc npm test", + "local": "zuul --local 3000 --no-coverage -- test/browser.js", + "report": "nyc report --reporter=lcov", + "test": "tap test/parallel/*.js test/ours/*.js", + "write-zuul": "printf \"ui: tape\nbrowsers:\n - name: $BROWSER_NAME\n version: $BROWSER_VERSION\n\">.zuul.yml" + }, + "version": "2.1.5" +} diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/passthrough.js b/node_modules/vinyl-fs/node_modules/readable-stream/passthrough.js new file mode 100644 index 000000000..27e8d8a55 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/passthrough.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_passthrough.js") diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/readable.js b/node_modules/vinyl-fs/node_modules/readable-stream/readable.js new file mode 100644 index 000000000..be2688a07 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/readable.js @@ -0,0 +1,16 @@ +var Stream = (function (){ + try { + return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = require('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = require('./lib/_stream_writable.js'); +exports.Duplex = require('./lib/_stream_duplex.js'); +exports.Transform = require('./lib/_stream_transform.js'); +exports.PassThrough = require('./lib/_stream_passthrough.js'); + +if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) { + module.exports = Stream; +} diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/transform.js b/node_modules/vinyl-fs/node_modules/readable-stream/transform.js new file mode 100644 index 000000000..5d482f078 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/transform.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_transform.js") diff --git a/node_modules/vinyl-fs/node_modules/readable-stream/writable.js b/node_modules/vinyl-fs/node_modules/readable-stream/writable.js new file mode 100644 index 000000000..e1e9efdf3 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/readable-stream/writable.js @@ -0,0 +1 @@ +module.exports = require("./lib/_stream_writable.js") diff --git a/node_modules/vinyl-fs/node_modules/unique-stream/LICENSE b/node_modules/vinyl-fs/node_modules/unique-stream/LICENSE new file mode 100644 index 000000000..cd2225ad8 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/unique-stream/LICENSE @@ -0,0 +1,20 @@ +Copyright 2014 Eugene Ware + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/unique-stream/README.md b/node_modules/vinyl-fs/node_modules/unique-stream/README.md new file mode 100644 index 000000000..fce2ec019 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/unique-stream/README.md @@ -0,0 +1,133 @@ +# unique-stream + +node.js through stream that emits a unique stream of objects based on criteria + +[![Build Status](https://travis-ci.org/eugeneware/unique-stream.svg?branch=master)](https://travis-ci.org/eugeneware/unique-stream) +[![Coverage Status](https://coveralls.io/repos/eugeneware/unique-stream/badge.svg?branch=master&service=github)](https://coveralls.io/github/eugeneware/unique-stream?branch=master) + +## Installation + +Install via [npm](https://www.npmjs.com/): + +``` +$ npm install unique-stream +``` + +## Examples + +### Dedupe a ReadStream based on JSON.stringify: + +``` js +var unique = require('unique-stream') + , Stream = require('stream'); + +// return a stream of 3 identical objects +function makeStreamOfObjects() { + var s = new Stream; + s.readable = true; + var count = 3; + for (var i = 0; i < 3; i++) { + setImmediate(function () { + s.emit('data', { name: 'Bob', number: 123 }); + --count || end(); + }); + } + + function end() { + s.emit('end'); + } + + return s; +} + +// Will only print out one object as the rest are dupes. (Uses JSON.stringify) +makeStreamOfObjects() + .pipe(unique()) + .on('data', console.log); + +``` + +### Dedupe a ReadStream based on an object property: + +``` js +// Use name as the key field to dedupe on. Will only print one object +makeStreamOfObjects() + .pipe(unique('name')) + .on('data', console.log); +``` + +### Dedupe a ReadStream based on a custom function: + +``` js +// Use a custom function to dedupe on. Use the 'number' field. Will only print one object. +makeStreamOfObjects() + .pipe(function (data) { + return data.number; + }) + .on('data', console.log); +``` + +## Dedupe multiple streams + +The reason I wrote this was to dedupe multiple object streams: + +``` js +var aggregator = unique(); + +// Stream 1 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 2 +makeStreamOfObjects() + .pipe(aggregator); + +// Stream 3 +makeStreamOfObjects() + .pipe(aggregator); + +aggregator.on('data', console.log); +``` + +## Use a custom store to record keys that have been encountered + +By default a set is used to store keys encountered so far, in order to check new ones for +uniqueness. You can supply your own store instead, providing it supports the add(key) and +has(key) methods. This could allow you to use a persistant store so that already encountered +objects are not re-streamed when node is reloaded. + +``` js +var keyStore = { + store: {}, + + add: function(key) { + this.store[key] = true; + }, + + has: function(key) { + return this.store[key] !== undefined; + } +}; + +makeStreamOfObjects() + .pipe(unique('name', keyStore)) + .on('data', console.log); +``` + +## Contributing + +unique-stream is an **OPEN Open Source Project**. This means that: + +> Individuals making significant and valuable contributions are given commit-access to the project to contribute as they see fit. This project is more like an open wiki than a standard guarded open source project. + +See the [CONTRIBUTING.md](https://github.com/eugeneware/unique-stream/blob/master/CONTRIBUTING.md) file for more details. + +### Contributors + +unique-stream is only possible due to the excellent work of the following contributors: + +<table><tbody> +<tr><th align="left">Eugene Ware</th><td><a href="https://github.com/eugeneware">GitHub/eugeneware</a></td></tr> +<tr><th align="left">Craig Ambrose</th><td><a href="https://github.com/craigambrose">GitHub/craigambrose</a></td></tr> +<tr><th align="left">Shinnosuke Watanabe</th><td><a href="https://github.com/shinnn">GitHub/shinnn</a></td></tr> +</tbody></table> diff --git a/node_modules/vinyl-fs/node_modules/unique-stream/index.js b/node_modules/vinyl-fs/node_modules/unique-stream/index.js new file mode 100644 index 000000000..a2b292069 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/unique-stream/index.js @@ -0,0 +1,48 @@ +'use strict'; + +var filter = require('through2-filter').obj; +var stringify = require("json-stable-stringify"); + +var ES6Set; +if (typeof global.Set === 'function') { + ES6Set = global.Set; +} else { + ES6Set = function() { + this.keys = []; + this.has = function(val) { + return this.keys.indexOf(val) !== -1; + }, + this.add = function(val) { + this.keys.push(val); + } + } +} + +function prop(propName) { + return function (data) { + return data[propName]; + }; +} + +module.exports = unique; +function unique(propName, keyStore) { + keyStore = keyStore || new ES6Set(); + + var keyfn = stringify; + if (typeof propName === 'string') { + keyfn = prop(propName); + } else if (typeof propName === 'function') { + keyfn = propName; + } + + return filter(function (data) { + var key = keyfn(data); + + if (keyStore.has(key)) { + return false; + } + + keyStore.add(key); + return true; + }); +} diff --git a/node_modules/vinyl-fs/node_modules/unique-stream/package.json b/node_modules/vinyl-fs/node_modules/unique-stream/package.json new file mode 100644 index 000000000..bf079a53e --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/unique-stream/package.json @@ -0,0 +1,108 @@ +{ + "_args": [ + [ + { + "raw": "unique-stream@^2.0.2", + "scope": null, + "escapedName": "unique-stream", + "name": "unique-stream", + "rawSpec": "^2.0.2", + "spec": ">=2.0.2 <3.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream" + ] + ], + "_from": "unique-stream@>=2.0.2 <3.0.0", + "_id": "unique-stream@2.2.1", + "_inCache": true, + "_location": "/vinyl-fs/unique-stream", + "_nodeVersion": "5.6.0", + "_npmOperationalInternal": { + "host": "packages-6-west.internal.npmjs.com", + "tmp": "tmp/unique-stream-2.2.1.tgz_1455624338144_0.2851575950626284" + }, + "_npmUser": { + "name": "shinnn", + "email": "snnskwtnb@gmail.com" + }, + "_npmVersion": "3.7.2", + "_phantomChildren": {}, + "_requested": { + "raw": "unique-stream@^2.0.2", + "scope": null, + "escapedName": "unique-stream", + "name": "unique-stream", + "rawSpec": "^2.0.2", + "spec": ">=2.0.2 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs/glob-stream" + ], + "_resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "_shasum": "5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369", + "_shrinkwrap": null, + "_spec": "unique-stream@^2.0.2", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs/node_modules/glob-stream", + "author": { + "name": "Eugene Ware", + "email": "eugene@noblesamurai.com" + }, + "bugs": { + "url": "https://github.com/eugeneware/unique-stream/issues" + }, + "dependencies": { + "json-stable-stringify": "^1.0.0", + "through2-filter": "^2.0.0" + }, + "description": "node.js through stream that emits a unique stream of objects based on criteria", + "devDependencies": { + "after": "~0.8.1", + "chai": "^3.0.0", + "istanbul": "^0.4.2", + "istanbul-coveralls": "^1.0.3", + "mocha": "^2.1.0" + }, + "directories": {}, + "dist": { + "shasum": "5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369", + "tarball": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz" + }, + "files": [ + "index.js" + ], + "gitHead": "44bb895ede1645668c4f62a81c7af8edaf47bff9", + "homepage": "https://github.com/eugeneware/unique-stream#readme", + "keywords": [ + "unique", + "stream", + "unique-stream", + "streaming", + "streams" + ], + "license": "MIT", + "maintainers": [ + { + "name": "eugeneware", + "email": "eugene@noblesamurai.com" + }, + { + "name": "shinnn", + "email": "snnskwtnb@gmail.com" + } + ], + "name": "unique-stream", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git+https://github.com/eugeneware/unique-stream.git" + }, + "scripts": { + "coverage": "istanbul cover _mocha", + "coveralls": "${npm_package_scripts_coverage} && istanbul-coveralls", + "test": "mocha" + }, + "version": "2.2.1" +} diff --git a/node_modules/vinyl-fs/node_modules/vinyl/CHANGELOG.md b/node_modules/vinyl-fs/node_modules/vinyl/CHANGELOG.md new file mode 100644 index 000000000..9bf67df45 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/CHANGELOG.md @@ -0,0 +1,163 @@ +## Change Log + +### v1.1.1 (2016/01/18 23:23 +00:00) +- [3990e00](https://github.com/gulpjs/vinyl/commit/3990e007b004c809a53670c00566afb157fa56b6) 1.1.1 +- [2d3e984](https://github.com/gulpjs/vinyl/commit/2d3e98447a42285b593e1b261984b87b171e7313) chore: add NPM script for changelog (@T1st3) +- [f70c395](https://github.com/gulpjs/vinyl/commit/f70c395085fc3952cf72c061c851f5b0d4676030) docs: add CHANGELOG.md (@T1st3) +- [#74](https://github.com/gulpjs/vinyl/pull/74) Fix isVinyl for falsy values (@erikkemperman) +- [3e8b132](https://github.com/gulpjs/vinyl/commit/3e8b132cd87bf5ab536ff7a4c6d660e33f5990b4) Fix isVinyl for falsy values (@erikkemperman) +- [#73](https://github.com/gulpjs/vinyl/pull/73) Readme: use SVG images. (@d10) +- [193e3d2](https://github.com/gulpjs/vinyl/commit/193e3d25f68c97593e011981e49db2c3e7a47d91) Readme: use SVG images. (@d10) +- [#67](https://github.com/gulpjs/vinyl/pull/67) Set Travis to sudo:false and add node 0.12/4.x (@pdehaan) +- [c33d85a](https://github.com/gulpjs/vinyl/commit/c33d85ab1d63fbcd272f7fb91d666006dab76d99) Set Travis to sudo:false and add node 0.12/4.x (@pdehaan) + +### v1.1.0 (2015/10/23 06:33 +00:00) +- [51052ad](https://github.com/gulpjs/vinyl/commit/51052add24bb1c771bf5912809b47d4d53288c48) 1.1.0 +- [#64](https://github.com/gulpjs/vinyl/pull/64) File.stem for basename without suffix (@soslan) +- [e505375](https://github.com/gulpjs/vinyl/commit/e5053756a49ea8800cd5da12fc0eefce859ccf61) Following JSCS rules in File.stem (@soslan) +- [d45f478](https://github.com/gulpjs/vinyl/commit/d45f478c7af3f2e956e57ce6d7550d64e3b7dbfb) Following JSCS rules (@soslan) +- [#66](https://github.com/gulpjs/vinyl/pull/66) Replace JSHint with ESLint (@pdehaan) +- [c5549f7](https://github.com/gulpjs/vinyl/commit/c5549f7002ae580fa9a7f7df490d6e3911af2285) Bump to eslint-config-gulp@2 (@pdehaan) +- [f6a5512](https://github.com/gulpjs/vinyl/commit/f6a55125e7230621ecae1f395da202140baaee1d) Replace JSHint with ESLint (@pdehaan) +- [#65](https://github.com/gulpjs/vinyl/pull/65) Add JSCS to repo (@pdehaan) +- [f9a0101](https://github.com/gulpjs/vinyl/commit/f9a0101d013356056293d21356d4cb443613b0be) Comments should start with uppercase letters (per JSCS) (@pdehaan) +- [6506478](https://github.com/gulpjs/vinyl/commit/650647833e3cea8d005a3ab1810ecd285418fa1e) Add JSCS to repo (@pdehaan) +- [ae3778c](https://github.com/gulpjs/vinyl/commit/ae3778c536a898fe47bbb37e5932b300123b28b8) Documentation for File.stem (@soslan) +- [e2246af](https://github.com/gulpjs/vinyl/commit/e2246af8aad6df348557f9d1df5001c30ff83774) add stem property to File (@soslan) +- [#63](https://github.com/gulpjs/vinyl/pull/63) Fix broken badge URLs in README.md (@tatsuyafw) +- [032ae7c](https://github.com/gulpjs/vinyl/commit/032ae7c5c59b72dc58041a14449d8d66af053023) Use reference links (@tatsuyafw) +- [652bc3b](https://github.com/gulpjs/vinyl/commit/652bc3bd3cc7a6af5d21d8d759a01cee3ce46acf) Fix some broken links in README.md (@tatsuyafw) + +### v1.0.0 (2015/09/25 22:40 +00:00) +- [dbe943d](https://github.com/gulpjs/vinyl/commit/dbe943dad575b04995f38a35bd27962f54dc8217) 1.0.0 (@contra) +- [0b64336](https://github.com/gulpjs/vinyl/commit/0b643367289db0cfefc6c628eff2be4ee019405c) correct url (@contra) +- [#60](https://github.com/gulpjs/vinyl/pull/60) remove <br> from README.md (@bobintornado) +- [d9ae5ea](https://github.com/gulpjs/vinyl/commit/d9ae5eab010fd15094c8a0260a25d1244f17df79) remove <br> from README.md (@bobintornado) + +### v0.5.3 (2015/09/03 00:20 +00:00) +- [6f19648](https://github.com/gulpjs/vinyl/commit/6f19648bd67040bfd0dc755ad031e1e5e0b58429) 0.5.3 (@contra) +- [0fe8da7](https://github.com/gulpjs/vinyl/commit/0fe8da757a862bb956d88dec03ab6f99ca895f7f) add isVinyl function (@contra) + +### v0.5.1 (2015/08/04 21:26 +00:00) +- [81692ec](https://github.com/gulpjs/vinyl/commit/81692ece22eb3b927dba74fedb54a2acb65a36eb) 0.5.1 (@contra) +- [#58](https://github.com/gulpjs/vinyl/pull/58) use Buffer.isBuffer instead of instanceof (@whyrusleeping) +- [7293a71](https://github.com/gulpjs/vinyl/commit/7293a71b9daf177d9b9f600f3acf00a73b95107c) condense isBuffer module to a one liner (@whyrusleeping) +- [e7208e2](https://github.com/gulpjs/vinyl/commit/e7208e2c27029405c7c9cf9c9a3263cdf1e0dfb8) also remove old comment (@whyrusleeping) +- [b4ac64b](https://github.com/gulpjs/vinyl/commit/b4ac64b85ce28093f576db4f006264438f546cb8) use Buffer.isBuffer instead of instanceof (@whyrusleeping) +- [#54](https://github.com/gulpjs/vinyl/pull/54) Fix file clone options (@danielhusar) +- [4b42095](https://github.com/gulpjs/vinyl/commit/4b42095d8e0cb4351a503da67752da15e6b59570) Fix file clone options (@danielhusar) +- [04f681e](https://github.com/gulpjs/vinyl/commit/04f681e4af8ffb99ea3a0a3eab1cc79793887560) closes #50 and #51 (@contra) + +### v0.5.0 (2015/06/03 23:44 +00:00) +- [8fea984](https://github.com/gulpjs/vinyl/commit/8fea9843e6b2aca820ccfee394927ca073f88a05) 0.5.0 (@contra) +- [#52](https://github.com/gulpjs/vinyl/pull/52) Add explicit newlines to readme (@jeremyruppel) +- [027142c](https://github.com/gulpjs/vinyl/commit/027142cf62a3f0a68f4659a612ee782b24c00198) Add explicit newlines to readme (@jeremyruppel) +- [#46](https://github.com/gulpjs/vinyl/pull/46) Add dirname, basename and extname getters (@jeremyruppel) +- [e09817f](https://github.com/gulpjs/vinyl/commit/e09817f15e4ddfc28e1b3452bbca5e2ba1fc2f19) Add dirname, basename and extname accessors (@jeremyruppel) +- [#49](https://github.com/gulpjs/vinyl/pull/49) update license attribute (@pgilad) +- [e5b2670](https://github.com/gulpjs/vinyl/commit/e5b2670af205ca0fb6f589a396b89ab2845a91ac) update license attribut (@pgilad) +- [55f90e3](https://github.com/gulpjs/vinyl/commit/55f90e3763af84c7eb599bd6403dbe14f63d5513) dep updates (@contra) +- [#48](https://github.com/gulpjs/vinyl/pull/48) Update docs for `path` and `history` (@jmm) +- [231f32a](https://github.com/gulpjs/vinyl/commit/231f32a375aa9147d0a41ffd1ace773c45e66ee5) Document `path`. (@jmm) +- [93df183](https://github.com/gulpjs/vinyl/commit/93df18374b62de32c76862baf73e92f33b04882a) Document `options.history`. (@jmm) +- [2ed6a01](https://github.com/gulpjs/vinyl/commit/2ed6a012c03a78b46f9d41034969898a15fdfe15) Correct `options.path` default value docs. (@jmm) +- [edf1ecb](https://github.com/gulpjs/vinyl/commit/edf1ecb0698f355e137f9361a9a9a2581ca485e5) Document `history`. (@jmm) +- [#45](https://github.com/gulpjs/vinyl/pull/45) Update dependencies and devDependencies (@shinnn) +- [f1f9dfb](https://github.com/gulpjs/vinyl/commit/f1f9dfbb1346b608226e5847161bf48e0caa2c1e) update test script (@shinnn) +- [0737ef4](https://github.com/gulpjs/vinyl/commit/0737ef489f9cfffa2494b06edaab9a032f00eb7e) update dependencies and devDependencies (@shinnn) +- [#43](https://github.com/gulpjs/vinyl/pull/43) Document `file.clone()` arguments (@pascalduez) +- [3c5e95d](https://github.com/gulpjs/vinyl/commit/3c5e95d5f482ea9f28dd2d78b83166723cd121bb) Document `file.clone()` arguments (@pascalduez) + +### v0.4.6 (2014/12/03 06:15 +00:00) +- [8255a5f](https://github.com/gulpjs/vinyl/commit/8255a5f1de7fecb1cd5e7ba7ac1ec997395f6be1) 0.4.6 (@contra) +- [37dafeb](https://github.com/gulpjs/vinyl/commit/37dafeb8cb0b33424e77fe67a094517925be2bef) dep update (@contra) + +### v0.4.5 (2014/11/13 23:23 +00:00) +- [a7a8c68](https://github.com/gulpjs/vinyl/commit/a7a8c68a1df914b1f486a54a97b68e9186699d33) 0.4.5 (@contra) +- [ec094b4](https://github.com/gulpjs/vinyl/commit/ec094b43e36512894142baacef26dfffc5827114) reduce size by switching off lodash (@contra) + +### v0.4.4 (2014/11/13 22:59 +00:00) +- [61834c9](https://github.com/gulpjs/vinyl/commit/61834c9429f2e6883a18f377bc5893031ea1c94f) 0.4.4 (@contra) +- [fd887b3](https://github.com/gulpjs/vinyl/commit/fd887b3d21ed47c2b4cf40b0c0ed7b2df9048b09) ignore some files for size reasons (@contra) +- [#37](https://github.com/gulpjs/vinyl/pull/37) Don't package coverage into NPM (@Dapperbot) +- [9b811b8](https://github.com/gulpjs/vinyl/commit/9b811b86529e2b4b0cc20936a6697b3d9df503a2) Don't package coverage into NPM (@lotyrin) + +### v0.4.3 (2014/09/01 18:17 +00:00) +- [6eae432](https://github.com/gulpjs/vinyl/commit/6eae432519b007c313a8df83b093adfb97a2944c) 0.4.3 (@contra) +- [d220c85](https://github.com/gulpjs/vinyl/commit/d220c857259f0070ab38c7b50d90f184a919e472) fix funky history passing, closes #35 (@contra) + +### v0.4.2 (2014/08/29 15:58 +00:00) +- [f33d6d5](https://github.com/gulpjs/vinyl/commit/f33d6d5c1b9d1f83e238521651114beb90a01019) 0.4.2 (@contra) +- [cd0d042](https://github.com/gulpjs/vinyl/commit/cd0d04272297363f27f8456818dbf675618939c3) remove native clone (@contra) +- [e4d8b99](https://github.com/gulpjs/vinyl/commit/e4d8b99c21a50700afd17173e1f3a2076e6fe860) minor speed enhancements (@contra) +- [2353e39](https://github.com/gulpjs/vinyl/commit/2353e3996ac67629da92c2af906bdfdbc6978065) minor speed ups (@contra) + +### v0.4.1 (2014/08/29 14:34 +00:00) +- [0014b9b](https://github.com/gulpjs/vinyl/commit/0014b9bf4166fb5cbe94c439201752cda7991a70) 0.4.1 (@contra) +- [0142513](https://github.com/gulpjs/vinyl/commit/0142513b0727ad6a018b0944fea2bb4966d8bbfa) fix history cloning bug (@contra) + +### v0.4.0 (2014/08/29 07:07 +00:00) +- [80d3f61](https://github.com/gulpjs/vinyl/commit/80d3f61445b347fc1c34f462f0ab800644e90e04) 0.4.0 (@contra) +- [#33](https://github.com/gulpjs/vinyl/pull/33) Clone stream (@popomore) +- [d37b57b](https://github.com/gulpjs/vinyl/commit/d37b57bba0aa1fba18d9fecec3513ac4e61b27cd) coverage 100% :sparkles: (@popomore) +- [b5a62f0](https://github.com/gulpjs/vinyl/commit/b5a62f0ede71bdeae957e8653e6ccbdca998879c) fix testcase and delete duplicate testcase (@popomore) +- [fb1b15d](https://github.com/gulpjs/vinyl/commit/fb1b15da472647743eb4e829b99f64d6d9f751fa) Adding more test (@nfroidure) +- [acea889](https://github.com/gulpjs/vinyl/commit/acea8894e9d983d8037641b4ff6f08b666056979) Fixing the clone method (@nfroidure) +- [#32](https://github.com/gulpjs/vinyl/pull/32) improve clone (@popomore) +- [037e830](https://github.com/gulpjs/vinyl/commit/037e8300b75fdddf9c3e003fd205da7ec13b9157) object should multiline (@popomore) +- [7724121](https://github.com/gulpjs/vinyl/commit/7724121194a4ac94fb23a0048ff926d00a784ecc) pass jshint (@popomore) +- [f76a921](https://github.com/gulpjs/vinyl/commit/f76a9211b8b495d81074884d8ea6454a20bba349) use node-v8-clone for performance, fallback to lodash #29 (@popomore) +- [7638f07](https://github.com/gulpjs/vinyl/commit/7638f072bf33a427ec8324a0fb463f73cb9fc8f2) option to not clone buffer #16 (@popomore) +- [6bfd73c](https://github.com/gulpjs/vinyl/commit/6bfd73cc459907a06ce9affc373599ffb8130c08) copy all attributes deeply #29 (@popomore) +- [b34f813](https://github.com/gulpjs/vinyl/commit/b34f8135d47e0a2ba3be6f769729ba66931b3234) add testcase for clone history (@popomore) +- [a913edf](https://github.com/gulpjs/vinyl/commit/a913edf1dd91c5bdcfc9ff3149a94eae131006aa) fix mixed quote and unused variable (@popomore) + +### v0.3.3 (2014/08/28 13:50 +00:00) +- [c801d3d](https://github.com/gulpjs/vinyl/commit/c801d3dc354383cf2656338d63908ec2983e3612) 0.3.3 (@contra) +- [f13970e](https://github.com/gulpjs/vinyl/commit/f13970e3cc5d1d730f94316daeee5b5c0e6c00f3) fix jshint on tests (@contra) +- [6186101](https://github.com/gulpjs/vinyl/commit/61861017bc22a786a026730cf5c55d23c657abea) closes #31 (@contra) +- [#24](https://github.com/gulpjs/vinyl/pull/24) path get/set for recording path change (@popomore) +- [6eab1c4](https://github.com/gulpjs/vinyl/commit/6eab1c4f1376aec901d8869d3d410953f1c93e9f) done (@contra) + +### v0.3.2 (2014/07/30 23:22 +00:00) +- [44ef836](https://github.com/gulpjs/vinyl/commit/44ef8369e1a0a7ba01da4608d01166c5a5d8cbe1) 0.3.2 (@contra) +- [ae28ff2](https://github.com/gulpjs/vinyl/commit/ae28ff200c034e9a40babb38886cdc7ef97a0f25) oops, thats what i get for coding from a car (@contra) + +### v0.3.1 (2014/07/30 22:35 +00:00) +- [03b7578](https://github.com/gulpjs/vinyl/commit/03b75789e58b43bdaef9ca166e4062b8ccfdefb9) 0.3.1 (@contra) +- [64850ff](https://github.com/gulpjs/vinyl/commit/64850ffdf4d31b35ac1160d0d495644cadd52914) fix deep deps, closes #28 (@contra) + +### v0.3.0 (2014/07/19 04:57 +00:00) +- [dcb77f3](https://github.com/gulpjs/vinyl/commit/dcb77f3246d1011a430c20f883eb89c520206ca6) 0.3.0 (@contra) +- [#27](https://github.com/gulpjs/vinyl/pull/27) Clone custom properties (@vweevers) +- [95710de](https://github.com/gulpjs/vinyl/commit/95710de62f4c1234a244a6818b5e39d92ea7b9a8) fix relative path test for windows (@vweevers) +- [e493187](https://github.com/gulpjs/vinyl/commit/e493187b3f2fd1485077f09e73e669407ac077d3) clone custom properties (@laurelnaiad) +- [e50ceac](https://github.com/gulpjs/vinyl/commit/e50ceacfc3daa825e111976ba4192cb93c80bfe2) throw when set path is null (@popomore) +- [7c71bf3](https://github.com/gulpjs/vinyl/commit/7c71bf3d806a98730a0ce5edd56c0b8f1f42e8f0) remove initialize of this.path (@popomore) +- [d95023f](https://github.com/gulpjs/vinyl/commit/d95023f6604a990d38e4f5b332c7916ceb012366) delete this._path :tongue: (@popomore) +- [f3f9be0](https://github.com/gulpjs/vinyl/commit/f3f9be0f3d76b4125353cd936731f70015d44284) path get/set for recording path change #19 (@popomore) +- [#21](https://github.com/gulpjs/vinyl/pull/21) LICENSE: Remove executable mode (@felixrabe) +- [#22](https://github.com/gulpjs/vinyl/pull/22) Travis: Dump node 0.9 - travis-ci/travis-ci#2251 (@felixrabe) +- [70a2193](https://github.com/gulpjs/vinyl/commit/70a219346c00e0db6be1a0aa55c183e7d5b80ad1) Travis: Dump node 0.9 - travis-ci/travis-ci#2251 (@felixrabe) +- [460eed5](https://github.com/gulpjs/vinyl/commit/460eed58de9cb04d44e35b6bebbfbaea9146015f) LICENSE: Remove executable mode (@felixrabe) +- [#18](https://github.com/gulpjs/vinyl/pull/18) fix typo (@vvakame) +- [1783e7f](https://github.com/gulpjs/vinyl/commit/1783e7f031ecfb118ee9b43971a72be264caa144) fix typo (@vvakame) +- [#11](https://github.com/gulpjs/vinyl/pull/11) Correct README about pipe's end option. (@shuhei) +- [1824ec9](https://github.com/gulpjs/vinyl/commit/1824ec9cefd276557b7338dfdbd54922599f020a) Correct README about pipe's end option. (@shuhei) +- [f49b9c3](https://github.com/gulpjs/vinyl/commit/f49b9c325229754229726ed530c579e4ac23252b) remove dead line (@contra) +- [1ca8e46](https://github.com/gulpjs/vinyl/commit/1ca8e463259c2a395d5d41b528b04a89a953f6b7) dep update, new coveralls stuff (@contra) +- [f00767b](https://github.com/gulpjs/vinyl/commit/f00767bf8b61ca8a7b25f3ebd3dde297fa2dafd7) bump (@contra) +- [#8](https://github.com/gulpjs/vinyl/pull/8) Correct File.clone() treatment of File.stats (@hughsk) +- [bc3acf7](https://github.com/gulpjs/vinyl/commit/bc3acf7b1ed712d70e7d8cb4f6e5248124743ec7) Add test for new File.clone() functionality (@hughsk) +- [dd668fb](https://github.com/gulpjs/vinyl/commit/dd668fb5aaed02cfb0f63a58f027c937dd7e0467) Use clone-stats module to clone fs.Stats instances. (@hughsk) +- [b6244c5](https://github.com/gulpjs/vinyl/commit/b6244c52d3bf9bd87bd6b926f0486f407627f7e0) Correct File.clone() treatment of File.stats (@hughsk) +- [796ba8b](https://github.com/gulpjs/vinyl/commit/796ba8b5ddd658fed3393c7d0a0d7bea7befa1b1) 0.2.1 - fixes #2 (@contra) +- [bffa6a4](https://github.com/gulpjs/vinyl/commit/bffa6a4e323e18e084b5b1444b4537aa3fb3e109) vinyl-fs movement? (@contra) +- [cfaa0a0](https://github.com/gulpjs/vinyl/commit/cfaa0a02b7794e493f600d1d36b288294a278e6c) fix isDirectory tests (@contra) +- [05d1f1b](https://github.com/gulpjs/vinyl/commit/05d1f1b741960cce8e8d2702d326ebb0187935ad) add isDirectory (@contra) +- [76580e5](https://github.com/gulpjs/vinyl/commit/76580e573870885580ac00dd9175e562d008cb81) bump to 0.1.0 (@contra) +- [f7a15c4](https://github.com/gulpjs/vinyl/commit/f7a15c41ac5e82de930e161f6b109ae3336d337b) readme 0.9+ (@contra) +- [fc7f192](https://github.com/gulpjs/vinyl/commit/fc7f1925b2a18466f19db062ad28df02f1db823b) drop 0.8 support (@contra) +- [c004b6c](https://github.com/gulpjs/vinyl/commit/c004b6c857d03a292e8ecd5020ad0420d82dbf1e) target 0.8+ (@contra) +- [edf20bd](https://github.com/gulpjs/vinyl/commit/edf20bd8563fca6e8a568b9d08fb728f6705573c) add small example (@contra) +- [d8c63fe](https://github.com/gulpjs/vinyl/commit/d8c63fe0fd16cf13db2d9a6452c979ec12779428) 0.0.1 (@contra)
\ No newline at end of file diff --git a/node_modules/vinyl-fs/node_modules/vinyl/LICENSE b/node_modules/vinyl-fs/node_modules/vinyl/LICENSE new file mode 100644 index 000000000..4f482f9ba --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2013 Fractal <contact@wearefractal.com> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/node_modules/vinyl-fs/node_modules/vinyl/README.md b/node_modules/vinyl-fs/node_modules/vinyl/README.md new file mode 100644 index 000000000..d4d2c6136 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/README.md @@ -0,0 +1,265 @@ +# vinyl [![NPM version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coveralls Status][coveralls-image]][coveralls-url] [![Dependency Status][depstat-image]][depstat-url] + +## Information +<table><tr><td>Package</td><td>vinyl</td></tr><tr><td>Description</td><td>A virtual file format</td></tr><tr><td>Node Version</td><td>>= 0.9</td></tr></table> + +## What is this? +Read this for more info about how this plays into the grand scheme of things [https://medium.com/@eschoff/3828e8126466](https://medium.com/@eschoff/3828e8126466) + +## File + +```javascript +var File = require('vinyl'); + +var coffeeFile = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee", + contents: new Buffer("test = 123") +}); +``` + +### isVinyl +When checking if an object is a vinyl file, you should not use instanceof. Use the isVinyl function instead. + +```js +var File = require('vinyl'); + +var dummy = new File({stuff}); +var notAFile = {}; + +File.isVinyl(dummy); // true +File.isVinyl(notAFile); // false +``` + +### isCustomProp +Vinyl checks if a property is not managed internally, such as `sourceMap`. This is than used in `constructor(options)` when setting, and `clone()` when copying properties. + +```js +var File = require('vinyl'); + +File.isCustomProp('sourceMap'); // true +File.isCustomProp('path'); // false -> internal getter/setter +``` + +Read more in [Extending Vinyl](#extending-vinyl). + +### constructor(options) +#### options.cwd +Type: `String`<br><br>Default: `process.cwd()` + +#### options.base +Used for relative pathing. Typically where a glob starts. + +Type: `String`<br><br>Default: `options.cwd` + +#### options.path +Full path to the file. + +Type: `String`<br><br>Default: `undefined` + +#### options.history +Path history. Has no effect if `options.path` is passed. + +Type: `Array`<br><br>Default: `options.path ? [options.path] : []` + +#### options.stat +The result of an fs.stat call. See [fs.Stats](http://nodejs.org/api/fs.html#fs_class_fs_stats) for more information. + +Type: `fs.Stats`<br><br>Default: `null` + +#### options.contents +File contents. + +Type: `Buffer, Stream, or null`<br><br>Default: `null` + +#### options.{custom} +Any other option properties will just be assigned to the new File object. + +```js +var File = require('vinyl'); + +var file = new File({foo: 'bar'}); +file.foo === 'bar'; // true +``` + +### isBuffer() +Returns true if file.contents is a Buffer. + +### isStream() +Returns true if file.contents is a Stream. + +### isNull() +Returns true if file.contents is null. + +### clone([opt]) +Returns a new File object with all attributes cloned.<br>By default custom attributes are deep-cloned. + +If opt or opt.deep is false, custom attributes will not be deep-cloned. + +If opt.contents is false, it will copy file.contents Buffer's reference. + +### pipe(stream[, opt]) +If file.contents is a Buffer, it will write it to the stream. + +If file.contents is a Stream, it will pipe it to the stream. + +If file.contents is null, it will do nothing. + +If opt.end is false, the destination stream will not be ended (same as node core). + +Returns the stream. + +### inspect() +Returns a pretty String interpretation of the File. Useful for console.log. + +### contents +The [Stream](https://nodejs.org/api/stream.html#stream_stream) or [Buffer](https://nodejs.org/api/buffer.html#buffer_class_buffer) of the file as it was passed in via options, or as the result of modification. + +For example: + +```js +if (file.isBuffer()) { + console.log(file.contents.toString()); // logs out the string of contents +} +``` + +### path +Absolute pathname string or `undefined`. Setting to a different value pushes the old value to `history`. + +### history +Array of `path` values the file object has had, from `history[0]` (original) through `history[history.length - 1]` (current). `history` and its elements should normally be treated as read-only and only altered indirectly by setting `path`. + +### relative +Returns path.relative for the file base and file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.relative); // file.coffee +``` + +### dirname +Gets and sets path.dirname for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.dirname); // /test + +file.dirname = '/specs'; + +console.log(file.dirname); // /specs +console.log(file.path); // /specs/file.coffee +``` + +### basename +Gets and sets path.basename for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.basename); // file.coffee + +file.basename = 'file.js'; + +console.log(file.basename); // file.js +console.log(file.path); // /test/file.js +``` + +### stem +Gets and sets stem (filename without suffix) for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.stem); // file + +file.stem = 'foo'; + +console.log(file.stem); // foo +console.log(file.path); // /test/foo.coffee +``` + +### extname +Gets and sets path.extname for the file path. + +Example: + +```javascript +var file = new File({ + cwd: "/", + base: "/test/", + path: "/test/file.coffee" +}); + +console.log(file.extname); // .coffee + +file.extname = '.js'; + +console.log(file.extname); // .js +console.log(file.path); // /test/file.js +``` + +## Extending Vinyl +When extending Vinyl into your own class with extra features, you need to think about a few things. + +When you have your own properties that are managed internally, you need to extend the static `isCustomProp` method to return `false` when one of these properties is queried. + +```js +const File = require('vinyl'); + +const builtInProps = ['foo', '_foo']; + +class SuperFile extends File { + constructor(options) { + super(options); + this._foo = 'example internal read-only value'; + } + + get foo() { + return this._foo; + } + + static isCustomProp(name) { + return super.isCustomProp(name) && builtInProps.indexOf(name) === -1; + } +} +``` + +This makes properties `foo` and `_foo` ignored when cloning, and when passed in options to `constructor(options)` so they don't get assigned to the new object. + +Same goes for `clone()`. If you have your own internal stuff that needs special handling during cloning, you should extend it to do so. + +[npm-url]: https://npmjs.org/package/vinyl +[npm-image]: https://badge.fury.io/js/vinyl.svg +[travis-url]: https://travis-ci.org/gulpjs/vinyl +[travis-image]: https://travis-ci.org/gulpjs/vinyl.svg?branch=master +[coveralls-url]: https://coveralls.io/github/gulpjs/vinyl +[coveralls-image]: https://coveralls.io/repos/github/gulpjs/vinyl/badge.svg +[depstat-url]: https://david-dm.org/gulpjs/vinyl +[depstat-image]: https://david-dm.org/gulpjs/vinyl.svg diff --git a/node_modules/vinyl-fs/node_modules/vinyl/index.js b/node_modules/vinyl-fs/node_modules/vinyl/index.js new file mode 100644 index 000000000..5a1fe551d --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/index.js @@ -0,0 +1,270 @@ +var path = require('path'); +var clone = require('clone'); +var cloneStats = require('clone-stats'); +var cloneBuffer = require('./lib/cloneBuffer'); +var isBuffer = require('./lib/isBuffer'); +var isStream = require('./lib/isStream'); +var isNull = require('./lib/isNull'); +var inspectStream = require('./lib/inspectStream'); +var Stream = require('stream'); +var replaceExt = require('replace-ext'); + +var builtInFields = [ + '_contents', 'contents', 'stat', 'history', 'path', 'base', 'cwd', +]; + +function File(file) { + var self = this; + + if (!file) { + file = {}; + } + + // Record path change + var history = file.path ? [file.path] : file.history; + this.history = history || []; + + this.cwd = file.cwd || process.cwd(); + this.base = file.base || this.cwd; + + // Stat = files stats object + this.stat = file.stat || null; + + // Contents = stream, buffer, or null if not read + this.contents = file.contents || null; + + this._isVinyl = true; + + // Set custom properties + Object.keys(file).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + self[key] = file[key]; + } + }); +} + +File.prototype.isBuffer = function() { + return isBuffer(this.contents); +}; + +File.prototype.isStream = function() { + return isStream(this.contents); +}; + +File.prototype.isNull = function() { + return isNull(this.contents); +}; + +// TODO: Should this be moved to vinyl-fs? +File.prototype.isDirectory = function() { + return this.isNull() && this.stat && this.stat.isDirectory(); +}; + +File.prototype.clone = function(opt) { + var self = this; + + if (typeof opt === 'boolean') { + opt = { + deep: opt, + contents: true, + }; + } else if (!opt) { + opt = { + deep: true, + contents: true, + }; + } else { + opt.deep = opt.deep === true; + opt.contents = opt.contents !== false; + } + + // Clone our file contents + var contents; + if (this.isStream()) { + contents = this.contents.pipe(new Stream.PassThrough()); + this.contents = this.contents.pipe(new Stream.PassThrough()); + } else if (this.isBuffer()) { + contents = opt.contents ? cloneBuffer(this.contents) : this.contents; + } + + var file = new this.constructor({ + cwd: this.cwd, + base: this.base, + stat: (this.stat ? cloneStats(this.stat) : null), + history: this.history.slice(), + contents: contents, + }); + + // Clone our custom properties + Object.keys(this).forEach(function(key) { + if (self.constructor.isCustomProp(key)) { + file[key] = opt.deep ? clone(self[key], true) : self[key]; + } + }); + return file; +}; + +File.prototype.pipe = function(stream, opt) { + if (!opt) { + opt = {}; + } + if (typeof opt.end === 'undefined') { + opt.end = true; + } + + if (this.isStream()) { + return this.contents.pipe(stream, opt); + } + if (this.isBuffer()) { + if (opt.end) { + stream.end(this.contents); + } else { + stream.write(this.contents); + } + return stream; + } + + // Check if isNull + if (opt.end) { + stream.end(); + } + return stream; +}; + +File.prototype.inspect = function() { + var inspect = []; + + // Use relative path if possible + var filePath = (this.base && this.path) ? this.relative : this.path; + + if (filePath) { + inspect.push('"' + filePath + '"'); + } + + if (this.isBuffer()) { + inspect.push(this.contents.inspect()); + } + + if (this.isStream()) { + inspect.push(inspectStream(this.contents)); + } + + return '<File ' + inspect.join(' ') + '>'; +}; + +File.isCustomProp = function(key) { + return builtInFields.indexOf(key) === -1; +}; + +File.isVinyl = function(file) { + return (file && file._isVinyl === true) || false; +}; + +// Virtual attributes +// Or stuff with extra logic +Object.defineProperty(File.prototype, 'contents', { + get: function() { + return this._contents; + }, + set: function(val) { + if (!isBuffer(val) && !isStream(val) && !isNull(val)) { + throw new Error('File.contents can only be a Buffer, a Stream, or null.'); + } + this._contents = val; + }, +}); + +// TODO: Should this be moved to vinyl-fs? +Object.defineProperty(File.prototype, 'relative', { + get: function() { + if (!this.base) { + throw new Error('No base specified! Can not get relative.'); + } + if (!this.path) { + throw new Error('No path specified! Can not get relative.'); + } + return path.relative(this.base, this.path); + }, + set: function() { + throw new Error('File.relative is generated from the base and path attributes. Do not modify it.'); + }, +}); + +Object.defineProperty(File.prototype, 'dirname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get dirname.'); + } + return path.dirname(this.path); + }, + set: function(dirname) { + if (!this.path) { + throw new Error('No path specified! Can not set dirname.'); + } + this.path = path.join(dirname, path.basename(this.path)); + }, +}); + +Object.defineProperty(File.prototype, 'basename', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get basename.'); + } + return path.basename(this.path); + }, + set: function(basename) { + if (!this.path) { + throw new Error('No path specified! Can not set basename.'); + } + this.path = path.join(path.dirname(this.path), basename); + }, +}); + +// Property for getting/setting stem of the filename. +Object.defineProperty(File.prototype, 'stem', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get stem.'); + } + return path.basename(this.path, this.extname); + }, + set: function(stem) { + if (!this.path) { + throw new Error('No path specified! Can not set stem.'); + } + this.path = path.join(path.dirname(this.path), stem + this.extname); + }, +}); + +Object.defineProperty(File.prototype, 'extname', { + get: function() { + if (!this.path) { + throw new Error('No path specified! Can not get extname.'); + } + return path.extname(this.path); + }, + set: function(extname) { + if (!this.path) { + throw new Error('No path specified! Can not set extname.'); + } + this.path = replaceExt(this.path, extname); + }, +}); + +Object.defineProperty(File.prototype, 'path', { + get: function() { + return this.history[this.history.length - 1]; + }, + set: function(path) { + if (typeof path !== 'string') { + throw new Error('path should be string'); + } + + // Record history only when path changed + if (path && path !== this.path) { + this.history.push(path); + } + }, +}); + +module.exports = File; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/lib/cloneBuffer.js b/node_modules/vinyl-fs/node_modules/vinyl/lib/cloneBuffer.js new file mode 100644 index 000000000..89f09eda1 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/lib/cloneBuffer.js @@ -0,0 +1,7 @@ +var Buffer = require('buffer').Buffer; + +module.exports = function(buf) { + var out = new Buffer(buf.length); + buf.copy(out); + return out; +}; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/lib/inspectStream.js b/node_modules/vinyl-fs/node_modules/vinyl/lib/inspectStream.js new file mode 100644 index 000000000..942f23d8c --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/lib/inspectStream.js @@ -0,0 +1,15 @@ +var isStream = require('./isStream'); + +module.exports = function(stream) { + if (!isStream(stream)) { + return; + } + + var streamType = stream.constructor.name; + // Avoid StreamStream + if (streamType === 'Stream') { + streamType = ''; + } + + return '<' + streamType + 'Stream>'; +}; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/lib/isBuffer.js b/node_modules/vinyl-fs/node_modules/vinyl/lib/isBuffer.js new file mode 100644 index 000000000..8a767d174 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/lib/isBuffer.js @@ -0,0 +1 @@ +module.exports = require('buffer').Buffer.isBuffer; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/lib/isNull.js b/node_modules/vinyl-fs/node_modules/vinyl/lib/isNull.js new file mode 100644 index 000000000..7f22c63ae --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/lib/isNull.js @@ -0,0 +1,3 @@ +module.exports = function(v) { + return v === null; +}; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/lib/isStream.js b/node_modules/vinyl-fs/node_modules/vinyl/lib/isStream.js new file mode 100644 index 000000000..6b54e123b --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/lib/isStream.js @@ -0,0 +1,5 @@ +var Stream = require('stream').Stream; + +module.exports = function(o) { + return !!o && o instanceof Stream; +}; diff --git a/node_modules/vinyl-fs/node_modules/vinyl/package.json b/node_modules/vinyl-fs/node_modules/vinyl/package.json new file mode 100644 index 000000000..675005bd9 --- /dev/null +++ b/node_modules/vinyl-fs/node_modules/vinyl/package.json @@ -0,0 +1,122 @@ +{ + "_args": [ + [ + { + "raw": "vinyl@^1.0.0", + "scope": null, + "escapedName": "vinyl", + "name": "vinyl", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs" + ] + ], + "_from": "vinyl@>=1.0.0 <2.0.0", + "_id": "vinyl@1.2.0", + "_inCache": true, + "_location": "/vinyl-fs/vinyl", + "_nodeVersion": "0.10.41", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/vinyl-1.2.0.tgz_1469745377040_0.31818721699528396" + }, + "_npmUser": { + "name": "phated", + "email": "blaine.bublitz@gmail.com" + }, + "_npmVersion": "2.15.2", + "_phantomChildren": {}, + "_requested": { + "raw": "vinyl@^1.0.0", + "scope": null, + "escapedName": "vinyl", + "name": "vinyl", + "rawSpec": "^1.0.0", + "spec": ">=1.0.0 <2.0.0", + "type": "range" + }, + "_requiredBy": [ + "/vinyl-fs" + ], + "_resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "_shasum": "5c88036cf565e5df05558bfc911f8656df218884", + "_shrinkwrap": null, + "_spec": "vinyl@^1.0.0", + "_where": "/home/dold/repos/taler/wallet-webex/node_modules/vinyl-fs", + "author": { + "name": "Fractal", + "email": "contact@wearefractal.com", + "url": "http://wearefractal.com/" + }, + "bugs": { + "url": "https://github.com/gulpjs/vinyl/issues" + }, + "dependencies": { + "clone": "^1.0.0", + "clone-stats": "^0.0.1", + "replace-ext": "0.0.1" + }, + "description": "A virtual file format", + "devDependencies": { + "buffer-equal": "0.0.1", + "eslint": "^1.7.3", + "eslint-config-gulp": "^2.0.0", + "event-stream": "^3.1.0", + "github-changes": "^1.0.1", + "istanbul": "^0.3.0", + "istanbul-coveralls": "^1.0.1", + "jscs": "^2.3.5", + "jscs-preset-gulp": "^1.0.0", + "lodash.templatesettings": "^3.1.0", + "mocha": "^2.0.0", + "rimraf": "^2.2.5", + "should": "^7.0.0" + }, + "directories": {}, + "dist": { + "shasum": "5c88036cf565e5df05558bfc911f8656df218884", + "tarball": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz" + }, + "engines": { + "node": ">= 0.9" + }, + "files": [ + "index.js", + "lib" + ], + "gitHead": "ba3670add1f2f52827e3807b8783159f30ba4606", + "homepage": "http://github.com/gulpjs/vinyl", + "license": "MIT", + "main": "./index.js", + "maintainers": [ + { + "name": "contra", + "email": "contra@wearefractal.com" + }, + { + "name": "fractal", + "email": "contact@wearefractal.com" + }, + { + "name": "phated", + "email": "blaine.bublitz@gmail.com" + } + ], + "name": "vinyl", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/gulpjs/vinyl.git" + }, + "scripts": { + "changelog": "github-changes -o gulpjs -r vinyl -b master -f ./CHANGELOG.md --order-semver --use-commit-body", + "coveralls": "istanbul cover _mocha && istanbul-coveralls", + "lint": "eslint . && jscs *.js lib/ test/", + "pretest": "npm run lint", + "test": "mocha" + }, + "version": "1.2.0" +} diff --git a/node_modules/vinyl-fs/package.json b/node_modules/vinyl-fs/package.json new file mode 100644 index 000000000..7660d23ae --- /dev/null +++ b/node_modules/vinyl-fs/package.json @@ -0,0 +1,157 @@ +{ + "_args": [ + [ + { + "raw": "vinyl-fs@^2.4.3", + "scope": null, + "escapedName": "vinyl-fs", + "name": "vinyl-fs", + "rawSpec": "^2.4.3", + "spec": ">=2.4.3 <3.0.0", + "type": "range" + }, + "/home/dold/repos/taler/wallet-webex" + ] + ], + "_from": "vinyl-fs@>=2.4.3 <3.0.0", + "_id": "vinyl-fs@2.4.3", + "_inCache": true, + "_location": "/vinyl-fs", + "_nodeVersion": "0.10.41", + "_npmOperationalInternal": { + "host": "packages-12-west.internal.npmjs.com", + "tmp": "tmp/vinyl-fs-2.4.3.tgz_1459541557875_0.8605514999944717" + }, + "_npmUser": { + "name": "phated", + "email": "blaine.bublitz@gmail.com" + }, + "_npmVersion": "2.15.2", + "_phantomChildren": { + "buffer-shims": "1.0.0", + "clone": "1.0.2", + "clone-stats": "0.0.1", + "core-util-is": "1.0.2", + "extend": "3.0.0", + "inflight": "1.0.5", + "inherits": "2.0.3", + "is-stream": "1.1.0", + "json-stable-stringify": "1.0.1", + "micromatch": "2.3.11", + "minimatch": "3.0.3", + "once": "1.4.0", + "path-is-absolute": "1.0.1", + "process-nextick-args": "1.0.7", + "replace-ext": "0.0.1", + "string_decoder": "0.10.31", + "through2-filter": "2.0.0", + "to-absolute-glob": "0.1.1", + "util-deprecate": "1.0.2", + "xtend": "4.0.1" + }, + "_requested": { + "raw": "vinyl-fs@^2.4.3", + "scope": null, + "escapedName": "vinyl-fs", + "name": "vinyl-fs", + "rawSpec": "^2.4.3", + "spec": ">=2.4.3 <3.0.0", + "type": "range" + }, + "_requiredBy": [ + "#DEV:/", + "/gulp-typescript" + ], + "_resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.3.tgz", + "_shasum": "3d97e562ebfdd4b66921dea70626b84bde9d2d07", + "_shrinkwrap": null, + "_spec": "vinyl-fs@^2.4.3", + "_where": "/home/dold/repos/taler/wallet-webex", + "author": { + "name": "Fractal", + "email": "contact@wearefractal.com", + "url": "http://wearefractal.com/" + }, + "bugs": { + "url": "https://github.com/wearefractal/vinyl-fs/issues" + }, + "dependencies": { + "duplexify": "^3.2.0", + "glob-stream": "^5.3.2", + "graceful-fs": "^4.0.0", + "gulp-sourcemaps": "^1.5.2", + "is-valid-glob": "^0.3.0", + "lazystream": "^1.0.0", + "lodash.isequal": "^4.0.0", + "merge-stream": "^1.0.0", + "mkdirp": "^0.5.0", + "object-assign": "^4.0.0", + "readable-stream": "^2.0.4", + "strip-bom": "^2.0.0", + "strip-bom-stream": "^1.0.0", + "through2": "^2.0.0", + "through2-filter": "^2.0.0", + "vali-date": "^1.0.0", + "vinyl": "^1.0.0" + }, + "description": "Vinyl adapter for the file system", + "devDependencies": { + "buffer-equal": "^0.0.1", + "default-resolution": "^1.0.1", + "del": "^2.2.0", + "eslint": "^1.10.3", + "eslint-config-gulp": "^2.0.0", + "expect": "^1.14.0", + "github-changes": "^1.0.1", + "istanbul": "^0.3.0", + "istanbul-coveralls": "^1.0.1", + "jscs": "^2.4.0", + "jscs-preset-gulp": "^1.0.0", + "mocha": "^2.0.0", + "mocha-lcov-reporter": "^1.0.0", + "rimraf": "^2.2.5", + "should": "^7.0.0", + "sinon": "^1.10.3" + }, + "directories": {}, + "dist": { + "shasum": "3d97e562ebfdd4b66921dea70626b84bde9d2d07", + "tarball": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.3.tgz" + }, + "engines": { + "node": ">=0.10" + }, + "files": [ + "index.js", + "lib" + ], + "gitHead": "3033555d4b094e115b274b9c611be55104538118", + "homepage": "http://github.com/wearefractal/vinyl-fs", + "license": "MIT", + "main": "./index.js", + "maintainers": [ + { + "name": "fractal", + "email": "contact@wearefractal.com" + }, + { + "name": "phated", + "email": "blaine@iceddev.com" + } + ], + "name": "vinyl-fs", + "optionalDependencies": {}, + "readme": "ERROR: No README data found!", + "repository": { + "type": "git", + "url": "git://github.com/wearefractal/vinyl-fs.git" + }, + "scripts": { + "changelog": "github-changes -o gulpjs -r vinyl-fs -b master -f ./CHANGELOG.md --order-semver --use-commit-body", + "cover": "istanbul cover _mocha", + "coveralls": "npm run cover && istanbul-coveralls", + "lint": "eslint . && jscs index.js lib/ test/", + "test": "npm run lint && mocha" + }, + "version": "2.4.3" +} |