From ed23cb87a9a143de7e5bfaf29808b34322addee7 Mon Sep 17 00:00:00 2001 From: zhouganqing Date: Fri, 17 Feb 2023 18:26:51 +0800 Subject: [PATCH] Import Upstream version 6.1.11+ds1+~cs6.0.6 --- .eslintrc.json | 207 + .github/CODEOWNERS | 1 + .github/settings.yml | 2 + .github/workflows/ci.yml | 45 + .github/workflows/codeql-analysis.yml | 71 + CHANGELOG.md | 68 + LICENSE | 15 + README.md | 1042 ++ fs-minipass/.travis.yml | 18 + fs-minipass/LICENSE | 15 + fs-minipass/README.md | 70 + fs-minipass/index.js | 390 + fs-minipass/package-lock.json | 3444 +++++ fs-minipass/package.json | 39 + fs-minipass/test/read.js | 345 + fs-minipass/test/write.js | 494 + index.js | 18 + lib/create.js | 104 + lib/extract.js | 107 + lib/get-write-flag.js | 20 + lib/header.js | 288 + lib/high-level-opt.js | 29 + lib/large-numbers.js | 99 + lib/list.js | 132 + lib/mkdir.js | 213 + lib/mode-fix.js | 23 + lib/normalize-unicode.js | 11 + lib/normalize-windows-path.js | 8 + lib/pack.js | 397 + lib/parse.js | 481 + lib/path-reservations.js | 148 + lib/pax.js | 143 + lib/read-entry.js | 100 + lib/replace.js | 223 + lib/strip-absolute-path.js | 24 + lib/strip-trailing-slashes.js | 13 + lib/types.js | 44 + lib/unpack.js | 877 ++ lib/update.js | 36 + lib/warn-mixin.js | 21 + lib/winchars.js | 23 + lib/write-entry.js | 525 + map.js | 9 + package-lock.json | 12411 ++++++++++++++++ package.json | 59 + scripts/generate-parse-fixtures.js | 97 + test/create.js | 227 + test/dir-normalization.tar | Bin 0 -> 4608 bytes test/extract.js | 231 + test/fixtures/files/.dotfile | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + test/fixtures/files/1024-bytes.txt | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + test/fixtures/files/512-bytes.txt | 1 + ...lucky-file-beyond-130-byte-path-length.txt | 3 + .../some-unlucky-file.txt | 3 + test/fixtures/files/dir/x | 0 test/fixtures/files/hardlink-1 | 1 + test/fixtures/files/hardlink-2 | 1 + .../y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + ...cccccccccccccccccccccccccccccccccccccccccc | 1 + .../y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt | 1 + test/fixtures/files/longlink | 1 + test/fixtures/files/one-byte.txt | 1 + .../fixtures/files/strip-dir/1/2/3/hardlink-3 | 1 + test/fixtures/files/strip-dir/hardlink-1 | 1 + test/fixtures/files/strip-dir/hardlink-2 | 1 + test/fixtures/files/strip-dir/symlink | 1 + test/fixtures/files/symlink | 1 + test/fixtures/files/zero-byte.txt | 0 test/fixtures/files/Ω.txt | 1 + test/fixtures/files/🌟.txt | 1 + .../parse/bad-cksum--filter-strict.json | 64 + test/fixtures/parse/bad-cksum--filter.json | 60 + .../bad-cksum--meta-250-filter-strict.json | 64 + .../parse/bad-cksum--meta-250-filter.json | 60 + .../parse/bad-cksum--meta-250-strict.json | 64 + test/fixtures/parse/bad-cksum--meta-250.json | 60 + test/fixtures/parse/bad-cksum--strict.json | 64 + test/fixtures/parse/bad-cksum.json | 60 + .../body-byte-counts--filter-strict.json | 167 + .../parse/body-byte-counts--filter.json | 167 + ...y-byte-counts--meta-250-filter-strict.json | 167 + .../body-byte-counts--meta-250-filter.json | 167 + .../body-byte-counts--meta-250-strict.json | 167 + .../parse/body-byte-counts--meta-250.json | 167 + .../parse/body-byte-counts--strict.json | 167 + test/fixtures/parse/body-byte-counts.json | 167 + test/fixtures/parse/dir--filter-strict.json | 50 + test/fixtures/parse/dir--filter.json | 50 + .../parse/dir--meta-250-filter-strict.json | 50 + test/fixtures/parse/dir--meta-250-filter.json | 50 + test/fixtures/parse/dir--meta-250-strict.json | 50 + test/fixtures/parse/dir--meta-250.json | 50 + test/fixtures/parse/dir--strict.json | 50 + test/fixtures/parse/dir.json | 50 + .../parse/emptypax--filter-strict.json | 110 + test/fixtures/parse/emptypax--filter.json | 110 + .../emptypax--meta-250-filter-strict.json | 110 + .../parse/emptypax--meta-250-filter.json | 110 + .../parse/emptypax--meta-250-strict.json | 110 + test/fixtures/parse/emptypax--meta-250.json | 110 + test/fixtures/parse/emptypax--strict.json | 110 + test/fixtures/parse/emptypax.json | 110 + test/fixtures/parse/file--filter-strict.json | 50 + test/fixtures/parse/file--filter.json | 50 + .../parse/file--meta-250-filter-strict.json | 50 + .../fixtures/parse/file--meta-250-filter.json | 50 + .../fixtures/parse/file--meta-250-strict.json | 50 + test/fixtures/parse/file--meta-250.json | 50 + test/fixtures/parse/file--strict.json | 50 + test/fixtures/parse/file.json | 50 + .../parse/global-header--filter-strict.json | 71 + .../fixtures/parse/global-header--filter.json | 71 + ...global-header--meta-250-filter-strict.json | 71 + .../parse/global-header--meta-250-filter.json | 71 + .../parse/global-header--meta-250-strict.json | 71 + .../parse/global-header--meta-250.json | 71 + .../fixtures/parse/global-header--strict.json | 71 + test/fixtures/parse/global-header.json | 71 + test/fixtures/parse/links--filter-strict.json | 128 + test/fixtures/parse/links--filter.json | 128 + .../parse/links--meta-250-filter-strict.json | 128 + .../parse/links--meta-250-filter.json | 128 + .../parse/links--meta-250-strict.json | 128 + test/fixtures/parse/links--meta-250.json | 128 + test/fixtures/parse/links--strict.json | 128 + .../parse/links-invalid--filter-strict.json | 71 + .../fixtures/parse/links-invalid--filter.json | 65 + ...links-invalid--meta-250-filter-strict.json | 71 + .../parse/links-invalid--meta-250-filter.json | 65 + .../parse/links-invalid--meta-250-strict.json | 71 + .../parse/links-invalid--meta-250.json | 65 + .../fixtures/parse/links-invalid--strict.json | 71 + test/fixtures/parse/links-invalid.json | 65 + .../parse/links-strip--filter-strict.json | 200 + test/fixtures/parse/links-strip--filter.json | 200 + .../links-strip--meta-250-filter-strict.json | 200 + .../parse/links-strip--meta-250-filter.json | 200 + .../parse/links-strip--meta-250-strict.json | 200 + .../fixtures/parse/links-strip--meta-250.json | 200 + test/fixtures/parse/links-strip--strict.json | 200 + test/fixtures/parse/links-strip.json | 200 + test/fixtures/parse/links.json | 128 + .../parse/long-paths--filter-strict.json | 1364 ++ test/fixtures/parse/long-paths--filter.json | 1364 ++ .../long-paths--meta-250-filter-strict.json | 1418 ++ .../parse/long-paths--meta-250-filter.json | 1418 ++ .../parse/long-paths--meta-250-strict.json | 1418 ++ test/fixtures/parse/long-paths--meta-250.json | 1418 ++ test/fixtures/parse/long-paths--strict.json | 1364 ++ test/fixtures/parse/long-paths.json | 1364 ++ .../parse/long-pax--filter-strict.json | 65 + test/fixtures/parse/long-pax--filter.json | 65 + .../long-pax--meta-250-filter-strict.json | 83 + .../parse/long-pax--meta-250-filter.json | 83 + .../parse/long-pax--meta-250-strict.json | 83 + test/fixtures/parse/long-pax--meta-250.json | 83 + test/fixtures/parse/long-pax--strict.json | 65 + test/fixtures/parse/long-pax.json | 65 + .../next-file-has-long--filter-strict.json | 101 + .../parse/next-file-has-long--filter.json | 101 + ...file-has-long--meta-250-filter-strict.json | 101 + .../next-file-has-long--meta-250-filter.json | 101 + .../next-file-has-long--meta-250-strict.json | 101 + .../parse/next-file-has-long--meta-250.json | 101 + .../parse/next-file-has-long--strict.json | 101 + test/fixtures/parse/next-file-has-long.json | 101 + .../parse/null-byte--filter-strict.json | 95 + test/fixtures/parse/null-byte--filter.json | 95 + .../null-byte--meta-250-filter-strict.json | 95 + .../parse/null-byte--meta-250-filter.json | 95 + .../parse/null-byte--meta-250-strict.json | 95 + test/fixtures/parse/null-byte--meta-250.json | 95 + test/fixtures/parse/null-byte--strict.json | 95 + test/fixtures/parse/null-byte.json | 95 + .../parse/path-missing--filter-strict.json | 32 + test/fixtures/parse/path-missing--filter.json | 26 + .../path-missing--meta-250-filter-strict.json | 32 + .../parse/path-missing--meta-250-filter.json | 26 + .../parse/path-missing--meta-250-strict.json | 32 + .../parse/path-missing--meta-250.json | 26 + test/fixtures/parse/path-missing--strict.json | 32 + test/fixtures/parse/path-missing.json | 26 + ...ling-slash-corner-case--filter-strict.json | 140 + .../trailing-slash-corner-case--filter.json | 140 + ...h-corner-case--meta-250-filter-strict.json | 140 + ...ng-slash-corner-case--meta-250-filter.json | 140 + ...ng-slash-corner-case--meta-250-strict.json | 140 + .../trailing-slash-corner-case--meta-250.json | 140 + .../trailing-slash-corner-case--strict.json | 140 + .../parse/trailing-slash-corner-case.json | 140 + test/fixtures/parse/utf8--filter-strict.json | 191 + test/fixtures/parse/utf8--filter.json | 191 + .../parse/utf8--meta-250-filter-strict.json | 191 + .../fixtures/parse/utf8--meta-250-filter.json | 191 + .../fixtures/parse/utf8--meta-250-strict.json | 191 + test/fixtures/parse/utf8--meta-250.json | 191 + test/fixtures/parse/utf8--strict.json | 191 + test/fixtures/parse/utf8.json | 191 + test/fixtures/parses.tar | Bin 0 -> 665600 bytes test/fixtures/sync-gzip-fail.tgz | Bin 0 -> 296 bytes test/fixtures/tars/bad-cksum.tar | Bin 0 -> 3072 bytes test/fixtures/tars/body-byte-counts.tar | Bin 0 -> 5120 bytes test/fixtures/tars/dir.tar | Bin 0 -> 1536 bytes test/fixtures/tars/emptypax.tar | Bin 0 -> 4608 bytes test/fixtures/tars/file.tar | Bin 0 -> 2048 bytes test/fixtures/tars/global-header.tar | Bin 0 -> 3072 bytes test/fixtures/tars/links-invalid.tar | Bin 0 -> 3072 bytes test/fixtures/tars/links-strip.tar | Bin 0 -> 3072 bytes test/fixtures/tars/links.tar | Bin 0 -> 3072 bytes test/fixtures/tars/long-paths.tar | Bin 0 -> 26624 bytes test/fixtures/tars/long-pax.tar | Bin 0 -> 3072 bytes test/fixtures/tars/next-file-has-long.tar | Bin 0 -> 4608 bytes test/fixtures/tars/null-byte.tar | Bin 0 -> 10240 bytes test/fixtures/tars/path-missing.tar | Bin 0 -> 2048 bytes .../tars/trailing-slash-corner-case.tar | Bin 0 -> 10240 bytes test/fixtures/tars/utf8.tar | Bin 0 -> 7168 bytes test/fixtures/test.js | 20 + test/get-write-flag.js | 64 + test/header.js | 614 + test/high-level-opt.js | 42 + test/index.js | 73 + test/large-numbers.js | 85 + test/list.js | 228 + test/load-all.js | 10 + test/make-tar.js | 25 + test/map.js | 7 + test/mode-fix.js | 16 + test/normalize-unicode.js | 12 + test/normalize-windows-path.js | 26 + test/pack.js | 1161 ++ test/parse.js | 689 + test/path-reservations.js | 152 + test/pax.js | 253 + test/read-entry.js | 224 + test/replace.js | 400 + test/strip-absolute-path.js | 51 + test/strip-trailing-slashes.js | 8 + test/types.js | 6 + test/unpack.js | 3230 ++++ test/update.js | 369 + test/warn-mixin.js | 37 + test/winchars.js | 7 + test/write-entry.js | 1702 +++ types-tar/LICENSE | 21 + types-tar/README.md | 16 + types-tar/index.d.ts | 764 + types-tar/package.json | 33 + 252 files changed, 57196 insertions(+) create mode 100644 .eslintrc.json create mode 100644 .github/CODEOWNERS create mode 100644 .github/settings.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 fs-minipass/.travis.yml create mode 100644 fs-minipass/LICENSE create mode 100644 fs-minipass/README.md create mode 100644 fs-minipass/index.js create mode 100644 fs-minipass/package-lock.json create mode 100644 fs-minipass/package.json create mode 100644 fs-minipass/test/read.js create mode 100644 fs-minipass/test/write.js create mode 100644 index.js create mode 100644 lib/create.js create mode 100644 lib/extract.js create mode 100644 lib/get-write-flag.js create mode 100644 lib/header.js create mode 100644 lib/high-level-opt.js create mode 100644 lib/large-numbers.js create mode 100644 lib/list.js create mode 100644 lib/mkdir.js create mode 100644 lib/mode-fix.js create mode 100644 lib/normalize-unicode.js create mode 100644 lib/normalize-windows-path.js create mode 100644 lib/pack.js create mode 100644 lib/parse.js create mode 100644 lib/path-reservations.js create mode 100644 lib/pax.js create mode 100644 lib/read-entry.js create mode 100644 lib/replace.js create mode 100644 lib/strip-absolute-path.js create mode 100644 lib/strip-trailing-slashes.js create mode 100644 lib/types.js create mode 100644 lib/unpack.js create mode 100644 lib/update.js create mode 100644 lib/warn-mixin.js create mode 100644 lib/winchars.js create mode 100644 lib/write-entry.js create mode 100644 map.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/generate-parse-fixtures.js create mode 100644 test/create.js create mode 100644 test/dir-normalization.tar create mode 100644 test/extract.js create mode 100644 test/fixtures/files/.dotfile create mode 100644 test/fixtures/files/100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/1024-bytes.txt create mode 100644 test/fixtures/files/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/512-bytes.txt create mode 100644 test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt create mode 100644 test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt create mode 100644 test/fixtures/files/dir/x create mode 100644 test/fixtures/files/hardlink-1 create mode 100644 test/fixtures/files/hardlink-2 create mode 100644 test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt create mode 100644 test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc create mode 100644 test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt create mode 120000 test/fixtures/files/longlink create mode 100644 test/fixtures/files/one-byte.txt create mode 100644 test/fixtures/files/strip-dir/1/2/3/hardlink-3 create mode 100644 test/fixtures/files/strip-dir/hardlink-1 create mode 100644 test/fixtures/files/strip-dir/hardlink-2 create mode 120000 test/fixtures/files/strip-dir/symlink create mode 120000 test/fixtures/files/symlink create mode 100644 test/fixtures/files/zero-byte.txt create mode 100644 test/fixtures/files/Ω.txt create mode 100644 test/fixtures/files/🌟.txt create mode 100644 test/fixtures/parse/bad-cksum--filter-strict.json create mode 100644 test/fixtures/parse/bad-cksum--filter.json create mode 100644 test/fixtures/parse/bad-cksum--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/bad-cksum--meta-250-filter.json create mode 100644 test/fixtures/parse/bad-cksum--meta-250-strict.json create mode 100644 test/fixtures/parse/bad-cksum--meta-250.json create mode 100644 test/fixtures/parse/bad-cksum--strict.json create mode 100644 test/fixtures/parse/bad-cksum.json create mode 100644 test/fixtures/parse/body-byte-counts--filter-strict.json create mode 100644 test/fixtures/parse/body-byte-counts--filter.json create mode 100644 test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/body-byte-counts--meta-250-filter.json create mode 100644 test/fixtures/parse/body-byte-counts--meta-250-strict.json create mode 100644 test/fixtures/parse/body-byte-counts--meta-250.json create mode 100644 test/fixtures/parse/body-byte-counts--strict.json create mode 100644 test/fixtures/parse/body-byte-counts.json create mode 100644 test/fixtures/parse/dir--filter-strict.json create mode 100644 test/fixtures/parse/dir--filter.json create mode 100644 test/fixtures/parse/dir--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/dir--meta-250-filter.json create mode 100644 test/fixtures/parse/dir--meta-250-strict.json create mode 100644 test/fixtures/parse/dir--meta-250.json create mode 100644 test/fixtures/parse/dir--strict.json create mode 100644 test/fixtures/parse/dir.json create mode 100644 test/fixtures/parse/emptypax--filter-strict.json create mode 100644 test/fixtures/parse/emptypax--filter.json create mode 100644 test/fixtures/parse/emptypax--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/emptypax--meta-250-filter.json create mode 100644 test/fixtures/parse/emptypax--meta-250-strict.json create mode 100644 test/fixtures/parse/emptypax--meta-250.json create mode 100644 test/fixtures/parse/emptypax--strict.json create mode 100644 test/fixtures/parse/emptypax.json create mode 100644 test/fixtures/parse/file--filter-strict.json create mode 100644 test/fixtures/parse/file--filter.json create mode 100644 test/fixtures/parse/file--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/file--meta-250-filter.json create mode 100644 test/fixtures/parse/file--meta-250-strict.json create mode 100644 test/fixtures/parse/file--meta-250.json create mode 100644 test/fixtures/parse/file--strict.json create mode 100644 test/fixtures/parse/file.json create mode 100644 test/fixtures/parse/global-header--filter-strict.json create mode 100644 test/fixtures/parse/global-header--filter.json create mode 100644 test/fixtures/parse/global-header--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/global-header--meta-250-filter.json create mode 100644 test/fixtures/parse/global-header--meta-250-strict.json create mode 100644 test/fixtures/parse/global-header--meta-250.json create mode 100644 test/fixtures/parse/global-header--strict.json create mode 100644 test/fixtures/parse/global-header.json create mode 100644 test/fixtures/parse/links--filter-strict.json create mode 100644 test/fixtures/parse/links--filter.json create mode 100644 test/fixtures/parse/links--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/links--meta-250-filter.json create mode 100644 test/fixtures/parse/links--meta-250-strict.json create mode 100644 test/fixtures/parse/links--meta-250.json create mode 100644 test/fixtures/parse/links--strict.json create mode 100644 test/fixtures/parse/links-invalid--filter-strict.json create mode 100644 test/fixtures/parse/links-invalid--filter.json create mode 100644 test/fixtures/parse/links-invalid--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/links-invalid--meta-250-filter.json create mode 100644 test/fixtures/parse/links-invalid--meta-250-strict.json create mode 100644 test/fixtures/parse/links-invalid--meta-250.json create mode 100644 test/fixtures/parse/links-invalid--strict.json create mode 100644 test/fixtures/parse/links-invalid.json create mode 100644 test/fixtures/parse/links-strip--filter-strict.json create mode 100644 test/fixtures/parse/links-strip--filter.json create mode 100644 test/fixtures/parse/links-strip--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/links-strip--meta-250-filter.json create mode 100644 test/fixtures/parse/links-strip--meta-250-strict.json create mode 100644 test/fixtures/parse/links-strip--meta-250.json create mode 100644 test/fixtures/parse/links-strip--strict.json create mode 100644 test/fixtures/parse/links-strip.json create mode 100644 test/fixtures/parse/links.json create mode 100644 test/fixtures/parse/long-paths--filter-strict.json create mode 100644 test/fixtures/parse/long-paths--filter.json create mode 100644 test/fixtures/parse/long-paths--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/long-paths--meta-250-filter.json create mode 100644 test/fixtures/parse/long-paths--meta-250-strict.json create mode 100644 test/fixtures/parse/long-paths--meta-250.json create mode 100644 test/fixtures/parse/long-paths--strict.json create mode 100644 test/fixtures/parse/long-paths.json create mode 100644 test/fixtures/parse/long-pax--filter-strict.json create mode 100644 test/fixtures/parse/long-pax--filter.json create mode 100644 test/fixtures/parse/long-pax--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/long-pax--meta-250-filter.json create mode 100644 test/fixtures/parse/long-pax--meta-250-strict.json create mode 100644 test/fixtures/parse/long-pax--meta-250.json create mode 100644 test/fixtures/parse/long-pax--strict.json create mode 100644 test/fixtures/parse/long-pax.json create mode 100644 test/fixtures/parse/next-file-has-long--filter-strict.json create mode 100644 test/fixtures/parse/next-file-has-long--filter.json create mode 100644 test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/next-file-has-long--meta-250-filter.json create mode 100644 test/fixtures/parse/next-file-has-long--meta-250-strict.json create mode 100644 test/fixtures/parse/next-file-has-long--meta-250.json create mode 100644 test/fixtures/parse/next-file-has-long--strict.json create mode 100644 test/fixtures/parse/next-file-has-long.json create mode 100644 test/fixtures/parse/null-byte--filter-strict.json create mode 100644 test/fixtures/parse/null-byte--filter.json create mode 100644 test/fixtures/parse/null-byte--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/null-byte--meta-250-filter.json create mode 100644 test/fixtures/parse/null-byte--meta-250-strict.json create mode 100644 test/fixtures/parse/null-byte--meta-250.json create mode 100644 test/fixtures/parse/null-byte--strict.json create mode 100644 test/fixtures/parse/null-byte.json create mode 100644 test/fixtures/parse/path-missing--filter-strict.json create mode 100644 test/fixtures/parse/path-missing--filter.json create mode 100644 test/fixtures/parse/path-missing--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/path-missing--meta-250-filter.json create mode 100644 test/fixtures/parse/path-missing--meta-250-strict.json create mode 100644 test/fixtures/parse/path-missing--meta-250.json create mode 100644 test/fixtures/parse/path-missing--strict.json create mode 100644 test/fixtures/parse/path-missing.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--filter-strict.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--filter.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--meta-250.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case--strict.json create mode 100644 test/fixtures/parse/trailing-slash-corner-case.json create mode 100644 test/fixtures/parse/utf8--filter-strict.json create mode 100644 test/fixtures/parse/utf8--filter.json create mode 100644 test/fixtures/parse/utf8--meta-250-filter-strict.json create mode 100644 test/fixtures/parse/utf8--meta-250-filter.json create mode 100644 test/fixtures/parse/utf8--meta-250-strict.json create mode 100644 test/fixtures/parse/utf8--meta-250.json create mode 100644 test/fixtures/parse/utf8--strict.json create mode 100644 test/fixtures/parse/utf8.json create mode 100644 test/fixtures/parses.tar create mode 100644 test/fixtures/sync-gzip-fail.tgz create mode 100644 test/fixtures/tars/bad-cksum.tar create mode 100644 test/fixtures/tars/body-byte-counts.tar create mode 100644 test/fixtures/tars/dir.tar create mode 100644 test/fixtures/tars/emptypax.tar create mode 100644 test/fixtures/tars/file.tar create mode 100644 test/fixtures/tars/global-header.tar create mode 100644 test/fixtures/tars/links-invalid.tar create mode 100644 test/fixtures/tars/links-strip.tar create mode 100644 test/fixtures/tars/links.tar create mode 100644 test/fixtures/tars/long-paths.tar create mode 100644 test/fixtures/tars/long-pax.tar create mode 100644 test/fixtures/tars/next-file-has-long.tar create mode 100644 test/fixtures/tars/null-byte.tar create mode 100644 test/fixtures/tars/path-missing.tar create mode 100644 test/fixtures/tars/trailing-slash-corner-case.tar create mode 100644 test/fixtures/tars/utf8.tar create mode 100644 test/fixtures/test.js create mode 100644 test/get-write-flag.js create mode 100644 test/header.js create mode 100644 test/high-level-opt.js create mode 100644 test/index.js create mode 100644 test/large-numbers.js create mode 100644 test/list.js create mode 100644 test/load-all.js create mode 100644 test/make-tar.js create mode 100644 test/map.js create mode 100644 test/mode-fix.js create mode 100644 test/normalize-unicode.js create mode 100644 test/normalize-windows-path.js create mode 100644 test/pack.js create mode 100644 test/parse.js create mode 100644 test/path-reservations.js create mode 100644 test/pax.js create mode 100644 test/read-entry.js create mode 100644 test/replace.js create mode 100644 test/strip-absolute-path.js create mode 100644 test/strip-trailing-slashes.js create mode 100644 test/types.js create mode 100644 test/unpack.js create mode 100644 test/update.js create mode 100644 test/warn-mixin.js create mode 100644 test/winchars.js create mode 100644 test/write-entry.js create mode 100755 types-tar/LICENSE create mode 100755 types-tar/README.md create mode 100755 types-tar/index.d.ts create mode 100755 types-tar/package.json diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..9a124b8 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,207 @@ +{ + "parserOptions": { + "ecmaVersion": 2018, + "ecmaFeatures": {}, + "sourceType": "script" + }, + + "env": { + "es6": true, + "node": true + }, + + "plugins": [ + "import", + "node", + "promise", + "standard" + ], + + "globals": { + "document": "readonly", + "navigator": "readonly", + "window": "readonly" + }, + + "rules": { + "accessor-pairs": "error", + "array-bracket-spacing": ["error", "never"], + "arrow-spacing": ["error", { "before": true, "after": true }], + "block-spacing": ["error", "always"], + "brace-style": ["error", "1tbs", { "allowSingleLine": false }], + "camelcase": ["error", { "properties": "never" }], + "comma-dangle": ["error", { + "arrays": "always-multiline", + "objects": "always-multiline", + "imports": "always-multiline", + "exports": "always-multiline", + "functions": "never" + }], + "comma-spacing": ["error", { "before": false, "after": true }], + "comma-style": ["error", "last"], + "computed-property-spacing": ["error", "never"], + "constructor-super": "error", + "curly": ["error", "multi-or-nest"], + "dot-location": ["error", "property"], + "dot-notation": ["error", { "allowKeywords": true }], + "eol-last": "error", + "eqeqeq": ["error", "always", { "null": "ignore" }], + "func-call-spacing": ["error", "never"], + "generator-star-spacing": ["error", { "before": true, "after": true }], + "handle-callback-err": ["error", "^(err|error)$" ], + "indent": ["error", 2, { + "SwitchCase": 1, + "VariableDeclarator": 1, + "outerIIFEBody": 1, + "MemberExpression": 1, + "FunctionDeclaration": { "parameters": 1, "body": 1 }, + "FunctionExpression": { "parameters": 1, "body": 1 }, + "CallExpression": { "arguments": 1 }, + "ArrayExpression": 1, + "ObjectExpression": 1, + "ImportDeclaration": 1, + "flatTernaryExpressions": true, + "ignoreComments": false, + "ignoredNodes": ["TemplateLiteral *"] + }], + "key-spacing": ["error", { "beforeColon": false, "afterColon": true }], + "keyword-spacing": ["error", { "before": true, "after": true }], + "lines-between-class-members": ["error", "always", { "exceptAfterSingleLine": true }], + "new-cap": ["error", { "newIsCap": true, "capIsNew": false, "properties": true }], + "new-parens": "error", + "no-array-constructor": "error", + "no-async-promise-executor": "error", + "no-caller": "error", + "no-case-declarations": "error", + "no-class-assign": "error", + "no-compare-neg-zero": "error", + "no-cond-assign": "off", + "no-const-assign": "error", + "no-constant-condition": ["error", { "checkLoops": false }], + "no-control-regex": "error", + "no-debugger": "error", + "no-delete-var": "error", + "no-dupe-args": "error", + "no-dupe-class-members": "error", + "no-dupe-keys": "error", + "no-duplicate-case": "error", + "no-empty-character-class": "error", + "no-empty-pattern": "error", + "no-eval": "error", + "no-ex-assign": "error", + "no-extend-native": "error", + "no-extra-bind": "error", + "no-extra-boolean-cast": "error", + "no-extra-parens": ["error", "functions"], + "no-fallthrough": "off", + "no-floating-decimal": "error", + "no-func-assign": "error", + "no-global-assign": "error", + "no-implied-eval": "error", + "no-inner-declarations": ["error", "functions"], + "no-invalid-regexp": "error", + "no-irregular-whitespace": "error", + "no-iterator": "error", + "no-labels": ["error", { "allowLoop": true, "allowSwitch": false }], + "no-lone-blocks": "error", + "no-misleading-character-class": "error", + "no-prototype-builtins": "error", + "no-useless-catch": "error", + "no-mixed-operators": "off", + "no-mixed-spaces-and-tabs": "error", + "no-multi-spaces": "error", + "no-multi-str": "error", + "no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 0 }], + "no-negated-in-lhs": "error", + "no-new": "off", + "no-new-func": "error", + "no-new-object": "error", + "no-new-require": "error", + "no-new-symbol": "error", + "no-new-wrappers": "error", + "no-obj-calls": "error", + "no-octal": "error", + "no-octal-escape": "error", + "no-path-concat": "error", + "no-proto": "error", + "no-redeclare": ["error", { "builtinGlobals": false }], + "no-regex-spaces": "error", + "no-return-assign": "off", + "no-self-assign": "off", + "no-self-compare": "error", + "no-sequences": "off", + "no-shadow-restricted-names": "error", + "no-sparse-arrays": "error", + "no-tabs": "error", + "no-template-curly-in-string": "error", + "no-this-before-super": "error", + "no-throw-literal": "off", + "no-trailing-spaces": "error", + "no-undef": "error", + "no-undef-init": "error", + "no-unexpected-multiline": "error", + "no-unmodified-loop-condition": "error", + "no-unneeded-ternary": ["error", { "defaultAssignment": false }], + "no-unreachable": "error", + "no-unsafe-finally": 0, + "no-unsafe-negation": "error", + "no-unused-expressions": ["off"], + "no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }], + "no-use-before-define": ["error", { "functions": false, "classes": false, "variables": false }], + "no-useless-call": "error", + "no-useless-computed-key": "error", + "no-useless-constructor": "error", + "no-useless-escape": "error", + "no-useless-rename": "error", + "no-useless-return": "error", + "no-void": "error", + "no-whitespace-before-property": "error", + "no-with": "error", + "nonblock-statement-body-position": [2, "below"], + "object-curly-newline": "off", + "object-curly-spacing": "off", + "object-property-newline": ["error", { "allowMultiplePropertiesPerLine": true }], + "one-var": ["error", { "initialized": "never" }], + "operator-linebreak": "off", + "padded-blocks": ["error", { "blocks": "never", "switches": "never", "classes": "never" }], + "prefer-const": ["error", {"destructuring": "all"}], + "prefer-promise-reject-errors": "error", + "quote-props": ["error", "as-needed"], + "quotes": ["error", "single", { "avoidEscape": true, "allowTemplateLiterals": true }], + "rest-spread-spacing": ["error", "never"], + "semi": ["error", "never"], + "semi-spacing": ["error", { "before": false, "after": true }], + "space-before-blocks": ["error", "always"], + "space-before-function-paren": ["error", "always"], + "space-in-parens": ["error", "never"], + "space-infix-ops": "error", + "space-unary-ops": ["error", { "words": true, "nonwords": false }], + "spaced-comment": ["error", "always", { + "line": { "markers": ["*package", "!", "/", ",", "="] }, + "block": { "balanced": true, "markers": ["*package", "!", ",", ":", "::", "flow-include"], "exceptions": ["*"] } + }], + "symbol-description": "error", + "template-curly-spacing": ["error", "never"], + "template-tag-spacing": ["error", "never"], + "unicode-bom": ["error", "never"], + "use-isnan": "error", + "valid-typeof": ["error", { "requireStringLiterals": true }], + "wrap-iife": ["error", "any", { "functionPrototypeMethods": true }], + "yield-star-spacing": ["error", "both"], + "yoda": ["error", "never"], + + "import/export": "error", + "import/first": "error", + "import/no-absolute-path": ["error", { "esmodule": true, "commonjs": true, "amd": false }], + "import/no-duplicates": "error", + "import/no-named-default": "error", + "import/no-webpack-loader-syntax": "error", + + "node/no-deprecated-api": "error", + "node/process-exit-as-throw": "error", + + "promise/param-names": "off", + + "standard/no-callback-literal": "error" + } +} diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..ef87431 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @npm/cli-team diff --git a/.github/settings.yml b/.github/settings.yml new file mode 100644 index 0000000..4aaa0dd --- /dev/null +++ b/.github/settings.yml @@ -0,0 +1,2 @@ +--- +_extends: 'open-source-project-boilerplate' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..4c18673 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,45 @@ +name: CI + +on: [push, pull_request] + +jobs: + build: + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 16.x] + platform: + - os: ubuntu-latest + shell: bash + - os: macos-latest + shell: bash + - os: windows-latest + shell: powershell + + fail-fast: false + + runs-on: ${{ matrix.platform.os }} + defaults: + run: + shell: ${{ matrix.platform.shell }} + + steps: + # there are files here that make windows unhappy by default + - name: Support longpaths + run: git config --global core.longpaths true + + - name: Checkout Repository + uses: actions/checkout@v1.1.0 + + - name: Use Nodejs ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + + - name: use latest npm + run: npm i -g npm@latest + + - name: Install dependencies + run: npm install + + - name: Run Tap Tests + run: npm test -- -c -t0 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..7a99ab0 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '27 20 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9373401 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,68 @@ +# Changelog + +## 6.0 + +- Drop support for node 6 and 8 +- fix symlinks and hardlinks on windows being packed with `\`-style path + targets + +## 5.0 + +- Address unpack race conditions using path reservations +- Change large-numbers errors from TypeError to Error +- Add `TAR_*` error codes +- Raise `TAR_BAD_ARCHIVE` warning/error when there are no valid entries + found in an archive +- do not treat ignored entries as an invalid archive +- drop support for node v4 +- unpack: conditionally use a file mapping to write files on Windows +- Set more portable 'mode' value in portable mode +- Set `portable` gzip option in portable mode + +## 4.4 + +- Add 'mtime' option to tar creation to force mtime +- unpack: only reuse file fs entries if nlink = 1 +- unpack: rename before unlinking files on Windows +- Fix encoding/decoding of base-256 numbers +- Use `stat` instead of `lstat` when checking CWD +- Always provide a callback to fs.close() + +## 4.3 + +- Add 'transform' unpack option + +## 4.2 + +- Fail when zlib fails + +## 4.1 + +- Add noMtime flag for tar creation + +## 4.0 + +- unpack: raise error if cwd is missing or not a dir +- pack: don't drop dots from dotfiles when prefixing + +## 3.1 + +- Support `@file.tar` as an entry argument to copy entries from one tar + file to another. +- Add `noPax` option +- `noResume` option for tar.t +- win32: convert `>|, + file: 'my-tarball.tgz' + }, + ['some', 'files', 'and', 'folders'] +).then(_ => { .. tarball has been created .. }) +``` + +To replicate `tar cz files and folders > my-tarball.tgz`, you'd do: + +```js +tar.c( // or tar.create + { + gzip: + }, + ['some', 'files', 'and', 'folders'] +).pipe(fs.createWriteStream('my-tarball.tgz')) +``` + +To replicate `tar xf my-tarball.tgz` you'd do: + +```js +tar.x( // or tar.extract( + { + file: 'my-tarball.tgz' + } +).then(_=> { .. tarball has been dumped in cwd .. }) +``` + +To replicate `cat my-tarball.tgz | tar x -C some-dir --strip=1`: + +```js +fs.createReadStream('my-tarball.tgz').pipe( + tar.x({ + strip: 1, + C: 'some-dir' // alias for cwd:'some-dir', also ok + }) +) +``` + +To replicate `tar tf my-tarball.tgz`, do this: + +```js +tar.t({ + file: 'my-tarball.tgz', + onentry: entry => { .. do whatever with it .. } +}) +``` + +To replicate `cat my-tarball.tgz | tar t` do: + +```js +fs.createReadStream('my-tarball.tgz') + .pipe(tar.t()) + .on('entry', entry => { .. do whatever with it .. }) +``` + +To do anything synchronous, add `sync: true` to the options. Note +that sync functions don't take a callback and don't return a promise. +When the function returns, it's already done. Sync methods without a +file argument return a sync stream, which flushes immediately. But, +of course, it still won't be done until you `.end()` it. + +To filter entries, add `filter: ` to the options. +Tar-creating methods call the filter with `filter(path, stat)`. +Tar-reading methods (including extraction) call the filter with +`filter(path, entry)`. The filter is called in the `this`-context of +the `Pack` or `Unpack` stream object. + +The arguments list to `tar t` and `tar x` specify a list of filenames +to extract or list, so they're equivalent to a filter that tests if +the file is in the list. + +For those who _aren't_ fans of tar's single-character command names: + +``` +tar.c === tar.create +tar.r === tar.replace (appends to archive, file is required) +tar.u === tar.update (appends if newer, file is required) +tar.x === tar.extract +tar.t === tar.list +``` + +Keep reading for all the command descriptions and options, as well as +the low-level API that they are built on. + +### tar.c(options, fileList, callback) [alias: tar.create] + +Create a tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Write the tarball archive to the specified filename. If this + is specified, then the callback will be fired when the file has been + written, and a promise will be returned that resolves when the file + is written. If a filename is not specified, then a Readable Stream + will be returned which will emit the file data. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. If this is set, + and a file is not provided, then the resulting stream will already + have the data ready to `read` or `emit('data')` as soon as you + request it. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `mode` The mode to set on the created file archive +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. + +### tar.x(options, fileList, callback) [alias: tar.extract] + +Extract a tarball archive. + +The `fileList` is an array of paths to extract from the tarball. If +no paths are provided, then all the entries are extracted. + +If the archive is gzipped, then tar will detect this and unzip it. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +Most extraction errors will cause a `warn` event to be emitted. If +the `cwd` is missing, or not a directory, then the extraction will +fail completely. + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. [Alias: `C`] +- `file` The archive file to extract. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Create files and directories synchronously. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. [Alias: `keep-newer`, + `keep-newer-files`] +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. [Alias: `k`, `keep-existing`] +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. + [Alias: `P`] +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. [Alias: + `U`] +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. [Alias: `strip-components`, `stripComponents`] +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. + [Alias: `p`] +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. [Alias: `m`, `no-mtime`] +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `noChmod` Set to true to omit calling `fs.chmod()` to ensure that the + extracted file matches the entry mode. This also suppresses the call to + `process.umask()` to determine the default umask value, since tar will + extract with whatever mode is provided, and let the process `umask` apply + normally. + +The following options are mostly internal, but can be modified in some +advanced use cases, such as re-using caches between runs. + +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync extractions. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### tar.t(options, fileList, callback) [alias: tar.list] + +List the contents of a tarball archive. + +The `fileList` is an array of paths to list from the tarball. If +no paths are provided, then all the entries are listed. + +If the archive is gzipped, then tar will detect this and unzip it. + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. However, they don't emit `'data'` or `'end'` +events. (If you want to get actual readable entries, use the +`tar.Parse` class instead.) + +The following options are supported: + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. [Alias: `C`] +- `file` The archive file to list. If not specified, then a + Writable stream is returned where the archive data should be + written. [Alias: `f`] +- `sync` Read the specified file synchronously. (This has no effect + when a file option isn't specified, because entries are emitted as + fast as they are parsed from the stream anyway.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. This is important for when both `file` and + `sync` are set, because it will be called synchronously. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noResume` By default, `entry` streams are resumed immediately after + the call to `onentry`. Set `noResume: true` to suppress this + behavior. Note that by opting into this, the stream will never + complete until the entry data is consumed. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") + +### tar.u(options, fileList, callback) [alias: tar.update] + +Add files to an archive if they are newer than the entry already in +the tarball archive. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +### tar.r(options, fileList, callback) [alias: tar.replace] + +Add files to an existing archive. Because later entries override +earlier entries, this effectively replaces any existing entries. + +The `fileList` is an array of paths to add to the tarball. Adding a +directory also adds its children recursively. + +An entry in `fileList` that starts with an `@` symbol is a tar archive +whose entries will be added. To add a file that starts with `@`, +prepend it with `./`. + +The following options are supported: + +- `file` Required. Write the tarball archive to the specified + filename. [Alias: `f`] +- `sync` Act synchronously. If this is set, then any provided file + will be fully written after the call to `tar.c`. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for adding entries to the + archive. Defaults to `process.cwd()`. [Alias: `C`] +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` [Alias: `z`] +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. [Alias: `P`] +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. [Alias: `n`] +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. [Alias: `L`, `h`] +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + [Alias: `m`, `no-mtime`] +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + + +## Low-Level API + +### class tar.Pack + +A readable tar stream. + +Has all the standard readable stream interface stuff. `'data'` and +`'end'` events, `read()` method, `pause()` and `resume()`, etc. + +#### constructor(options) + +The following options are supported: + +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `strict` Treat warnings as crash-worthy errors. Default false. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `prefix` A path portion to prefix onto the entries in the archive. +- `gzip` Set to any truthy value to create a gzipped archive, or an + object with settings for `zlib.Gzip()` +- `filter` A function that gets called with `(path, stat)` for each + entry being added. Return `true` to add the entry to the archive, + or `false` to omit it. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `readdirCache` A Map object that caches calls to `readdir`. +- `jobs` A number specifying how many concurrent jobs to run. + Defaults to 4. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 16 MB. +- `noDirRecurse` Do not recursively archive the contents of + directories. +- `follow` Set to true to pack the targets of symbolic links. Without + this option, symbolic links are archived as such. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `mtime` Set to a `Date` object to force a specific `mtime` for + everything added to the archive. Overridden by `noMtime`. + +#### add(path) + +Adds an entry to the archive. Returns the Pack stream. + +#### write(path) + +Adds an entry to the archive. Returns true if flushed. + +#### end() + +Finishes the archive. + +### class tar.Pack.Sync + +Synchronous version of `tar.Pack`. + +### class tar.Unpack + +A writable stream that unpacks a tar archive onto the file system. + +All the normal writable stream stuff is supported. `write()` and +`end()` methods, `'drain'` events, etc. + +Note that all directories that are created will be forced to be +writable, readable, and listable by their owner, to avoid cases where +a directory prevents extraction of child entries by virtue of its +mode. + +`'close'` is emitted when it's done writing stuff to the file system. + +Most unpack errors will cause a `warn` event to be emitted. If the +`cwd` is missing, or not a directory, then an error will be emitted. + +#### constructor(options) + +- `cwd` Extract files relative to the specified directory. Defaults + to `process.cwd()`. If provided, this must exist and must be a + directory. +- `filter` A function that gets called with `(path, entry)` for each + entry being unpacked. Return `true` to unpack the entry from the + archive, or `false` to skip it. +- `newer` Set to true to keep the existing file on disk if it's newer + than the file in the archive. +- `keep` Do not overwrite existing files. In particular, if a file + appears more than once in an archive, later copies will not + overwrite earlier copies. +- `preservePaths` Allow absolute paths, paths containing `..`, and + extracting through symbolic links. By default, `/` is stripped from + absolute paths, `..` paths are not extracted, and any file whose + location would be modified by a symbolic link is not extracted. +- `unlink` Unlink files before creating them. Without this option, + tar overwrites existing files, which preserves existing hardlinks. + With this option, existing hardlinks will be broken, as will any + symlink that would affect the location of an extracted file. +- `strip` Remove the specified number of leading path elements. + Pathnames with fewer elements will be silently skipped. Note that + the pathname is edited after applying the filter, but before + security checks. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `umask` Filter the modes of entries like `process.umask()`. +- `dmode` Default mode for directories +- `fmode` Default mode for files +- `dirCache` A Map object of which directories exist. +- `maxMetaEntrySize` The maximum size of meta entries that is + supported. Defaults to 1 MB. +- `preserveOwner` If true, tar will set the `uid` and `gid` of + extracted entries to the `uid` and `gid` fields in the archive. + This defaults to true when run as root, and false otherwise. If + false, then files and directories will be set with the owner and + group of the user running the process. This is similar to `-p` in + `tar(1)`, but ACLs and other system-specific data is never unpacked + in this implementation, and modes are set by default already. +- `win32` True if on a windows platform. Causes behavior where + filenames containing `<|>?` chars are converted to + windows-compatible values while being unpacked. +- `uid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified user id, regardless of the `uid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `gid` option. +- `gid` Set to a number to force ownership of all extracted files and + folders, and all implicitly created directories, to be owned by the + specified group id, regardless of the `gid` field in the archive. + Cannot be used along with `preserveOwner`. Requires also setting a + `uid` option. +- `noMtime` Set to true to omit writing `mtime` value for extracted + entries. +- `transform` Provide a function that takes an `entry` object, and + returns a stream, or any falsey value. If a stream is provided, + then that stream's data will be written instead of the contents of + the archive entry. If a falsey value is provided, then the entry is + written to disk as normal. (To exclude items from extraction, use + the `filter` option described above.) +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `noChmod` Set to true to omit calling `fs.chmod()` to ensure that the + extracted file matches the entry mode. This also suppresses the call to + `process.umask()` to determine the default umask value, since tar will + extract with whatever mode is provided, and let the process `umask` apply + normally. + +### class tar.Unpack.Sync + +Synchronous version of `tar.Unpack`. + +Note that using an asynchronous stream type with the `transform` +option will cause undefined behavior in sync unpack streams. +[MiniPass](http://npm.im/minipass)-based streams are designed for this +use case. + +### class tar.Parse + +A writable stream that parses a tar archive stream. All the standard +writable stream stuff is supported. + +If the archive is gzipped, then tar will detect this and unzip it. + +Emits `'entry'` events with `tar.ReadEntry` objects, which are +themselves readable streams that you can pipe wherever. + +Each `entry` will not emit until the one before it is flushed through, +so make sure to either consume the data (with `on('data', ...)` or +`.pipe(...)`) or throw it away with `.resume()` to keep the stream +flowing. + +#### constructor(options) + +Returns an event emitter that emits `entry` events with +`tar.ReadEntry` objects. + +The following options are supported: + +- `strict` Treat warnings as crash-worthy errors. Default false. +- `filter` A function that gets called with `(path, entry)` for each + entry being listed. Return `true` to emit the entry from the + archive, or `false` to skip it. +- `onentry` A function that gets called with `(entry)` for each entry + that passes the filter. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") + +#### abort(error) + +Stop all parsing activities. This is called when there are zlib +errors. It also emits an unrecoverable warning with the error provided. + +### class tar.ReadEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being read out of a tar archive. + +It has the following fields: + +- `extended` The extended metadata object provided to the constructor. +- `globalExtended` The global extended metadata object provided to the + constructor. +- `remain` The number of bytes remaining to be written into the + stream. +- `blockRemain` The number of 512-byte blocks remaining to be written + into the stream. +- `ignore` Whether this entry should be ignored. +- `meta` True if this represents metadata about the next entry, false + if it represents a filesystem object. +- All the fields from the header, extended header, and global extended + header are added to the ReadEntry object. So it has `path`, `type`, + `size`, `mode`, and so on. + +#### constructor(header, extended, globalExtended) + +Create a new ReadEntry object with the specified header, extended +header, and global extended header values. + +### class tar.WriteEntry extends [MiniPass](http://npm.im/minipass) + +A representation of an entry that is being written from the file +system into a tar archive. + +Emits data for the Header, and for the Pax Extended Header if one is +required, as well as any body data. + +Creating a WriteEntry for a directory does not also create +WriteEntry objects for all of the directory contents. + +It has the following fields: + +- `path` The path field that will be written to the archive. By + default, this is also the path from the cwd to the file system + object. +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `myuid` If supported, the uid of the user running the current + process. +- `myuser` The `env.USER` string if set, or `''`. Set as the entry + `uname` field if the file's `uid` matches `this.myuid`. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/` and filenames containing the windows-compatible + forms of `<|>?:` characters are converted to actual `<|>?:` characters + in the archive. +- `noPax` Suppress pax extended headers. Note that this means that + long paths and linkpaths will be truncated, and large or negative + numeric values may be interpreted incorrectly. +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + + +#### constructor(path, options) + +`path` is the path of the entry as it is written in the archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `maxReadSize` The maximum buffer size for `fs.read()` operations. + Defaults to 1 MB. +- `linkCache` A Map object containing the device and inode value for + any file whose nlink is > 1, to identify hard links. +- `statCache` A Map object that caches calls `lstat`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `cwd` The current working directory for creating the archive. + Defaults to `process.cwd()`. +- `absolute` The absolute path to the entry on the filesystem. By + default, this is `path.resolve(this.cwd, this.path)`, but it can be + overridden explicitly. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `win32` True if on a windows platform. Causes behavior where paths + replace `\` with `/`. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. +- `umask` Set to restrict the modes on the entries in the archive, + somewhat like how umask works on file creation. Defaults to + `process.umask()` on unix systems, or `0o22` on Windows. + +#### warn(message, data) + +If strict, emit an error with the provided message. + +Othewise, emit a `'warn'` event with the provided message and data. + +### class tar.WriteEntry.Sync + +Synchronous version of tar.WriteEntry + +### class tar.WriteEntry.Tar + +A version of tar.WriteEntry that gets its data from a tar.ReadEntry +instead of from the filesystem. + +#### constructor(readEntry, options) + +`readEntry` is the entry being read out of another archive. + +The following options are supported: + +- `portable` Omit metadata that is system-specific: `ctime`, `atime`, + `uid`, `gid`, `uname`, `gname`, `dev`, `ino`, and `nlink`. Note + that `mtime` is still included, because this is necessary for other + time-based operations. Additionally, `mode` is set to a "reasonable + default" for most unix systems, based on a `umask` value of `0o22`. +- `preservePaths` Allow absolute paths. By default, `/` is stripped + from absolute paths. +- `strict` Treat warnings as crash-worthy errors. Default false. +- `onwarn` A function that will get called with `(code, message, data)` for + any warnings encountered. (See "Warnings and Errors") +- `noMtime` Set to true to omit writing `mtime` values for entries. + Note that this prevents using other mtime-based features like + `tar.update` or the `keepNewer` option with the resulting tar archive. + +### class tar.Header + +A class for reading and writing header blocks. + +It has the following fields: + +- `nullBlock` True if decoding a block which is entirely composed of + `0x00` null bytes. (Useful because tar files are terminated by + at least 2 null blocks.) +- `cksumValid` True if the checksum in the header is valid, false + otherwise. +- `needPax` True if the values, as encoded, will require a Pax + extended header. +- `path` The path of the entry. +- `mode` The 4 lowest-order octal digits of the file mode. That is, + read/write/execute permissions for world, group, and owner, and the + setuid, setgid, and sticky bits. +- `uid` Numeric user id of the file owner +- `gid` Numeric group id of the file owner +- `size` Size of the file in bytes +- `mtime` Modified time of the file +- `cksum` The checksum of the header. This is generated by adding all + the bytes of the header block, treating the checksum field itself as + all ascii space characters (that is, `0x20`). +- `type` The human-readable name of the type of entry this represents, + or the alphanumeric key if unknown. +- `typeKey` The alphanumeric key for the type of entry this header + represents. +- `linkpath` The target of Link and SymbolicLink entries. +- `uname` Human-readable user name of the file owner +- `gname` Human-readable group name of the file owner +- `devmaj` The major portion of the device number. Always `0` for + files, directories, and links. +- `devmin` The minor portion of the device number. Always `0` for + files, directories, and links. +- `atime` File access time. +- `ctime` File change time. + +#### constructor(data, [offset=0]) + +`data` is optional. It is either a Buffer that should be interpreted +as a tar Header starting at the specified offset and continuing for +512 bytes, or a data object of keys and values to set on the header +object, and eventually encode as a tar Header. + +#### decode(block, offset) + +Decode the provided buffer starting at the specified offset. + +Buffer length must be greater than 512 bytes. + +#### set(data) + +Set the fields in the data object. + +#### encode(buffer, offset) + +Encode the header fields into the buffer at the specified offset. + +Returns `this.needPax` to indicate whether a Pax Extended Header is +required to properly encode the specified data. + +### class tar.Pax + +An object representing a set of key-value pairs in an Pax extended +header entry. + +It has the following fields. Where the same name is used, they have +the same semantics as the tar.Header field of the same name. + +- `global` True if this represents a global extended header, or false + if it is for a single entry. +- `atime` +- `charset` +- `comment` +- `ctime` +- `gid` +- `gname` +- `linkpath` +- `mtime` +- `path` +- `size` +- `uid` +- `uname` +- `dev` +- `ino` +- `nlink` + +#### constructor(object, global) + +Set the fields set in the object. `global` is a boolean that defaults +to false. + +#### encode() + +Return a Buffer containing the header and body for the Pax extended +header entry, or `null` if there is nothing to encode. + +#### encodeBody() + +Return a string representing the body of the pax extended header +entry. + +#### encodeField(fieldName) + +Return a string representing the key/value encoding for the specified +fieldName, or `''` if the field is unset. + +### tar.Pax.parse(string, extended, global) + +Return a new Pax object created by parsing the contents of the string +provided. + +If the `extended` object is set, then also add the fields from that +object. (This is necessary because multiple metadata entries can +occur in sequence.) + +### tar.types + +A translation table for the `type` field in tar headers. + +#### tar.types.name.get(code) + +Get the human-readable name for a given alphanumeric code. + +#### tar.types.code.get(name) + +Get the alphanumeric code for a given human-readable name. diff --git a/fs-minipass/.travis.yml b/fs-minipass/.travis.yml new file mode 100644 index 0000000..09263d7 --- /dev/null +++ b/fs-minipass/.travis.yml @@ -0,0 +1,18 @@ +language: node_js +sudo: false + +node_js: + - node + - 12 + - 10 + - 8 + +os: + - linux + +cache: + directories: + - $HOME/.npm + +notifications: + email: false diff --git a/fs-minipass/LICENSE b/fs-minipass/LICENSE new file mode 100644 index 0000000..19129e3 --- /dev/null +++ b/fs-minipass/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/fs-minipass/README.md b/fs-minipass/README.md new file mode 100644 index 0000000..1e61241 --- /dev/null +++ b/fs-minipass/README.md @@ -0,0 +1,70 @@ +# fs-minipass + +Filesystem streams based on [minipass](http://npm.im/minipass). + +4 classes are exported: + +- ReadStream +- ReadStreamSync +- WriteStream +- WriteStreamSync + +When using `ReadStreamSync`, all of the data is made available +immediately upon consuming the stream. Nothing is buffered in memory +when the stream is constructed. If the stream is piped to a writer, +then it will synchronously `read()` and emit data into the writer as +fast as the writer can consume it. (That is, it will respect +backpressure.) If you call `stream.read()` then it will read the +entire file and return the contents. + +When using `WriteStreamSync`, every write is flushed to the file +synchronously. If your writes all come in a single tick, then it'll +write it all out in a single tick. It's as synchronous as you are. + +The async versions work much like their node builtin counterparts, +with the exception of introducing significantly less Stream machinery +overhead. + +## USAGE + +It's just streams, you pipe them or read() them or write() to them. + +```js +const fsm = require('fs-minipass') +const readStream = new fsm.ReadStream('file.txt') +const writeStream = new fsm.WriteStream('output.txt') +writeStream.write('some file header or whatever\n') +readStream.pipe(writeStream) +``` + +## ReadStream(path, options) + +Path string is required, but somewhat irrelevant if an open file +descriptor is passed in as an option. + +Options: + +- `fd` Pass in a numeric file descriptor, if the file is already open. +- `readSize` The size of reads to do, defaults to 16MB +- `size` The size of the file, if known. Prevents zero-byte read() + call at the end. +- `autoClose` Set to `false` to prevent the file descriptor from being + closed when the file is done being read. + +## WriteStream(path, options) + +Path string is required, but somewhat irrelevant if an open file +descriptor is passed in as an option. + +Options: + +- `fd` Pass in a numeric file descriptor, if the file is already open. +- `mode` The mode to create the file with. Defaults to `0o666`. +- `start` The position in the file to start reading. If not + specified, then the file will start writing at position zero, and be + truncated by default. +- `autoClose` Set to `false` to prevent the file descriptor from being + closed when the stream is ended. +- `flags` Flags to use when opening the file. Irrelevant if `fd` is + passed in, since file won't be opened in that case. Defaults to + `'a'` if a `pos` is specified, or `'w'` otherwise. diff --git a/fs-minipass/index.js b/fs-minipass/index.js new file mode 100644 index 0000000..2402890 --- /dev/null +++ b/fs-minipass/index.js @@ -0,0 +1,390 @@ +'use strict' +const MiniPass = require('minipass') +const EE = require('events').EventEmitter +const fs = require('fs') + +let writev = fs.writev +/* istanbul ignore next */ +if (!writev) { + // This entire block can be removed if support for earlier than Node.js + // 12.9.0 is not needed. + const binding = process.binding('fs') + const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback + + writev = (fd, iovec, pos, cb) => { + const done = (er, bw) => cb(er, bw, iovec) + const req = new FSReqWrap() + req.oncomplete = done + binding.writeBuffers(fd, iovec, pos, req) + } +} + +const _autoClose = Symbol('_autoClose') +const _close = Symbol('_close') +const _ended = Symbol('_ended') +const _fd = Symbol('_fd') +const _finished = Symbol('_finished') +const _flags = Symbol('_flags') +const _flush = Symbol('_flush') +const _handleChunk = Symbol('_handleChunk') +const _makeBuf = Symbol('_makeBuf') +const _mode = Symbol('_mode') +const _needDrain = Symbol('_needDrain') +const _onerror = Symbol('_onerror') +const _onopen = Symbol('_onopen') +const _onread = Symbol('_onread') +const _onwrite = Symbol('_onwrite') +const _open = Symbol('_open') +const _path = Symbol('_path') +const _pos = Symbol('_pos') +const _queue = Symbol('_queue') +const _read = Symbol('_read') +const _readSize = Symbol('_readSize') +const _reading = Symbol('_reading') +const _remain = Symbol('_remain') +const _size = Symbol('_size') +const _write = Symbol('_write') +const _writing = Symbol('_writing') +const _defaultFlag = Symbol('_defaultFlag') + +class ReadStream extends MiniPass { + constructor (path, opt) { + opt = opt || {} + super(opt) + + this.writable = false + + if (typeof path !== 'string') + throw new TypeError('path must be a string') + + this[_fd] = typeof opt.fd === 'number' ? opt.fd : null + this[_path] = path + this[_readSize] = opt.readSize || 16*1024*1024 + this[_reading] = false + this[_size] = typeof opt.size === 'number' ? opt.size : Infinity + this[_remain] = this[_size] + this[_autoClose] = typeof opt.autoClose === 'boolean' ? + opt.autoClose : true + + if (typeof this[_fd] === 'number') + this[_read]() + else + this[_open]() + } + + get fd () { return this[_fd] } + get path () { return this[_path] } + + write () { + throw new TypeError('this is a readable stream') + } + + end () { + throw new TypeError('this is a readable stream') + } + + [_open] () { + fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)) + } + + [_onopen] (er, fd) { + if (er) + this[_onerror](er) + else { + this[_fd] = fd + this.emit('open', fd) + this[_read]() + } + } + + [_makeBuf] () { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])) + } + + [_read] () { + if (!this[_reading]) { + this[_reading] = true + const buf = this[_makeBuf]() + /* istanbul ignore if */ + if (buf.length === 0) return process.nextTick(() => this[_onread](null, 0, buf)) + fs.read(this[_fd], buf, 0, buf.length, null, (er, br, buf) => + this[_onread](er, br, buf)) + } + } + + [_onread] (er, br, buf) { + this[_reading] = false + if (er) + this[_onerror](er) + else if (this[_handleChunk](br, buf)) + this[_read]() + } + + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + fs.close(this[_fd], _ => this.emit('close')) + this[_fd] = null + } + } + + [_onerror] (er) { + this[_reading] = true + this[_close]() + this.emit('error', er) + } + + [_handleChunk] (br, buf) { + let ret = false + // no effect if infinite + this[_remain] -= br + if (br > 0) + ret = super.write(br < buf.length ? buf.slice(0, br) : buf) + + if (br === 0 || this[_remain] <= 0) { + ret = false + this[_close]() + super.end() + } + + return ret + } + + emit (ev, data) { + switch (ev) { + case 'prefinish': + case 'finish': + break + + case 'drain': + if (typeof this[_fd] === 'number') + this[_read]() + break + + default: + return super.emit(ev, data) + } + } +} + +class ReadStreamSync extends ReadStream { + [_open] () { + let threw = true + try { + this[_onopen](null, fs.openSync(this[_path], 'r')) + threw = false + } finally { + if (threw) + this[_close]() + } + } + + [_read] () { + let threw = true + try { + if (!this[_reading]) { + this[_reading] = true + do { + const buf = this[_makeBuf]() + /* istanbul ignore next */ + const br = buf.length === 0 ? 0 : fs.readSync(this[_fd], buf, 0, buf.length, null) + if (!this[_handleChunk](br, buf)) + break + } while (true) + this[_reading] = false + } + threw = false + } finally { + if (threw) + this[_close]() + } + } + + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + try { + fs.closeSync(this[_fd]) + } catch (er) {} + this[_fd] = null + this.emit('close') + } + } +} + +class WriteStream extends EE { + constructor (path, opt) { + opt = opt || {} + super(opt) + this.readable = false + this[_writing] = false + this[_ended] = false + this[_needDrain] = false + this[_queue] = [] + this[_path] = path + this[_fd] = typeof opt.fd === 'number' ? opt.fd : null + this[_mode] = opt.mode === undefined ? 0o666 : opt.mode + this[_pos] = typeof opt.start === 'number' ? opt.start : null + this[_autoClose] = typeof opt.autoClose === 'boolean' ? + opt.autoClose : true + + // truncating makes no sense when writing into the middle + const defaultFlag = this[_pos] !== null ? 'r+' : 'w' + this[_defaultFlag] = opt.flags === undefined + this[_flags] = this[_defaultFlag] ? defaultFlag : opt.flags + + if (this[_fd] === null) + this[_open]() + } + + get fd () { return this[_fd] } + get path () { return this[_path] } + + [_onerror] (er) { + this[_close]() + this[_writing] = true + this.emit('error', er) + } + + [_open] () { + fs.open(this[_path], this[_flags], this[_mode], + (er, fd) => this[_onopen](er, fd)) + } + + [_onopen] (er, fd) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && er.code === 'ENOENT') { + this[_flags] = 'w' + this[_open]() + } else if (er) + this[_onerror](er) + else { + this[_fd] = fd + this.emit('open', fd) + this[_flush]() + } + } + + end (buf, enc) { + if (buf) + this.write(buf, enc) + + this[_ended] = true + + // synthetic after-write logic, where drain/finish live + if (!this[_writing] && !this[_queue].length && + typeof this[_fd] === 'number') + this[_onwrite](null, 0) + } + + write (buf, enc) { + if (typeof buf === 'string') + buf = Buffer.from(buf, enc) + + if (this[_ended]) { + this.emit('error', new Error('write() after end()')) + return false + } + + if (this[_fd] === null || this[_writing] || this[_queue].length) { + this[_queue].push(buf) + this[_needDrain] = true + return false + } + + this[_writing] = true + this[_write](buf) + return true + } + + [_write] (buf) { + fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => + this[_onwrite](er, bw)) + } + + [_onwrite] (er, bw) { + if (er) + this[_onerror](er) + else { + if (this[_pos] !== null) + this[_pos] += bw + if (this[_queue].length) + this[_flush]() + else { + this[_writing] = false + + if (this[_ended] && !this[_finished]) { + this[_finished] = true + this[_close]() + this.emit('finish') + } else if (this[_needDrain]) { + this[_needDrain] = false + this.emit('drain') + } + } + } + } + + [_flush] () { + if (this[_queue].length === 0) { + if (this[_ended]) + this[_onwrite](null, 0) + } else if (this[_queue].length === 1) + this[_write](this[_queue].pop()) + else { + const iovec = this[_queue] + this[_queue] = [] + writev(this[_fd], iovec, this[_pos], + (er, bw) => this[_onwrite](er, bw)) + } + } + + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + fs.close(this[_fd], _ => this.emit('close')) + this[_fd] = null + } + } +} + +class WriteStreamSync extends WriteStream { + [_open] () { + let fd + try { + fd = fs.openSync(this[_path], this[_flags], this[_mode]) + } catch (er) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && er.code === 'ENOENT') { + this[_flags] = 'w' + return this[_open]() + } else + throw er + } + this[_onopen](null, fd) + } + + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + try { + fs.closeSync(this[_fd]) + } catch (er) {} + this[_fd] = null + this.emit('close') + } + } + + [_write] (buf) { + try { + this[_onwrite](null, + fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos])) + } catch (er) { + this[_onwrite](er, 0) + } + } +} + +exports.ReadStream = ReadStream +exports.ReadStreamSync = ReadStreamSync + +exports.WriteStream = WriteStream +exports.WriteStreamSync = WriteStreamSync diff --git a/fs-minipass/package-lock.json b/fs-minipass/package-lock.json new file mode 100644 index 0000000..88af43e --- /dev/null +++ b/fs-minipass/package-lock.json @@ -0,0 +1,3444 @@ +{ + "name": "fs-minipass", + "version": "2.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.6.0.tgz", + "integrity": "sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==", + "dev": true, + "requires": { + "@babel/types": "^7.6.0", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", + "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.0.0", + "@babel/template": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", + "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==", + "dev": true + }, + "@babel/runtime": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.6.0.tgz", + "integrity": "sha512-89eSBLJsxNxOERC0Op4vd+0Bqm6wRMqMbFtV3i0/fbaWw/mJ8Q3eBvgX0G4SyrOOLCtbu98HspF8o09MRT+KzQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + } + }, + "@babel/template": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.6.0.tgz", + "integrity": "sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0" + } + }, + "@babel/traverse": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.6.0.tgz", + "integrity": "sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.6.0", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.6.0", + "@babel/types": "^7.6.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.6.1.tgz", + "integrity": "sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dev": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.0.tgz", + "integrity": "sha512-Ozz7l4ixzI7Oxj2+cw+p0tVUt27BpaJ+1+q1TCeANWxHpvyn2+Un+YamBdfKu0uh8xLodGhoa1v7595NhKDAuA==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arg": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.1.tgz", + "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async-hook-domain": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-1.1.0.tgz", + "integrity": "sha512-NH7V97d1yCbIanu2oDLyPT2GFNct0esPeJyRfkk8J5hTztHVSQp4UiNfL2O42sCA9XZPU8OgHvzOmt9ewBhVqA==", + "dev": true, + "requires": { + "source-map-support": "^0.5.11" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", + "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", + "dev": true + }, + "bind-obj-methods": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-2.0.0.tgz", + "integrity": "sha512-3/qRXczDi2Cdbz6jE+W3IflJOutRVica8frpBn14de1mBOkzDo+6tY33kNhvkw54Kn3PzRRD2VnGbGPcTAk4sw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "dependencies": { + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + } + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", + "integrity": "sha512-c4PR2egjNjI1um6bamCQ6bUNPDiyofNQruHvKgHQ4gDUP/ITSVSzNsiI5OWtHOsX323i5ha/kk4YmOZ1Ktg7KA==", + "dev": true, + "requires": { + "anymatch": "^3.0.1", + "braces": "^3.0.2", + "fsevents": "^2.0.6", + "glob-parent": "^5.0.0", + "is-binary-path": "^2.1.0", + "is-glob": "^4.0.1", + "normalize-path": "^3.0.0", + "readdirp": "^3.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.6.tgz", + "integrity": "sha512-Pgh4v3gCI4T/9VijVrm8Ym5v0OgjvGLKj3zTUwkvsCiwqae/p6VLzpsFNjQS2i6ewV7ef+DjFJ5TSKxYt/mCrA==", + "dev": true, + "requires": { + "growl": "~> 1.10.0", + "js-yaml": "^3.13.1", + "lcov-parse": "^0.0.10", + "log-driver": "^1.2.7", + "minimist": "^1.2.0", + "request": "^2.86.0" + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + } + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", + "dev": true + }, + "flow-parser": { + "version": "0.107.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.107.0.tgz", + "integrity": "sha512-GtMCS8qzP0VskiE5qfN4zYiwjnClV/BxPZ4zUqMRUfyaF+gBuLHDTPqVLJ4ndGedrdv54510rsXDSbkCqUig+g==", + "dev": true + }, + "flow-remove-types": { + "version": "2.107.0", + "resolved": "https://registry.npmjs.org/flow-remove-types/-/flow-remove-types-2.107.0.tgz", + "integrity": "sha512-PXsYEHt5gKuFxw4rSc5e0K2OxhR7JxploCQ4wQzu7wE/Fw42oOs7sdGHPZujTeBY/g3OYSoZ11YxK3KoTHIYWw==", + "dev": true, + "requires": { + "flow-parser": "^0.107.0", + "pirates": "^3.0.2", + "vlq": "^0.2.1" + } + }, + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.0.7.tgz", + "integrity": "sha512-a7YT0SV3RB+DjYcppwVDLtn13UQnmg0SWZS7ezZD0UjnLwXmy8Zm21GMVGLaFGimIqcvyMQaOJBrop8MyOp1kQ==", + "dev": true, + "optional": true + }, + "function-loop": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-1.0.2.tgz", + "integrity": "sha512-Iw4MzMfS3udk/rqxTiDDCllhGwlOrsr50zViTOO/W6lS/9y6B1J0BD2VZzrnWUYBJsl3aeqjgR5v7bWWhZSYbA==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", + "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", + "dev": true + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "handlebars": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz", + "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==", + "dev": true, + "requires": { + "neo-async": "^2.6.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", + "dev": true, + "requires": { + "is-stream": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", + "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-1.0.0.tgz", + "integrity": "sha512-FY0cPmWa4WoQNlvB8VOcafiRoB5nB+l2Pz2xGuXHRSy1KM8QFOYfz/rN+bGMCAeejrY3mrpF5oJHcN0s/garCg==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^6.0.5", + "istanbul-lib-coverage": "^2.0.3", + "rimraf": "^2.6.3", + "uuid": "^3.3.2" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + } + }, + "istanbul-reports": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", + "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" + } + }, + "jackspeak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.0.tgz", + "integrity": "sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw==", + "dev": true, + "requires": { + "cliui": "^4.1.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + }, + "dependencies": { + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "dev": true + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "dev": true, + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "minipass": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.0.0.tgz", + "integrity": "sha512-FKNU4XrAPDX0+ynwns7njVu4RolyG1mUKSlT6n6GwGXLtYSYh2Znc0S83Rl6zEr1zgFfXvAzIBabnmItm+n19g==", + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mutate-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mutate-fs/-/mutate-fs-2.0.1.tgz", + "integrity": "sha512-upIbJgHP2yd3hlwcWGUAoq5+8QmPR9sZIJGBNiVgORJKQ3BmGvDBevcCJ+Sk+75MrUagTUucADRpwR692qygeA==", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "requires": { + "own-or": "^1.0.0" + } + }, + "p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz", + "integrity": "sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pirates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-3.0.2.tgz", + "integrity": "sha512-c5CgUJq6H2k6MJz72Ak1F5sN9n9wlSlJyEnwvpm9/y3WB4E3pHBDT2c6PEiS1vyJvq2bUxUAIu0EGf8Cx4Ic7Q==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "optional": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.1.2.tgz", + "integrity": "sha512-8rhl0xs2cxfVsqzreYCvs8EwBfn/DhVdqtoLmw19uI3SC5avYX9teCurlErfpPXGmYtMHReGaP2RsLnFvz/lnw==", + "dev": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tap": { + "version": "14.6.4", + "resolved": "https://registry.npmjs.org/tap/-/tap-14.6.4.tgz", + "integrity": "sha512-qYO/ZlQumbYzibH+wCVfkrNAomtBhKcKvMHWAMaucHrTBzZGHCmLR/WmRhb1khOKN5gzxMbCpEct3GQIKYXRlw==", + "dev": true, + "requires": { + "async-hook-domain": "^1.1.0", + "bind-obj-methods": "^2.0.0", + "browser-process-hrtime": "^1.0.0", + "capture-stack-trace": "^1.0.0", + "chokidar": "^3.0.2", + "color-support": "^1.1.0", + "coveralls": "^3.0.6", + "diff": "^4.0.1", + "esm": "^3.2.25", + "findit": "^2.0.0", + "flow-remove-types": "^2.107.0", + "foreground-child": "^1.3.3", + "fs-exists-cached": "^1.0.0", + "function-loop": "^1.0.2", + "glob": "^7.1.4", + "import-jsx": "^2.0.0", + "ink": "^2.3.0", + "isexe": "^2.0.0", + "istanbul-lib-processinfo": "^1.0.0", + "jackspeak": "^1.4.0", + "minipass": "^2.5.1", + "mkdirp": "^0.5.1", + "nyc": "^14.1.1", + "opener": "^1.5.1", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "react": "^16.9.0", + "rimraf": "^2.7.1", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.13", + "stack-utils": "^1.0.2", + "tap-mocha-reporter": "^4.0.1", + "tap-parser": "^9.3.3", + "tap-yaml": "^1.0.0", + "tcompare": "^2.3.0", + "treport": "^0.4.0", + "trivial-deferred": "^1.0.1", + "ts-node": "^8.3.0", + "typescript": "^3.6.3", + "which": "^1.3.1", + "write-file-atomic": "^3.0.0", + "yaml": "^1.6.0", + "yapool": "^1.0.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.4.5", + "bundled": true, + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.2" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.2", + "bundled": true, + "dev": true + } + } + }, + "@types/prop-types": { + "version": "15.7.1", + "bundled": true, + "dev": true + }, + "@types/react": { + "version": "16.8.22", + "bundled": true, + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "auto-bind": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "@types/react": "^16.8.12" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + } + }, + "babel-core": { + "version": "6.26.3", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "bundled": true, + "dev": true, + "requires": { + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + } + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "esutils": "^2.0.2" + } + }, + "babel-helpers": { + "version": "6.24.1", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "bundled": true, + "dev": true + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "^6.8.0", + "babel-runtime": "^6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "bundled": true, + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "^6.24.1", + "babel-plugin-syntax-jsx": "^6.8.0", + "babel-runtime": "^6.22.0" + } + }, + "babel-register": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "bundled": true, + "dev": true, + "requires": { + "source-map": "^0.5.6" + } + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "bundled": true, + "dev": true, + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caller-callsite": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "requires": { + "slice-ansi": "^1.0.0", + "string-width": "^2.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js": { + "version": "2.6.5", + "bundled": true, + "dev": true + }, + "csstype": { + "version": "2.6.5", + "bundled": true, + "dev": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esprima": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true, + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "globals": { + "version": "9.18.0", + "bundled": true, + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "import-jsx": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "babel-core": "^6.25.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-object-rest-spread": "^6.23.0", + "babel-plugin-transform-react-jsx": "^6.24.1", + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "ink": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "@types/react": "^16.8.6", + "arrify": "^1.0.1", + "auto-bind": "^2.0.0", + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "cli-truncate": "^1.1.0", + "is-ci": "^2.0.0", + "lodash.throttle": "^4.1.1", + "log-update": "^3.0.0", + "prop-types": "^15.6.2", + "react-reconciler": "^0.20.0", + "scheduler": "^0.13.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^1.0.0", + "string-length": "^2.0.0", + "widest-line": "^2.0.0", + "wrap-ansi": "^5.0.0", + "yoga-layout-prebuilt": "^1.9.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-ci": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true, + "dev": true + }, + "json5": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "lodash": { + "version": "4.17.14", + "bundled": true, + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "log-update": { + "version": "3.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "cli-cursor": "^2.1.0", + "wrap-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "2.5.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "onetime": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + }, + "dependencies": { + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + } + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "private": { + "version": "0.1.8", + "bundled": true, + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "react": { + "version": "16.9.0", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-is": { + "version": "16.8.6", + "bundled": true, + "dev": true + }, + "react-reconciler": { + "version": "0.20.4", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.13.6" + } + }, + "redeyed": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true, + "dev": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "scheduler": { + "version": "0.13.6", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true + }, + "slash": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-length": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "tap-parser": { + "version": "9.3.3", + "bundled": true, + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^2.2.0", + "tap-yaml": "^1.0.0" + } + }, + "tap-yaml": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true, + "dev": true + }, + "treport": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^2.4.2", + "import-jsx": "^2.0.0", + "ink": "^2.1.1", + "ms": "^2.1.1", + "react": "^16.8.6", + "string-length": "^2.0.0", + "tap-parser": "^9.3.2", + "unicode-length": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "unicode-length": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "widest-line": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^2.1.1" + } + }, + "yaml": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5" + } + }, + "yoga-layout-prebuilt": { + "version": "1.9.3", + "bundled": true, + "dev": true + } + } + }, + "tap-mocha-reporter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-4.0.1.tgz", + "integrity": "sha512-/KfXaaYeSPn8qBi5Be8WSIP3iKV83s2uj2vzImJAXmjNu22kzqZ+1Dv1riYWa53sPCiyo1R1w1jbJrftF8SpcQ==", + "dev": true, + "requires": { + "color-support": "^1.1.0", + "debug": "^2.1.3", + "diff": "^1.3.2", + "escape-string-regexp": "^1.0.3", + "glob": "^7.0.5", + "readable-stream": "^2.1.5", + "tap-parser": "^8.0.0", + "tap-yaml": "0 || 1", + "unicode-length": "^1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "tap-parser": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-8.1.0.tgz", + "integrity": "sha512-GgOzgDwThYLxhVR83RbS1JUR1TxcT+jfZsrETgPAvFdr12lUOnuvrHOBaUQgpkAp6ZyeW6r2Nwd91t88M0ru3w==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^2.2.0", + "tap-yaml": "0 || 1" + }, + "dependencies": { + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "tap-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", + "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "tcompare": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-2.3.0.tgz", + "integrity": "sha512-fAfA73uFtFGybWGt4+IYT6UPLYVZQ4NfsP+IXEZGY0vh8e2IF7LVKafcQNMRBLqP0wzEA65LM9Tqj+FSmO8GLw==", + "dev": true + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, + "ts-node": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", + "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", + "dev": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "typescript": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.3.tgz", + "integrity": "sha512-N7bceJL1CtRQ2RiG0AQME13ksR7DiuQh/QehubYcghzv20tnh+MQnQIuJddTmsbqYj+dztchykemz0zFzlvdQw==", + "dev": true + }, + "uglify-js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz", + "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.0", + "source-map": "~0.6.1" + } + }, + "unicode-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-1.0.3.tgz", + "integrity": "sha1-Wtp6f+1RhBpBijKM8UlHisg1irs=", + "dev": true, + "requires": { + "punycode": "^1.3.2", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "optional": true + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.0.tgz", + "integrity": "sha512-EIgkf60l2oWsffja2Sf2AL384dx328c0B+cIYPTQq5q2rOYuDV00/iPFBOUiDKKwKMOhkymH8AidPaRvzfxY+Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.6.0.tgz", + "integrity": "sha512-iZfse3lwrJRoSlfs/9KQ9iIXxs9++RvBFVzAqbbBiFT+giYtyanevreF9r61ZTbGMgWQBxAua3FzJiniiJXWWw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.4.5" + } + }, + "yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, + "yargs": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", + "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + } + } +} diff --git a/fs-minipass/package.json b/fs-minipass/package.json new file mode 100644 index 0000000..df86d6d --- /dev/null +++ b/fs-minipass/package.json @@ -0,0 +1,39 @@ +{ + "name": "fs-minipass", + "version": "2.0.1", + "main": "index.js", + "scripts": { + "test": "tap", + "preversion": "npm test", + "postversion": "npm publish", + "postpublish": "git push origin --follow-tags" + }, + "keywords": [], + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/fs-minipass.git" + }, + "bugs": { + "url": "https://github.com/npm/fs-minipass/issues" + }, + "homepage": "https://github.com/npm/fs-minipass#readme", + "description": "fs read and write streams based on minipass", + "dependencies": { + "minipass": "^3.0.0" + }, + "devDependencies": { + "mutate-fs": "^2.0.1", + "tap": "^14.6.4" + }, + "files": [ + "index.js" + ], + "tap": { + "check-coverage": true + }, + "engines": { + "node": ">= 8" + } +} diff --git a/fs-minipass/test/read.js b/fs-minipass/test/read.js new file mode 100644 index 0000000..ed22dce --- /dev/null +++ b/fs-minipass/test/read.js @@ -0,0 +1,345 @@ +'use strict' + +const t = require('tap') +const fsm = require('../') +const fs = require('fs') +const EE = require('events').EventEmitter +const mutateFS = require('mutate-fs') + +t.test('read the readme', t => { + const p = __dirname + '/../README.md' + const rm = fs.readFileSync(p, 'utf8') + const check = (t, res) => { + t.equal(rm, res) + t.end() + } + + t.test('sync', t => { + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8' }) + t.isa(str.fd, 'number') + const out = [] + str.on('data', chunk => out.push(chunk)) + check(t, out.join('')) + }) + + t.test('sync using read()', t => { + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8' }) + t.isa(str.fd, 'number') + const out = [] + let chunk + while (chunk = str.read()) + out.push(chunk) + check(t, out.join('')) + }) + + return t.test('async', t => { + const str = new fsm.ReadStream(p, { encoding: 'utf8' }) + t.equal(str.fd, null) + let sawFD + str.on('open', fd => sawFD = fd) + const out = [] + t.equal(str.read(), null) + str.on('data', chunk => out.push(chunk)) + str.on('close', _ => { + t.isa(sawFD, 'number') + check(t, out.join('')) + }) + }) +}) + +t.test('read the readme sized', t => { + const p = __dirname + '/../README.md' + const size = fs.statSync(p).size + const rm = fs.readFileSync(p, 'utf8') + const check = (t, res) => { + t.equal(rm, res) + t.end() + } + + t.test('sync', t => { + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', size: size }) + t.equal(str.fd, null) + const out = [] + str.on('data', chunk => out.push(chunk)) + check(t, out.join('')) + }) + + t.test('sync using read()', t => { + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', size: size }) + t.equal(str.fd, null) + const out = [] + let chunk + while (chunk = str.read()) + out.push(chunk) + check(t, out.join('')) + }) + + return t.test('async', t => { + const str = new fsm.ReadStream(p, { encoding: 'utf8', size: size }) + t.equal(str.fd, null) + let sawFD + str.on('open', fd => sawFD = fd) + const out = [] + t.equal(str.read(), null) + str.on('data', chunk => out.push(chunk)) + str.on('end', _ => { + t.isa(sawFD, 'number') + check(t, out.join('')) + }) + }) +}) + +t.test('slow sink', t => { + const chunks = [] + const EE = require('events').EventEmitter + class SlowStream extends EE { + write (chunk) { + chunks.push(chunk) + setTimeout(_ => this.emit('drain')) + return false + } + end () { return this.write() } + } + + const p = __dirname + '/../README.md' + const rm = fs.readFileSync(p, 'utf8') + const check = t => { + t.equal(chunks.join(''), rm) + chunks.length = 0 + t.end() + } + + t.test('sync', t => { + const ss = new SlowStream() + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', readSize: 5 }) + str.pipe(ss) + // trigger a read-while-reading + str.on('readable', _ => str.emit('drain')) + str.on('end', _ => check(t)) + }) + + return t.test('async', t => { + const ss = new SlowStream() + const str = new fsm.ReadStream(p, { encoding: 'utf8', readSize: 256 }) + str.pipe(ss) + str.on('end', _ => check(t)) + }) +}) + +t.test('zeno reading style', t => { + t.teardown(mutateFS.zenoRead()) + const chunks = [] + const EE = require('events').EventEmitter + class Collector extends EE { + write (chunk) { + chunks.push(chunk) + return true + } + end () {} + } + + const p = __dirname + '/../README.md' + const rm = fs.readFileSync(p, 'utf8') + const check = t => { + t.equal(chunks.join(''), rm) + chunks.length = 0 + t.end() + } + + t.test('sync', t => { + const ss = new Collector() + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', readSize: 256 }) + str.pipe(ss) + check(t) + }) + + return t.test('async', t => { + const ss = new Collector() + const str = new fsm.ReadStream(p, { encoding: 'utf8', readSize: 256 }) + str.pipe(ss) + str.on('end', _ => check(t)) + }) +}) + +t.test('fail open', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('open', poop)) + t.throws(_ => new fsm.ReadStreamSync(__filename), poop) + const str = new fsm.ReadStream(__filename) + str.on('error', er => { + t.equal(er, poop) + t.end() + }) +}) + +t.test('type errors', t => { + const er = new TypeError('this is a readable stream') + t.throws(_ => new fsm.ReadStream(__filename).write('hello'), er) + t.throws(_ => new fsm.ReadStream(__filename).end(), er) + const pathstr = new TypeError('path must be a string') + t.throws(_ => new fsm.ReadStream(1234), pathstr) + t.end() +}) + +t.test('fail read', t => { + const poop = new Error('poop') + const badFDs = new Set() + const read = fs.read + const readSync = fs.readSync + const open = fs.open + const openSync = fs.openSync + + t.teardown(_ => { + fs.open = open + fs.openSync = openSync + fs.read = read + fs.readSync = readSync + }) + + fs.open = (path, flags, cb) => { + if (path === __filename) + open(path, flags, (er, fd) => { + if (!er) + badFDs.add(fd) + return cb(er, fd) + }) + else + open(path, flags, cb) + } + + fs.openSync = (path, flags) => { + const fd = openSync(path, flags) + if (path === __filename) + badFDs.add(fd) + return fd + } + + fs.read = function (fd, buf, offset, length, pos, cb) { + if (badFDs.has(fd)) + process.nextTick(_ => cb(new Error('poop'))) + else + read(fd, buf, offset, length, pos, cb) + } + + fs.readSync = function (fd, buf, offset, length, pos) { + if (badFDs.has(fd)) + throw new Error('poop sync') + } + + t.throws(_ => new fsm.ReadStreamSync(__filename)) + + t.test('async', t => { + const str = new fsm.ReadStream(__filename) + str.once('error', er => { + str.on('error', er => { + console.error('got an other error', er) + }) + t.match(er, poop) + t.end() + }) + }) + + t.end() +}) + +t.test('fd test', t => { + const p = __dirname + '/../README.md' + const rm = fs.readFileSync(p, 'utf8') + const check = (t, res) => { + t.equal(rm, res) + t.end() + } + + t.test('sync', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', fd: fd }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + str.on('data', chunk => out.push(chunk)) + check(t, out.join('')) + }) + + t.test('sync using read()', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStreamSync(p, { encoding: 'utf8', fd: fd }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + let chunk + while (chunk = str.read()) + out.push(chunk) + check(t, out.join('')) + }) + + t.test('async', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStream(p, { encoding: 'utf8', fd: fd }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + t.equal(str.read(), null) + str.on('data', chunk => out.push(chunk)) + str.on('end', _ => check(t, out.join(''))) + }) + + t.end() +}) + +t.test('fd test, no autoClose', t => { + const p = __dirname + '/../README.md' + const rm = fs.readFileSync(p, 'utf8') + const check = (t, res, fd) => { + // will throw EBADF if already closed + fs.closeSync(fd) + t.equal(rm, res) + t.end() + } + + t.test('sync', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStreamSync(p, { + encoding: 'utf8', + fd: fd, + autoClose: false + }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + str.on('data', chunk => out.push(chunk)) + check(t, out.join(''), fd) + }) + + t.test('sync using read()', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStreamSync(p, { + encoding: 'utf8', + fd: fd, + autoClose: false + }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + let chunk + while (chunk = str.read()) + out.push(chunk) + check(t, out.join(''), fd) + }) + + t.test('async', t => { + const fd = fs.openSync(p, 'r') + const str = new fsm.ReadStream(p, { + encoding: 'utf8', + fd: fd, + autoClose: false + }) + t.isa(str.fd, 'number') + t.equal(str.path, p) + const out = [] + t.equal(str.read(), null) + str.on('data', chunk => out.push(chunk)) + str.on('end', _ => check(t, out.join(''), fd)) + }) + + t.end() +}) diff --git a/fs-minipass/test/write.js b/fs-minipass/test/write.js new file mode 100644 index 0000000..4ccfde1 --- /dev/null +++ b/fs-minipass/test/write.js @@ -0,0 +1,494 @@ +'use strict' + +const t = require('tap') +const fsm = require('../') +const fs = require('fs') +const EE = require('events').EventEmitter +const mutateFS = require('mutate-fs') + +t.test('basic write', t => { + const p = __dirname + '/basic-write' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + new fsm.WriteStreamSync(p).end('ok') + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p) + s.end('ok') + s.on('close', _ => check(t)) + }) + + t.end() +}) + +t.test('write then end', t => { + const p = __dirname + '/write-then-end' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'okend') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const s = new fsm.WriteStreamSync(p) + s.write('ok') + s.end('end') + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p) + s.write('ok') + s.end('end') + t.equal(s.fd, null) + t.equal(s.path, p) + s.on('open', fd => { + t.equal(fd, s.fd) + t.isa(fd, 'number') + }) + s.on('finish', _ => check(t)) + }) + + t.end() +}) + +t.test('multiple writes', t => { + const p = __dirname + '/multiple-writes' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'abcdefghijklmnop') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const s = new fsm.WriteStreamSync(p) + s.write('a') + s.write('b') + s.write('c') + s.write('d') + s.write('e') + s.write('f') + s.write(new Buffer('676869', 'hex')) + s.write('jklm') + s.write(new Buffer('nop')) + s.end() + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p) + s.write('a') + s.write('b') + s.write('c') + s.write('d') + s.write('e') + s.write('f') + s.write(new Buffer('676869', 'hex')) + s.write('jklm') + s.write(new Buffer('nop')) + s.end() + s.on('finish', _ => check(t)) + }) + + t.test('async after open', t => { + const s = new fsm.WriteStream(p) + s.on('open', fd => { + t.isa(fd, 'number') + t.ok(s.write('a')) + t.notOk(s.write('b')) + t.notOk(s.write('c')) + t.notOk(s.write('d')) + t.notOk(s.write('e')) + t.notOk(s.write('f')) + t.notOk(s.write(new Buffer('676869', 'hex'))) + t.notOk(s.write('jklm')) + t.notOk(s.write(new Buffer('nop'))) + s.end() + s.on('finish', _ => check(t)) + }) + }) + + t.test('async after open, drains', t => { + const s = new fsm.WriteStream(p) + s.on('open', fd => { + t.isa(fd, 'number') + t.ok(s.write('a')) + t.notOk(s.write('b')) + s.once('drain', _ => { + t.ok(s.write('c')) + t.notOk(s.write('d')) + t.notOk(s.write('e')) + s.once('drain', _ => { + t.ok(s.write('f')) + t.notOk(s.write(new Buffer('676869', 'hex'))) + t.notOk(s.write('jklm')) + t.notOk(s.write(new Buffer('nop'))) + s.once('drain', _ => s.end()) + }) + }) + s.on('finish', _ => check(t)) + }) + }) + t.end() +}) + +t.test('flags', t => { + const p = __dirname + '/flags' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + new fsm.WriteStreamSync(p, { flags: 'w+' }).end('ok') + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p, { flags: 'w+' }) + s.end('ok') + s.on('finish', _ => check(t)) + }) + + t.end() +}) + +t.test('mode', t => { + const p = __dirname + '/mode' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + t.equal(fs.statSync(p).mode & 0o777, 0o700) + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + new fsm.WriteStreamSync(p, { mode: 0o700 }).end('ok') + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p, { mode: 0o700 }) + s.end('ok') + s.on('finish', _ => check(t)) + }) + + t.end() +}) + +t.test('write after end', t => { + const p = __dirname + '/write-after-end' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const s = new fsm.WriteStreamSync(p, { mode: 0o700 }) + s.end('ok') + t.throws(_ => s.write('626164', 'hex'), + new Error('write() after end()')) + check(t) + }) + + t.test('async', t => { + const s = new fsm.WriteStream(p, { mode: 0o700 }) + s.end('ok') + s.on('error', e => { + t.match(e, new Error('write() after end()')) + s.on('finish', _ => check(t)) + }) + s.write('626164', 'hex') + }) + + t.end() +}) + +t.test('fd', t => { + const p = __dirname + '/fd' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const fd = fs.openSync(p, 'w') + new fsm.WriteStreamSync(p, { fd: fd }).end('ok') + check(t) + }) + + t.test('async', t => { + const fd = fs.openSync(p, 'w') + const s = new fsm.WriteStream(p, { fd: fd }) + s.end('ok') + s.on('finish', _ => check(t)) + }) + + t.end() +}) + +t.test('empty write', t => { + const p = __dirname + '/empty-write' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), '') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + t.test('empty string', t => { + new fsm.WriteStreamSync(p).end('') + check(t) + }) + t.test('no chunk to end', t => { + new fsm.WriteStreamSync(p).end('') + check(t) + }) + t.end() + }) + + return t.test('async', t => { + t.test('immediate', t => { + t.test('no chunk to end', t => { + const s = new fsm.WriteStream(p) + s.end() + s.on('finish', _ => check(t)) + }) + + return t.test('empty string', t => { + const s = new fsm.WriteStream(p) + s.end('') + s.on('finish', _ => check(t)) + }) + }) + + return t.test('end on open', t => { + t.test('no chunk to end', t => { + const s = new fsm.WriteStream(p) + s.on('open', _ => s.end()) + s.on('finish', _ => check(t)) + }) + + return t.test('empty string', t => { + const s = new fsm.WriteStream(p) + s.on('open', _ => s.end('')) + s.on('finish', _ => check(t)) + }) + }) + }) +}) + +t.test('fail open', t => { + const p = __dirname + '/fail-open' + const poop = new Error('poop') + t.teardown(mutateFS.fail('open', poop)) + t.throws(_ => new fsm.WriteStreamSync(p), poop) + const str = new fsm.WriteStream(p) + str.on('error', er => { + t.equal(er, poop) + t.end() + }) +}) + +t.test('fail write', t => { + const p = __dirname + '/fail-write' + const poop = new Error('poop') + t.teardown(mutateFS.fail('write', poop)) + + t.throws(_ => new fsm.WriteStreamSync(p).write('foo'), poop) + const str = new fsm.WriteStream(p) + str.write('foo') + str.on('error', er => { + t.equal(er, poop) + fs.unlinkSync(p) + t.end() + }) +}) + +t.test('positioned write', t => { + const p = __dirname + '/positioned-write' + const write = new Buffer('this is the data that is written') + + const data = Buffer.allocUnsafe(256) + for (let i = 0; i < 256; i++) { + data[i] = i + } + + const expect = new Buffer(data.toString('hex'), 'hex') + for (let i = 0; i < write.length; i++) { + expect[i + 100] = write[i] + } + + const check = t => { + t.same(fs.readFileSync(p), expect) + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + fs.writeFileSync(p, data) + new fsm.WriteStreamSync(p, { start: 100 }).end(write) + check(t) + }) + + t.test('async', t => { + fs.writeFileSync(p, data) + const s = new fsm.WriteStream(p, { start: 100 }) + s.end(write) + s.on('finish', _ => check(t)) + }) + + t.end() +}) + +t.test('positioned then unpositioned', t => { + const p = __dirname + '/positioned-then-unpositioned' + const write = new Buffer('this is the data that is written') + + const data = Buffer.allocUnsafe(256) + for (let i = 0; i < 256; i++) { + data[i] = i + } + + const expect = new Buffer(data.toString('hex'), 'hex') + for (let i = 0; i < write.length; i++) { + expect[i + 100] = write[i] + } + + const check = t => { + t.same(fs.readFileSync(p), expect) + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + fs.writeFileSync(p, data) + const s = new fsm.WriteStreamSync(p, { start: 100 }) + s.write(write.slice(0, 20)) + s.end(write.slice(20)) + check(t) + }) + + t.test('async', t => { + fs.writeFileSync(p, data) + const s = new fsm.WriteStream(p, { start: 100 }) + s.write(write.slice(0, 20)) + s.end(write.slice(20)) + s.on('close', _ => check(t)) + }) + + t.end() +}) + +t.test('positioned then unpositioned at zero', t => { + const p = __dirname + '/positioned-then-unpositioned' + const write = new Buffer('this is the data that is written') + + const data = Buffer.allocUnsafe(256) + for (let i = 0; i < 256; i++) { + data[i] = i + } + + const expect = new Buffer(data.toString('hex'), 'hex') + for (let i = 0; i < write.length; i++) { + expect[i] = write[i] + } + + const check = t => { + t.same(fs.readFileSync(p), expect) + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + fs.writeFileSync(p, data) + const s = new fsm.WriteStreamSync(p, { start: 0 }) + s.write(write.slice(0, 20)) + s.end(write.slice(20)) + check(t) + }) + + t.test('async', t => { + fs.writeFileSync(p, data) + const s = new fsm.WriteStream(p, { start: 0 }) + s.write(write.slice(0, 20)) + s.end(write.slice(20)) + s.on('close', _ => check(t)) + }) + + t.end() +}) + +t.test('fd, no autoClose', t => { + const p = __dirname + '/fd-no-autoclose' + + const check = (t, fd) => { + fs.closeSync(fd) + t.equal(fs.readFileSync(p, 'utf8'), 'ok') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const fd = fs.openSync(p, 'w') + new fsm.WriteStreamSync(p, { fd: fd, autoClose: false }).end('ok') + check(t, fd) + }) + + t.test('async', t => { + const fd = fs.openSync(p, 'w') + const s = new fsm.WriteStream(p, { fd: fd, autoClose: false }) + s.end('ok') + s.on('finish', _ => check(t, fd)) + }) + + t.end() +}) + +t.test('positioned, nonexistent file', t => { + const p = __dirname + '/pos-noent' + + const check = t => { + t.equal(fs.readFileSync(p, 'utf8'), '\0\0asdf\0\0\0\0asdf') + fs.unlinkSync(p) + t.end() + } + + t.test('sync', t => { + const w = new fsm.WriteStreamSync(p, { start: 10 }) + w.end('asdf') + const w2 = new fsm.WriteStreamSync(p, { start: 2 }) + w2.end('asdf') + check(t) + }) + + t.test('async', t => { + const w = new fsm.WriteStream(p, { start: 10 }) + w.end('asdf') + w.on('close', _ => { + const w = new fsm.WriteStream(p, { start: 2 }) + w.end('asdf') + w.on('close', _ => check(t)) + }) + }) + + t.end() +}) diff --git a/index.js b/index.js new file mode 100644 index 0000000..1c0b826 --- /dev/null +++ b/index.js @@ -0,0 +1,18 @@ +'use strict' + +// high-level commands +exports.c = exports.create = exports.Create = require('./lib/create.js') +exports.r = exports.replace = exports.Replace = require('./lib/replace.js') +exports.t = exports.list = exports.List = require('./lib/list.js') +exports.u = exports.update = exports.Update = require('./lib/update.js') +exports.x = exports.extract = exports.Extract = require('./lib/extract.js') + +// classes +exports.Pack = require('./lib/pack.js') +exports.Unpack = require('./lib/unpack.js') +exports.Parse = require('./lib/parse.js') +exports.ReadEntry = require('./lib/read-entry.js') +exports.WriteEntry = require('./lib/write-entry.js') +exports.Header = require('./lib/header.js') +exports.Pax = require('./lib/pax.js') +exports.types = require('./lib/types.js') diff --git a/lib/create.js b/lib/create.js new file mode 100644 index 0000000..d033640 --- /dev/null +++ b/lib/create.js @@ -0,0 +1,104 @@ +'use strict' + +// tar -c +const hlo = require('./high-level-opt.js') + +const Pack = require('./pack.js') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +module.exports = (opt_, files, cb) => { + if (typeof files === 'function') + cb = files + + if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + return opt.file && opt.sync ? createFileSync(opt, files) + : opt.file ? createFile(opt, files, cb) + : opt.sync ? createSync(opt, files) + : create(opt, files) +} + +const createFileSync = (opt, files) => { + const p = new Pack.Sync(opt) + const stream = new fsm.WriteStreamSync(opt.file, { + mode: opt.mode || 0o666, + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const createFile = (opt, files, cb) => { + const p = new Pack(opt) + const stream = new fsm.WriteStream(opt.file, { + mode: opt.mode || 0o666, + }) + p.pipe(stream) + + const promise = new Promise((res, rej) => { + stream.on('error', rej) + stream.on('close', res) + p.on('error', rej) + }) + + addFilesAsync(p, files) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry), + }) + } else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') { + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry), + }).then(_ => addFilesAsync(p, files)) + } else + p.add(file) + } + p.end() +} + +const createSync = (opt, files) => { + const p = new Pack.Sync(opt) + addFilesSync(p, files) + return p +} + +const create = (opt, files) => { + const p = new Pack(opt) + addFilesAsync(p, files) + return p +} diff --git a/lib/extract.js b/lib/extract.js new file mode 100644 index 0000000..98e946e --- /dev/null +++ b/lib/extract.js @@ -0,0 +1,107 @@ +'use strict' + +// tar -x +const hlo = require('./high-level-opt.js') +const Unpack = require('./unpack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') +const stripSlash = require('./strip-trailing-slashes.js') + +module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + return opt.file && opt.sync ? extractFileSync(opt) + : opt.file ? extractFile(opt, cb) + : opt.sync ? extractSync(opt) + : extract(opt) +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [stripSlash(f), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file)) + : file => mapHas(stripSlash(file)) +} + +const extractFileSync = opt => { + const u = new Unpack.Sync(opt) + + const file = opt.file + const stat = fs.statSync(file) + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16 * 1024 * 1024 + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size, + }) + stream.pipe(u) +} + +const extractFile = (opt, cb) => { + const u = new Unpack(opt) + const readSize = opt.maxReadSize || 16 * 1024 * 1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + u.on('error', reject) + u.on('close', resolve) + + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }) + stream.on('error', reject) + stream.pipe(u) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const extractSync = opt => new Unpack.Sync(opt) + +const extract = opt => new Unpack(opt) diff --git a/lib/get-write-flag.js b/lib/get-write-flag.js new file mode 100644 index 0000000..e869599 --- /dev/null +++ b/lib/get-write-flag.js @@ -0,0 +1,20 @@ +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +// Only supported in Node v12.9.0 and above. +const platform = process.env.__FAKE_PLATFORM__ || process.platform +const isWindows = platform === 'win32' +const fs = global.__FAKE_TESTING_FS__ || require('fs') + +/* istanbul ignore next */ +const { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs.constants + +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP +const fMapLimit = 512 * 1024 +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY +module.exports = !fMapEnabled ? () => 'w' + : size => size < fMapLimit ? fMapFlag : 'w' diff --git a/lib/header.js b/lib/header.js new file mode 100644 index 0000000..1295040 --- /dev/null +++ b/lib/header.js @@ -0,0 +1,288 @@ +'use strict' +// parse a 512-byte header block to a data object, or vice-versa +// encode returns `true` if a pax extended header is needed, because +// the data could not be faithfully encoded in a simple header. +// (Also, check header.needPax to see if it needs a pax header.) + +const types = require('./types.js') +const pathModule = require('path').posix +const large = require('./large-numbers.js') + +const SLURP = Symbol('slurp') +const TYPE = Symbol('type') + +class Header { + constructor (data, off, ex, gex) { + this.cksumValid = false + this.needPax = false + this.nullBlock = false + + this.block = null + this.path = null + this.mode = null + this.uid = null + this.gid = null + this.size = null + this.mtime = null + this.cksum = null + this[TYPE] = '0' + this.linkpath = null + this.uname = null + this.gname = null + this.devmaj = 0 + this.devmin = 0 + this.atime = null + this.ctime = null + + if (Buffer.isBuffer(data)) + this.decode(data, off || 0, ex, gex) + else if (data) + this.set(data) + } + + decode (buf, off, ex, gex) { + if (!off) + off = 0 + + if (!buf || !(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + this.path = decString(buf, off, 100) + this.mode = decNumber(buf, off + 100, 8) + this.uid = decNumber(buf, off + 108, 8) + this.gid = decNumber(buf, off + 116, 8) + this.size = decNumber(buf, off + 124, 12) + this.mtime = decDate(buf, off + 136, 12) + this.cksum = decNumber(buf, off + 148, 12) + + // if we have extended or global extended headers, apply them now + // See https://github.com/npm/node-tar/pull/187 + this[SLURP](ex) + this[SLURP](gex, true) + + // old tar versions marked dirs as a file with a trailing / + this[TYPE] = decString(buf, off + 156, 1) + if (this[TYPE] === '') + this[TYPE] = '0' + if (this[TYPE] === '0' && this.path.substr(-1) === '/') + this[TYPE] = '5' + + // tar implementations sometimes incorrectly put the stat(dir).size + // as the size in the tarball, even though Directory entries are + // not able to have any body at all. In the very rare chance that + // it actually DOES have a body, we weren't going to do anything with + // it anyway, and it'll just be a warning about an invalid header. + if (this[TYPE] === '5') + this.size = 0 + + this.linkpath = decString(buf, off + 157, 100) + if (buf.slice(off + 257, off + 265).toString() === 'ustar\u000000') { + this.uname = decString(buf, off + 265, 32) + this.gname = decString(buf, off + 297, 32) + this.devmaj = decNumber(buf, off + 329, 8) + this.devmin = decNumber(buf, off + 337, 8) + if (buf[off + 475] !== 0) { + // definitely a prefix, definitely >130 chars. + const prefix = decString(buf, off + 345, 155) + this.path = prefix + '/' + this.path + } else { + const prefix = decString(buf, off + 345, 130) + if (prefix) + this.path = prefix + '/' + this.path + this.atime = decDate(buf, off + 476, 12) + this.ctime = decDate(buf, off + 488, 12) + } + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) + sum += buf[i] + + for (let i = off + 156; i < off + 512; i++) + sum += buf[i] + + this.cksumValid = sum === this.cksum + if (this.cksum === null && sum === 8 * 0x20) + this.nullBlock = true + } + + [SLURP] (ex, global) { + for (const k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] + } + } + + encode (buf, off) { + if (!buf) { + buf = this.block = Buffer.alloc(512) + off = 0 + } + + if (!off) + off = 0 + + if (!(buf.length >= off + 512)) + throw new Error('need 512 bytes for header') + + const prefixSize = this.ctime || this.atime ? 130 : 155 + const split = splitPrefix(this.path || '', prefixSize) + const path = split[0] + const prefix = split[1] + this.needPax = split[2] + + this.needPax = encString(buf, off, 100, path) || this.needPax + this.needPax = encNumber(buf, off + 100, 8, this.mode) || this.needPax + this.needPax = encNumber(buf, off + 108, 8, this.uid) || this.needPax + this.needPax = encNumber(buf, off + 116, 8, this.gid) || this.needPax + this.needPax = encNumber(buf, off + 124, 12, this.size) || this.needPax + this.needPax = encDate(buf, off + 136, 12, this.mtime) || this.needPax + buf[off + 156] = this[TYPE].charCodeAt(0) + this.needPax = encString(buf, off + 157, 100, this.linkpath) || this.needPax + buf.write('ustar\u000000', off + 257, 8) + this.needPax = encString(buf, off + 265, 32, this.uname) || this.needPax + this.needPax = encString(buf, off + 297, 32, this.gname) || this.needPax + this.needPax = encNumber(buf, off + 329, 8, this.devmaj) || this.needPax + this.needPax = encNumber(buf, off + 337, 8, this.devmin) || this.needPax + this.needPax = encString(buf, off + 345, prefixSize, prefix) || this.needPax + if (buf[off + 475] !== 0) + this.needPax = encString(buf, off + 345, 155, prefix) || this.needPax + else { + this.needPax = encString(buf, off + 345, 130, prefix) || this.needPax + this.needPax = encDate(buf, off + 476, 12, this.atime) || this.needPax + this.needPax = encDate(buf, off + 488, 12, this.ctime) || this.needPax + } + + let sum = 8 * 0x20 + for (let i = off; i < off + 148; i++) + sum += buf[i] + + for (let i = off + 156; i < off + 512; i++) + sum += buf[i] + + this.cksum = sum + encNumber(buf, off + 148, 8, this.cksum) + this.cksumValid = true + + return this.needPax + } + + set (data) { + for (const i in data) { + if (data[i] !== null && data[i] !== undefined) + this[i] = data[i] + } + } + + get type () { + return types.name.get(this[TYPE]) || this[TYPE] + } + + get typeKey () { + return this[TYPE] + } + + set type (type) { + if (types.code.has(type)) + this[TYPE] = types.code.get(type) + else + this[TYPE] = type + } +} + +const splitPrefix = (p, prefixSize) => { + const pathSize = 100 + let pp = p + let prefix = '' + let ret + const root = pathModule.parse(p).root || '.' + + if (Buffer.byteLength(pp) < pathSize) + ret = [pp, prefix, false] + else { + // first set prefix to the dir, and path to the base + prefix = pathModule.dirname(pp) + pp = pathModule.basename(pp) + + do { + // both fit! + if (Buffer.byteLength(pp) <= pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp, prefix, false] + + // prefix fits in prefix, but path doesn't fit in path + else if (Buffer.byteLength(pp) > pathSize && + Buffer.byteLength(prefix) <= prefixSize) + ret = [pp.substr(0, pathSize - 1), prefix, true] + + else { + // make path take a bit from prefix + pp = pathModule.join(pathModule.basename(prefix), pp) + prefix = pathModule.dirname(prefix) + } + } while (prefix !== root && !ret) + + // at this point, found no resolution, just truncate + if (!ret) + ret = [p.substr(0, pathSize - 1), '', true] + } + return ret +} + +const decString = (buf, off, size) => + buf.slice(off, off + size).toString('utf8').replace(/\0.*/, '') + +const decDate = (buf, off, size) => + numToDate(decNumber(buf, off, size)) + +const numToDate = num => num === null ? null : new Date(num * 1000) + +const decNumber = (buf, off, size) => + buf[off] & 0x80 ? large.parse(buf.slice(off, off + size)) + : decSmallNumber(buf, off, size) + +const nanNull = value => isNaN(value) ? null : value + +const decSmallNumber = (buf, off, size) => + nanNull(parseInt( + buf.slice(off, off + size) + .toString('utf8').replace(/\0.*$/, '').trim(), 8)) + +// the maximum encodable as a null-terminated octal, by field size +const MAXNUM = { + 12: 0o77777777777, + 8: 0o7777777, +} + +const encNumber = (buf, off, size, number) => + number === null ? false : + number > MAXNUM[size] || number < 0 + ? (large.encode(number, buf.slice(off, off + size)), true) + : (encSmallNumber(buf, off, size, number), false) + +const encSmallNumber = (buf, off, size, number) => + buf.write(octalString(number, size), off, size, 'ascii') + +const octalString = (number, size) => + padOctal(Math.floor(number).toString(8), size) + +const padOctal = (string, size) => + (string.length === size - 1 ? string + : new Array(size - string.length - 1).join('0') + string + ' ') + '\0' + +const encDate = (buf, off, size, date) => + date === null ? false : + encNumber(buf, off, size, date.getTime() / 1000) + +// enough to fill the longest string we've got +const NULLS = new Array(156).join('\0') +// pad with nulls, return true if it's longer or non-ascii +const encString = (buf, off, size, string) => + string === null ? false : + (buf.write(string + NULLS, off, size, 'utf8'), + string.length !== Buffer.byteLength(string) || string.length > size) + +module.exports = Header diff --git a/lib/high-level-opt.js b/lib/high-level-opt.js new file mode 100644 index 0000000..40e4418 --- /dev/null +++ b/lib/high-level-opt.js @@ -0,0 +1,29 @@ +'use strict' + +// turn tar(1) style args like `C` into the more verbose things like `cwd` + +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'], +]) + +module.exports = opt => opt ? Object.keys(opt).map(k => [ + argmap.has(k) ? argmap.get(k) : k, opt[k], +]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {} diff --git a/lib/large-numbers.js b/lib/large-numbers.js new file mode 100644 index 0000000..dd6f690 --- /dev/null +++ b/lib/large-numbers.js @@ -0,0 +1,99 @@ +'use strict' +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. + +const encode = (num, buf) => { + if (!Number.isSafeInteger(num)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range') + else if (num < 0) + encodeNegative(num, buf) + else + encodePositive(num, buf) + return buf +} + +const encodePositive = (num, buf) => { + buf[0] = 0x80 + + for (var i = buf.length; i > 1; i--) { + buf[i - 1] = num & 0xff + num = Math.floor(num / 0x100) + } +} + +const encodeNegative = (num, buf) => { + buf[0] = 0xff + var flipped = false + num = num * -1 + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff + num = Math.floor(num / 0x100) + if (flipped) + buf[i - 1] = onesComp(byte) + else if (byte === 0) + buf[i - 1] = 0 + else { + flipped = true + buf[i - 1] = twosComp(byte) + } + } +} + +const parse = (buf) => { + const pre = buf[0] + const value = pre === 0x80 ? pos(buf.slice(1, buf.length)) + : pre === 0xff ? twos(buf) + : null + if (value === null) + throw Error('invalid base256 encoding') + + if (!Number.isSafeInteger(value)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('parsed number outside of javascript safe integer range') + + return value +} + +const twos = (buf) => { + var len = buf.length + var sum = 0 + var flipped = false + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + var f + if (flipped) + f = onesComp(byte) + else if (byte === 0) + f = byte + else { + flipped = true + f = twosComp(byte) + } + if (f !== 0) + sum -= f * Math.pow(256, len - i - 1) + } + return sum +} + +const pos = (buf) => { + var len = buf.length + var sum = 0 + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + if (byte !== 0) + sum += byte * Math.pow(256, len - i - 1) + } + return sum +} + +const onesComp = byte => (0xff ^ byte) & 0xff + +const twosComp = byte => ((0xff ^ byte) + 1) & 0xff + +module.exports = { + encode, + parse, +} diff --git a/lib/list.js b/lib/list.js new file mode 100644 index 0000000..a0c1cf2 --- /dev/null +++ b/lib/list.js @@ -0,0 +1,132 @@ +'use strict' + +// XXX: This shares a lot in common with extract.js +// maybe some DRY opportunity here? + +// tar -t +const hlo = require('./high-level-opt.js') +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') +const stripSlash = require('./strip-trailing-slashes.js') + +module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') + + if (files.length) + filesFilter(opt, files) + + if (!opt.noResume) + onentryFunction(opt) + + return opt.file && opt.sync ? listFileSync(opt) + : opt.file ? listFile(opt, cb) + : list(opt) +} + +const onentryFunction = opt => { + const onentry = opt.onentry + opt.onentry = onentry ? e => { + onentry(e) + e.resume() + } : e => e.resume() +} + +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [stripSlash(f), true])) + const filter = opt.filter + + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) + + map.set(file, ret) + return ret + } + + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(stripSlash(file)) + : file => mapHas(stripSlash(file)) +} + +const listFileSync = opt => { + const p = list(opt) + const file = opt.file + let threw = true + let fd + try { + const stat = fs.statSync(file) + const readSize = opt.maxReadSize || 16 * 1024 * 1024 + if (stat.size < readSize) + p.end(fs.readFileSync(file)) + else { + let pos = 0 + const buf = Buffer.allocUnsafe(readSize) + fd = fs.openSync(file, 'r') + while (pos < stat.size) { + const bytesRead = fs.readSync(fd, buf, 0, readSize, pos) + pos += bytesRead + p.write(buf.slice(0, bytesRead)) + } + p.end() + } + threw = false + } finally { + if (threw && fd) { + try { + fs.closeSync(fd) + } catch (er) {} + } + } +} + +const listFile = (opt, cb) => { + const parse = new Parser(opt) + const readSize = opt.maxReadSize || 16 * 1024 * 1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + parse.on('error', reject) + parse.on('end', resolve) + + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size, + }) + stream.on('error', reject) + stream.pipe(parse) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const list = opt => new Parser(opt) diff --git a/lib/mkdir.js b/lib/mkdir.js new file mode 100644 index 0000000..a0719e6 --- /dev/null +++ b/lib/mkdir.js @@ -0,0 +1,213 @@ +'use strict' +// wrapper around mkdirp for tar's needs. + +// TODO: This should probably be a class, not functionally +// passing around state in a gazillion args. + +const mkdirp = require('mkdirp') +const fs = require('fs') +const path = require('path') +const chownr = require('chownr') +const normPath = require('./normalize-windows-path.js') + +class SymlinkError extends Error { + constructor (symlink, path) { + super('Cannot extract through symbolic link') + this.path = path + this.symlink = symlink + } + + get name () { + return 'SylinkError' + } +} + +class CwdError extends Error { + constructor (path, code) { + super(code + ': Cannot cd into \'' + path + '\'') + this.path = path + this.code = code + } + + get name () { + return 'CwdError' + } +} + +const cGet = (cache, key) => cache.get(normPath(key)) +const cSet = (cache, key, val) => cache.set(normPath(key), val) + +const checkCwd = (dir, cb) => { + fs.stat(dir, (er, st) => { + if (er || !st.isDirectory()) + er = new CwdError(dir, er && er.code || 'ENOTDIR') + cb(er) + }) +} + +module.exports = (dir, opt, cb) => { + dir = normPath(dir) + + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = normPath(opt.cwd) + + const done = (er, created) => { + if (er) + cb(er) + else { + cSet(cache, dir, true) + if (created && doChown) + chownr(created, uid, gid, er => done(er)) + else if (needChmod) + fs.chmod(dir, mode, cb) + else + cb() + } + } + + if (cache && cGet(cache, dir) === true) + return done() + + if (dir === cwd) + return checkCwd(dir, done) + + if (preserve) + return mkdirp(dir, {mode}).then(made => done(null, made), done) + + const sub = normPath(path.relative(cwd, dir)) + const parts = sub.split('/') + mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done) +} + +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) + return cb(null, created) + const p = parts.shift() + const part = normPath(path.resolve(base + '/' + p)) + if (cGet(cache, part)) + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) +} + +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => { + if (er) { + fs.lstat(part, (statEr, st) => { + if (statEr) { + statEr.path = statEr.path && normPath(statEr.path) + cb(statEr) + } else if (st.isDirectory()) + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + else if (unlink) { + fs.unlink(part, er => { + if (er) + return cb(er) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) + }) + } else if (st.isSymbolicLink()) + return cb(new SymlinkError(part, part + '/' + parts.join('/'))) + else + cb(er) + }) + } else { + created = created || part + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + } +} + +const checkCwdSync = dir => { + let ok = false + let code = 'ENOTDIR' + try { + ok = fs.statSync(dir).isDirectory() + } catch (er) { + code = er.code + } finally { + if (!ok) + throw new CwdError(dir, code) + } +} + +module.exports.sync = (dir, opt) => { + dir = normPath(dir) + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 + + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + (uid !== opt.processUid || gid !== opt.processGid) + + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = normPath(opt.cwd) + + const done = (created) => { + cSet(cache, dir, true) + if (created && doChown) + chownr.sync(created, uid, gid) + if (needChmod) + fs.chmodSync(dir, mode) + } + + if (cache && cGet(cache, dir) === true) + return done() + + if (dir === cwd) { + checkCwdSync(cwd) + return done() + } + + if (preserve) + return done(mkdirp.sync(dir, mode)) + + const sub = normPath(path.relative(cwd, dir)) + const parts = sub.split('/') + let created = null + for (let p = parts.shift(), part = cwd; + p && (part += '/' + p); + p = parts.shift()) { + part = normPath(path.resolve(part)) + if (cGet(cache, part)) + continue + + try { + fs.mkdirSync(part, mode) + created = created || part + cSet(cache, part, true) + } catch (er) { + const st = fs.lstatSync(part) + if (st.isDirectory()) { + cSet(cache, part, true) + continue + } else if (unlink) { + fs.unlinkSync(part) + fs.mkdirSync(part, mode) + created = created || part + cSet(cache, part, true) + continue + } else if (st.isSymbolicLink()) + return new SymlinkError(part, part + '/' + parts.join('/')) + } + } + + return done(created) +} diff --git a/lib/mode-fix.js b/lib/mode-fix.js new file mode 100644 index 0000000..6a045ff --- /dev/null +++ b/lib/mode-fix.js @@ -0,0 +1,23 @@ +'use strict' +module.exports = (mode, isDir, portable) => { + mode &= 0o7777 + + // in portable mode, use the minimum reasonable umask + // if this system creates files with 0o664 by default + // (as some linux distros do), then we'll write the + // archive with 0o644 instead. Also, don't ever create + // a file that is not readable/writable by the owner. + if (portable) + mode = (mode | 0o600) & ~0o22 + + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) + mode |= 0o100 + if (mode & 0o40) + mode |= 0o10 + if (mode & 0o4) + mode |= 0o1 + } + return mode +} diff --git a/lib/normalize-unicode.js b/lib/normalize-unicode.js new file mode 100644 index 0000000..4aeb1d5 --- /dev/null +++ b/lib/normalize-unicode.js @@ -0,0 +1,11 @@ +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +const normalizeCache = Object.create(null) +const {hasOwnProperty} = Object.prototype +module.exports = s => { + if (!hasOwnProperty.call(normalizeCache, s)) + normalizeCache[s] = s.normalize('NFKD') + return normalizeCache[s] +} diff --git a/lib/normalize-windows-path.js b/lib/normalize-windows-path.js new file mode 100644 index 0000000..eb13ba0 --- /dev/null +++ b/lib/normalize-windows-path.js @@ -0,0 +1,8 @@ +// on windows, either \ or / are valid directory separators. +// on unix, \ is a valid character in filenames. +// so, on windows, and only on windows, we replace all \ chars with /, +// so that we can use / as our one and only directory separator char. + +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform +module.exports = platform !== 'win32' ? p => p + : p => p && p.replace(/\\/g, '/') diff --git a/lib/pack.js b/lib/pack.js new file mode 100644 index 0000000..9522c10 --- /dev/null +++ b/lib/pack.js @@ -0,0 +1,397 @@ +'use strict' + +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) + +class PackJob { + constructor (path, absolute) { + this.path = path || './' + this.absolute = absolute + this.entry = null + this.stat = null + this.readdir = null + this.pending = false + this.ignore = false + this.piped = false + } +} + +const MiniPass = require('minipass') +const zlib = require('minizlib') +const ReadEntry = require('./read-entry.js') +const WriteEntry = require('./write-entry.js') +const WriteEntrySync = WriteEntry.Sync +const WriteEntryTar = WriteEntry.Tar +const Yallist = require('yallist') +const EOF = Buffer.alloc(1024) +const ONSTAT = Symbol('onStat') +const ENDED = Symbol('ended') +const QUEUE = Symbol('queue') +const CURRENT = Symbol('current') +const PROCESS = Symbol('process') +const PROCESSING = Symbol('processing') +const PROCESSJOB = Symbol('processJob') +const JOBS = Symbol('jobs') +const JOBDONE = Symbol('jobDone') +const ADDFSENTRY = Symbol('addFSEntry') +const ADDTARENTRY = Symbol('addTarEntry') +const STAT = Symbol('stat') +const READDIR = Symbol('readdir') +const ONREADDIR = Symbol('onreaddir') +const PIPE = Symbol('pipe') +const ENTRY = Symbol('entry') +const ENTRYOPT = Symbol('entryOpt') +const WRITEENTRYCLASS = Symbol('writeEntryClass') +const WRITE = Symbol('write') +const ONDRAIN = Symbol('ondrain') + +const fs = require('fs') +const path = require('path') +const warner = require('./warn-mixin.js') +const normPath = require('./normalize-windows-path.js') + +const Pack = warner(class Pack extends MiniPass { + constructor (opt) { + super(opt) + opt = opt || Object.create(null) + this.opt = opt + this.file = opt.file || '' + this.cwd = opt.cwd || process.cwd() + this.maxReadSize = opt.maxReadSize + this.preservePaths = !!opt.preservePaths + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.prefix = normPath(opt.prefix || '') + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.readdirCache = opt.readdirCache || new Map() + + this[WRITEENTRYCLASS] = WriteEntry + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + this.portable = !!opt.portable + this.zip = null + if (opt.gzip) { + if (typeof opt.gzip !== 'object') + opt.gzip = {} + if (this.portable) + opt.gzip.portable = true + this.zip = new zlib.Gzip(opt.gzip) + this.zip.on('data', chunk => super.write(chunk)) + this.zip.on('end', _ => super.end()) + this.zip.on('drain', _ => this[ONDRAIN]()) + this.on('resume', _ => this.zip.resume()) + } else + this.on('drain', this[ONDRAIN]) + + this.noDirRecurse = !!opt.noDirRecurse + this.follow = !!opt.follow + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + + this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true + + this[QUEUE] = new Yallist() + this[JOBS] = 0 + this.jobs = +opt.jobs || 4 + this[PROCESSING] = false + this[ENDED] = false + } + + [WRITE] (chunk) { + return super.write(chunk) + } + + add (path) { + this.write(path) + return this + } + + end (path) { + if (path) + this.write(path) + this[ENDED] = true + this[PROCESS]() + return this + } + + write (path) { + if (this[ENDED]) + throw new Error('write after end') + + if (path instanceof ReadEntry) + this[ADDTARENTRY](path) + else + this[ADDFSENTRY](path) + return this.flowing + } + + [ADDTARENTRY] (p) { + const absolute = normPath(path.resolve(this.cwd, p.path)) + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) + p.resume() + else { + const job = new PackJob(p.path, absolute, false) + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) + job.entry.on('end', _ => this[JOBDONE](job)) + this[JOBS] += 1 + this[QUEUE].push(job) + } + + this[PROCESS]() + } + + [ADDFSENTRY] (p) { + const absolute = normPath(path.resolve(this.cwd, p)) + this[QUEUE].push(new PackJob(p, absolute)) + this[PROCESS]() + } + + [STAT] (job) { + job.pending = true + this[JOBS] += 1 + const stat = this.follow ? 'stat' : 'lstat' + fs[stat](job.absolute, (er, stat) => { + job.pending = false + this[JOBS] -= 1 + if (er) + this.emit('error', er) + else + this[ONSTAT](job, stat) + }) + } + + [ONSTAT] (job, stat) { + this.statCache.set(job.absolute, stat) + job.stat = stat + + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) + job.ignore = true + + this[PROCESS]() + } + + [READDIR] (job) { + job.pending = true + this[JOBS] += 1 + fs.readdir(job.absolute, (er, entries) => { + job.pending = false + this[JOBS] -= 1 + if (er) + return this.emit('error', er) + this[ONREADDIR](job, entries) + }) + } + + [ONREADDIR] (job, entries) { + this.readdirCache.set(job.absolute, entries) + job.readdir = entries + this[PROCESS]() + } + + [PROCESS] () { + if (this[PROCESSING]) + return + + this[PROCESSING] = true + for (let w = this[QUEUE].head; + w !== null && this[JOBS] < this.jobs; + w = w.next) { + this[PROCESSJOB](w.value) + if (w.value.ignore) { + const p = w.next + this[QUEUE].removeNode(w) + w.next = p + } + } + + this[PROCESSING] = false + + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) + this.zip.end(EOF) + else { + super.write(EOF) + super.end() + } + } + } + + get [CURRENT] () { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value + } + + [JOBDONE] (job) { + this[QUEUE].shift() + this[JOBS] -= 1 + this[PROCESS]() + } + + [PROCESSJOB] (job) { + if (job.pending) + return + + if (job.entry) { + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + return + } + + if (!job.stat) { + if (this.statCache.has(job.absolute)) + this[ONSTAT](job, this.statCache.get(job.absolute)) + else + this[STAT](job) + } + if (!job.stat) + return + + // filtered out! + if (job.ignore) + return + + if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { + if (this.readdirCache.has(job.absolute)) + this[ONREADDIR](job, this.readdirCache.get(job.absolute)) + else + this[READDIR](job) + if (!job.readdir) + return + } + + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job) + if (!job.entry) { + job.ignore = true + return + } + + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + } + + [ENTRYOPT] (job) { + return { + onwarn: (code, msg, data) => this.warn(code, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime, + prefix: this.prefix, + } + } + + [ENTRY] (job) { + this[JOBS] += 1 + try { + return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)) + } catch (er) { + this.emit('error', er) + } + } + + [ONDRAIN] () { + if (this[CURRENT] && this[CURRENT].entry) + this[CURRENT].entry.resume() + } + + // like .pipe() but using super, because our write() is special + [PIPE] (job) { + job.piped = true + + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + } + + const source = job.entry + const zip = this.zip + + if (zip) { + source.on('data', chunk => { + if (!zip.write(chunk)) + source.pause() + }) + } else { + source.on('data', chunk => { + if (!super.write(chunk)) + source.pause() + }) + } + } + + pause () { + if (this.zip) + this.zip.pause() + return super.pause() + } +}) + +class PackSync extends Pack { + constructor (opt) { + super(opt) + this[WRITEENTRYCLASS] = WriteEntrySync + } + + // pause/resume are no-ops in sync streams. + pause () {} + resume () {} + + [STAT] (job) { + const stat = this.follow ? 'statSync' : 'lstatSync' + this[ONSTAT](job, fs[stat](job.absolute)) + } + + [READDIR] (job, stat) { + this[ONREADDIR](job, fs.readdirSync(job.absolute)) + } + + // gotta get it all in this tick + [PIPE] (job) { + const source = job.entry + const zip = this.zip + + if (job.readdir) { + job.readdir.forEach(entry => { + const p = job.path + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) + } + + if (zip) { + source.on('data', chunk => { + zip.write(chunk) + }) + } else { + source.on('data', chunk => { + super[WRITE](chunk) + }) + } + } +} + +Pack.Sync = PackSync + +module.exports = Pack diff --git a/lib/parse.js b/lib/parse.js new file mode 100644 index 0000000..b1b4e7e --- /dev/null +++ b/lib/parse.js @@ -0,0 +1,481 @@ +'use strict' + +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away + +const warner = require('./warn-mixin.js') +const Header = require('./header.js') +const EE = require('events') +const Yallist = require('yallist') +const maxMetaEntrySize = 1024 * 1024 +const Entry = require('./read-entry.js') +const Pax = require('./pax.js') +const zlib = require('minizlib') + +const gzipHeader = Buffer.from([0x1f, 0x8b]) +const STATE = Symbol('state') +const WRITEENTRY = Symbol('writeEntry') +const READENTRY = Symbol('readEntry') +const NEXTENTRY = Symbol('nextEntry') +const PROCESSENTRY = Symbol('processEntry') +const EX = Symbol('extendedHeader') +const GEX = Symbol('globalExtendedHeader') +const META = Symbol('meta') +const EMITMETA = Symbol('emitMeta') +const BUFFER = Symbol('buffer') +const QUEUE = Symbol('queue') +const ENDED = Symbol('ended') +const EMITTEDEND = Symbol('emittedEnd') +const EMIT = Symbol('emit') +const UNZIP = Symbol('unzip') +const CONSUMECHUNK = Symbol('consumeChunk') +const CONSUMECHUNKSUB = Symbol('consumeChunkSub') +const CONSUMEBODY = Symbol('consumeBody') +const CONSUMEMETA = Symbol('consumeMeta') +const CONSUMEHEADER = Symbol('consumeHeader') +const CONSUMING = Symbol('consuming') +const BUFFERCONCAT = Symbol('bufferConcat') +const MAYBEEND = Symbol('maybeEnd') +const WRITING = Symbol('writing') +const ABORTED = Symbol('aborted') +const DONE = Symbol('onDone') +const SAW_VALID_ENTRY = Symbol('sawValidEntry') +const SAW_NULL_BLOCK = Symbol('sawNullBlock') +const SAW_EOF = Symbol('sawEOF') + +const noop = _ => true + +module.exports = warner(class Parser extends EE { + constructor (opt) { + opt = opt || {} + super(opt) + + this.file = opt.file || '' + + // set to boolean false when an entry starts. 1024 bytes of \0 + // is technically a valid tarball, albeit a boring one. + this[SAW_VALID_ENTRY] = null + + // these BADARCHIVE errors can't be detected early. listen on DONE. + this.on(DONE, _ => { + if (this[STATE] === 'begin' || this[SAW_VALID_ENTRY] === false) { + // either less than 1 block of data, or all entries were invalid. + // Either way, probably not even a tarball. + this.warn('TAR_BAD_ARCHIVE', 'Unrecognized archive format') + } + }) + + if (opt.ondone) + this.on(DONE, opt.ondone) + else { + this.on(DONE, _ => { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + }) + } + + this.strict = !!opt.strict + this.maxMetaEntrySize = opt.maxMetaEntrySize || maxMetaEntrySize + this.filter = typeof opt.filter === 'function' ? opt.filter : noop + + // have to set this so that streams are ok piping into it + this.writable = true + this.readable = false + + this[QUEUE] = new Yallist() + this[BUFFER] = null + this[READENTRY] = null + this[WRITEENTRY] = null + this[STATE] = 'begin' + this[META] = '' + this[EX] = null + this[GEX] = null + this[ENDED] = false + this[UNZIP] = null + this[ABORTED] = false + this[SAW_NULL_BLOCK] = false + this[SAW_EOF] = false + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + if (typeof opt.onentry === 'function') + this.on('entry', opt.onentry) + } + + [CONSUMEHEADER] (chunk, position) { + if (this[SAW_VALID_ENTRY] === null) + this[SAW_VALID_ENTRY] = false + let header + try { + header = new Header(chunk, position, this[EX], this[GEX]) + } catch (er) { + return this.warn('TAR_ENTRY_INVALID', er) + } + + if (header.nullBlock) { + if (this[SAW_NULL_BLOCK]) { + this[SAW_EOF] = true + // ending an archive with no entries. pointless, but legal. + if (this[STATE] === 'begin') + this[STATE] = 'header' + this[EMIT]('eof') + } else { + this[SAW_NULL_BLOCK] = true + this[EMIT]('nullBlock') + } + } else { + this[SAW_NULL_BLOCK] = false + if (!header.cksumValid) + this.warn('TAR_ENTRY_INVALID', 'checksum failure', {header}) + else if (!header.path) + this.warn('TAR_ENTRY_INVALID', 'path is required', {header}) + else { + const type = header.type + if (/^(Symbolic)?Link$/.test(type) && !header.linkpath) + this.warn('TAR_ENTRY_INVALID', 'linkpath required', {header}) + else if (!/^(Symbolic)?Link$/.test(type) && header.linkpath) + this.warn('TAR_ENTRY_INVALID', 'linkpath forbidden', {header}) + else { + const entry = this[WRITEENTRY] = new Entry(header, this[EX], this[GEX]) + + // we do this for meta & ignored entries as well, because they + // are still valid tar, or else we wouldn't know to ignore them + if (!this[SAW_VALID_ENTRY]) { + if (entry.remain) { + // this might be the one! + const onend = () => { + if (!entry.invalid) + this[SAW_VALID_ENTRY] = true + } + entry.on('end', onend) + } else + this[SAW_VALID_ENTRY] = true + } + + if (entry.meta) { + if (entry.size > this.maxMetaEntrySize) { + entry.ignore = true + this[EMIT]('ignoredEntry', entry) + this[STATE] = 'ignore' + entry.resume() + } else if (entry.size > 0) { + this[META] = '' + entry.on('data', c => this[META] += c) + this[STATE] = 'meta' + } + } else { + this[EX] = null + entry.ignore = entry.ignore || !this.filter(entry.path, entry) + + if (entry.ignore) { + // probably valid, just not something we care about + this[EMIT]('ignoredEntry', entry) + this[STATE] = entry.remain ? 'ignore' : 'header' + entry.resume() + } else { + if (entry.remain) + this[STATE] = 'body' + else { + this[STATE] = 'header' + entry.end() + } + + if (!this[READENTRY]) { + this[QUEUE].push(entry) + this[NEXTENTRY]() + } else + this[QUEUE].push(entry) + } + } + } + } + } + } + + [PROCESSENTRY] (entry) { + let go = true + + if (!entry) { + this[READENTRY] = null + go = false + } else if (Array.isArray(entry)) + this.emit.apply(this, entry) + else { + this[READENTRY] = entry + this.emit('entry', entry) + if (!entry.emittedEnd) { + entry.on('end', _ => this[NEXTENTRY]()) + go = false + } + } + + return go + } + + [NEXTENTRY] () { + do {} while (this[PROCESSENTRY](this[QUEUE].shift())) + + if (!this[QUEUE].length) { + // At this point, there's nothing in the queue, but we may have an + // entry which is being consumed (readEntry). + // If we don't, then we definitely can handle more data. + // If we do, and either it's flowing, or it has never had any data + // written to it, then it needs more. + // The only other possibility is that it has returned false from a + // write() call, so we wait for the next drain to continue. + const re = this[READENTRY] + const drainNow = !re || re.flowing || re.size === re.remain + if (drainNow) { + if (!this[WRITING]) + this.emit('drain') + } else + re.once('drain', _ => this.emit('drain')) + } + } + + [CONSUMEBODY] (chunk, position) { + // write up to but no more than writeEntry.blockRemain + const entry = this[WRITEENTRY] + const br = entry.blockRemain + const c = (br >= chunk.length && position === 0) ? chunk + : chunk.slice(position, position + br) + + entry.write(c) + + if (!entry.blockRemain) { + this[STATE] = 'header' + this[WRITEENTRY] = null + entry.end() + } + + return c.length + } + + [CONSUMEMETA] (chunk, position) { + const entry = this[WRITEENTRY] + const ret = this[CONSUMEBODY](chunk, position) + + // if we finished, then the entry is reset + if (!this[WRITEENTRY]) + this[EMITMETA](entry) + + return ret + } + + [EMIT] (ev, data, extra) { + if (!this[QUEUE].length && !this[READENTRY]) + this.emit(ev, data, extra) + else + this[QUEUE].push([ev, data, extra]) + } + + [EMITMETA] (entry) { + this[EMIT]('meta', this[META]) + switch (entry.type) { + case 'ExtendedHeader': + case 'OldExtendedHeader': + this[EX] = Pax.parse(this[META], this[EX], false) + break + + case 'GlobalExtendedHeader': + this[GEX] = Pax.parse(this[META], this[GEX], true) + break + + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + this[EX] = this[EX] || Object.create(null) + this[EX].path = this[META].replace(/\0.*/, '') + break + + case 'NextFileHasLongLinkpath': + this[EX] = this[EX] || Object.create(null) + this[EX].linkpath = this[META].replace(/\0.*/, '') + break + + /* istanbul ignore next */ + default: throw new Error('unknown meta: ' + entry.type) + } + } + + abort (error) { + this[ABORTED] = true + this.emit('abort', error) + // always throws, even in non-strict mode + this.warn('TAR_ABORT', error, { recoverable: false }) + } + + write (chunk) { + if (this[ABORTED]) + return + + // first write, might be gzipped + if (this[UNZIP] === null && chunk) { + if (this[BUFFER]) { + chunk = Buffer.concat([this[BUFFER], chunk]) + this[BUFFER] = null + } + if (chunk.length < gzipHeader.length) { + this[BUFFER] = chunk + return true + } + for (let i = 0; this[UNZIP] === null && i < gzipHeader.length; i++) { + if (chunk[i] !== gzipHeader[i]) + this[UNZIP] = false + } + if (this[UNZIP] === null) { + const ended = this[ENDED] + this[ENDED] = false + this[UNZIP] = new zlib.Unzip() + this[UNZIP].on('data', chunk => this[CONSUMECHUNK](chunk)) + this[UNZIP].on('error', er => this.abort(er)) + this[UNZIP].on('end', _ => { + this[ENDED] = true + this[CONSUMECHUNK]() + }) + this[WRITING] = true + const ret = this[UNZIP][ended ? 'end' : 'write'](chunk) + this[WRITING] = false + return ret + } + } + + this[WRITING] = true + if (this[UNZIP]) + this[UNZIP].write(chunk) + else + this[CONSUMECHUNK](chunk) + this[WRITING] = false + + // return false if there's a queue, or if the current entry isn't flowing + const ret = + this[QUEUE].length ? false : + this[READENTRY] ? this[READENTRY].flowing : + true + + // if we have no queue, then that means a clogged READENTRY + if (!ret && !this[QUEUE].length) + this[READENTRY].once('drain', _ => this.emit('drain')) + + return ret + } + + [BUFFERCONCAT] (c) { + if (c && !this[ABORTED]) + this[BUFFER] = this[BUFFER] ? Buffer.concat([this[BUFFER], c]) : c + } + + [MAYBEEND] () { + if (this[ENDED] && + !this[EMITTEDEND] && + !this[ABORTED] && + !this[CONSUMING]) { + this[EMITTEDEND] = true + const entry = this[WRITEENTRY] + if (entry && entry.blockRemain) { + // truncated, likely a damaged file + const have = this[BUFFER] ? this[BUFFER].length : 0 + this.warn('TAR_BAD_ARCHIVE', `Truncated input (needed ${ + entry.blockRemain} more bytes, only ${have} available)`, {entry}) + if (this[BUFFER]) + entry.write(this[BUFFER]) + entry.end() + } + this[EMIT](DONE) + } + } + + [CONSUMECHUNK] (chunk) { + if (this[CONSUMING]) + this[BUFFERCONCAT](chunk) + else if (!chunk && !this[BUFFER]) + this[MAYBEEND]() + else { + this[CONSUMING] = true + if (this[BUFFER]) { + this[BUFFERCONCAT](chunk) + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } else + this[CONSUMECHUNKSUB](chunk) + + while (this[BUFFER] && + this[BUFFER].length >= 512 && + !this[ABORTED] && + !this[SAW_EOF]) { + const c = this[BUFFER] + this[BUFFER] = null + this[CONSUMECHUNKSUB](c) + } + this[CONSUMING] = false + } + + if (!this[BUFFER] || this[ENDED]) + this[MAYBEEND]() + } + + [CONSUMECHUNKSUB] (chunk) { + // we know that we are in CONSUMING mode, so anything written goes into + // the buffer. Advance the position and put any remainder in the buffer. + let position = 0 + const length = chunk.length + while (position + 512 <= length && !this[ABORTED] && !this[SAW_EOF]) { + switch (this[STATE]) { + case 'begin': + case 'header': + this[CONSUMEHEADER](chunk, position) + position += 512 + break + + case 'ignore': + case 'body': + position += this[CONSUMEBODY](chunk, position) + break + + case 'meta': + position += this[CONSUMEMETA](chunk, position) + break + + /* istanbul ignore next */ + default: + throw new Error('invalid state: ' + this[STATE]) + } + } + + if (position < length) { + if (this[BUFFER]) + this[BUFFER] = Buffer.concat([chunk.slice(position), this[BUFFER]]) + else + this[BUFFER] = chunk.slice(position) + } + } + + end (chunk) { + if (!this[ABORTED]) { + if (this[UNZIP]) + this[UNZIP].end(chunk) + else { + this[ENDED] = true + this.write(chunk) + } + } + } +}) diff --git a/lib/path-reservations.js b/lib/path-reservations.js new file mode 100644 index 0000000..8183c45 --- /dev/null +++ b/lib/path-reservations.js @@ -0,0 +1,148 @@ +// A path exclusive reservation system +// reserve([list, of, paths], fn) +// When the fn is first in line for all its paths, it +// is called with a cb that clears the reservation. +// +// Used by async unpack to avoid clobbering paths in use, +// while still allowing maximal safe parallelization. + +const assert = require('assert') +const normalize = require('./normalize-unicode.js') +const stripSlashes = require('./strip-trailing-slashes.js') +const { join } = require('path') + +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform +const isWindows = platform === 'win32' + +module.exports = () => { + // path => [function or Set] + // A Set object means a directory reservation + // A fn is a direct reservation on that path + const queues = new Map() + + // fn => {paths:[path,...], dirs:[path, ...]} + const reservations = new Map() + + // return a set of parent dirs for a given path + // '/a/b/c/d' -> ['/', '/a', '/a/b', '/a/b/c', '/a/b/c/d'] + const getDirs = path => { + const dirs = path.split('/').slice(0, -1).reduce((set, path) => { + if (set.length) + path = join(set[set.length - 1], path) + set.push(path || '/') + return set + }, []) + return dirs + } + + // functions currently running + const running = new Set() + + // return the queues for each path the function cares about + // fn => {paths, dirs} + const getQueues = fn => { + const res = reservations.get(fn) + /* istanbul ignore if - unpossible */ + if (!res) + throw new Error('function does not have any path reservations') + return { + paths: res.paths.map(path => queues.get(path)), + dirs: [...res.dirs].map(path => queues.get(path)), + } + } + + // check if fn is first in line for all its paths, and is + // included in the first set for all its dir queues + const check = fn => { + const {paths, dirs} = getQueues(fn) + return paths.every(q => q[0] === fn) && + dirs.every(q => q[0] instanceof Set && q[0].has(fn)) + } + + // run the function if it's first in line and not already running + const run = fn => { + if (running.has(fn) || !check(fn)) + return false + running.add(fn) + fn(() => clear(fn)) + return true + } + + const clear = fn => { + if (!running.has(fn)) + return false + + const { paths, dirs } = reservations.get(fn) + const next = new Set() + + paths.forEach(path => { + const q = queues.get(path) + assert.equal(q[0], fn) + if (q.length === 1) + queues.delete(path) + else { + q.shift() + if (typeof q[0] === 'function') + next.add(q[0]) + else + q[0].forEach(fn => next.add(fn)) + } + }) + + dirs.forEach(dir => { + const q = queues.get(dir) + assert(q[0] instanceof Set) + if (q[0].size === 1 && q.length === 1) + queues.delete(dir) + else if (q[0].size === 1) { + q.shift() + + // must be a function or else the Set would've been reused + next.add(q[0]) + } else + q[0].delete(fn) + }) + running.delete(fn) + + next.forEach(fn => run(fn)) + return true + } + + const reserve = (paths, fn) => { + // collide on matches across case and unicode normalization + // On windows, thanks to the magic of 8.3 shortnames, it is fundamentally + // impossible to determine whether two paths refer to the same thing on + // disk, without asking the kernel for a shortname. + // So, we just pretend that every path matches every other path here, + // effectively removing all parallelization on windows. + paths = isWindows ? ['win32 parallelization disabled'] : paths.map(p => { + // don't need normPath, because we skip this entirely for windows + return normalize(stripSlashes(join(p))).toLowerCase() + }) + + const dirs = new Set( + paths.map(path => getDirs(path)).reduce((a, b) => a.concat(b)) + ) + reservations.set(fn, {dirs, paths}) + paths.forEach(path => { + const q = queues.get(path) + if (!q) + queues.set(path, [fn]) + else + q.push(fn) + }) + dirs.forEach(dir => { + const q = queues.get(dir) + if (!q) + queues.set(dir, [new Set([fn])]) + else if (q[q.length - 1] instanceof Set) + q[q.length - 1].add(fn) + else + q.push(new Set([fn])) + }) + + return run(fn) + } + + return { check, reserve } +} diff --git a/lib/pax.js b/lib/pax.js new file mode 100644 index 0000000..7768c7b --- /dev/null +++ b/lib/pax.js @@ -0,0 +1,143 @@ +'use strict' +const Header = require('./header.js') +const path = require('path') + +class Pax { + constructor (obj, global) { + this.atime = obj.atime || null + this.charset = obj.charset || null + this.comment = obj.comment || null + this.ctime = obj.ctime || null + this.gid = obj.gid || null + this.gname = obj.gname || null + this.linkpath = obj.linkpath || null + this.mtime = obj.mtime || null + this.path = obj.path || null + this.size = obj.size || null + this.uid = obj.uid || null + this.uname = obj.uname || null + this.dev = obj.dev || null + this.ino = obj.ino || null + this.nlink = obj.nlink || null + this.global = global || false + } + + encode () { + const body = this.encodeBody() + if (body === '') + return null + + const bodyLen = Buffer.byteLength(body) + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512) + const buf = Buffer.allocUnsafe(bufLen) + + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) + buf[i] = 0 + + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), + mode: this.mode || 0o644, + uid: this.uid || null, + gid: this.gid || null, + size: bodyLen, + mtime: this.mtime || null, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime || null, + ctime: this.ctime || null, + }).encode(buf) + + buf.write(body, 512, bodyLen, 'utf8') + + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) + buf[i] = 0 + + return buf + } + + encodeBody () { + return ( + this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname') + ) + } + + encodeField (field) { + if (this[field] === null || this[field] === undefined) + return '' + const v = this[field] instanceof Date ? this[field].getTime() / 1000 + : this[field] + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' + ? 'SCHILY.' : '') + + field + '=' + v + '\n' + const byteLen = Buffer.byteLength(s) + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 + if (byteLen + digits >= Math.pow(10, digits)) + digits += 1 + const len = digits + byteLen + return len + s + } +} + +Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) + +const merge = (a, b) => + b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a + +const parseKV = string => + string + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)) + +const parseKVLine = (set, line) => { + const n = parseInt(line, 10) + + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) + return set + + line = line.substr((n + ' ').length) + const kv = line.split('=') + const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') + if (!k) + return set + + const v = kv.join('=') + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) + ? new Date(v * 1000) + : /^[0-9]+$/.test(v) ? +v + : v + return set +} + +module.exports = Pax diff --git a/lib/read-entry.js b/lib/read-entry.js new file mode 100644 index 0000000..183a605 --- /dev/null +++ b/lib/read-entry.js @@ -0,0 +1,100 @@ +'use strict' +const MiniPass = require('minipass') +const normPath = require('./normalize-windows-path.js') + +const SLURP = Symbol('slurp') +module.exports = class ReadEntry extends MiniPass { + constructor (header, ex, gex) { + super() + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause() + this.extended = ex + this.globalExtended = gex + this.header = header + this.startBlockSize = 512 * Math.ceil(header.size / 512) + this.blockRemain = this.startBlockSize + this.remain = header.size + this.type = header.type + this.meta = false + this.ignore = false + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break + + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true + break + + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true + } + + this.path = normPath(header.path) + this.mode = header.mode + if (this.mode) + this.mode = this.mode & 0o7777 + this.uid = header.uid + this.gid = header.gid + this.uname = header.uname + this.gname = header.gname + this.size = header.size + this.mtime = header.mtime + this.atime = header.atime + this.ctime = header.ctime + this.linkpath = normPath(header.linkpath) + this.uname = header.uname + this.gname = header.gname + + if (ex) + this[SLURP](ex) + if (gex) + this[SLURP](gex, true) + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + + const r = this.remain + const br = this.blockRemain + this.remain = Math.max(0, r - writeLen) + this.blockRemain = Math.max(0, br - writeLen) + if (this.ignore) + return true + + if (r >= writeLen) + return super.write(data) + + // r < writeLen + return super.write(data.slice(0, r)) + } + + [SLURP] (ex, global) { + for (const k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = k === 'path' || k === 'linkpath' ? normPath(ex[k]) : ex[k] + } + } +} diff --git a/lib/replace.js b/lib/replace.js new file mode 100644 index 0000000..1374f3f --- /dev/null +++ b/lib/replace.js @@ -0,0 +1,223 @@ +'use strict' + +// tar -r +const hlo = require('./high-level-opt.js') +const Pack = require('./pack.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const t = require('./list.js') +const path = require('path') + +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. + +const Header = require('./header.js') + +module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + return opt.sync ? replaceSync(opt, files) + : replace(opt, files, cb) +} + +const replaceSync = (opt, files) => { + const p = new Pack.Sync(opt) + + let threw = true + let fd + let position + + try { + try { + fd = fs.openSync(opt.file, 'r+') + } catch (er) { + if (er.code === 'ENOENT') + fd = fs.openSync(opt.file, 'w+') + else + throw er + } + + const st = fs.fstatSync(fd) + const headBuf = Buffer.alloc(512) + + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = fs.readSync( + fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos + ) + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + throw new Error('cannot append to compressed archives') + + if (!bytes) + break POSITION + } + + const h = new Header(headBuf) + if (!h.cksumValid) + break + const entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > st.size) + break + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + } + threw = false + + streamSync(opt, p, position, fd, files) + } finally { + if (threw) { + try { + fs.closeSync(fd) + } catch (er) {} + } + } +} + +const streamSync = (opt, p, position, fd, files) => { + const stream = new fsm.WriteStreamSync(opt.file, { + fd: fd, + start: position, + }) + p.pipe(stream) + addFilesSync(p, files) +} + +const replace = (opt, files, cb) => { + files = Array.from(files) + const p = new Pack(opt) + + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) + fs.close(fd, _ => cb_(er)) + else + cb_(null, pos) + } + + let position = 0 + if (size === 0) + return cb(null, 0) + + let bufPos = 0 + const headBuf = Buffer.alloc(512) + const onread = (er, bytes) => { + if (er) + return cb(er) + bufPos += bytes + if (bufPos < 512 && bytes) { + return fs.read( + fd, headBuf, bufPos, headBuf.length - bufPos, + position + bufPos, onread + ) + } + + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + return cb(new Error('cannot append to compressed archives')) + + // truncated header + if (bufPos < 512) + return cb(null, position) + + const h = new Header(headBuf) + if (!h.cksumValid) + return cb(null, position) + + const entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > size) + return cb(null, position) + + position += entryBlockSize + 512 + if (position >= size) + return cb(null, position) + + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + bufPos = 0 + fs.read(fd, headBuf, 0, 512, position, onread) + } + fs.read(fd, headBuf, 0, 512, position, onread) + } + + const promise = new Promise((resolve, reject) => { + p.on('error', reject) + let flag = 'r+' + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+' + return fs.open(opt.file, flag, onopen) + } + + if (er) + return reject(er) + + fs.fstat(fd, (er, st) => { + if (er) + return fs.close(fd, () => reject(er)) + + getPos(fd, st.size, (er, position) => { + if (er) + return reject(er) + const stream = new fsm.WriteStream(opt.file, { + fd: fd, + start: position, + }) + p.pipe(stream) + stream.on('error', reject) + stream.on('close', resolve) + addFilesAsync(p, files) + }) + }) + } + fs.open(opt.file, flag, onopen) + }) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') { + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry), + }) + } else + p.add(file) + }) + p.end() +} + +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') { + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry), + }).then(_ => addFilesAsync(p, files)) + } else + p.add(file) + } + p.end() +} diff --git a/lib/strip-absolute-path.js b/lib/strip-absolute-path.js new file mode 100644 index 0000000..1aa2d2a --- /dev/null +++ b/lib/strip-absolute-path.js @@ -0,0 +1,24 @@ +// unix absolute paths are also absolute on win32, so we use this for both +const { isAbsolute, parse } = require('path').win32 + +// returns [root, stripped] +// Note that windows will think that //x/y/z/a has a "root" of //x/y, and in +// those cases, we want to sanitize it to x/y/z/a, not z/a, so we strip / +// explicitly if it's the first character. +// drive-specific relative paths on Windows get their root stripped off even +// though they are not absolute, so `c:../foo` becomes ['c:', '../foo'] +module.exports = path => { + let r = '' + + let parsed = parse(path) + while (isAbsolute(path) || parsed.root) { + // windows will think that //x/y/z has a "root" of //x/y/ + // but strip the //?/C:/ off of //?/C:/path + const root = path.charAt(0) === '/' && path.slice(0, 4) !== '//?/' ? '/' + : parsed.root + path = path.substr(root.length) + r += root + parsed = parse(path) + } + return [r, path] +} diff --git a/lib/strip-trailing-slashes.js b/lib/strip-trailing-slashes.js new file mode 100644 index 0000000..3e3ecec --- /dev/null +++ b/lib/strip-trailing-slashes.js @@ -0,0 +1,13 @@ +// warning: extremely hot code path. +// This has been meticulously optimized for use +// within npm install on large package trees. +// Do not edit without careful benchmarking. +module.exports = str => { + let i = str.length - 1 + let slashesStart = -1 + while (i > -1 && str.charAt(i) === '/') { + slashesStart = i + i-- + } + return slashesStart === -1 ? str : str.slice(0, slashesStart) +} diff --git a/lib/types.js b/lib/types.js new file mode 100644 index 0000000..7bfc254 --- /dev/null +++ b/lib/types.js @@ -0,0 +1,44 @@ +'use strict' +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'], +]) + +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])) diff --git a/lib/unpack.js b/lib/unpack.js new file mode 100644 index 0000000..7d39dc0 --- /dev/null +++ b/lib/unpack.js @@ -0,0 +1,877 @@ +'use strict' + +// the PEND/UNPEND stuff tracks whether we're ready to emit end/close yet. +// but the path reservations are required to avoid race conditions where +// parallelized unpack ops may mess with one another, due to dependencies +// (like a Link depending on its target) or destructive operations (like +// clobbering an fs object to create one of a different type.) + +const assert = require('assert') +const Parser = require('./parse.js') +const fs = require('fs') +const fsm = require('fs-minipass') +const path = require('path') +const mkdir = require('./mkdir.js') +const wc = require('./winchars.js') +const pathReservations = require('./path-reservations.js') +const stripAbsolutePath = require('./strip-absolute-path.js') +const normPath = require('./normalize-windows-path.js') +const stripSlash = require('./strip-trailing-slashes.js') +const normalize = require('./normalize-unicode.js') + +const ONENTRY = Symbol('onEntry') +const CHECKFS = Symbol('checkFs') +const CHECKFS2 = Symbol('checkFs2') +const PRUNECACHE = Symbol('pruneCache') +const ISREUSABLE = Symbol('isReusable') +const MAKEFS = Symbol('makeFs') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const LINK = Symbol('link') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const UNSUPPORTED = Symbol('unsupported') +const CHECKPATH = Symbol('checkPath') +const MKDIR = Symbol('mkdir') +const ONERROR = Symbol('onError') +const PENDING = Symbol('pending') +const PEND = Symbol('pend') +const UNPEND = Symbol('unpend') +const ENDED = Symbol('ended') +const MAYBECLOSE = Symbol('maybeClose') +const SKIP = Symbol('skip') +const DOCHOWN = Symbol('doChown') +const UID = Symbol('uid') +const GID = Symbol('gid') +const CHECKED_CWD = Symbol('checkedCwd') +const crypto = require('crypto') +const getFlag = require('./get-write-flag.js') +const platform = process.env.TESTING_TAR_FAKE_PLATFORM || process.platform +const isWindows = platform === 'win32' + +// Unlinks on Windows are not atomic. +// +// This means that if you have a file entry, followed by another +// file entry with an identical name, and you cannot re-use the file +// (because it's a hardlink, or because unlink:true is set, or it's +// Windows, which does not have useful nlink values), then the unlink +// will be committed to the disk AFTER the new file has been written +// over the old one, deleting the new file. +// +// To work around this, on Windows systems, we rename the file and then +// delete the renamed file. It's a sloppy kludge, but frankly, I do not +// know of a better way to do this, given windows' non-atomic unlink +// semantics. +// +// See: https://github.com/npm/node-tar/issues/183 +/* istanbul ignore next */ +const unlinkFile = (path, cb) => { + if (!isWindows) + return fs.unlink(path, cb) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.rename(path, name, er => { + if (er) + return cb(er) + fs.unlink(name, cb) + }) +} + +/* istanbul ignore next */ +const unlinkFileSync = path => { + if (!isWindows) + return fs.unlinkSync(path) + + const name = path + '.DELETE.' + crypto.randomBytes(16).toString('hex') + fs.renameSync(path, name) + fs.unlinkSync(name) +} + +// this.gid, entry.gid, this.processUid +const uint32 = (a, b, c) => + a === a >>> 0 ? a + : b === b >>> 0 ? b + : c + +// clear the cache if it's a case-insensitive unicode-squashing match. +// we can't know if the current file system is case-sensitive or supports +// unicode fully, so we check for similarity on the maximally compatible +// representation. Err on the side of pruning, since all it's doing is +// preventing lstats, and it's not the end of the world if we get a false +// positive. +// Note that on windows, we always drop the entire cache whenever a +// symbolic link is encountered, because 8.3 filenames are impossible +// to reason about, and collisions are hazards rather than just failures. +const cacheKeyNormalize = path => normalize(stripSlash(normPath(path))) + .toLowerCase() + +const pruneCache = (cache, abs) => { + abs = cacheKeyNormalize(abs) + for (const path of cache.keys()) { + const pnorm = cacheKeyNormalize(path) + if (pnorm === abs || pnorm.indexOf(abs + '/') === 0) + cache.delete(path) + } +} + +const dropCache = cache => { + for (const key of cache.keys()) + cache.delete(key) +} + +class Unpack extends Parser { + constructor (opt) { + if (!opt) + opt = {} + + opt.ondone = _ => { + this[ENDED] = true + this[MAYBECLOSE]() + } + + super(opt) + + this[CHECKED_CWD] = false + + this.reservations = pathReservations() + + this.transform = typeof opt.transform === 'function' ? opt.transform : null + + this.writable = true + this.readable = false + + this[PENDING] = 0 + this[ENDED] = false + + this.dirCache = opt.dirCache || new Map() + + if (typeof opt.uid === 'number' || typeof opt.gid === 'number') { + // need both or neither + if (typeof opt.uid !== 'number' || typeof opt.gid !== 'number') + throw new TypeError('cannot set owner without number uid and gid') + if (opt.preserveOwner) { + throw new TypeError( + 'cannot preserve owner in archive and also set owner explicitly') + } + this.uid = opt.uid + this.gid = opt.gid + this.setOwner = true + } else { + this.uid = null + this.gid = null + this.setOwner = false + } + + // default true for root + if (opt.preserveOwner === undefined && typeof opt.uid !== 'number') + this.preserveOwner = process.getuid && process.getuid() === 0 + else + this.preserveOwner = !!opt.preserveOwner + + this.processUid = (this.preserveOwner || this.setOwner) && process.getuid ? + process.getuid() : null + this.processGid = (this.preserveOwner || this.setOwner) && process.getgid ? + process.getgid() : null + + // mostly just for testing, but useful in some cases. + // Forcibly trigger a chown on every entry, no matter what + this.forceChown = opt.forceChown === true + + // turn > this[ONENTRY](entry)) + } + + // a bad or damaged archive is a warning for Parser, but an error + // when extracting. Mark those errors as unrecoverable, because + // the Unpack contract cannot be met. + warn (code, msg, data = {}) { + if (code === 'TAR_BAD_ARCHIVE' || code === 'TAR_ABORT') + data.recoverable = false + return super.warn(code, msg, data) + } + + [MAYBECLOSE] () { + if (this[ENDED] && this[PENDING] === 0) { + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + } + } + + [CHECKPATH] (entry) { + if (this.strip) { + const parts = normPath(entry.path).split('/') + if (parts.length < this.strip) + return false + entry.path = parts.slice(this.strip).join('/') + + if (entry.type === 'Link') { + const linkparts = normPath(entry.linkpath).split('/') + if (linkparts.length >= this.strip) + entry.linkpath = linkparts.slice(this.strip).join('/') + else + return false + } + } + + if (!this.preservePaths) { + const p = normPath(entry.path) + const parts = p.split('/') + if (parts.includes('..') || isWindows && /^[a-z]:\.\.$/i.test(parts[0])) { + this.warn('TAR_ENTRY_ERROR', `path contains '..'`, { + entry, + path: p, + }) + return false + } + + // strip off the root + const [root, stripped] = stripAbsolutePath(p) + if (root) { + entry.path = stripped + this.warn('TAR_ENTRY_INFO', `stripping ${root} from absolute path`, { + entry, + path: p, + }) + } + } + + if (path.isAbsolute(entry.path)) + entry.absolute = normPath(path.resolve(entry.path)) + else + entry.absolute = normPath(path.resolve(this.cwd, entry.path)) + + // if we somehow ended up with a path that escapes the cwd, and we are + // not in preservePaths mode, then something is fishy! This should have + // been prevented above, so ignore this for coverage. + /* istanbul ignore if - defense in depth */ + if (!this.preservePaths && + entry.absolute.indexOf(this.cwd + '/') !== 0 && + entry.absolute !== this.cwd) { + this.warn('TAR_ENTRY_ERROR', 'path escaped extraction target', { + entry, + path: normPath(entry.path), + resolvedPath: entry.absolute, + cwd: this.cwd, + }) + return false + } + + // an archive can set properties on the extraction directory, but it + // may not replace the cwd with a different kind of thing entirely. + if (entry.absolute === this.cwd && + entry.type !== 'Directory' && + entry.type !== 'GNUDumpDir') + return false + + // only encode : chars that aren't drive letter indicators + if (this.win32) { + const { root: aRoot } = path.win32.parse(entry.absolute) + entry.absolute = aRoot + wc.encode(entry.absolute.substr(aRoot.length)) + const { root: pRoot } = path.win32.parse(entry.path) + entry.path = pRoot + wc.encode(entry.path.substr(pRoot.length)) + } + + return true + } + + [ONENTRY] (entry) { + if (!this[CHECKPATH](entry)) + return entry.resume() + + assert.equal(typeof entry.absolute, 'string') + + switch (entry.type) { + case 'Directory': + case 'GNUDumpDir': + if (entry.mode) + entry.mode = entry.mode | 0o700 + + case 'File': + case 'OldFile': + case 'ContiguousFile': + case 'Link': + case 'SymbolicLink': + return this[CHECKFS](entry) + + case 'CharacterDevice': + case 'BlockDevice': + case 'FIFO': + default: + return this[UNSUPPORTED](entry) + } + } + + [ONERROR] (er, entry) { + // Cwd has to exist, or else nothing works. That's serious. + // Other errors are warnings, which raise the error in strict + // mode, but otherwise continue on. + if (er.name === 'CwdError') + this.emit('error', er) + else { + this.warn('TAR_ENTRY_ERROR', er, {entry}) + this[UNPEND]() + entry.resume() + } + } + + [MKDIR] (dir, mode, cb) { + mkdir(normPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + noChmod: this.noChmod, + }, cb) + } + + [DOCHOWN] (entry) { + // in preserve owner mode, chown if the entry doesn't match process + // in set owner mode, chown if setting doesn't match process + return this.forceChown || + this.preserveOwner && + (typeof entry.uid === 'number' && entry.uid !== this.processUid || + typeof entry.gid === 'number' && entry.gid !== this.processGid) + || + (typeof this.uid === 'number' && this.uid !== this.processUid || + typeof this.gid === 'number' && this.gid !== this.processGid) + } + + [UID] (entry) { + return uint32(this.uid, entry.uid, this.processUid) + } + + [GID] (entry) { + return uint32(this.gid, entry.gid, this.processGid) + } + + [FILE] (entry, fullyDone) { + const mode = entry.mode & 0o7777 || this.fmode + const stream = new fsm.WriteStream(entry.absolute, { + flags: getFlag(entry.size), + mode: mode, + autoClose: false, + }) + stream.on('error', er => { + if (stream.fd) + fs.close(stream.fd, () => {}) + + // flush all the data out so that we aren't left hanging + // if the error wasn't actually fatal. otherwise the parse + // is blocked, and we never proceed. + stream.write = () => true + this[ONERROR](er, entry) + fullyDone() + }) + + let actions = 1 + const done = er => { + if (er) { + /* istanbul ignore else - we should always have a fd by now */ + if (stream.fd) + fs.close(stream.fd, () => {}) + + this[ONERROR](er, entry) + fullyDone() + return + } + + if (--actions === 0) { + fs.close(stream.fd, er => { + if (er) + this[ONERROR](er, entry) + else + this[UNPEND]() + fullyDone() + }) + } + } + + stream.on('finish', _ => { + // if futimes fails, try utimes + // if utimes fails, fail with the original error + // same for fchown/chown + const abs = entry.absolute + const fd = stream.fd + + if (entry.mtime && !this.noMtime) { + actions++ + const atime = entry.atime || new Date() + const mtime = entry.mtime + fs.futimes(fd, atime, mtime, er => + er ? fs.utimes(abs, atime, mtime, er2 => done(er2 && er)) + : done()) + } + + if (this[DOCHOWN](entry)) { + actions++ + const uid = this[UID](entry) + const gid = this[GID](entry) + fs.fchown(fd, uid, gid, er => + er ? fs.chown(abs, uid, gid, er2 => done(er2 && er)) + : done()) + } + + done() + }) + + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => { + this[ONERROR](er, entry) + fullyDone() + }) + entry.pipe(tx) + } + tx.pipe(stream) + } + + [DIRECTORY] (entry, fullyDone) { + const mode = entry.mode & 0o7777 || this.dmode + this[MKDIR](entry.absolute, mode, er => { + if (er) { + this[ONERROR](er, entry) + fullyDone() + return + } + + let actions = 1 + const done = _ => { + if (--actions === 0) { + fullyDone() + this[UNPEND]() + entry.resume() + } + } + + if (entry.mtime && !this.noMtime) { + actions++ + fs.utimes(entry.absolute, entry.atime || new Date(), entry.mtime, done) + } + + if (this[DOCHOWN](entry)) { + actions++ + fs.chown(entry.absolute, this[UID](entry), this[GID](entry), done) + } + + done() + }) + } + + [UNSUPPORTED] (entry) { + entry.unsupported = true + this.warn('TAR_ENTRY_UNSUPPORTED', + `unsupported entry type: ${entry.type}`, {entry}) + entry.resume() + } + + [SYMLINK] (entry, done) { + this[LINK](entry, entry.linkpath, 'symlink', done) + } + + [HARDLINK] (entry, done) { + const linkpath = normPath(path.resolve(this.cwd, entry.linkpath)) + this[LINK](entry, linkpath, 'link', done) + } + + [PEND] () { + this[PENDING]++ + } + + [UNPEND] () { + this[PENDING]-- + this[MAYBECLOSE]() + } + + [SKIP] (entry) { + this[UNPEND]() + entry.resume() + } + + // Check if we can reuse an existing filesystem entry safely and + // overwrite it, rather than unlinking and recreating + // Windows doesn't report a useful nlink, so we just never reuse entries + [ISREUSABLE] (entry, st) { + return entry.type === 'File' && + !this.unlink && + st.isFile() && + st.nlink <= 1 && + !isWindows + } + + // check if a thing is there, and if so, try to clobber it + [CHECKFS] (entry) { + this[PEND]() + const paths = [entry.path] + if (entry.linkpath) + paths.push(entry.linkpath) + this.reservations.reserve(paths, done => this[CHECKFS2](entry, done)) + } + + [PRUNECACHE] (entry) { + // if we are not creating a directory, and the path is in the dirCache, + // then that means we are about to delete the directory we created + // previously, and it is no longer going to be a directory, and neither + // is any of its children. + // If a symbolic link is encountered, all bets are off. There is no + // reasonable way to sanitize the cache in such a way we will be able to + // avoid having filesystem collisions. If this happens with a non-symlink + // entry, it'll just fail to unpack, but a symlink to a directory, using an + // 8.3 shortname or certain unicode attacks, can evade detection and lead + // to arbitrary writes to anywhere on the system. + if (entry.type === 'SymbolicLink') + dropCache(this.dirCache) + else if (entry.type !== 'Directory') + pruneCache(this.dirCache, entry.absolute) + } + + [CHECKFS2] (entry, fullyDone) { + this[PRUNECACHE](entry) + + const done = er => { + this[PRUNECACHE](entry) + fullyDone(er) + } + + const checkCwd = () => { + this[MKDIR](this.cwd, this.dmode, er => { + if (er) { + this[ONERROR](er, entry) + done() + return + } + this[CHECKED_CWD] = true + start() + }) + } + + const start = () => { + if (entry.absolute !== this.cwd) { + const parent = normPath(path.dirname(entry.absolute)) + if (parent !== this.cwd) { + return this[MKDIR](parent, this.dmode, er => { + if (er) { + this[ONERROR](er, entry) + done() + return + } + afterMakeParent() + }) + } + } + afterMakeParent() + } + + const afterMakeParent = () => { + fs.lstat(entry.absolute, (lstatEr, st) => { + if (st && (this.keep || this.newer && st.mtime > entry.mtime)) { + this[SKIP](entry) + done() + return + } + if (lstatEr || this[ISREUSABLE](entry, st)) + return this[MAKEFS](null, entry, done) + + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = !this.noChmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode + const afterChmod = er => this[MAKEFS](er, entry, done) + if (!needChmod) + return afterChmod() + return fs.chmod(entry.absolute, entry.mode, afterChmod) + } + // Not a dir entry, have to remove it. + // NB: the only way to end up with an entry that is the cwd + // itself, in such a way that == does not detect, is a + // tricky windows absolute path with UNC or 8.3 parts (and + // preservePaths:true, or else it will have been stripped). + // In that case, the user has opted out of path protections + // explicitly, so if they blow away the cwd, c'est la vie. + if (entry.absolute !== this.cwd) { + return fs.rmdir(entry.absolute, er => + this[MAKEFS](er, entry, done)) + } + } + + // not a dir, and not reusable + // don't remove if the cwd, we want that error + if (entry.absolute === this.cwd) + return this[MAKEFS](null, entry, done) + + unlinkFile(entry.absolute, er => + this[MAKEFS](er, entry, done)) + }) + } + + if (this[CHECKED_CWD]) + start() + else + checkCwd() + } + + [MAKEFS] (er, entry, done) { + if (er) { + this[ONERROR](er, entry) + done() + return + } + + switch (entry.type) { + case 'File': + case 'OldFile': + case 'ContiguousFile': + return this[FILE](entry, done) + + case 'Link': + return this[HARDLINK](entry, done) + + case 'SymbolicLink': + return this[SYMLINK](entry, done) + + case 'Directory': + case 'GNUDumpDir': + return this[DIRECTORY](entry, done) + } + } + + [LINK] (entry, linkpath, link, done) { + // XXX: get the type ('symlink' or 'junction') for windows + fs[link](linkpath, entry.absolute, er => { + if (er) + this[ONERROR](er, entry) + else { + this[UNPEND]() + entry.resume() + } + done() + }) + } +} + +const callSync = fn => { + try { + return [null, fn()] + } catch (er) { + return [er, null] + } +} +class UnpackSync extends Unpack { + [MAKEFS] (er, entry) { + return super[MAKEFS](er, entry, () => {}) + } + + [CHECKFS] (entry) { + this[PRUNECACHE](entry) + + if (!this[CHECKED_CWD]) { + const er = this[MKDIR](this.cwd, this.dmode) + if (er) + return this[ONERROR](er, entry) + this[CHECKED_CWD] = true + } + + // don't bother to make the parent if the current entry is the cwd, + // we've already checked it. + if (entry.absolute !== this.cwd) { + const parent = normPath(path.dirname(entry.absolute)) + if (parent !== this.cwd) { + const mkParent = this[MKDIR](parent, this.dmode) + if (mkParent) + return this[ONERROR](mkParent, entry) + } + } + + const [lstatEr, st] = callSync(() => fs.lstatSync(entry.absolute)) + if (st && (this.keep || this.newer && st.mtime > entry.mtime)) + return this[SKIP](entry) + + if (lstatEr || this[ISREUSABLE](entry, st)) + return this[MAKEFS](null, entry) + + if (st.isDirectory()) { + if (entry.type === 'Directory') { + const needChmod = !this.noChmod && + entry.mode && + (st.mode & 0o7777) !== entry.mode + const [er] = needChmod ? callSync(() => { + fs.chmodSync(entry.absolute, entry.mode) + }) : [] + return this[MAKEFS](er, entry) + } + // not a dir entry, have to remove it + const [er] = callSync(() => fs.rmdirSync(entry.absolute)) + this[MAKEFS](er, entry) + } + + // not a dir, and not reusable. + // don't remove if it's the cwd, since we want that error. + const [er] = entry.absolute === this.cwd ? [] + : callSync(() => unlinkFileSync(entry.absolute)) + this[MAKEFS](er, entry) + } + + [FILE] (entry, done) { + const mode = entry.mode & 0o7777 || this.fmode + + const oner = er => { + let closeError + try { + fs.closeSync(fd) + } catch (e) { + closeError = e + } + if (er || closeError) + this[ONERROR](er || closeError, entry) + done() + } + + let fd + try { + fd = fs.openSync(entry.absolute, getFlag(entry.size), mode) + } catch (er) { + return oner(er) + } + const tx = this.transform ? this.transform(entry) || entry : entry + if (tx !== entry) { + tx.on('error', er => this[ONERROR](er, entry)) + entry.pipe(tx) + } + + tx.on('data', chunk => { + try { + fs.writeSync(fd, chunk, 0, chunk.length) + } catch (er) { + oner(er) + } + }) + + tx.on('end', _ => { + let er = null + // try both, falling futimes back to utimes + // if either fails, handle the first error + if (entry.mtime && !this.noMtime) { + const atime = entry.atime || new Date() + const mtime = entry.mtime + try { + fs.futimesSync(fd, atime, mtime) + } catch (futimeser) { + try { + fs.utimesSync(entry.absolute, atime, mtime) + } catch (utimeser) { + er = futimeser + } + } + } + + if (this[DOCHOWN](entry)) { + const uid = this[UID](entry) + const gid = this[GID](entry) + + try { + fs.fchownSync(fd, uid, gid) + } catch (fchowner) { + try { + fs.chownSync(entry.absolute, uid, gid) + } catch (chowner) { + er = er || fchowner + } + } + } + + oner(er) + }) + } + + [DIRECTORY] (entry, done) { + const mode = entry.mode & 0o7777 || this.dmode + const er = this[MKDIR](entry.absolute, mode) + if (er) { + this[ONERROR](er, entry) + done() + return + } + if (entry.mtime && !this.noMtime) { + try { + fs.utimesSync(entry.absolute, entry.atime || new Date(), entry.mtime) + } catch (er) {} + } + if (this[DOCHOWN](entry)) { + try { + fs.chownSync(entry.absolute, this[UID](entry), this[GID](entry)) + } catch (er) {} + } + done() + entry.resume() + } + + [MKDIR] (dir, mode) { + try { + return mkdir.sync(normPath(dir), { + uid: this.uid, + gid: this.gid, + processUid: this.processUid, + processGid: this.processGid, + umask: this.processUmask, + preserve: this.preservePaths, + unlink: this.unlink, + cache: this.dirCache, + cwd: this.cwd, + mode: mode, + }) + } catch (er) { + return er + } + } + + [LINK] (entry, linkpath, link, done) { + try { + fs[link + 'Sync'](linkpath, entry.absolute) + done() + entry.resume() + } catch (er) { + return this[ONERROR](er, entry) + } + } +} + +Unpack.Sync = UnpackSync +module.exports = Unpack diff --git a/lib/update.js b/lib/update.js new file mode 100644 index 0000000..a5784b7 --- /dev/null +++ b/lib/update.js @@ -0,0 +1,36 @@ +'use strict' + +// tar -u + +const hlo = require('./high-level-opt.js') +const r = require('./replace.js') +// just call tar.r with the filter and mtimeCache + +module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) + + if (!opt.file) + throw new TypeError('file is required') + + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') + + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') + + files = Array.from(files) + + mtimeFilter(opt) + return r(opt, files, cb) +} + +const mtimeFilter = opt => { + const filter = opt.filter + + if (!opt.mtimeCache) + opt.mtimeCache = new Map() + + opt.filter = filter ? (path, stat) => + filter(path, stat) && !(opt.mtimeCache.get(path) > stat.mtime) + : (path, stat) => !(opt.mtimeCache.get(path) > stat.mtime) +} diff --git a/lib/warn-mixin.js b/lib/warn-mixin.js new file mode 100644 index 0000000..aeebb53 --- /dev/null +++ b/lib/warn-mixin.js @@ -0,0 +1,21 @@ +'use strict' +module.exports = Base => class extends Base { + warn (code, message, data = {}) { + if (this.file) + data.file = this.file + if (this.cwd) + data.cwd = this.cwd + data.code = message instanceof Error && message.code || code + data.tarCode = code + if (!this.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data) + message = message.message + } + this.emit('warn', data.tarCode, message, data) + } else if (message instanceof Error) + this.emit('error', Object.assign(message, data)) + else + this.emit('error', Object.assign(new Error(`${code}: ${message}`), data)) + } +} diff --git a/lib/winchars.js b/lib/winchars.js new file mode 100644 index 0000000..ebcab4a --- /dev/null +++ b/lib/winchars.js @@ -0,0 +1,23 @@ +'use strict' + +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. + +const raw = [ + '|', + '<', + '>', + '?', + ':', +] + +const win = raw.map(char => + String.fromCharCode(0xf000 + char.charCodeAt(0))) + +const toWin = new Map(raw.map((char, i) => [char, win[i]])) +const toRaw = new Map(win.map((char, i) => [char, raw[i]])) + +module.exports = { + encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s), + decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s), +} diff --git a/lib/write-entry.js b/lib/write-entry.js new file mode 100644 index 0000000..3702f2a --- /dev/null +++ b/lib/write-entry.js @@ -0,0 +1,525 @@ +'use strict' +const MiniPass = require('minipass') +const Pax = require('./pax.js') +const Header = require('./header.js') +const fs = require('fs') +const path = require('path') +const normPath = require('./normalize-windows-path.js') +const stripSlash = require('./strip-trailing-slashes.js') + +const prefixPath = (path, prefix) => { + if (!prefix) + return normPath(path) + path = normPath(path).replace(/^\.(\/|$)/, '') + return stripSlash(prefix) + '/' + path +} + +const maxReadSize = 16 * 1024 * 1024 +const PROCESS = Symbol('process') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const HEADER = Symbol('header') +const READ = Symbol('read') +const LSTAT = Symbol('lstat') +const ONLSTAT = Symbol('onlstat') +const ONREAD = Symbol('onread') +const ONREADLINK = Symbol('onreadlink') +const OPENFILE = Symbol('openfile') +const ONOPENFILE = Symbol('onopenfile') +const CLOSE = Symbol('close') +const MODE = Symbol('mode') +const AWAITDRAIN = Symbol('awaitDrain') +const ONDRAIN = Symbol('ondrain') +const PREFIX = Symbol('prefix') +const HAD_ERROR = Symbol('hadError') +const warner = require('./warn-mixin.js') +const winchars = require('./winchars.js') +const stripAbsolutePath = require('./strip-absolute-path.js') + +const modeFix = require('./mode-fix.js') + +const WriteEntry = warner(class WriteEntry extends MiniPass { + constructor (p, opt) { + opt = opt || {} + super(opt) + if (typeof p !== 'string') + throw new TypeError('path is required') + this.path = normPath(p) + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable + // until node has builtin pwnam functions, this'll have to do + this.myuid = process.getuid && process.getuid() || 0 + this.myuser = process.env.USER || '' + this.maxReadSize = opt.maxReadSize || maxReadSize + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.preservePaths = !!opt.preservePaths + this.cwd = normPath(opt.cwd || process.cwd()) + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null + this.prefix = opt.prefix ? normPath(opt.prefix) : null + + this.fd = null + this.blockLen = null + this.blockRemain = null + this.buf = null + this.offset = null + this.length = null + this.pos = null + this.remain = null + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + let pathWarn = false + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path) + if (root) { + this.path = stripped + pathWarn = root + } + } + + this.win32 = !!opt.win32 || process.platform === 'win32' + if (this.win32) { + // force the \ to / normalization, since we might not *actually* + // be on windows, but want \ to be considered a path separator. + this.path = winchars.decode(this.path.replace(/\\/g, '/')) + p = p.replace(/\\/g, '/') + } + + this.absolute = normPath(opt.absolute || path.resolve(this.cwd, p)) + + if (this.path === '') + this.path = './' + + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }) + } + + if (this.statCache.has(this.absolute)) + this[ONLSTAT](this.statCache.get(this.absolute)) + else + this[LSTAT]() + } + + emit (ev, ...data) { + if (ev === 'error') + this[HAD_ERROR] = true + return super.emit(ev, ...data) + } + + [LSTAT] () { + fs.lstat(this.absolute, (er, stat) => { + if (er) + return this.emit('error', er) + this[ONLSTAT](stat) + }) + } + + [ONLSTAT] (stat) { + this.statCache.set(this.absolute, stat) + this.stat = stat + if (!stat.isFile()) + stat.size = 0 + this.type = getType(stat) + this.emit('stat', stat) + this[PROCESS]() + } + + [PROCESS] () { + switch (this.type) { + case 'File': return this[FILE]() + case 'Directory': return this[DIRECTORY]() + case 'SymbolicLink': return this[SYMLINK]() + // unsupported types are ignored. + default: return this.end() + } + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory', this.portable) + } + + [PREFIX] (path) { + return prefixPath(path, this.prefix) + } + + [HEADER] () { + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.header = new Header({ + path: this[PREFIX](this.path), + // only apply the prefix to hard links. + linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? null : this.stat.uid, + gid: this.portable ? null : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? null : this.mtime || this.stat.mtime, + type: this.type, + uname: this.portable ? null : + this.stat.uid === this.myuid ? this.myuser : '', + atime: this.portable ? null : this.stat.atime, + ctime: this.portable ? null : this.stat.ctime, + }) + + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? null : this.header.atime, + ctime: this.portable ? null : this.header.ctime, + gid: this.portable ? null : this.header.gid, + mtime: this.noMtime ? null : this.mtime || this.header.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath) + : this.linkpath, + size: this.header.size, + uid: this.portable ? null : this.header.uid, + uname: this.portable ? null : this.header.uname, + dev: this.portable ? null : this.stat.dev, + ino: this.portable ? null : this.stat.ino, + nlink: this.portable ? null : this.stat.nlink, + }).encode()) + } + super.write(this.header.block) + } + + [DIRECTORY] () { + if (this.path.substr(-1) !== '/') + this.path += '/' + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [SYMLINK] () { + fs.readlink(this.absolute, (er, linkpath) => { + if (er) + return this.emit('error', er) + this[ONREADLINK](linkpath) + }) + } + + [ONREADLINK] (linkpath) { + this.linkpath = normPath(linkpath) + this[HEADER]() + this.end() + } + + [HARDLINK] (linkpath) { + this.type = 'Link' + this.linkpath = normPath(path.relative(this.cwd, linkpath)) + this.stat.size = 0 + this[HEADER]() + this.end() + } + + [FILE] () { + if (this.stat.nlink > 1) { + const linkKey = this.stat.dev + ':' + this.stat.ino + if (this.linkCache.has(linkKey)) { + const linkpath = this.linkCache.get(linkKey) + if (linkpath.indexOf(this.cwd) === 0) + return this[HARDLINK](linkpath) + } + this.linkCache.set(linkKey, this.absolute) + } + + this[HEADER]() + if (this.stat.size === 0) + return this.end() + + this[OPENFILE]() + } + + [OPENFILE] () { + fs.open(this.absolute, 'r', (er, fd) => { + if (er) + return this.emit('error', er) + this[ONOPENFILE](fd) + }) + } + + [ONOPENFILE] (fd) { + this.fd = fd + if (this[HAD_ERROR]) + return this[CLOSE]() + + this.blockLen = 512 * Math.ceil(this.stat.size / 512) + this.blockRemain = this.blockLen + const bufLen = Math.min(this.blockLen, this.maxReadSize) + this.buf = Buffer.allocUnsafe(bufLen) + this.offset = 0 + this.pos = 0 + this.remain = this.stat.size + this.length = this.buf.length + this[READ]() + } + + [READ] () { + const { fd, buf, offset, length, pos } = this + fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + return this[CLOSE](() => this.emit('error', er)) + } + this[ONREAD](bytesRead) + }) + } + + [CLOSE] (cb) { + fs.close(this.fd, cb) + } + + [ONREAD] (bytesRead) { + if (bytesRead <= 0 && this.remain > 0) { + const er = new Error('encountered unexpected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + return this[CLOSE](() => this.emit('error', er)) + } + + if (bytesRead > this.remain) { + const er = new Error('did not encounter expected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + return this[CLOSE](() => this.emit('error', er)) + } + + // null out the rest of the buffer, if we could fit the block padding + // at the end of this loop, we've incremented bytesRead and this.remain + // to be incremented up to the blockRemain level, as if we had expected + // to get a null-padded file, and read it until the end. then we will + // decrement both remain and blockRemain by bytesRead, and know that we + // reached the expected EOF, without any null buffer to append. + if (bytesRead === this.remain) { + for (let i = bytesRead; i < this.length && bytesRead < this.blockRemain; i++) { + this.buf[i + this.offset] = 0 + bytesRead++ + this.remain++ + } + } + + const writeBuf = this.offset === 0 && bytesRead === this.buf.length ? + this.buf : this.buf.slice(this.offset, this.offset + bytesRead) + + const flushed = this.write(writeBuf) + if (!flushed) + this[AWAITDRAIN](() => this[ONDRAIN]()) + else + this[ONDRAIN]() + } + + [AWAITDRAIN] (cb) { + this.once('drain', cb) + } + + write (writeBuf) { + if (this.blockRemain < writeBuf.length) { + const er = new Error('writing more data than expected') + er.path = this.absolute + return this.emit('error', er) + } + this.remain -= writeBuf.length + this.blockRemain -= writeBuf.length + this.pos += writeBuf.length + this.offset += writeBuf.length + return super.write(writeBuf) + } + + [ONDRAIN] () { + if (!this.remain) { + if (this.blockRemain) + super.write(Buffer.alloc(this.blockRemain)) + return this[CLOSE](er => er ? this.emit('error', er) : this.end()) + } + + if (this.offset >= this.length) { + // if we only have a smaller bit left to read, alloc a smaller buffer + // otherwise, keep it the same length it was before. + this.buf = Buffer.allocUnsafe(Math.min(this.blockRemain, this.buf.length)) + this.offset = 0 + } + this.length = this.buf.length - this.offset + this[READ]() + } +}) + +class WriteEntrySync extends WriteEntry { + [LSTAT] () { + this[ONLSTAT](fs.lstatSync(this.absolute)) + } + + [SYMLINK] () { + this[ONREADLINK](fs.readlinkSync(this.absolute)) + } + + [OPENFILE] () { + this[ONOPENFILE](fs.openSync(this.absolute, 'r')) + } + + [READ] () { + let threw = true + try { + const { fd, buf, offset, length, pos } = this + const bytesRead = fs.readSync(fd, buf, offset, length, pos) + this[ONREAD](bytesRead) + threw = false + } finally { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + if (threw) { + try { + this[CLOSE](() => {}) + } catch (er) {} + } + } + } + + [AWAITDRAIN] (cb) { + cb() + } + + [CLOSE] (cb) { + fs.closeSync(this.fd) + cb() + } +} + +const WriteEntryTar = warner(class WriteEntryTar extends MiniPass { + constructor (readEntry, opt) { + opt = opt || {} + super(opt) + this.preservePaths = !!opt.preservePaths + this.portable = !!opt.portable + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + + this.readEntry = readEntry + this.type = readEntry.type + if (this.type === 'Directory' && this.portable) + this.noMtime = true + + this.prefix = opt.prefix || null + + this.path = normPath(readEntry.path) + this.mode = this[MODE](readEntry.mode) + this.uid = this.portable ? null : readEntry.uid + this.gid = this.portable ? null : readEntry.gid + this.uname = this.portable ? null : readEntry.uname + this.gname = this.portable ? null : readEntry.gname + this.size = readEntry.size + this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime + this.atime = this.portable ? null : readEntry.atime + this.ctime = this.portable ? null : readEntry.ctime + this.linkpath = normPath(readEntry.linkpath) + + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) + + let pathWarn = false + if (!this.preservePaths) { + const [root, stripped] = stripAbsolutePath(this.path) + if (root) { + this.path = stripped + pathWarn = root + } + } + + this.remain = readEntry.size + this.blockRemain = readEntry.startBlockSize + + this.header = new Header({ + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath) + : this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? null : this.uid, + gid: this.portable ? null : this.gid, + size: this.size, + mtime: this.noMtime ? null : this.mtime, + type: this.type, + uname: this.portable ? null : this.uname, + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime, + }) + + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }) + } + + if (this.header.encode() && !this.noPax) { + super.write(new Pax({ + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime, + gid: this.portable ? null : this.gid, + mtime: this.noMtime ? null : this.mtime, + path: this[PREFIX](this.path), + linkpath: this.type === 'Link' ? this[PREFIX](this.linkpath) + : this.linkpath, + size: this.size, + uid: this.portable ? null : this.uid, + uname: this.portable ? null : this.uname, + dev: this.portable ? null : this.readEntry.dev, + ino: this.portable ? null : this.readEntry.ino, + nlink: this.portable ? null : this.readEntry.nlink, + }).encode()) + } + + super.write(this.header.block) + readEntry.pipe(this) + } + + [PREFIX] (path) { + return prefixPath(path, this.prefix) + } + + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory', this.portable) + } + + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + this.blockRemain -= writeLen + return super.write(data) + } + + end () { + if (this.blockRemain) + super.write(Buffer.alloc(this.blockRemain)) + return super.end() + } +}) + +WriteEntry.Sync = WriteEntrySync +WriteEntry.Tar = WriteEntryTar + +const getType = stat => + stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported' + +module.exports = WriteEntry diff --git a/map.js b/map.js new file mode 100644 index 0000000..adeceef --- /dev/null +++ b/map.js @@ -0,0 +1,9 @@ +const {basename} = require('path') + +const map = test => + test === 'index.js' || test === 'map.js' ? test + : test === 'unpack.js' ? ['lib/unpack.js', 'lib/mkdir.js'] + : test === 'load-all.js' ? [] + : `lib/${test}` + +module.exports = test => map(basename(test)) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..535aa04 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12411 @@ +{ + "name": "tar", + "version": "6.1.11", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "6.1.11", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "devDependencies": { + "chmodr": "^1.2.0", + "end-of-stream": "^1.4.3", + "eslint": "^7.17.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^5.0.0", + "events-to-array": "^1.1.2", + "mutate-fs": "^2.1.1", + "rimraf": "^2.7.1", + "tap": "^15.0.9", + "tar-fs": "^1.16.3", + "tar-stream": "^1.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-hook-domain": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.3.tgz", + "integrity": "sha512-MadiLLDEZRZzZwcm0dgS+K99qXZ4H2saAUwUgwzFulbAkXrKi3AX5FvWS3FFTQtLMwrqcGqAJe6o12KrObejQA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bind-obj-methods": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", + "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", + "escalade": "^3.1.1", + "node-releases": "^1.1.73" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chmodr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.2.0.tgz", + "integrity": "sha512-Y5uI7Iq/Az6HgJEL6pdw7THVd7jbVOTPwsmcPOBjQL8e3N+pz872kzK5QxYGEy21iRys+iHWV0UZQXDFJo1hyA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "dependencies": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/coveralls": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", + "dev": true, + "dependencies": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + }, + "bin": { + "coveralls": "bin/coveralls.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.3.798", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.798.tgz", + "integrity": "sha512-fwsr6oXAORoV9a6Ak2vMCdXfmHIpAGgpOGesulS1cbGgJmrMl3H+GicUyRG3t+z9uHTMrIuMTleFDW+EUFYT3g==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz", + "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==", + "deprecated": "standard 16.0.0 and eslint-config-standard 16.0.0 no longer require the eslint-plugin-standard package. You can remove it from your dependencies with 'npm rm eslint-plugin-standard'. More info here: https://github.com/standard/standard/issues/1316", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "peerDependencies": { + "eslint": ">=5.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", + "dev": true + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function-loop": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", + "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-jsx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-jsx/-/import-jsx-4.0.0.tgz", + "integrity": "sha512-CnjJ2BZFJzbFDmYG5S47xPQjMlSbZLyLJuG4znzL4TdPtJBxHtFP1xVmR+EYX4synFSldiY3B6m00XkPM3zVnA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "caller-path": "^2.0.0", + "find-cache-dir": "^3.2.0", + "make-dir": "^3.0.2", + "resolve-from": "^3.0.0", + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/import-jsx/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-jsx/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.0.tgz", + "integrity": "sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw==", + "dev": true, + "dependencies": { + "cliui": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true, + "bin": { + "lcov-parse": "bin/cli.js" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libtap": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.1.1.tgz", + "integrity": "sha512-Fye8fh1+G7E8qqmjQaY+pXGxy7HM0S6bqCCJFLa16+g2jODBByxbJFDpjbDNF69wfRVyvJ+foLZc1WTIv7dx+g==", + "dev": true, + "dependencies": { + "async-hook-domain": "^2.0.1", + "bind-obj-methods": "^3.0.0", + "diff": "^4.0.2", + "function-loop": "^2.0.1", + "minipass": "^3.1.1", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "signal-exit": "^3.0.2", + "stack-utils": "^2.0.1", + "tap-parser": "^10.0.1", + "tap-yaml": "^1.0.0", + "tcompare": "^5.0.1", + "trivial-deferred": "^1.0.1", + "yapool": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true, + "engines": { + "node": ">=0.8.6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "dependencies": { + "mime-db": "1.49.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mutate-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mutate-fs/-/mutate-fs-2.1.1.tgz", + "integrity": "sha512-WI5pPPUNiWqaK2XdK94AVpxIc8GmZEXYlLfFbWuc4gUtBGHTK92jdPqFdx/lilxgb5Ep7tQ15NqCcJEOeq6wdA==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "node_modules/own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "dependencies": { + "own-or": "^1.0.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "node_modules/pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/tap": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/tap/-/tap-15.0.9.tgz", + "integrity": "sha512-bqY5SxEqYKRd37PIUfKBf9HMs/hklyl/fGXkuStr9rYTIGa0/icpSLsm6IVOmx2qT0/TliPNJ6OvS5kddJYHdg==", + "bundleDependencies": [ + "ink", + "treport", + "@types/react" + ], + "dev": true, + "dependencies": { + "@types/react": "^16.9.23", + "chokidar": "^3.3.0", + "coveralls": "^3.0.11", + "findit": "^2.0.0", + "foreground-child": "^2.0.0", + "fs-exists-cached": "^1.0.0", + "glob": "^7.1.6", + "import-jsx": "^4.0.0", + "ink": "^2.7.1", + "isexe": "^2.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "jackspeak": "^1.4.0", + "libtap": "^1.1.1", + "minipass": "^3.1.1", + "mkdirp": "^1.0.4", + "nyc": "^15.1.0", + "opener": "^1.5.1", + "react": "^16.12.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.16", + "tap-mocha-reporter": "^5.0.0", + "tap-parser": "^10.0.1", + "tap-yaml": "^1.0.0", + "tcompare": "^5.0.6", + "treport": "^2.0.2", + "which": "^2.0.2" + }, + "bin": { + "tap": "bin/run.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "peerDependencies": { + "flow-remove-types": ">=2.112.0", + "ts-node": ">=8.5.2", + "typescript": ">=3.7.2" + }, + "peerDependenciesMeta": { + "flow-remove-types": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/tap-mocha-reporter": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", + "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", + "dev": true, + "dependencies": { + "color-support": "^1.1.0", + "debug": "^4.1.1", + "diff": "^4.0.1", + "escape-string-regexp": "^2.0.0", + "glob": "^7.0.5", + "tap-parser": "^10.0.0", + "tap-yaml": "^1.0.0", + "unicode-length": "^2.0.2" + }, + "bin": { + "tap-mocha-reporter": "index.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap-mocha-reporter/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz", + "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==", + "dev": true, + "dependencies": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + }, + "bin": { + "tap-parser": "bin/cmd.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", + "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", + "dev": true, + "dependencies": { + "yaml": "^1.5.0" + } + }, + "node_modules/tap/node_modules/@babel/code-frame": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/compat-data": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@babel/core": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/tap/node_modules/@babel/generator": { + "version": "7.14.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.14.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/helper-compilation-targets": { + "version": "7.13.16", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-function-name": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/helper-get-function-arity": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/tap/node_modules/@babel/helper-module-imports": { + "version": "7.13.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/tap/node_modules/@babel/helper-module-transforms": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "node_modules/tap/node_modules/@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/helper-plugin-utils": { + "version": "7.13.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@babel/helper-replace-supers": { + "version": "7.13.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "node_modules/tap/node_modules/@babel/helper-simple-access": { + "version": "7.13.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.13.12" + } + }, + "node_modules/tap/node_modules/@babel/helper-split-export-declaration": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@babel/helper-validator-option": { + "version": "7.12.17", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@babel/helpers": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "node_modules/tap/node_modules/@babel/highlight": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/tap/node_modules/@babel/parser": { + "version": "7.14.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-parameters": { + "version": "7.13.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.13.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/tap/node_modules/@babel/template": { + "version": "7.12.13", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "node_modules/tap/node_modules/@babel/traverse": { + "version": "7.14.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "node_modules/tap/node_modules/@babel/types": { + "version": "7.14.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/tap/node_modules/@types/prop-types": { + "version": "15.7.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@types/react": { + "version": "16.14.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/tap/node_modules/@types/scheduler": { + "version": "0.16.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/@types/yoga-layout": { + "version": "1.9.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/ansi-styles": { + "version": "3.2.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/ansicolors": { + "version": "0.3.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/arrify": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/auto-bind": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/tap/node_modules/browserslist": { + "version": "4.16.6", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/tap/node_modules/caller-callsite": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/caller-path": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/callsites": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/caniuse-lite": { + "version": "1.0.30001223", + "dev": true, + "inBundle": true, + "license": "CC-BY-4.0" + }, + "node_modules/tap/node_modules/cardinal": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/tap/node_modules/chalk": { + "version": "2.4.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/color-convert": { + "version": "1.9.3", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tap/node_modules/color-name": { + "version": "1.1.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/colorette": { + "version": "1.2.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/convert-source-map": { + "version": "1.7.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/tap/node_modules/csstype": { + "version": "3.0.8", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/debug": { + "version": "4.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/tap/node_modules/electron-to-chromium": { + "version": "1.3.727", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/escalade": { + "version": "3.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tap/node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "inBundle": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/events-to-array": { + "version": "1.1.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/find-cache-dir": { + "version": "3.3.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/tap/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/tap/node_modules/glob": { + "version": "7.1.7", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/globals": { + "version": "11.12.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/has-flag": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/import-jsx": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "caller-path": "^2.0.0", + "find-cache-dir": "^3.2.0", + "make-dir": "^3.0.2", + "resolve-from": "^3.0.0", + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tap/node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/tap/node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/ink": { + "version": "2.7.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "arrify": "^2.0.1", + "auto-bind": "^4.0.0", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "is-ci": "^2.0.0", + "lodash.throttle": "^4.1.1", + "log-update": "^3.0.0", + "prop-types": "^15.6.2", + "react-reconciler": "^0.24.0", + "scheduler": "^0.18.0", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "string-length": "^3.1.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "yoga-layout-prebuilt": "^1.9.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/tap/node_modules/ink/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/ink/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/ink/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/ink/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/ink/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/ink/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/is-ci": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/tap/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/jsesc": { + "version": "2.5.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/json5": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/lodash.throttle": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/log-update": { + "version": "3.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^3.2.0", + "cli-cursor": "^2.1.0", + "wrap-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/ansi-escapes": { + "version": "3.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/cli-cursor": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/mimic-fn": { + "version": "1.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/onetime": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/restore-cursor": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/log-update/node_modules/wrap-ansi": { + "version": "5.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/loose-envify": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/tap/node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/minimatch": { + "version": "3.0.4", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tap/node_modules/minimist": { + "version": "1.2.5", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/minipass": { + "version": "3.1.3", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/node-releases": { + "version": "1.1.71", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/once": { + "version": "1.4.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/tap/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/prop-types": { + "version": "15.7.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/tap/node_modules/punycode": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/react-reconciler": { + "version": "0.24.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^16.0.0" + } + }, + "node_modules/tap/node_modules/redeyed": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "esprima": "~4.0.0" + } + }, + "node_modules/tap/node_modules/resolve-from": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/tap/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/scheduler": { + "version": "0.18.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/tap/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/tap/node_modules/signal-exit": { + "version": "3.0.3", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/source-map": { + "version": "0.5.7", + "dev": true, + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/string-length": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/string-length/node_modules/ansi-regex": { + "version": "4.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/string-length/node_modules/astral-regex": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/string-length/node_modules/strip-ansi": { + "version": "5.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tap/node_modules/string-width": { + "version": "4.2.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/string-width/node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/supports-color": { + "version": "5.5.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/tap-parser": { + "version": "10.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + }, + "bin": { + "tap-parser": "bin/cmd.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tap/node_modules/tap-yaml": { + "version": "1.0.0", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "yaml": "^1.5.0" + } + }, + "node_modules/tap/node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tap/node_modules/treport": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "cardinal": "^2.1.1", + "chalk": "^3.0.0", + "import-jsx": "^4.0.0", + "ink": "^2.6.0", + "ms": "^2.1.2", + "string-length": "^3.1.0", + "tap-parser": "^10.0.1", + "unicode-length": "^2.0.2" + }, + "peerDependencies": { + "react": "^16.8.6" + } + }, + "node_modules/tap/node_modules/treport/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/treport/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/treport/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/treport/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/treport/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/treport/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "inBundle": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tap/node_modules/unicode-length": { + "version": "2.0.2", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/tap/node_modules/unicode-length/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/unicode-length/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tap/node_modules/widest-line": { + "version": "3.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrap-ansi": { + "version": "6.2.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/tap/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tap/node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/tap/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tap/node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "@types/yoga-layout": "1.9.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "dependencies": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-fs/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tcompare": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.6.tgz", + "integrity": "sha512-OvO7omN/wkdsKzmOqr3sQFfLbghs/2X5mwSkcfgRiXZshfPnTsAs3IRf1RixR/Pff26qG/r9ogcZMpV0YdeGXg==", + "dev": true, + "dependencies": { + "diff": "^4.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "dev": true, + "dependencies": { + "json5": "^2.2.0", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-length": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.0.2.tgz", + "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", + "dev": true, + "dependencies": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/unicode-length/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unicode-length/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/yargs/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "dev": true + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", + "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "dev": true, + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "dev": true, + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "dev": true, + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helpers": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", + "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "dev": true, + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.14.8", + "@babel/types": "^7.14.8" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.0.tgz", + "integrity": "sha512-0v7oNOjr6YT9Z2RAOTv4T9aP+ubfx4Q/OhVtAet7PFDt0t9Oy6Jn+/rfC6b8HJ5zEqrQCiMxJfgtHpmIminmJQ==", + "dev": true + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz", + "integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.14.7", + "@babel/helper-compilation-targets": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.14.5" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz", + "integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + } + } + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async-hook-domain": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-2.0.3.tgz", + "integrity": "sha512-MadiLLDEZRZzZwcm0dgS+K99qXZ4H2saAUwUgwzFulbAkXrKi3AX5FvWS3FFTQtLMwrqcGqAJe6o12KrObejQA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bind-obj-methods": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bind-obj-methods/-/bind-obj-methods-3.0.0.tgz", + "integrity": "sha512-nLEaaz3/sEzNSyPWRsN9HNsqwk1AUyECtGj+XwGdIi3xABnEqecvXtIJ0wehQXuuER5uZ/5fTs2usONgYjG+iw==", + "dev": true + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.16.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.7.tgz", + "integrity": "sha512-7I4qVwqZltJ7j37wObBe3SoTz+nS8APaNcrBOlgoirb6/HbEU2XxW/LpUDTCngM6iauwFqmRTuOMfyKnFGY5JA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001248", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.793", + "escalade": "^3.1.1", + "node-releases": "^1.1.73" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "requires": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001249", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001249.tgz", + "integrity": "sha512-vcX4U8lwVXPdqzPWi6cAJ3FnQaqXbBqy/GZseKNQzRj37J7qZdGcBtxq/QLFNLLlfsoXLUdHw8Iwenri86Tagw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chmodr": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-1.2.0.tgz", + "integrity": "sha512-Y5uI7Iq/Az6HgJEL6pdw7THVd7jbVOTPwsmcPOBjQL8e3N+pz872kzK5QxYGEy21iRys+iHWV0UZQXDFJo1hyA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.1.tgz", + "integrity": "sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "default-require-extensions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "electron-to-chromium": { + "version": "1.3.798", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.798.tgz", + "integrity": "sha512-fwsr6oXAORoV9a6Ak2vMCdXfmHIpAGgpOGesulS1cbGgJmrMl3H+GicUyRG3t+z9uHTMrIuMTleFDW+EUFYT3g==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "requires": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.23.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", + "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.1", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.4.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.3", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-promise": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz", + "integrity": "sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==", + "dev": true + }, + "eslint-plugin-standard": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-5.0.0.tgz", + "integrity": "sha512-eSIXPc9wBM4BrniMzJRBm2uoVuXz2EPa+NXPk2+itrVt+r5SbKFERx/IgrK/HmfjddyKVz2f+j+7gBRvu19xLg==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "findit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz", + "integrity": "sha1-ZQnwEmr0wXhVHPqZOU4DLhOk1W4=", + "dev": true + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-exists-cached": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz", + "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84=", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function-loop": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/function-loop/-/function-loop-2.0.1.tgz", + "integrity": "sha512-ktIR+O6i/4h+j/ZhZJNdzeI4i9lEPeEK6UPR2EVyTVBqOwcU3Za9xYKLH64ZR9HmcROyRrOkizNyjjtWJzDDkQ==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.10.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", + "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-jsx": { + "version": "https://registry.npmjs.org/import-jsx/-/import-jsx-4.0.0.tgz", + "integrity": "sha512-CnjJ2BZFJzbFDmYG5S47xPQjMlSbZLyLJuG4znzL4TdPtJBxHtFP1xVmR+EYX4synFSldiY3B6m00XkPM3zVnA==", + "dev": true, + "requires": { + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "caller-path": "^2.0.0", + "find-cache-dir": "^3.2.0", + "make-dir": "^3.0.2", + "resolve-from": "^3.0.0", + "rimraf": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true + }, + "is-core-module": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", + "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-1.4.0.tgz", + "integrity": "sha512-VDcSunT+wcccoG46FtzuBAyQKlzhHjli4q31e1fIHGOsRspqNUFjVzGb+7eIFDlTvqLygxapDHPHS0ouT2o/tw==", + "dev": true, + "requires": { + "cliui": "^4.1.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lcov-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", + "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "libtap": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/libtap/-/libtap-1.1.1.tgz", + "integrity": "sha512-Fye8fh1+G7E8qqmjQaY+pXGxy7HM0S6bqCCJFLa16+g2jODBByxbJFDpjbDNF69wfRVyvJ+foLZc1WTIv7dx+g==", + "dev": true, + "requires": { + "async-hook-domain": "^2.0.1", + "bind-obj-methods": "^3.0.0", + "diff": "^4.0.2", + "function-loop": "^2.0.1", + "minipass": "^3.1.1", + "own-or": "^1.0.0", + "own-or-env": "^1.0.1", + "signal-exit": "^3.0.2", + "stack-utils": "^2.0.1", + "tap-parser": "^10.0.1", + "tap-yaml": "^1.0.0", + "tcompare": "^5.0.1", + "trivial-deferred": "^1.0.1", + "yapool": "^1.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "requires": { + "mime-db": "1.49.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mutate-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mutate-fs/-/mutate-fs-2.1.1.tgz", + "integrity": "sha512-WI5pPPUNiWqaK2XdK94AVpxIc8GmZEXYlLfFbWuc4gUtBGHTK92jdPqFdx/lilxgb5Ep7tQ15NqCcJEOeq6wdA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, + "node-releases": { + "version": "1.1.73", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", + "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "requires": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "own-or": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/own-or/-/own-or-1.0.0.tgz", + "integrity": "sha1-Tod/vtqaLsgAD7wLyuOWRe6L+Nw=", + "dev": true + }, + "own-or-env": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-or-env/-/own-or-env-1.0.1.tgz", + "integrity": "sha512-y8qULRbRAlL6x2+M0vIe7jJbJx/kmUTzYonRAa2ayesR2qWLswninkVyeJe4x3IEXhdgoNodzjQRKAoEs6Fmrw==", + "dev": true, + "requires": { + "own-or": "^1.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "requires": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "dependencies": { + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "tap": { + "version": "15.0.9", + "resolved": "https://registry.npmjs.org/tap/-/tap-15.0.9.tgz", + "integrity": "sha512-bqY5SxEqYKRd37PIUfKBf9HMs/hklyl/fGXkuStr9rYTIGa0/icpSLsm6IVOmx2qT0/TliPNJ6OvS5kddJYHdg==", + "dev": true, + "requires": { + "@types/react": "^16.9.23", + "chokidar": "^3.3.0", + "coveralls": "^3.0.11", + "findit": "^2.0.0", + "foreground-child": "^2.0.0", + "fs-exists-cached": "^1.0.0", + "glob": "^7.1.6", + "import-jsx": "^4.0.0", + "ink": "^2.7.1", + "isexe": "^2.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "jackspeak": "^1.4.0", + "libtap": "^1.1.1", + "minipass": "^3.1.1", + "mkdirp": "^1.0.4", + "nyc": "^15.1.0", + "opener": "^1.5.1", + "react": "^16.12.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.0", + "source-map-support": "^0.5.16", + "tap-mocha-reporter": "^5.0.0", + "tap-parser": "^10.0.1", + "tap-yaml": "^1.0.0", + "tcompare": "^5.0.6", + "treport": "^2.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/compat-data": { + "version": "7.14.0", + "bundled": true, + "dev": true + }, + "@babel/core": { + "version": "7.14.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-compilation-targets": "^7.13.16", + "@babel/helper-module-transforms": "^7.14.0", + "@babel/helpers": "^7.14.0", + "@babel/parser": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.14.1", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.14.1", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.13.16", + "bundled": true, + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.15", + "@babel/helper-validator-option": "^7.12.17", + "browserslist": "^4.14.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.13.12", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-imports": { + "version": "7.13.12", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-module-transforms": { + "version": "7.14.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-replace-supers": "^7.13.12", + "@babel/helper-simple-access": "^7.13.12", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.14.0", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.13.0", + "bundled": true, + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.13.12", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.13.12", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.13.0", + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-simple-access": { + "version": "7.13.12", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.13.12" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "bundled": true, + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.12.17", + "bundled": true, + "dev": true + }, + "@babel/helpers": { + "version": "7.14.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.14.0", + "@babel/types": "^7.14.0" + } + }, + "@babel/highlight": { + "version": "7.14.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.14.1", + "bundled": true, + "dev": true + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.13.8", + "bundled": true, + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.8", + "@babel/helper-compilation-targets": "^7.13.8", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.13.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.13.17", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.13.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.13.0" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.13.12", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-module-imports": "^7.13.12", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/plugin-syntax-jsx": "^7.12.13", + "@babel/types": "^7.13.12" + } + }, + "@babel/template": { + "version": "7.12.13", + "bundled": true, + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.14.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.14.0", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.14.0", + "@babel/types": "^7.14.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.14.1", + "bundled": true, + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "to-fast-properties": "^2.0.0" + } + }, + "@types/prop-types": { + "version": "15.7.3", + "bundled": true, + "dev": true + }, + "@types/react": { + "version": "16.14.6", + "bundled": true, + "dev": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/scheduler": { + "version": "0.16.1", + "bundled": true, + "dev": true + }, + "@types/yoga-layout": { + "version": "1.9.2", + "bundled": true, + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "bundled": true, + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "bundled": true, + "dev": true + }, + "arrify": { + "version": "2.0.1", + "bundled": true, + "dev": true + }, + "astral-regex": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "auto-bind": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.16.6", + "bundled": true, + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" + } + }, + "caller-callsite": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001223", + "bundled": true, + "dev": true + }, + "cardinal": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "ci-info": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true, + "dev": true + }, + "colorette": { + "version": "1.2.2", + "bundled": true, + "dev": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "csstype": { + "version": "3.0.8", + "bundled": true, + "dev": true + }, + "debug": { + "version": "4.3.1", + "bundled": true, + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "electron-to-chromium": { + "version": "1.3.727", + "bundled": true, + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "bundled": true, + "dev": true + }, + "escalade": { + "version": "3.1.1", + "bundled": true, + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "esprima": { + "version": "4.0.1", + "bundled": true, + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "bundled": true, + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "bundled": true, + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "bundled": true, + "dev": true + }, + "glob": { + "version": "7.1.7", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "import-jsx": { + "version": "4.0.0", + "bundled": true, + "dev": true, + "requires": { + "@babel/core": "^7.5.5", + "@babel/plugin-proposal-object-rest-spread": "^7.5.5", + "@babel/plugin-transform-destructuring": "^7.5.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", + "caller-path": "^2.0.0", + "find-cache-dir": "^3.2.0", + "make-dir": "^3.0.2", + "resolve-from": "^3.0.0", + "rimraf": "^3.0.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "bundled": true, + "dev": true + }, + "ink": { + "version": "2.7.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "arrify": "^2.0.1", + "auto-bind": "^4.0.0", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "is-ci": "^2.0.0", + "lodash.throttle": "^4.1.1", + "log-update": "^3.0.0", + "prop-types": "^15.6.2", + "react-reconciler": "^0.24.0", + "scheduler": "^0.18.0", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "string-length": "^3.1.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "yoga-layout-prebuilt": "^1.9.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "is-ci": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "bundled": true, + "dev": true + }, + "json5": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "locate-path": { + "version": "5.0.0", + "bundled": true, + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.throttle": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "log-update": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-escapes": "^3.2.0", + "cli-cursor": "^2.1.0", + "wrap-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "bundled": true, + "dev": true + }, + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "bundled": true, + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "emoji-regex": { + "version": "7.0.3", + "bundled": true, + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true, + "dev": true + }, + "onetime": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "bundled": true, + "dev": true + }, + "node-releases": { + "version": "1.1.71", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "bundled": true, + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "bundled": true, + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "bundled": true, + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "bundled": true, + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prop-types": { + "version": "15.7.2", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "punycode": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "react-is": { + "version": "16.13.1", + "bundled": true, + "dev": true + }, + "react-reconciler": { + "version": "0.24.0", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.18.0" + } + }, + "redeyed": { + "version": "2.1.1", + "bundled": true, + "dev": true, + "requires": { + "esprima": "~4.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "bundled": true, + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "rimraf": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "scheduler": { + "version": "0.18.0", + "bundled": true, + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "6.3.0", + "bundled": true, + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "bundled": true, + "dev": true + }, + "slice-ansi": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "bundled": true, + "dev": true + }, + "string-length": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "bundled": true, + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "string-width": { + "version": "4.2.2", + "bundled": true, + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tap-parser": { + "version": "10.1.0", + "bundled": true, + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + } + }, + "tap-yaml": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "bundled": true, + "dev": true + }, + "treport": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "cardinal": "^2.1.1", + "chalk": "^3.0.0", + "import-jsx": "^4.0.0", + "ink": "^2.6.0", + "ms": "^2.1.2", + "string-length": "^3.1.0", + "tap-parser": "^10.0.1", + "unicode-length": "^2.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "bundled": true, + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "type-fest": { + "version": "0.21.3", + "bundled": true, + "dev": true + }, + "unicode-length": { + "version": "2.0.2", + "bundled": true, + "dev": true, + "requires": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "widest-line": { + "version": "3.1.0", + "bundled": true, + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "bundled": true, + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "bundled": true, + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "bundled": true, + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "yaml": { + "version": "1.10.2", + "bundled": true, + "dev": true + }, + "yoga-layout-prebuilt": { + "version": "1.10.0", + "bundled": true, + "dev": true, + "requires": { + "@types/yoga-layout": "1.9.2" + } + } + } + }, + "tap-mocha-reporter": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/tap-mocha-reporter/-/tap-mocha-reporter-5.0.1.tgz", + "integrity": "sha512-1knFWOwd4khx/7uSEnUeaP9IPW3w+sqTgJMhrwah6t46nZ8P25atOKAjSvVDsT67lOPu0nfdOqUwoyKn+3E5pA==", + "dev": true, + "requires": { + "color-support": "^1.1.0", + "debug": "^4.1.1", + "diff": "^4.0.1", + "escape-string-regexp": "^2.0.0", + "glob": "^7.0.5", + "tap-parser": "^10.0.0", + "tap-yaml": "^1.0.0", + "unicode-length": "^2.0.2" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "tap-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-10.1.0.tgz", + "integrity": "sha512-FujQeciDaOiOvaIVGS1Rpb0v4R6XkOjvWCWowlz5oKuhPkEJ8U6pxgqt38xuzYhPt8dWEnfHn2jqpZdJEkW7pA==", + "dev": true, + "requires": { + "events-to-array": "^1.0.1", + "minipass": "^3.0.0", + "tap-yaml": "^1.0.0" + } + }, + "tap-yaml": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tap-yaml/-/tap-yaml-1.0.0.tgz", + "integrity": "sha512-Rxbx4EnrWkYk0/ztcm5u3/VznbyFJpyXO12dDBHKWiDVxy7O2Qw6MRrwO5H6Ww0U5YhRY/4C/VzWmFPhBQc4qQ==", + "dev": true, + "requires": { + "yaml": "^1.5.0" + } + }, + "tar-fs": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", + "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", + "dev": true, + "requires": { + "chownr": "^1.0.1", + "mkdirp": "^0.5.1", + "pump": "^1.0.0", + "tar-stream": "^1.1.2" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "tcompare": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/tcompare/-/tcompare-5.0.6.tgz", + "integrity": "sha512-OvO7omN/wkdsKzmOqr3sQFfLbghs/2X5mwSkcfgRiXZshfPnTsAs3IRf1RixR/Pff26qG/r9ogcZMpV0YdeGXg==", + "dev": true, + "requires": { + "diff": "^4.0.2" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trivial-deferred": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-1.0.1.tgz", + "integrity": "sha1-N21NKdlR1jaKb3oK6FwvTV4GWPM=", + "dev": true + }, + "tsconfig-paths": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz", + "integrity": "sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==", + "dev": true, + "requires": { + "json5": "^2.2.0", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unicode-length": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.0.2.tgz", + "integrity": "sha512-Ph/j1VbS3/r77nhoY2WU0GWGjVYOHL3xpKp0y/Eq2e5r0mT/6b649vm7KFO6RdAdrZkYLdxphYVgvODxPB+Ebg==", + "dev": true, + "requires": { + "punycode": "^2.0.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yapool": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yapool/-/yapool-1.0.0.tgz", + "integrity": "sha1-9pPymjFbUNmp2iZGp6ZkXJaYW2o=", + "dev": true + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9f9977a --- /dev/null +++ b/package.json @@ -0,0 +1,59 @@ +{ + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "name": "tar", + "description": "tar for node", + "version": "6.1.11", + "repository": { + "type": "git", + "url": "https://github.com/npm/node-tar.git" + }, + "scripts": { + "test:posix": "tap", + "test:win32": "tap --lines=98 --branches=98 --statements=98 --functions=98", + "test": "node test/fixtures/test.js", + "posttest": "npm run lint", + "eslint": "eslint", + "lint": "npm run eslint -- test lib", + "lintfix": "npm run lint -- --fix", + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "genparse": "node scripts/generate-parse-fixtures.js", + "bench": "for i in benchmarks/*/*.js; do echo $i; for j in {1..5}; do node $i || break; done; done" + }, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "devDependencies": { + "chmodr": "^1.2.0", + "end-of-stream": "^1.4.3", + "eslint": "^7.17.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^5.0.0", + "events-to-array": "^1.1.2", + "mutate-fs": "^2.1.1", + "rimraf": "^2.7.1", + "tap": "^15.0.9", + "tar-fs": "^1.16.3", + "tar-stream": "^1.6.2" + }, + "license": "ISC", + "engines": { + "node": ">= 10" + }, + "files": [ + "index.js", + "lib/*.js" + ], + "tap": { + "coverage-map": "map.js", + "check-coverage": true + } +} diff --git a/scripts/generate-parse-fixtures.js b/scripts/generate-parse-fixtures.js new file mode 100644 index 0000000..0310f83 --- /dev/null +++ b/scripts/generate-parse-fixtures.js @@ -0,0 +1,97 @@ +'use strict' +const Parse = require('../lib/parse.js') +const fs = require('fs') +const path = require('path') +const tardir = path.resolve(__dirname, '../test/fixtures/tars') +const parsedir = path.resolve(__dirname, '../test/fixtures/parse') +const maxMetaOpt = [250, null] +const filterOpt = [ true, false ] +const strictOpt = [ true, false ] + +const makeTest = (tarfile, tardata, maxMeta, filter, strict) => { + const o = + (maxMeta ? '-meta-' + maxMeta : '') + + (filter ? '-filter' : '') + + (strict ? '-strict' : '') + const tail = (o ? '-' + o : '') + '.json' + const eventsfile = parsedir + '/' + path.basename(tarfile, '.tar') + tail + + const p = new Parse({ + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict + }) + const events = [] + + const pushEntry = type => entry => { + events.push([type, { + extended: entry.extended, + globalExtended: entry.globalExtended, + type: entry.type, + meta: entry.meta, + ignore: entry.ignore, + path: entry.path, + mode: entry.mode, + uid: entry.uid, + gid: entry.gid, + uname: entry.uname, + gname: entry.gname, + size: entry.size, + mtime: entry.mtime, + atime: entry.atime, + ctime: entry.ctime, + linkpath: entry.linkpath, + header: { + cksumValid: entry.header.cksumValid, + needPax: entry.header.needPax, + path: entry.header.path, + mode: entry.header.mode, + uid: entry.header.uid, + gid: entry.header.gid, + size: entry.header.size, + mtime: entry.header.mtime, + cksum: entry.header.cksum, + linkpath: entry.header.linkpath, + ustar: entry.header.ustar, + ustarver: entry.header.ustarver, + uname: entry.header.uname, + gname: entry.header.gname, + devmaj: entry.header.devmaj, + devmin: entry.header.devmin, + ustarPrefix: entry.header.ustarPrefix, + xstarPrefix: entry.header.xstarPrefix, + prefixTerminator: entry.header.prefixTerminator, + atime: entry.header.atime, + ctime: entry.header.atime + } + }]) + entry.resume() + } + + p.on('entry', pushEntry('entry')) + p.on('ignoredEntry', pushEntry('ignoredEntry')) + p.on('warn', (code, message, data) => events.push(['warn', code, message])) + p.on('error', er => events.push(['error', { + message: er.message, + code: er.code + }])) + p.on('end', _ => events.push(['end'])) + p.on('nullBlock', _ => events.push(['nullBlock'])) + p.on('eof', _ => events.push(['eof'])) + p.on('meta', meta => events.push(['meta', meta])) + + p.end(tardata) + console.log(eventsfile) + fs.writeFileSync(eventsfile, JSON.stringify(events, null, 2) + '\n') +} + + +fs.readdirSync(tardir) +.forEach(tar => { + const tarfile = tardir + '/' + tar + const tardata = fs.readFileSync(tarfile) + maxMetaOpt.forEach(maxMeta => + filterOpt.forEach(filter => + strictOpt.forEach(strict => + makeTest(tarfile, tardata, maxMeta, filter, strict)))) +}) diff --git a/test/create.js b/test/create.js new file mode 100644 index 0000000..c30aa28 --- /dev/null +++ b/test/create.js @@ -0,0 +1,227 @@ +'use strict' + +const isWindows = process.platform === 'win32' +const t = require('tap') +const c = require('../lib/create.js') +const list = require('../lib/list.js') +const fs = require('fs') +const path = require('path') +const dir = path.resolve(__dirname, 'fixtures/create') +const tars = path.resolve(__dirname, 'fixtures/tars') +const rimraf = require('rimraf') +const mkdirp = require('mkdirp') +const spawn = require('child_process').spawn +const Pack = require('../lib/pack.js') +const mutateFS = require('mutate-fs') +const {promisify} = require('util') + +const readtar = (file, cb) => { + const child = spawn('tar', ['tf', file]) + const out = [] + child.stdout.on('data', c => out.push(c)) + child.on('close', (code, signal) => + cb(code, signal, Buffer.concat(out).toString())) +} + +t.teardown(() => new Promise(resolve => rimraf(dir, resolve))) + +t.before(async () => { + await promisify(rimraf)(dir) + await mkdirp(dir) +}) + +t.test('no cb if sync or without file', t => { + t.throws(_ => c({ sync: true }, ['asdf'], _ => _)) + t.throws(_ => c(_ => _)) + t.throws(_ => c({}, _ => _)) + t.throws(_ => c({}, ['asdf'], _ => _)) + t.end() +}) + +t.test('create file', t => { + const files = [path.basename(__filename)] + + t.test('sync', t => { + const file = path.resolve(dir, 'sync.tar') + c({ + file: file, + cwd: __dirname, + sync: true, + }, files) + readtar(file, (code, signal, list) => { + t.equal(code, 0) + t.equal(signal, null) + t.equal(list.trim(), 'create.js') + t.end() + }) + }) + + t.test('async', t => { + const file = path.resolve(dir, 'async.tar') + c({ + file: file, + cwd: __dirname, + }, files, er => { + if (er) + throw er + readtar(file, (code, signal, list) => { + t.equal(code, 0) + t.equal(signal, null) + t.equal(list.trim(), 'create.js') + t.end() + }) + }) + }) + + t.test('async promise only', t => { + const file = path.resolve(dir, 'promise.tar') + c({ + file: file, + cwd: __dirname, + }, files).then(_ => { + readtar(file, (code, signal, list) => { + t.equal(code, 0) + t.equal(signal, null) + t.equal(list.trim(), 'create.js') + t.end() + }) + }) + }) + + t.test('with specific mode', t => { + const mode = isWindows ? 0o666 : 0o740 + t.test('sync', t => { + const file = path.resolve(dir, 'sync-mode.tar') + c({ + mode: mode, + file: file, + cwd: __dirname, + sync: true, + }, files) + readtar(file, (code, signal, list) => { + t.equal(code, 0) + t.equal(signal, null) + t.equal(list.trim(), 'create.js') + t.equal(fs.lstatSync(file).mode & 0o7777, mode) + t.end() + }) + }) + + t.test('async', t => { + const file = path.resolve(dir, 'async-mode.tar') + c({ + mode: mode, + file: file, + cwd: __dirname, + }, files, er => { + if (er) + throw er + readtar(file, (code, signal, list) => { + t.equal(code, 0) + t.equal(signal, null) + t.equal(list.trim(), 'create.js') + t.equal(fs.lstatSync(file).mode & 0o7777, mode) + t.end() + }) + }) + }) + + t.end() + }) + t.end() +}) + +t.test('create', t => { + t.type(c({ sync: true }, ['README.md']), Pack.Sync) + t.type(c(['README.md']), Pack) + t.end() +}) + +t.test('open fails', t => { + const poop = new Error('poop') + const file = path.resolve(dir, 'throw-open.tar') + t.teardown(mutateFS.statFail(poop)) + t.throws(_ => c({ + file: file, + sync: true, + cwd: __dirname, + }, [path.basename(__filename)])) + t.throws(_ => fs.lstatSync(file)) + t.end() +}) + +t.test('gzipped tarball that makes some drain/resume stuff', t => { + const cwd = path.dirname(__dirname) + const out = path.resolve(dir, 'package.tgz') + + // don't include node_modules/.cache, since that gets written to + // by nyc during tests, and can result in spurious errors. + const entries = fs.readdirSync(`${cwd}/node_modules`) + .filter(e => !/^\./.test(e)) + .map(e => `node_modules/${e}`) + + c({ z: true, C: cwd }, entries) + .pipe(fs.createWriteStream(out)) + .on('finish', _ => { + const child = spawn('tar', ['tf', out], { + stdio: ['ignore', 'ignore', 'pipe'], + }) + child.stderr.on('data', c => { + t.fail(c + '') + }) + child.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + t.end() + }) + }) +}) + +t.test('create tarball out of another tarball', t => { + const out = path.resolve(dir, 'out.tar') + + const check = t => { + const expect = [ + 'dir/', + 'Ω.txt', + '🌟.txt', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + 'hardlink-1', + 'hardlink-2', + 'symlink', + ] + list({ f: out, + sync: true, + onentry: entry => { + if (entry.path === 'hardlink-2') + t.equal(entry.type, 'Link') + else if (entry.path === 'symlink') + t.equal(entry.type, 'SymbolicLink') + else if (entry.path === 'dir/') + t.equal(entry.type, 'Directory') + else + t.equal(entry.type, 'File') + t.equal(entry.path, expect.shift()) + }}) + t.same(expect, []) + t.end() + } + + t.test('sync', t => { + c({ + f: out, + cwd: tars, + sync: true, + }, ['@dir.tar', '@utf8.tar', '@links.tar']) + check(t) + }) + + t.test('async', t => { + c({ + f: out, + cwd: tars, + }, ['@dir.tar', '@utf8.tar', '@links.tar'], _ => check(t)) + }) + + t.end() +}) diff --git a/test/dir-normalization.tar b/test/dir-normalization.tar new file mode 100644 index 0000000000000000000000000000000000000000..3c4845356cecb20939b415830a5fa9717fb91341 GIT binary patch literal 4608 zcmeHJS&qUm4DC^J0f_Cy&3Qtn6-dKR7m2w&PN6j7t4Me>Xkt~0n?~MVp55+r8K=G- zY^5gv5SUE`972tqikXFmnFvea&It?*4!@B>h$+50` z-pt$IGqpQZU1J+8}SF0 zCIB7{5IUmDkd5|W8~bGygDd>M_5W1rH{-sT+lc?%|G~}t525gXDWB^4;D59iEk}ZX z?bE#9F#qrUKRCf3v;xZQ7XGjNZ*)4qOZ=A~MLp$ne2HwSHsX(c~XH?({YrM8z literal 0 HcmV?d00001 diff --git a/test/extract.js b/test/extract.js new file mode 100644 index 0000000..16a52bd --- /dev/null +++ b/test/extract.js @@ -0,0 +1,231 @@ +'use strict' + +const t = require('tap') +const x = require('../lib/extract.js') +const path = require('path') +const fs = require('fs') +const extractdir = path.resolve(__dirname, 'fixtures/extract') +const tars = path.resolve(__dirname, 'fixtures/tars') +const mkdirp = require('mkdirp') +const {promisify} = require('util') +const rimraf = promisify(require('rimraf')) +const mutateFS = require('mutate-fs') + +t.teardown(_ => rimraf(extractdir)) + +t.test('basic extracting', t => { + const file = path.resolve(tars, 'utf8.tar') + const dir = path.resolve(extractdir, 'basic') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = async t => { + fs.lstatSync(dir + '/Ω.txt') + fs.lstatSync(dir + '/🌟.txt') + t.throws(_ => fs.lstatSync(dir + '/long-path/r/e/a/l/l/y/-/d/e/e/p/-' + + '/f/o/l/d/e/r/-/p/a/t/h/Ω.txt')) + + await rimraf(dir) + t.end() + } + + const files = ['🌟.txt', 'Ω.txt'] + t.test('sync', t => { + x({ file: file, sync: true, C: dir }, files) + return check(t) + }) + + t.test('async promisey', t => { + return x({ file: file, cwd: dir }, files).then(_ => check(t)) + }) + + t.test('async cb', t => { + return x({ file: file, cwd: dir }, files, er => { + if (er) + throw er + return check(t) + }) + }) + + t.end() +}) + +t.test('file list and filter', t => { + const file = path.resolve(tars, 'utf8.tar') + const dir = path.resolve(extractdir, 'filter') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = async t => { + fs.lstatSync(dir + '/Ω.txt') + t.throws(_ => fs.lstatSync(dir + '/🌟.txt')) + t.throws(_ => fs.lstatSync(dir + '/long-path/r/e/a/l/l/y/-/d/e/e/p/-' + + '/f/o/l/d/e/r/-/p/a/t/h/Ω.txt')) + + await rimraf(dir) + t.end() + } + + const filter = path => path === 'Ω.txt' + + t.test('sync', t => { + x({ filter: filter, file: file, sync: true, C: dir }, ['🌟.txt', 'Ω.txt']) + return check(t) + }) + + t.test('async promisey', t => { + return x({ filter: filter, file: file, cwd: dir }, ['🌟.txt', 'Ω.txt']).then(_ => { + return check(t) + }) + }) + + t.test('async cb', t => { + return x({ filter: filter, file: file, cwd: dir }, ['🌟.txt', 'Ω.txt'], er => { + if (er) + throw er + return check(t) + }) + }) + + t.end() +}) + +t.test('no file list', t => { + const file = path.resolve(tars, 'body-byte-counts.tar') + const dir = path.resolve(extractdir, 'no-list') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = async t => { + t.equal(fs.lstatSync(path.resolve(dir, '1024-bytes.txt')).size, 1024) + t.equal(fs.lstatSync(path.resolve(dir, '512-bytes.txt')).size, 512) + t.equal(fs.lstatSync(path.resolve(dir, 'one-byte.txt')).size, 1) + t.equal(fs.lstatSync(path.resolve(dir, 'zero-byte.txt')).size, 0) + await rimraf(dir) + t.end() + } + + t.test('sync', t => { + x({ file: file, sync: true, C: dir }) + return check(t) + }) + + t.test('async promisey', t => { + return x({ file: file, cwd: dir }).then(_ => { + return check(t) + }) + }) + + t.test('async cb', t => { + return x({ file: file, cwd: dir }, er => { + if (er) + throw er + return check(t) + }) + }) + + t.end() +}) + +t.test('read in itty bits', t => { + const maxReadSize = 1000 + const file = path.resolve(tars, 'body-byte-counts.tar') + const dir = path.resolve(extractdir, 'no-list') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = async t => { + t.equal(fs.lstatSync(path.resolve(dir, '1024-bytes.txt')).size, 1024) + t.equal(fs.lstatSync(path.resolve(dir, '512-bytes.txt')).size, 512) + t.equal(fs.lstatSync(path.resolve(dir, 'one-byte.txt')).size, 1) + t.equal(fs.lstatSync(path.resolve(dir, 'zero-byte.txt')).size, 0) + await rimraf(dir) + t.end() + } + + t.test('sync', t => { + x({ file: file, sync: true, C: dir, maxReadSize: maxReadSize }) + return check(t) + }) + + t.test('async promisey', t => { + return x({ file: file, cwd: dir, maxReadSize: maxReadSize }).then(_ => { + return check(t) + }) + }) + + t.test('async cb', t => { + return x({ file: file, cwd: dir, maxReadSize: maxReadSize }, er => { + if (er) + throw er + return check(t) + }) + }) + + t.end() +}) + +t.test('bad calls', t => { + t.throws(_ => x(_ => _)) + t.throws(_ => x({sync: true}, _ => _)) + t.throws(_ => x({sync: true}, [], _ => _)) + t.end() +}) + +t.test('no file', t => { + const Unpack = require('../lib/unpack.js') + t.type(x(), Unpack) + t.type(x(['asdf']), Unpack) + t.type(x({sync: true}), Unpack.Sync) + t.end() +}) + +t.test('nonexistent', t => { + t.throws(_ => x({sync: true, file: 'does not exist' })) + x({ file: 'does not exist' }).catch(_ => t.end()) +}) + +t.test('read fail', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + + t.throws(_ => x({maxReadSize: 10, sync: true, file: __filename }), poop) + t.end() +}) + +t.test('sync gzip error edge case test', async t => { + const file = path.resolve(__dirname, 'fixtures/sync-gzip-fail.tgz') + const dir = path.resolve(__dirname, 'sync-gzip-fail') + const cwd = process.cwd() + await mkdirp(dir + '/x') + process.chdir(dir) + t.teardown(async () => { + process.chdir(cwd) + await rimraf(dir) + }) + + x({ + sync: true, + file: file, + onwarn: (c, m, er) => { + throw er + }, + }) + + t.same(fs.readdirSync(dir + '/x').sort(), + ['1', '10', '2', '3', '4', '5', '6', '7', '8', '9']) + + t.end() +}) diff --git a/test/fixtures/files/.dotfile b/test/fixtures/files/.dotfile new file mode 100644 index 0000000..9c558e3 --- /dev/null +++ b/test/fixtures/files/.dotfile @@ -0,0 +1 @@ +. diff --git a/test/fixtures/files/100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..5a5d18e --- /dev/null +++ b/test/fixtures/files/100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc \ No newline at end of file diff --git a/test/fixtures/files/1024-bytes.txt b/test/fixtures/files/1024-bytes.txt new file mode 100644 index 0000000..b790cce --- /dev/null +++ b/test/fixtures/files/1024-bytes.txt @@ -0,0 +1 @@ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/test/fixtures/files/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..5a5d18e --- /dev/null +++ b/test/fixtures/files/120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc \ No newline at end of file diff --git a/test/fixtures/files/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..5a5d18e --- /dev/null +++ b/test/fixtures/files/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc \ No newline at end of file diff --git a/test/fixtures/files/512-bytes.txt b/test/fixtures/files/512-bytes.txt new file mode 100644 index 0000000..871ebdc --- /dev/null +++ b/test/fixtures/files/512-bytes.txt @@ -0,0 +1 @@ +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt b/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt new file mode 100644 index 0000000..578ff71 --- /dev/null +++ b/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt @@ -0,0 +1,3 @@ +Behold! I am a text file and NOT a tar header. + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt b/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt new file mode 100644 index 0000000..578ff71 --- /dev/null +++ b/test/fixtures/files/99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt @@ -0,0 +1,3 @@ +Behold! I am a text file and NOT a tar header. + +xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx diff --git a/test/fixtures/files/dir/x b/test/fixtures/files/dir/x new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/files/hardlink-1 b/test/fixtures/files/hardlink-1 new file mode 100644 index 0000000..84c7ae5 --- /dev/null +++ b/test/fixtures/files/hardlink-1 @@ -0,0 +1 @@ +this link is like diamond diff --git a/test/fixtures/files/hardlink-2 b/test/fixtures/files/hardlink-2 new file mode 100644 index 0000000..84c7ae5 --- /dev/null +++ b/test/fixtures/files/hardlink-2 @@ -0,0 +1 @@ +this link is like diamond diff --git a/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt new file mode 100644 index 0000000..1d3aaf1 --- /dev/null +++ b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt @@ -0,0 +1 @@ +short diff --git a/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..8bb6cc7 --- /dev/null +++ b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 \ No newline at end of file diff --git a/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..e5a9d5e --- /dev/null +++ b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222 \ No newline at end of file diff --git a/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc new file mode 100644 index 0000000..5a5d18e --- /dev/null +++ b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc @@ -0,0 +1 @@ +cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc \ No newline at end of file diff --git a/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt new file mode 100644 index 0000000..1ca042f --- /dev/null +++ b/test/fixtures/files/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt @@ -0,0 +1 @@ +Ω \ No newline at end of file diff --git a/test/fixtures/files/longlink b/test/fixtures/files/longlink new file mode 120000 index 0000000..c3b17d6 --- /dev/null +++ b/test/fixtures/files/longlink @@ -0,0 +1 @@ +170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc \ No newline at end of file diff --git a/test/fixtures/files/one-byte.txt b/test/fixtures/files/one-byte.txt new file mode 100644 index 0000000..2e65efe --- /dev/null +++ b/test/fixtures/files/one-byte.txt @@ -0,0 +1 @@ +a \ No newline at end of file diff --git a/test/fixtures/files/strip-dir/1/2/3/hardlink-3 b/test/fixtures/files/strip-dir/1/2/3/hardlink-3 new file mode 100644 index 0000000..84c7ae5 --- /dev/null +++ b/test/fixtures/files/strip-dir/1/2/3/hardlink-3 @@ -0,0 +1 @@ +this link is like diamond diff --git a/test/fixtures/files/strip-dir/hardlink-1 b/test/fixtures/files/strip-dir/hardlink-1 new file mode 100644 index 0000000..84c7ae5 --- /dev/null +++ b/test/fixtures/files/strip-dir/hardlink-1 @@ -0,0 +1 @@ +this link is like diamond diff --git a/test/fixtures/files/strip-dir/hardlink-2 b/test/fixtures/files/strip-dir/hardlink-2 new file mode 100644 index 0000000..84c7ae5 --- /dev/null +++ b/test/fixtures/files/strip-dir/hardlink-2 @@ -0,0 +1 @@ +this link is like diamond diff --git a/test/fixtures/files/strip-dir/symlink b/test/fixtures/files/strip-dir/symlink new file mode 120000 index 0000000..c30d310 --- /dev/null +++ b/test/fixtures/files/strip-dir/symlink @@ -0,0 +1 @@ +hardlink-2 \ No newline at end of file diff --git a/test/fixtures/files/symlink b/test/fixtures/files/symlink new file mode 120000 index 0000000..c30d310 --- /dev/null +++ b/test/fixtures/files/symlink @@ -0,0 +1 @@ +hardlink-2 \ No newline at end of file diff --git a/test/fixtures/files/zero-byte.txt b/test/fixtures/files/zero-byte.txt new file mode 100644 index 0000000..e69de29 diff --git a/test/fixtures/files/Ω.txt b/test/fixtures/files/Ω.txt new file mode 100644 index 0000000..1ca042f --- /dev/null +++ b/test/fixtures/files/Ω.txt @@ -0,0 +1 @@ +Ω \ No newline at end of file diff --git a/test/fixtures/files/🌟.txt b/test/fixtures/files/🌟.txt new file mode 100644 index 0000000..bc384f8 --- /dev/null +++ b/test/fixtures/files/🌟.txt @@ -0,0 +1 @@ +🌟✧✩⭐︎✪✫✬✭✮⚝✯✰✵✶✷✸✹❂⭑⭒★☆✡☪✴︎✦✡️🔯✴️🌠 diff --git a/test/fixtures/parse/bad-cksum--filter-strict.json b/test/fixtures/parse/bad-cksum--filter-strict.json new file mode 100644 index 0000000..edfce53 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--filter-strict.json @@ -0,0 +1,64 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--filter.json b/test/fixtures/parse/bad-cksum--filter.json new file mode 100644 index 0000000..55274a4 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--filter.json @@ -0,0 +1,60 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--meta-250-filter-strict.json b/test/fixtures/parse/bad-cksum--meta-250-filter-strict.json new file mode 100644 index 0000000..edfce53 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--meta-250-filter-strict.json @@ -0,0 +1,64 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--meta-250-filter.json b/test/fixtures/parse/bad-cksum--meta-250-filter.json new file mode 100644 index 0000000..55274a4 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--meta-250-filter.json @@ -0,0 +1,60 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--meta-250-strict.json b/test/fixtures/parse/bad-cksum--meta-250-strict.json new file mode 100644 index 0000000..edfce53 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--meta-250-strict.json @@ -0,0 +1,64 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--meta-250.json b/test/fixtures/parse/bad-cksum--meta-250.json new file mode 100644 index 0000000..55274a4 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--meta-250.json @@ -0,0 +1,60 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum--strict.json b/test/fixtures/parse/bad-cksum--strict.json new file mode 100644 index 0000000..edfce53 --- /dev/null +++ b/test/fixtures/parse/bad-cksum--strict.json @@ -0,0 +1,64 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/bad-cksum.json b/test/fixtures/parse/bad-cksum.json new file mode 100644 index 0000000..55274a4 --- /dev/null +++ b/test/fixtures/parse/bad-cksum.json @@ -0,0 +1,60 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--filter-strict.json b/test/fixtures/parse/body-byte-counts--filter-strict.json new file mode 100644 index 0000000..7290291 --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--filter-strict.json @@ -0,0 +1,167 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--filter.json b/test/fixtures/parse/body-byte-counts--filter.json new file mode 100644 index 0000000..7290291 --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--filter.json @@ -0,0 +1,167 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json b/test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json new file mode 100644 index 0000000..7290291 --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--meta-250-filter-strict.json @@ -0,0 +1,167 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--meta-250-filter.json b/test/fixtures/parse/body-byte-counts--meta-250-filter.json new file mode 100644 index 0000000..7290291 --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--meta-250-filter.json @@ -0,0 +1,167 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--meta-250-strict.json b/test/fixtures/parse/body-byte-counts--meta-250-strict.json new file mode 100644 index 0000000..8069e9c --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--meta-250-strict.json @@ -0,0 +1,167 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--meta-250.json b/test/fixtures/parse/body-byte-counts--meta-250.json new file mode 100644 index 0000000..8069e9c --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--meta-250.json @@ -0,0 +1,167 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts--strict.json b/test/fixtures/parse/body-byte-counts--strict.json new file mode 100644 index 0000000..8069e9c --- /dev/null +++ b/test/fixtures/parse/body-byte-counts--strict.json @@ -0,0 +1,167 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/body-byte-counts.json b/test/fixtures/parse/body-byte-counts.json new file mode 100644 index 0000000..8069e9c --- /dev/null +++ b/test/fixtures/parse/body-byte-counts.json @@ -0,0 +1,167 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "1024-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1024, + "mtime": "2017-04-10T16:57:47.000Z", + "cksum": 6109, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "512-bytes.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 512, + "mtime": "2017-04-10T17:08:55.000Z", + "cksum": 6064, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "zero-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:08:01.000Z", + "cksum": 6246, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--filter-strict.json b/test/fixtures/parse/dir--filter-strict.json new file mode 100644 index 0000000..6992643 --- /dev/null +++ b/test/fixtures/parse/dir--filter-strict.json @@ -0,0 +1,50 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--filter.json b/test/fixtures/parse/dir--filter.json new file mode 100644 index 0000000..6992643 --- /dev/null +++ b/test/fixtures/parse/dir--filter.json @@ -0,0 +1,50 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--meta-250-filter-strict.json b/test/fixtures/parse/dir--meta-250-filter-strict.json new file mode 100644 index 0000000..6992643 --- /dev/null +++ b/test/fixtures/parse/dir--meta-250-filter-strict.json @@ -0,0 +1,50 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--meta-250-filter.json b/test/fixtures/parse/dir--meta-250-filter.json new file mode 100644 index 0000000..6992643 --- /dev/null +++ b/test/fixtures/parse/dir--meta-250-filter.json @@ -0,0 +1,50 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--meta-250-strict.json b/test/fixtures/parse/dir--meta-250-strict.json new file mode 100644 index 0000000..0a933bf --- /dev/null +++ b/test/fixtures/parse/dir--meta-250-strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--meta-250.json b/test/fixtures/parse/dir--meta-250.json new file mode 100644 index 0000000..0a933bf --- /dev/null +++ b/test/fixtures/parse/dir--meta-250.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir--strict.json b/test/fixtures/parse/dir--strict.json new file mode 100644 index 0000000..0a933bf --- /dev/null +++ b/test/fixtures/parse/dir--strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/dir.json b/test/fixtures/parse/dir.json new file mode 100644 index 0000000..0a933bf --- /dev/null +++ b/test/fixtures/parse/dir.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "dir/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T17:00:17.000Z", + "cksum": 5284, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--filter-strict.json b/test/fixtures/parse/emptypax--filter-strict.json new file mode 100644 index 0000000..2810367 --- /dev/null +++ b/test/fixtures/parse/emptypax--filter-strict.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--filter.json b/test/fixtures/parse/emptypax--filter.json new file mode 100644 index 0000000..2810367 --- /dev/null +++ b/test/fixtures/parse/emptypax--filter.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--meta-250-filter-strict.json b/test/fixtures/parse/emptypax--meta-250-filter-strict.json new file mode 100644 index 0000000..2810367 --- /dev/null +++ b/test/fixtures/parse/emptypax--meta-250-filter-strict.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--meta-250-filter.json b/test/fixtures/parse/emptypax--meta-250-filter.json new file mode 100644 index 0000000..2810367 --- /dev/null +++ b/test/fixtures/parse/emptypax--meta-250-filter.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--meta-250-strict.json b/test/fixtures/parse/emptypax--meta-250-strict.json new file mode 100644 index 0000000..686a428 --- /dev/null +++ b/test/fixtures/parse/emptypax--meta-250-strict.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--meta-250.json b/test/fixtures/parse/emptypax--meta-250.json new file mode 100644 index 0000000..686a428 --- /dev/null +++ b/test/fixtures/parse/emptypax--meta-250.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax--strict.json b/test/fixtures/parse/emptypax--strict.json new file mode 100644 index 0000000..686a428 --- /dev/null +++ b/test/fixtures/parse/emptypax--strict.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/emptypax.json b/test/fixtures/parse/emptypax.json new file mode 100644 index 0000000..686a428 --- /dev/null +++ b/test/fixtures/parse/emptypax.json @@ -0,0 +1,110 @@ +[ + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491845601\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:33:21.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:33:21.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--filter-strict.json b/test/fixtures/parse/file--filter-strict.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--filter-strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--filter.json b/test/fixtures/parse/file--filter.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--filter.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--meta-250-filter-strict.json b/test/fixtures/parse/file--meta-250-filter-strict.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--meta-250-filter-strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--meta-250-filter.json b/test/fixtures/parse/file--meta-250-filter.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--meta-250-filter.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--meta-250-strict.json b/test/fixtures/parse/file--meta-250-strict.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--meta-250-strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--meta-250.json b/test/fixtures/parse/file--meta-250.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--meta-250.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file--strict.json b/test/fixtures/parse/file--strict.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file--strict.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/file.json b/test/fixtures/parse/file.json new file mode 100644 index 0000000..07e38b4 --- /dev/null +++ b/test/fixtures/parse/file.json @@ -0,0 +1,50 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--filter-strict.json b/test/fixtures/parse/global-header--filter-strict.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--filter-strict.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--filter.json b/test/fixtures/parse/global-header--filter.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--filter.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--meta-250-filter-strict.json b/test/fixtures/parse/global-header--meta-250-filter-strict.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--meta-250-filter-strict.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--meta-250-filter.json b/test/fixtures/parse/global-header--meta-250-filter.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--meta-250-filter.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--meta-250-strict.json b/test/fixtures/parse/global-header--meta-250-strict.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--meta-250-strict.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--meta-250.json b/test/fixtures/parse/global-header--meta-250.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--meta-250.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header--strict.json b/test/fixtures/parse/global-header--strict.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header--strict.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/global-header.json b/test/fixtures/parse/global-header.json new file mode 100644 index 0000000..114679a --- /dev/null +++ b/test/fixtures/parse/global-header.json @@ -0,0 +1,71 @@ +[ + [ + "meta", + "11 path=ab\n" + ], + [ + "entry", + { + "extended": null, + "globalExtended": { + "atime": null, + "charset": null, + "comment": null, + "ctime": null, + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "ab", + "size": null, + "uid": null, + "uname": null, + "dev": null, + "ino": null, + "nlink": null, + "global": true + }, + "type": "File", + "meta": false, + "ignore": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "one-byte.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1, + "mtime": "2017-04-10T16:58:20.000Z", + "cksum": 6121, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--filter-strict.json b/test/fixtures/parse/links--filter-strict.json new file mode 100644 index 0000000..ed902aa --- /dev/null +++ b/test/fixtures/parse/links--filter-strict.json @@ -0,0 +1,128 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--filter.json b/test/fixtures/parse/links--filter.json new file mode 100644 index 0000000..ed902aa --- /dev/null +++ b/test/fixtures/parse/links--filter.json @@ -0,0 +1,128 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--meta-250-filter-strict.json b/test/fixtures/parse/links--meta-250-filter-strict.json new file mode 100644 index 0000000..ed902aa --- /dev/null +++ b/test/fixtures/parse/links--meta-250-filter-strict.json @@ -0,0 +1,128 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--meta-250-filter.json b/test/fixtures/parse/links--meta-250-filter.json new file mode 100644 index 0000000..ed902aa --- /dev/null +++ b/test/fixtures/parse/links--meta-250-filter.json @@ -0,0 +1,128 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--meta-250-strict.json b/test/fixtures/parse/links--meta-250-strict.json new file mode 100644 index 0000000..fdf0725 --- /dev/null +++ b/test/fixtures/parse/links--meta-250-strict.json @@ -0,0 +1,128 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--meta-250.json b/test/fixtures/parse/links--meta-250.json new file mode 100644 index 0000000..fdf0725 --- /dev/null +++ b/test/fixtures/parse/links--meta-250.json @@ -0,0 +1,128 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links--strict.json b/test/fixtures/parse/links--strict.json new file mode 100644 index 0000000..fdf0725 --- /dev/null +++ b/test/fixtures/parse/links--strict.json @@ -0,0 +1,128 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--filter-strict.json b/test/fixtures/parse/links-invalid--filter-strict.json new file mode 100644 index 0000000..fd2d5dc --- /dev/null +++ b/test/fixtures/parse/links-invalid--filter-strict.json @@ -0,0 +1,71 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath forbidden", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--filter.json b/test/fixtures/parse/links-invalid--filter.json new file mode 100644 index 0000000..42a58d1 --- /dev/null +++ b/test/fixtures/parse/links-invalid--filter.json @@ -0,0 +1,65 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath forbidden" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath required" + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--meta-250-filter-strict.json b/test/fixtures/parse/links-invalid--meta-250-filter-strict.json new file mode 100644 index 0000000..fd2d5dc --- /dev/null +++ b/test/fixtures/parse/links-invalid--meta-250-filter-strict.json @@ -0,0 +1,71 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath forbidden", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--meta-250-filter.json b/test/fixtures/parse/links-invalid--meta-250-filter.json new file mode 100644 index 0000000..42a58d1 --- /dev/null +++ b/test/fixtures/parse/links-invalid--meta-250-filter.json @@ -0,0 +1,65 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath forbidden" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath required" + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--meta-250-strict.json b/test/fixtures/parse/links-invalid--meta-250-strict.json new file mode 100644 index 0000000..0c6c72d --- /dev/null +++ b/test/fixtures/parse/links-invalid--meta-250-strict.json @@ -0,0 +1,71 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath forbidden", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--meta-250.json b/test/fixtures/parse/links-invalid--meta-250.json new file mode 100644 index 0000000..c62395e --- /dev/null +++ b/test/fixtures/parse/links-invalid--meta-250.json @@ -0,0 +1,65 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath forbidden" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath required" + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid--strict.json b/test/fixtures/parse/links-invalid--strict.json new file mode 100644 index 0000000..0c6c72d --- /dev/null +++ b/test/fixtures/parse/links-invalid--strict.json @@ -0,0 +1,71 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath forbidden", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: linkpath required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-invalid.json b/test/fixtures/parse/links-invalid.json new file mode 100644 index 0000000..c62395e --- /dev/null +++ b/test/fixtures/parse/links-invalid.json @@ -0,0 +1,65 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath forbidden" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "linkpath required" + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--filter-strict.json b/test/fixtures/parse/links-strip--filter-strict.json new file mode 100644 index 0000000..9a640e0 --- /dev/null +++ b/test/fixtures/parse/links-strip--filter-strict.json @@ -0,0 +1,200 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--filter.json b/test/fixtures/parse/links-strip--filter.json new file mode 100644 index 0000000..9a640e0 --- /dev/null +++ b/test/fixtures/parse/links-strip--filter.json @@ -0,0 +1,200 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--meta-250-filter-strict.json b/test/fixtures/parse/links-strip--meta-250-filter-strict.json new file mode 100644 index 0000000..9a640e0 --- /dev/null +++ b/test/fixtures/parse/links-strip--meta-250-filter-strict.json @@ -0,0 +1,200 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--meta-250-filter.json b/test/fixtures/parse/links-strip--meta-250-filter.json new file mode 100644 index 0000000..9a640e0 --- /dev/null +++ b/test/fixtures/parse/links-strip--meta-250-filter.json @@ -0,0 +1,200 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": true, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--meta-250-strict.json b/test/fixtures/parse/links-strip--meta-250-strict.json new file mode 100644 index 0000000..17e5397 --- /dev/null +++ b/test/fixtures/parse/links-strip--meta-250-strict.json @@ -0,0 +1,200 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--meta-250.json b/test/fixtures/parse/links-strip--meta-250.json new file mode 100644 index 0000000..17e5397 --- /dev/null +++ b/test/fixtures/parse/links-strip--meta-250.json @@ -0,0 +1,200 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip--strict.json b/test/fixtures/parse/links-strip--strict.json new file mode 100644 index 0000000..17e5397 --- /dev/null +++ b/test/fixtures/parse/links-strip--strict.json @@ -0,0 +1,200 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links-strip.json b/test/fixtures/parse/links-strip.json new file mode 100644 index 0000000..17e5397 --- /dev/null +++ b/test/fixtures/parse/links-strip.json @@ -0,0 +1,200 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/", + "mode": 493, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 4708, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-1", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 26, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 5644, + "linkpath": "", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/hardlink-2", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7553, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "strip-dir/hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/1/2/3/hardlink-3", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 7845, + "linkpath": "strip-dir/hardlink-1", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "uname": "", + "gname": "", + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "strip-dir/symlink", + "mode": 420, + "uid": 0, + "gid": 0, + "size": 0, + "mtime": "2018-11-06T01:45:25.000Z", + "cksum": 6417, + "linkpath": "hardlink-2", + "uname": "", + "gname": "", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/links.json b/test/fixtures/parse/links.json new file mode 100644 index 0000000..fdf0725 --- /dev/null +++ b/test/fixtures/parse/links.json @@ -0,0 +1,128 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-1", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 26, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 5856, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Link", + "meta": false, + "ignore": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-1", + "header": { + "cksumValid": true, + "needPax": false, + "path": "hardlink-2", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:05.000Z", + "cksum": 6792, + "linkpath": "hardlink-1", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "hardlink-2", + "header": { + "cksumValid": true, + "needPax": false, + "path": "symlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T19:27:33.000Z", + "cksum": 6639, + "linkpath": "hardlink-2", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--filter-strict.json b/test/fixtures/parse/long-paths--filter-strict.json new file mode 100644 index 0000000..8dfe9de --- /dev/null +++ b/test/fixtures/parse/long-paths--filter-strict.json @@ -0,0 +1,1364 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:56:18.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836326, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:56:18.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836253, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836254, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--filter.json b/test/fixtures/parse/long-paths--filter.json new file mode 100644 index 0000000..8dfe9de --- /dev/null +++ b/test/fixtures/parse/long-paths--filter.json @@ -0,0 +1,1364 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:56:18.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836326, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:56:18.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836253, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836254, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--meta-250-filter-strict.json b/test/fixtures/parse/long-paths--meta-250-filter-strict.json new file mode 100644 index 0000000..2a2e496 --- /dev/null +++ b/test/fixtures/parse/long-paths--meta-250-filter-strict.json @@ -0,0 +1,1418 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14413, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18881, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19932, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--meta-250-filter.json b/test/fixtures/parse/long-paths--meta-250-filter.json new file mode 100644 index 0000000..2a2e496 --- /dev/null +++ b/test/fixtures/parse/long-paths--meta-250-filter.json @@ -0,0 +1,1418 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14413, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18881, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19932, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--meta-250-strict.json b/test/fixtures/parse/long-paths--meta-250-strict.json new file mode 100644 index 0000000..532f236 --- /dev/null +++ b/test/fixtures/parse/long-paths--meta-250-strict.json @@ -0,0 +1,1418 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14413, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18881, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19932, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--meta-250.json b/test/fixtures/parse/long-paths--meta-250.json new file mode 100644 index 0000000..532f236 --- /dev/null +++ b/test/fixtures/parse/long-paths--meta-250.json @@ -0,0 +1,1418 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 283, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14413, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 289, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18881, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 339, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19932, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths--strict.json b/test/fixtures/parse/long-paths--strict.json new file mode 100644 index 0000000..835fd96 --- /dev/null +++ b/test/fixtures/parse/long-paths--strict.json @@ -0,0 +1,1364 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:56:18.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836326, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:56:18.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836253, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836254, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-paths.json b/test/fixtures/parse/long-paths.json new file mode 100644 index 0000000..835fd96 --- /dev/null +++ b/test/fixtures/parse/long-paths.json @@ -0,0 +1,1364 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:53:02.000Z", + "cksum": 14592, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843252\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836297\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:54:12.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836297, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:54:12.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "180 path=170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843378\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836326\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:56:18.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836326, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:56:18.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 5870, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6031, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6179, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6323, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6478, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6633, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6801, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 6893, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7040, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7188, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7336, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7587, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7736, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 7894, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8049, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8196, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8344, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8505, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8597, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8756, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 8900, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 9063, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9223, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 6, + "mtime": "2017-04-10T16:56:46.000Z", + "cksum": 9714, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 19068, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "186 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836253\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836253, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 18969, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "236 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n20 ctime=1491843140\n20 atime=1491843717\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836254\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:01:57.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:52:20.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836254, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "atime": "2017-04-10T17:01:57.000Z", + "ctime": "2017-04-10T16:52:20.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:52:20.000Z", + "cksum": 20019, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491844045\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:07:25.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:07:25.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--filter-strict.json b/test/fixtures/parse/long-pax--filter-strict.json new file mode 100644 index 0000000..7e9df8b --- /dev/null +++ b/test/fixtures/parse/long-pax--filter-strict.json @@ -0,0 +1,65 @@ +[ + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": null, + "charset": null, + "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", + "ctime": null, + "gid": 20, + "gname": "staff", + "linkpath": null, + "mtime": "2017-04-10T16:54:12.000Z", + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": 100, + "uid": 501, + "uname": "isaacs", + "dev": null, + "ino": null, + "nlink": null, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--filter.json b/test/fixtures/parse/long-pax--filter.json new file mode 100644 index 0000000..7e9df8b --- /dev/null +++ b/test/fixtures/parse/long-pax--filter.json @@ -0,0 +1,65 @@ +[ + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": null, + "charset": null, + "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", + "ctime": null, + "gid": 20, + "gname": "staff", + "linkpath": null, + "mtime": "2017-04-10T16:54:12.000Z", + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": 100, + "uid": 501, + "uname": "isaacs", + "dev": null, + "ino": null, + "nlink": null, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--meta-250-filter-strict.json b/test/fixtures/parse/long-pax--meta-250-filter-strict.json new file mode 100644 index 0000000..584863e --- /dev/null +++ b/test/fixtures/parse/long-pax--meta-250-filter-strict.json @@ -0,0 +1,83 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14425, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--meta-250-filter.json b/test/fixtures/parse/long-pax--meta-250-filter.json new file mode 100644 index 0000000..584863e --- /dev/null +++ b/test/fixtures/parse/long-pax--meta-250-filter.json @@ -0,0 +1,83 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14425, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--meta-250-strict.json b/test/fixtures/parse/long-pax--meta-250-strict.json new file mode 100644 index 0000000..5a19f0e --- /dev/null +++ b/test/fixtures/parse/long-pax--meta-250-strict.json @@ -0,0 +1,83 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14425, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--meta-250.json b/test/fixtures/parse/long-pax--meta-250.json new file mode 100644 index 0000000..5a19f0e --- /dev/null +++ b/test/fixtures/parse/long-pax--meta-250.json @@ -0,0 +1,83 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "ExtendedHeader", + "meta": true, + "ignore": true, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "PaxHeader/120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 1282, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14425, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax--strict.json b/test/fixtures/parse/long-pax--strict.json new file mode 100644 index 0000000..c72def0 --- /dev/null +++ b/test/fixtures/parse/long-pax--strict.json @@ -0,0 +1,65 @@ +[ + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" + ], + [ + "entry", + { + "extended": { + "atime": null, + "charset": null, + "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", + "ctime": null, + "gid": 20, + "gname": "staff", + "linkpath": null, + "mtime": "2017-04-10T16:54:12.000Z", + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": 100, + "uid": 501, + "uname": "isaacs", + "dev": null, + "ino": null, + "nlink": null, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/long-pax.json b/test/fixtures/parse/long-pax.json new file mode 100644 index 0000000..c72def0 --- /dev/null +++ b/test/fixtures/parse/long-pax.json @@ -0,0 +1,65 @@ +[ + [ + "meta", + "130 path=120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc\n1069 comment=all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy\n9 gid=20\n15 gname=staff\n20 mtime=1491843252\n12 size=100\n11 uid=501\n16 uname=isaacs\n" + ], + [ + "entry", + { + "extended": { + "atime": null, + "charset": null, + "comment": "all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy all work and no play makes johnny a tar boy", + "ctime": null, + "gid": 20, + "gname": "staff", + "linkpath": null, + "mtime": "2017-04-10T16:54:12.000Z", + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "size": 100, + "uid": 501, + "uname": "isaacs", + "dev": null, + "ino": null, + "nlink": null, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:54:12.000Z", + "cksum": 14495, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--filter-strict.json b/test/fixtures/parse/next-file-has-long--filter-strict.json new file mode 100644 index 0000000..a010d9e --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--filter-strict.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--filter.json b/test/fixtures/parse/next-file-has-long--filter.json new file mode 100644 index 0000000..a010d9e --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--filter.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json b/test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json new file mode 100644 index 0000000..a010d9e --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--meta-250-filter-strict.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--meta-250-filter.json b/test/fixtures/parse/next-file-has-long--meta-250-filter.json new file mode 100644 index 0000000..a010d9e --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--meta-250-filter.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "ignoredEntry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": true, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--meta-250-strict.json b/test/fixtures/parse/next-file-has-long--meta-250-strict.json new file mode 100644 index 0000000..9d6eef0 --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--meta-250-strict.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--meta-250.json b/test/fixtures/parse/next-file-has-long--meta-250.json new file mode 100644 index 0000000..9d6eef0 --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--meta-250.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long--strict.json b/test/fixtures/parse/next-file-has-long--strict.json new file mode 100644 index 0000000..9d6eef0 --- /dev/null +++ b/test/fixtures/parse/next-file-has-long--strict.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/next-file-has-long.json b/test/fixtures/parse/next-file-has-long.json new file mode 100644 index 0000000..9d6eef0 --- /dev/null +++ b/test/fixtures/parse/next-file-has-long.json @@ -0,0 +1,101 @@ +[ + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 100, + "mtime": "2017-04-10T16:56:18.000Z", + "cksum": 14500, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + ], + [ + "entry", + { + "extended": { + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + }, + "globalExtended": null, + "type": "SymbolicLink", + "meta": false, + "ignore": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "atime": null, + "ctime": null, + "linkpath": "170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "header": { + "cksumValid": true, + "needPax": false, + "path": "longlink", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2017-04-10T23:22:33.000Z", + "cksum": 7135, + "linkpath": "././@LongSymLink", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--filter-strict.json b/test/fixtures/parse/null-byte--filter-strict.json new file mode 100644 index 0000000..3c27f2b --- /dev/null +++ b/test/fixtures/parse/null-byte--filter-strict.json @@ -0,0 +1,95 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--filter.json b/test/fixtures/parse/null-byte--filter.json new file mode 100644 index 0000000..3c27f2b --- /dev/null +++ b/test/fixtures/parse/null-byte--filter.json @@ -0,0 +1,95 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--meta-250-filter-strict.json b/test/fixtures/parse/null-byte--meta-250-filter-strict.json new file mode 100644 index 0000000..3c27f2b --- /dev/null +++ b/test/fixtures/parse/null-byte--meta-250-filter-strict.json @@ -0,0 +1,95 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--meta-250-filter.json b/test/fixtures/parse/null-byte--meta-250-filter.json new file mode 100644 index 0000000..3c27f2b --- /dev/null +++ b/test/fixtures/parse/null-byte--meta-250-filter.json @@ -0,0 +1,95 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--meta-250-strict.json b/test/fixtures/parse/null-byte--meta-250-strict.json new file mode 100644 index 0000000..a9bad19 --- /dev/null +++ b/test/fixtures/parse/null-byte--meta-250-strict.json @@ -0,0 +1,95 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "entry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--meta-250.json b/test/fixtures/parse/null-byte--meta-250.json new file mode 100644 index 0000000..a9bad19 --- /dev/null +++ b/test/fixtures/parse/null-byte--meta-250.json @@ -0,0 +1,95 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "entry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte--strict.json b/test/fixtures/parse/null-byte--strict.json new file mode 100644 index 0000000..a9bad19 --- /dev/null +++ b/test/fixtures/parse/null-byte--strict.json @@ -0,0 +1,95 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "entry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/null-byte.json b/test/fixtures/parse/null-byte.json new file mode 100644 index 0000000..a9bad19 --- /dev/null +++ b/test/fixtures/parse/null-byte.json @@ -0,0 +1,95 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/", + "mode": 509, + "uid": 1000, + "gid": 1000, + "size": 0, + "mtime": "2017-07-31T22:21:58.000Z", + "cksum": 11228, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz\u0000" + ], + [ + "entry", + { + "extended": { + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "uname": null, + "gname": null, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "this_is_a_really_long_directory_name_with_a_lot_of_characters/this_is_a_really_long_tgz_file_with_a_lot_of_characters.tgz", + "mode": 436, + "uid": 1000, + "gid": 1000, + "size": 200, + "mtime": "2017-07-31T22:21:53.000Z", + "cksum": 15210, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--filter-strict.json b/test/fixtures/parse/path-missing--filter-strict.json new file mode 100644 index 0000000..c6ec5cc --- /dev/null +++ b/test/fixtures/parse/path-missing--filter-strict.json @@ -0,0 +1,32 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: path is required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "error", + { + "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", + "code": "TAR_BAD_ARCHIVE" + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--filter.json b/test/fixtures/parse/path-missing--filter.json new file mode 100644 index 0000000..5d81f37 --- /dev/null +++ b/test/fixtures/parse/path-missing--filter.json @@ -0,0 +1,26 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "path is required" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "warn", + "TAR_BAD_ARCHIVE", + "Unrecognized archive format" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--meta-250-filter-strict.json b/test/fixtures/parse/path-missing--meta-250-filter-strict.json new file mode 100644 index 0000000..c6ec5cc --- /dev/null +++ b/test/fixtures/parse/path-missing--meta-250-filter-strict.json @@ -0,0 +1,32 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: path is required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "error", + { + "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", + "code": "TAR_BAD_ARCHIVE" + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--meta-250-filter.json b/test/fixtures/parse/path-missing--meta-250-filter.json new file mode 100644 index 0000000..5d81f37 --- /dev/null +++ b/test/fixtures/parse/path-missing--meta-250-filter.json @@ -0,0 +1,26 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "path is required" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "warn", + "TAR_BAD_ARCHIVE", + "Unrecognized archive format" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--meta-250-strict.json b/test/fixtures/parse/path-missing--meta-250-strict.json new file mode 100644 index 0000000..c6ec5cc --- /dev/null +++ b/test/fixtures/parse/path-missing--meta-250-strict.json @@ -0,0 +1,32 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: path is required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "error", + { + "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", + "code": "TAR_BAD_ARCHIVE" + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--meta-250.json b/test/fixtures/parse/path-missing--meta-250.json new file mode 100644 index 0000000..5d81f37 --- /dev/null +++ b/test/fixtures/parse/path-missing--meta-250.json @@ -0,0 +1,26 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "path is required" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "warn", + "TAR_BAD_ARCHIVE", + "Unrecognized archive format" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing--strict.json b/test/fixtures/parse/path-missing--strict.json new file mode 100644 index 0000000..c6ec5cc --- /dev/null +++ b/test/fixtures/parse/path-missing--strict.json @@ -0,0 +1,32 @@ +[ + [ + "error", + { + "message": "TAR_ENTRY_INVALID: path is required", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "error", + { + "message": "TAR_ENTRY_INVALID: checksum failure", + "code": "TAR_ENTRY_INVALID" + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "error", + { + "message": "TAR_BAD_ARCHIVE: Unrecognized archive format", + "code": "TAR_BAD_ARCHIVE" + } + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/path-missing.json b/test/fixtures/parse/path-missing.json new file mode 100644 index 0000000..5d81f37 --- /dev/null +++ b/test/fixtures/parse/path-missing.json @@ -0,0 +1,26 @@ +[ + [ + "warn", + "TAR_ENTRY_INVALID", + "path is required" + ], + [ + "warn", + "TAR_ENTRY_INVALID", + "checksum failure" + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "warn", + "TAR_BAD_ARCHIVE", + "Unrecognized archive format" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--filter-strict.json b/test/fixtures/parse/trailing-slash-corner-case--filter-strict.json new file mode 100644 index 0000000..3739da9 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--filter-strict.json @@ -0,0 +1,140 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--filter.json b/test/fixtures/parse/trailing-slash-corner-case--filter.json new file mode 100644 index 0000000..3739da9 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--filter.json @@ -0,0 +1,140 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json b/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json new file mode 100644 index 0000000..3739da9 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter-strict.json @@ -0,0 +1,140 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json b/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json new file mode 100644 index 0000000..3739da9 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--meta-250-filter.json @@ -0,0 +1,140 @@ +[ + [ + "ignoredEntry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "ignoredEntry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json b/test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json new file mode 100644 index 0000000..1420029 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--meta-250-strict.json @@ -0,0 +1,140 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--meta-250.json b/test/fixtures/parse/trailing-slash-corner-case--meta-250.json new file mode 100644 index 0000000..1420029 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--meta-250.json @@ -0,0 +1,140 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case--strict.json b/test/fixtures/parse/trailing-slash-corner-case--strict.json new file mode 100644 index 0000000..1420029 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case--strict.json @@ -0,0 +1,140 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/trailing-slash-corner-case.json b/test/fixtures/parse/trailing-slash-corner-case.json new file mode 100644 index 0000000..1420029 --- /dev/null +++ b/test/fixtures/parse/trailing-slash-corner-case.json @@ -0,0 +1,140 @@ +[ + [ + "entry", + { + "extended": null, + "globalExtended": null, + "type": "Directory", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/", + "mode": 493, + "uid": 501, + "gid": 20, + "size": 0, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13612, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/a-truly-unlucky-file-beyond-130-byte-path-length.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-19T00:03:11.000Z", + "cksum": 13611, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt\u0000" + ], + [ + "entry", + { + "extended": { + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt" + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": null, + "gname": null, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "atime": null, + "ctime": null, + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "99-byte-dirname-ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc/some-unlucky-file.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 560, + "mtime": "2018-06-18T23:49:44.000Z", + "cksum": 13602, + "linkpath": "", + "uname": null, + "gname": null, + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--filter-strict.json b/test/fixtures/parse/utf8--filter-strict.json new file mode 100644 index 0000000..b8c5bac --- /dev/null +++ b/test/fixtures/parse/utf8--filter-strict.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--filter.json b/test/fixtures/parse/utf8--filter.json new file mode 100644 index 0000000..b8c5bac --- /dev/null +++ b/test/fixtures/parse/utf8--filter.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--meta-250-filter-strict.json b/test/fixtures/parse/utf8--meta-250-filter-strict.json new file mode 100644 index 0000000..b8c5bac --- /dev/null +++ b/test/fixtures/parse/utf8--meta-250-filter-strict.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--meta-250-filter.json b/test/fixtures/parse/utf8--meta-250-filter.json new file mode 100644 index 0000000..b8c5bac --- /dev/null +++ b/test/fixtures/parse/utf8--meta-250-filter.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "ignoredEntry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": true, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--meta-250-strict.json b/test/fixtures/parse/utf8--meta-250-strict.json new file mode 100644 index 0000000..611f052 --- /dev/null +++ b/test/fixtures/parse/utf8--meta-250-strict.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--meta-250.json b/test/fixtures/parse/utf8--meta-250.json new file mode 100644 index 0000000..611f052 --- /dev/null +++ b/test/fixtures/parse/utf8--meta-250.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8--strict.json b/test/fixtures/parse/utf8--strict.json new file mode 100644 index 0000000..611f052 --- /dev/null +++ b/test/fixtures/parse/utf8--strict.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parse/utf8.json b/test/fixtures/parse/utf8.json new file mode 100644 index 0000000..611f052 --- /dev/null +++ b/test/fixtures/parse/utf8.json @@ -0,0 +1,191 @@ +[ + [ + "meta", + "15 path=Ω.txt\n20 ctime=1491843102\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836217\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:51:42.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836217, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:51:42.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:51:42.000Z", + "cksum": 5688, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "17 path=🌟.txt\n20 ctime=1491843956\n20 atime=1491843993\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836716\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:06:33.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T17:05:56.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "🌟.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836716, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "atime": "2017-04-10T17:06:33.000Z", + "ctime": "2017-04-10T17:05:56.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "🌟.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 106, + "mtime": "2017-04-10T17:05:55.000Z", + "cksum": 6023, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "meta", + "71 path=long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt\n20 ctime=1491843527\n20 atime=1491843758\n23 SCHILY.dev=16777220\n22 SCHILY.ino=9836396\n18 SCHILY.nlink=1\n" + ], + [ + "entry", + { + "extended": { + "atime": "2017-04-10T17:02:38.000Z", + "charset": null, + "comment": null, + "ctime": "2017-04-10T16:58:47.000Z", + "gid": null, + "gname": null, + "linkpath": null, + "mtime": null, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "size": null, + "uid": null, + "uname": null, + "dev": 16777220, + "ino": 9836396, + "nlink": 1, + "global": false + }, + "globalExtended": null, + "type": "File", + "meta": false, + "ignore": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "uname": "isaacs", + "gname": "staff", + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "atime": "2017-04-10T17:02:38.000Z", + "ctime": "2017-04-10T16:58:47.000Z", + "linkpath": "", + "header": { + "cksumValid": true, + "needPax": false, + "path": "long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt", + "mode": 420, + "uid": 501, + "gid": 20, + "size": 2, + "mtime": "2017-04-10T16:58:47.000Z", + "cksum": 9990, + "linkpath": "", + "uname": "isaacs", + "gname": "staff", + "devmaj": 0, + "devmin": 0, + "atime": null, + "ctime": null + } + } + ], + [ + "nullBlock" + ], + [ + "eof" + ], + [ + "end" + ] +] diff --git a/test/fixtures/parses.tar b/test/fixtures/parses.tar new file mode 100644 index 0000000000000000000000000000000000000000..4d76160fc71546d140dee0e92020b70017032058 GIT binary patch literal 665600 zcmeHw-EQN^wXU!GDFj^~wOIU>1Qg zeVv!dvz$jbt0+}*kyWHbid8Df%X??6E>e`ds@C7P{<3tNjUN^-+4Cmdj=#<~+jM-> z^N$BVNfh1i-|$oYov*PV2tt-5Nf6w4EQkVjGl+Wr9@@t}Z?pMkFu2*Q*O~T){o(>>T} zpIf~DF`eJ18~Ajw6+pn8DgQQK=6_hWd6ra!YpXQ9|Lgn(-cTYWToKRKl9F$WLQGgx z$O&szg2GajLi}+@(+F`v? z;$l@<)a@DEi+63$7k}ix`F}s~^CmcGvsrKUTPU^-PW^T}|Fk=ItKa$N4R)Mn>Jj|J zeYafSeHm81UhM_o@ciC)AKtZ=pY(={rod79zpLWkQ|5sFXGsv2^*>8uKO+5a<6v>g zC8QVWf71Wl5`-Vp|H6!HqyPUk->mlPf4HdXdTb~hePgZ4uD#GwmmiS-++-j5k#~|K zctHMZ{69a4$p5n;{%=VB1B2K24vKfv!nYafe2J1LAq0%x*%^}mw?_b^OU$(r`F~Zl zG8k07&|1|{d!ePyup*e~L#$Aso&N9U2p-V?s{iLR55fh6|5`W!r2k3(6aKq*dUZA% z`G2|pcS;2Cfc)3^f6R+X{#%g#H{}0uu#5aZ2!x?vD)+Ri;Z#nhNg#Q-w zGx>`2Kk0wc|2^sdqtiN%zOgoCr}je2Tpq3bU*EsxMOUM{_46v*o>~TYK>o*3T*?3U zA>)+rKa*l#J{!sZT_xWA59cidz-4W+bd7m_n4ie)S?d7dTga@*fQU@|i8b|rDxu)!q8`wj3R1)Jh1LT)%ux~Z&(BcsCB!D{k4ZA~CbKAVo}cv8 z?1!BYk?OcfOD4=sP<}56eYxC3_31;ZPup4Ql%FCyF>p3VT?O)@@?A}US{dN5KKggM zS)aYpgKQAcpp87{yf)I)k}HqXJ$*?c{y3dwm+PV`k@z9y4P|(z2S1E2Ul-N7-?bN7 z`sLC=GyI~B|KAl3ZtwpymV}i5V|eTH$CLlxq7M*qZ1utqS^=qUt%IeYW9y*BrKhIWeuc$$z4Z{0_ycQmE~{jMn`O==`Tykq zlmDOB4(K^ZJHroi&{fQ*b66kgeOAl*NV<*sL!wP>cTgMYX~~rb<^S*MhqRl<+5Ol` znp!u%_QG}e|DF259rXW0zdZlX_roxt{QqNp_*3pf{=bv;l{J~_8d0X2)%_(Z)FbKEIQiNbjLq)+wn^8dLIJXENR9b3KEqIGM@|9?uM<;&3b zSTgd$5%YdwT0&usLH@rfzlHpNIE>%+9kRrc``dh(kF~>95^!ymruToHzrY(F=F4p= za5}j1bw8I}PffU?hbRmA|6DHtEuHjUw2A7PZ8wTYixXL^jwUnTBmbYDqIx7+r4ig* zAkjV(REFgX?Lq4#2a*5ZpB~cFk{^1C_UGI`(3;_#(cfIOU-c=E^Zz@A{pE*s@c(^A z@qbA_lP}2s&kck_6TnePd#%Amo&PXQ!W9t3|M}q(9_KK9$sh|Xy$7d~r-=#Ma`aow>;#jJ3vzAs2Sgj#)~fK50+-a(+UW)|X~_Sd4RCzONS&pV z-V6EvLZopcn&)kG2GO*n?8kS(zI&Y}BLDw9nn>@nTGm8Tcs1yuYG~U*J*1~)KRhH! zRA}^``@}tW@9DLFYwFN`B-|k6lU%)p3xPMwo-HqUPU8O{Di(HM?#SiI&c- zo`tlot%EG2r)57pBuP}qLs}wX9-{nzbG}<2PuBVW_lwPF^srcF>1K3V$c}K}=a_w;U4PY53`&Zk?JNQhKKK}1+o$Ovnvm58adK`J8hCwN?d zHhjy!)oQ*gCRl9e^Sh#HBmZ*ZQh7W!T;Vavxs_3WwS8Y|FSyYV=79V^75dHPPiy(l z;)v$I92DKX+(7bwkHzR^hyY|r{`0IQUy=c2>mI7YOLagM$^Z4;mmwg-AGoa|A>#Xd z>D`BOh6rorf2HO3DULvE`R_A7A^X1<`F`jjB>zeN4??p4=cpD$IFz8|uD(R%Sowd7 zBhXs@vm}XW{^KFh-OF{7|0MrO{=eN4!NcsckpHKf z{Zc-4k^eE-|B`+tUy%GK`M7gxpFVwsV!8QCUqt{1OB;al#Xb7>~av`Ve# zlUWeVd{)lV=ceA{e6vk6jSN^nJwa4NbD^dpH=0GU^7viud_}wnty5V>+3%GrBDb=# zEV_}4jgkct1x{ai$1c6Uy0}k&tt`U^!XGcT5J^YaLAbErL$sc6A%6>6+qJiY#XPvP z-=jao4Fp^wC;v zO}A#-jdEKvuW3uaC9h#2D7mV%s68$Q_(x01o_I)5sE&iQG{PKo73J}KTfbXs((`LC zxP;zIGp_Rs9sX0b|4#*jTHF7;{}=WD?!2dM-bnU8+5aHag`I=794wRlUoCu=lp0p* zkPqdNk^R4e88wC=KYw|aLFASE#@fsSL`!%t+5fpuEzpm%x0%-(t(t9DH@&~CO?i&= zr$cMolKo#o4zx4^c9R}7+5c?}El2Ndw*UJn0&Z>p`+krR{%_^Pko`~gKexXK|L0*N z#SHDyA}KIyy-fnG^a%f#b{lL))%AjFg(pbSduCnbE^gufmI}vs<)r6l}Lp=6|WyaY%#lq}IT~kuv|mZYv}Q z<{--aX*Q}Z=<0Fye@EbdPlwj_Kji;=l>cMp6p{T;g}<8a2bY=nPximZl93mVnD-0Y z*}+u#yT?Zh+>-2nvj1zU?8*M;l7oHRb6o(t4k z{`)NS$^JJd^wE<^{*(MC`+ukQv}pivJdRGvs5SFzFF0)fSLFW*jzD|)??Htj+5bpP z8+%FepX5Kuf0F;%^CsPnzw$w-;~oAZ<$rg>e=oJV$p4V?e~ig|{9uy*B>zeNll-rj z|0fv!UFARE|3OUlKbF&`UX%PM`A_nnGYJ2Z{V(Zf@&(C%lK&+C zN&Z*m|LInLA+_4e|0oCu|1St=@D<5_lK&+CN&aK`|7p4YIA4w)Q(hF-Lm|Kc`R|7S z_Ol=eLLXYQg~^TQvn28f|1l``<)e}O=K-I6qwpbP1K!EwcK-3VRkc3mv^s%rhkIZ= z@+edW)k{2W0%aE7t)HIY!!;LB*9>(3E?=?o5RvOySw?-)D_2B`RApH-I+=fz&DBAZ z>`SaF_wFXMR2Q2@?pE$ytk&vZz2e_lUEXmotn->p(L+Q~g_?aABO)-3OF2H0Sm;m; zakt`c|`i3Dl?%C8R>t{ zD40(QlEAu{BUNqJ2A71zU8$~uEB4xD)T;T~3#9*r|1T2(AulikK%jMCu)Y2d00|)d zZ^LXL{ZINIY#a{#%m!seFXw5Omj&>lby_ve1k|~-N+D^j_Ndbx0%u{uZ1Zw~~t*Z+_JME<`G^?yV9pY%WJ|8kA5G%64%R5-hY z{|gIHLL%h%UY9&^uHokFJ+;H{%`O2?}^Y}|9c^${BJ8qi1a_{f71V?|4IJ??EiuA zf8PJ6lK3`Dyr2k3(ll~X||4RD5v)5l}t=9UVCCsDv ze?dTluSoxs{wMuU`k(Ya>3^aBd5mYf6em+(9F__< z$uC_c|I6{;+AbBM(ztMM%$u%-0nvY}F{z!%RCdwKejmN2251>DFsR445>ur zR-geZwF)@F$4D!c{J$g7N%H@ys4f$p7obU@aVEZU9sKum31I`G3VUfW!UTq-RF{ zA4oX8^mCSf z@BeuLqxhed6GHwU`G4g936LAiV2b}Kfhvmsl{=%uDNz#BDgL)F6#(KGiBgdNcc>Y@ z3=}oMZ&kNOEACo=E5)&=_#X@jlAu#T7x$5sS~suu!W-$0Z^ZyV^M@Sc|DDu`$Hvh>{@-bHeM@D5+3VL7K*iyo7t6HBX6!O$MoQEItJb7fsmWFS*{nri zt3j_;6R|q#)q+-(`I$ZP6C^3(z8*EeKW##O`YBD4e+rAlGXET7miELx@{dKr!XP6R zB!$CCIiLMcZ8pGBU4ngj&Z=f7$`er3rkPYr$FLQ7d!_8j`mB^Hp@5%d9yL|_t?q}s zIm){a?`&A4^cglOaD@NYJ@B{xLt6WPQ2!T3p`?;}KHDpN6IF;@{lM zF9^iV;J2IkX~0?~|L>V{J}a4NRbLs~s#jL?XMm%~|KlRN1lCfu-;De}%J#HjZM*jw z4gTM$VL$oDcJTk0Pw_uVKa(%W|0Dko41&;?crw_NN(LaT)i+cl|1VE{8yc`y$^Rq& zuUeTz{@*FBsLB5$|4;2oP5vMGewHK(1gcS+j{2}f2e|sR{kp5Tw zf0j`FPxHR@brtD#>8bc^mov_dH?}7Wzd^sZtWEY8x<<|4$k_{k{L{`dY3`p=;{Pm(DgWEb8A1C0E%^Tia&)^m{v}_v)>GB^sboiR zXO;hu=g*1oNsJcXX7h&!+$@VXVV%?bI4eT*f7?#Dm=)56A+ARXwl&klYXS348pY`3ByssC^*d@>3j?{JMQ;yL8 zUEO~9M;_Aus{ijr0r~%uekNZa{ZIaXr7_B<<@)1%`NNC8-td&bKl%TgdtOB{qRfB& zWX^&v;N&|#nX}etsJ%dO1d}4Y)w2)k|IS{2@ih+Vf5rc234@Uk1Fv|5xmVBNT5Se{ zo6UNiHGRsV>rL-<_!`px`NeV!~&xq1SYUu@^|yDi4$39)xr z8os@+R;&Me(EEa#2lRiW%zt806ndop1^rC^M*80X(oXZAxDO4c)I(S)a zUkt}VsqobQO&b^i3gPy+`*eBU=t9%(VwG)P_dED)f9Ei*L645ZmZ<+*EB4VGag&Tx z0%=4|$q9@k!+D%9yY$hIssA^jwc&_)zp&}dPn5RSS`k+ga8gx?9zQ(zEZM3!@CMk5 z>a-|Z%cP}C&(={u>;J7+pGF+w+V;@=4L-Ed|6^Vd2T3LWiv=O!zq;+}eGU14<~psk zaRYIEugr{Qo;UjVnx&%$7%0rKwb5PgKZWn5nsO%7uHkQ!T32iJ#j_}wdH#D~qrVql zQdh5gSd|y=?|&|;)lKThbw#wVv$?g@=WgMb?eh~@M=Xq{zSuxm$A*)nHmo}y#LZ`O z@BWM-3%mgr|F_IH&vrUK{%z%ZgWT`FW#N=fLg)wL=ZpEN7mEo?U@;i{{QZxA`RUj9 zknw)Y;v`9+p(w2TVtuh%-%ck%>`&o#HWAA!zEijCx4d~JE@(Yc4hk0^_Ezv>sj+Y} z^Vlp(%52LI4w%#1G=rmqu_1n8{qzJFoaTbg7ld;e&R9h%z*Ba8`YVqXL5IpRI;)i{ zLJ(D!McnIL2Lm(Ie)?SH8}3FIR2TQ*n94F77|y`^BZGJtP7GYwpBc2C9~u4@w6+6s zU@_0>5de|6VR#(QbGm{&6Q{}zk&({=|2VhORN12iqe@j;;%P0@=|#Q)57`B-Q*9%V zIql|!9H(^E-QyxsD&24z2_A!WB*=#HNb)b{b{w{(bSFaTCg)MQIz`;PrmE>6nVhVq z13$hlH672`M6m+wsOgJ2N|Tfou%DRBDwEw4 zo0(xVL|8`{E%8DO=M$q@W;BE)lTQXn6OOL~iyWSLhvQtrC*y{~J&t*}!fb3pz{i<< zv)zdxcH3n%bZ%SK#BPYVt}t8>;M_;jZq~J1I{r$=q$y)E1s#XT>k89dMZv-)rAk%p z9)2p2Pfvzr--cy{z^*VJBq>r{?L5%GFfTddJ&?vTtMN)Cc7^#8GBsCc_U(4ewoa)hd8wEpXr!Y54 zgm#4y*_4n^hZqrI~ev=?1)6^+uL^YAbj;7fW5!)5*2!lAtS9HZ!d=hPR~vE2TB19`pi?iVf?OxHXEuIxm_;YEu+mZA>4tqpMZBoK z*d@vB;*@2%h{$e_NmY8nXXgS6OoypYyOj$MO7q_L8Yl%%Uxw z$+i{J>#6M-8PCG_g1Tz9W70D15vLZ^hsAci10_lM<7yglszk+{nlOr`G^o?FacXk| z{eG^VOAw$r4z;INZ6A9@`nsR(YkrE{+0%U=rfq2_=+zG9Qkh)e^4DmG{&v2^#U3hmjFHJSzJlCpY>fE9iN?rF z>mPFlO7oLVnJ*!kFUzGql?#tGK^{P5SJGRb{fF*-~aHCi)yb#J|96|hFd}}j9~HTx#Ypr z_Q2C*=11iK4afI-n@g?@Dmo3f?6%jsEdV=@thDR11uA5{e+gcz(J*YA|Q3WDY zmZ=3IG*8v`SaV3rRyL|1O(f}${EQM=VZwn*D=vxlQ@*Fu=@qnL<*wCt%k|xt;k&`$ z13#1hfd9dtS$iQ}-RJkd`|$3@^iP&n>Lg=pWPq*Ur7CB?#MiZz{<+Hk+)LvS$y%>r-dEivCb+vylt z^|SoQSNyCXVchvT+RyT*a66j}e*XT)zx?#;``p~VWxuVedih8>_$}AsxhBtp?Hobz zJ(i5TaKyY{m^OOF4^D4>Rybo7sQ{0+;%A-fU`QDaf2f`CbgBB%T@UT-8{(kSRM|r+ z&BKf;RcYx~@K`iY)rx!r-rdv2j~r89hx@C;da744KuN_QfZ zZgL)_t5d|yYpR+KlF7+xI`D17p==gaic0uV>rG9^Gd3w3@9=m#YWiZ1l6A!nr%b?u zup165_RHHsjgC+?gx!oYl?D4S1vF2!W(r*1u>dx+W<01n!zKD2RtArqs>7S=+WxfI zq<7hR^D3qCFt=1@gNONYn+mx(+&RjX9s@%)cL+UZeV@YpVKK+hq-2o6gW3R)CTCRm z@+AoEZeNsDTC~OM5{@tGauF{Tq=dzGhPb2;e_T!3nMxtVNibRgKSN6p{;fD-%i)p5 zc0Rw`%Hsf+K8Z_!!aqFVEBEQ|PxH_4F8m36aj~i_>UNBONwjBssOFFSH~%k=!yJkC zl=lA9a{Y0>{NW{oSdGn&VUj{pmKOW3?tXttR&GLzgCbRIiE?;bq$JUv90MM7!AkD6 z-;2F~34*}!)slpmsXwj6Q}v0Rdh7%(i3z7vSbBwY;zxIJ528CNO$y)n!6h_l59~^j z!yng0JH;%yf-JU6(oTHjmOKTTGoYRT(op;1gR0fMDIq`k`U16*+xq_>P8&0WLEq-)e7lWUpUyV5V=x50^p9 zvp|}wAI-HKzZO=uE81&P^6H4eEHW4kHQt4GdevaOU!#;<&M;XCP9Y|<%49S*&Jdd+ z!aBle36!4@6mK)GwF5c0WwVPAPv{IhAWZR6{fq2f`vydZY1f;1{u=1r}TulFkt(oOmH6BA*%I#KY8x4Xv=DdvU!9D>d9CZFp8~ z$Q>7AMN6!RNbQPN3_>zZ9ny+?#3-?&HFiYAc7-7$FCwJW1*CKhsJa*qO)P1VCEd&U zoJ6G#gk-Xw-DKTBiW-IQjb_YXXI)G_mvYb*ZJ9)rMdO(H${CX?(5BREX{fgTf4XD#&$GduHQDhgnpe7vy-CF*Vm-XWVkRh{$e_ zNmY8nXNyLeQ=fXhG-=V3$J*d_bZrjGoDU|= zNz1fHoLW#H7TdKtlO*Mjt7&zn5*2f5!YG!~pia-msm%@a`?-29L4f8s)Sg#BrENL4Ugm2C-BAGA!~l}84Mnb)LfszbAek=CQ|kYJvfGv7p}lW zy1--Tj8Wx#9=kH5Dq*JqJpcU<54ouJO62nqm zGV`NyfQI9Hy$w9o1{Ix#TXx$kv?U0tOY*as*NYbA_t|qFf(uzwWp79R`$#gosf;Oz&wfb(kzWXw) z%pI(~05b*id*6L{cVqe|OSjqhVeyhZZ_@4f>wL3K#}by>jz%1r82OPmdRQ#8bTis! zo5fxB{_}RdI{K@5@DqpO4gU>4<=@N;!Z^8MK@fz#=LcbON&ToOMEeFMrBWX$DVQcb#hOk_ZMfg@A-EWU zW`Vc!mY8pz?R2cF`dNPDD}GjxFz$RE?PvK@xSdS~KY#z@Uw-=aeQs{wvfox!y?mq` z{FY12TylyD#8sn_&7!2tw*27q=4XX7R*?$ucq@L^xekVu(eQ^_@zCJR2rmLY(p?Yj z>>J{s(p1?)D$T=;DphIeRtPg|o~jl32E4noZ!)le80>pOw(D_9SEVz2y6_BHNbQsx zC(nz?^gpKa`*b74<}g?D<@uR=yT8(edniJHf1SVV9x`T$8EXK2yY)REM+bhO5V~q2 zb$=6s{fSIHs>LVb8Jme_dIK8N=MZ8pyvNbPB`ZREoN+Gyen9(pA0Y8IusPX1P#7ez&^OB@=gqdP5 zV8U&IuSCpboS9HhQ)!wM;*>N~n%;wJ2*%mNe7Q~0*%ZEgp_%x=cIOz1C0CGzX3oRw z+sxx<0JU-=mIBVnHqV%GRxMcyk<%3|6;MwPo4(VIsnARcVyiyb3K7&5#tM@wsEWTd zZN&?cq}@WS)embSlDfiNaX?^yLw_4Hrr@sHkJzg>$fBqXmqc}i!6qgAp1=zW;6*V# zSDpsaV0~#YKJ{6W)fpx$&?)#z#AH^P42>frHtUnk5Mdo*w8RT3u5~7JagwmXZq8;u_dIE`4( z4C^5hyTW`4nVRRw7Fmute$BgT?zA57vMDVhVn0*thluP715T#6T_|b4vuQs*Q;%5C zKq$N_=Mb44VZwjscj3g261OGI#27&D0|i^ehYl`|$PnWjL8xj@GHhy%NMb&vf4tCWnw?!(-G|TxI zRk?`BZjVV-dctRm_I^{Jdc8Dh(UV)`c0DL_K1@);htkX~`lXueT_(MrhVH9j?0nPf zerS(4wV*yMwrgrDNy;Br+tRj5RLrRfqgYCVIz1bwqDIKZUY<)3pjOPar&etrdqw)% z*p8wH%gyaa(x5$SkTvSAAz8z~cBg{P24N#Q>z_V5qpOZ820EaV)ay%mEG-)!{zPWd zy-k^8acldLIB3T@OPtAMLamV-B+fOPH|LTxNK?K|Nz<#o&_7J>Z9k$0ZCQ6wGmWK& zfrn7My%KMC$+&rG{i8pI)m3>cEgLsMAdlYL6gh=)(|TuLs+*|)x7^x(Bo5lK&Jt%j z4X$ARuerv*XESb0ok4Um<#DtuX^^ITo07)n-u5GE(3W)-HNNLDsbSzD7i!$#QR4~Q zO&aftl>GNUJd~o&3y*w08r&P?)4*<7IAxPC^unmkyzpQeTb>u5%>1Yvc!6E+Z(g`I zSZHNl_-WfKr7Tdx%G7Vzd6Y=+?$qy|$ZA=6No%QAb*TqcMjcAyxRaTuvP|vdZp~A* z64b!t?w&S^D~{7ga7y~~$JInDRa$XL#B1FkC2=~PUO{_RUL*3|a((w@_--)x!1?_j z@IUx7YcD_pto+`0AKu+u%TJbWv+={?C41ha+ws@=W}A-XY2A)STv?C&$QwN@mRY)a z|9QJ!wf);Y_=&^thX012@^9t^VVvBsAP8XYw;zPbjps8zVK)P>?FV(a|9P9uH-o{= zX1&gu-hb$N(|aAh#?Soz+&k<7g7G~1_?o5s6sD{BQ#wLUSWhpdm7$TbYCcGRQ*M!C zP%Dmundg@cL#Yr;rEX`Pb8B^z`cZ|5_6^EVr9M)IER3dDqiRhGxZm+X^w=q5fw%L@ zm~Wo#blj`@bAIG2{#=kS?&Jl7pTGa{FF*bI{yzQvmc>bu_`V10zF1$Z*0U_)Q-8a9dmzS-Xf;Q5;N9-6zZD8Wzz8WC$fa8*6@yJY*N^{=gES$}mB%BIB}Lz4rM~x^w7D)oFXzSJJ0}lT-@9&BBa^(F*t( zq(dvol6^B0HR#(NyWL~%lR})T!nD7bjg*?#qM0_h zm#-@f#gZ$?b~ESUnP4c?3W`{&kM3K}X{msEg4pz(xM1ZSWaK#@w(5he5J6qhR$)R_ z^_I=QU27&{t=?x4NRqn3Tya2P|5=#pl{8n5mh}Qz>`VbZ+|M}%o0Kp|LIRB=fyG%s zP3y@x?8i9V&Chg?$qIA|6e}^ARVG8@%!tkUWHUrqN6f{<3nfBJjJ6aRtTH#m405;x zm_v*$mZFzftzT9{F%MUmjZFynIFoNCX6F*S^$vjuN#-EK1pzKkCo|Hr8JPm4kLDSX zhU;6ymB{OgmZO4$#)1R$CM7==1eNrdK!p*gVzh-cC0t=VNKzCI4Eb{B@a1-l_fTNg zr14B>JU+?PIp#~q)I3MFNCBh>=35tMgV@g$`ynE`qWvaQ8Vqx0aD|(lyP4inJQE9= zV?p;)yCz;piO9|{AqqDU8=7Q8L}*8};e?eMa}x4-7UWZCLyj4cMl=|BC=8Dhsa;{l zASBb&A+4B>sl3!UI=b@%I6ER@yTXu>7ZFmL-h)k4>X#xqqSy*i;4?x23#%-N$n6YM zmO2QM$$EB^bpvn?h3_r1B_g;hjG07~MdO(H${CX?(5G!Pr1s3lj}Eh_I#gaX)y7_)OAw$|%(bUhZ6A9@`r6oz zq6f>(?MKp}J!_CP>aHPK!@zc@g3ShDBRcE=D+6U3FA3&;gyKUSFcWO6lpYD!=|3r}`6_N%uBoj>WC*N8+Fz>nw35lL@s( zZjdP@txCsJz^xme(DU6%eJNr`IME$?z*7hTD(2jMMIMZox1@nK+wW&XwabxNX zqLV3)qh(2hH09frG&c9PA5nw0tgEQ;J&#EZ0}r`S;|7l!PuOnKcvqz4zyIN(6m?#B z~eqe!nMIdEAzrn+g>SUff`n( ze#6cSgbzM49~2L89)>V>GdN-KVZPj^`$_PBh&K%_jp*!&td^CRw3cdBmwHfT)S)`L zTVpaxayBQ?mvXo_{ImfCQ?<0I&?JH`TU=Z`VpJlpBGSM}ul$X7hMAYt6S3kE-b z|KneN`t|*N`ui;?ktFeb57vFLzF4hqr;{M|r*J!)h~?a%zh%Fzs+#|h1Qb#cHZ^xF zd5qupSTgd$5%Ydw$;@N3C@J$RKQWJ7uV!#NW>0=${qzJMs<}{OmxVJ{5eM)TD=yr* zPJ|TB@P}G){@}0(Ed(Fwg!5OU8qdU|az`9gmnwg>;M7{rQS(%-us7g2y1;fl_?*Y7 zTb0gSM)D3TAR$>uEts{Yxae=tUud_8RU>S z(xNT7U~!9p2YZkJi1Pe_HTI24`?3UJa{FLiOKVtn+~7WBWtPs9H9y-Bqa!2#Ts)6- zPm6QsAkUi;#=1S?JgQ^{bKY9;{yI@D>s4_BvcPsunaj$etQPA}%V8er(4@IM`ChLn?*fvxVslBNXs6NN)<0xpx*qUE!qs zEOuU%p8Zu;$PKO)v+5CXnu!o89buywLRAPFA~rI}M$}q%C%t=`J1%W+S6GQ9SCGke z2}a$nGlATH(n{dI;1W(?h*g^21D*mGN)|F)5mD&Ew5yQQ6?O`)q0`6ZuoIe5K@8Og zLm`5?!ct*!1y%Bw#8T)C5L5NTREVUmuvHuogb$gg!jBvp^`YkDCH&tjA$vIz){`%# z5Y-jdnv_s^f+wu77HT<9TB|Ru^@=AwJHuWDkPBal*vk@op)q8{V0|(eBCI1UmUy8I zV-Sl01+1|c!R@`m?ZQOdwe^v!&f2= zXIaDXY20K|8lS=~N$d*SC1hBZ3T4i~c57lh6LB?cPViaE&avKPdIiH;F4@T3P1u&_ zf`F9%fs|qpp(L{-ns4HTlsbGi^s+b?D11Z=Xp#XDp91&eZW;u`h z@FDe*+|ICLsfiyMsAn`#`T0PRV$zQ0wPT6kuCQbhQ6`Kt#wtG{^FnMBQ`%ulL~>Wy za!TE`&L2lCEGf>G88N1fxMD5Q9brwF(@v$bj%mzn{OB-qs#AL$@9>p^wA)oE*SqpN ziHOKU?;Osndtfq&$e0Wen1hZ&SwD+}nPH4BE1;LdN$zCUpxu(UJfDhX+p7+1ruN$839peAx9Z3#V)nhF%!8nY|rMV_UPglbIit<14Ve z{mtIiMgy(P-ac(#rFaEuSec*=TaI$!9iE`w6J0HwL3K$CBH&qY*bVMtA%!#ip;o+CI4qapy`FtX98{Moe@JzCm{V&# zU(Hjs!rp-Ad-hERw(G%XK2F`LbmlU0?=`dVDw;cALO8mJJ+j1%9U!H;=5U!bx&4VO zsj4-(;~ATjRk)NPSba-rQChSm7c6d3KN0{@o4eO2@+=r~p z(s}x{Tz{M|MFMTbP?Yn5P7e>8VsvEWpNr>_?rCxE9OQYMd&GJ4bf_GWoP8QDFp{#Y-+k0}ikJy#b|Nz&a=N0K0_sI#$4BDAl=rMb?74T7$;{({ zQT{V*tDQ;&b%mwEClV@I=wLkeI7?t;J_bOR_q{UWJ7ZUy0bu5__TXXQaLQ(_Xycs%tEk zc%ckq5Q_l?tg#ru?Ym&<-{#9aGvEsx`*+a7%$H-H)dXP*@lSh3hPa# zG*sqn@Cmnp_^F_55rc^3&X%u`*%9`ecp;?@JHUP@d_-oaDYKKyIYekzSdf)Ee3H+1 z2A^+tGAM3mNegm>OGa*7VZ$IKL(~aPn2u4kB56aj+OR}yS6DIfB0@ozOF;vhnJd^? z;bMA2VF=T4KjDHa@%GvR2VLOp_G_M^?1b2lclZY~5oH17U2|;Dd z#FTcJ5|P{$wwzLTt@FnbImov&Tsd22q%Cd46>Ev^2y4Prc`B84Ok-x_M~9hHojT-n zn>^7=Lzh`mWlltPd+e#w6Fyrs)tma%b49B;Pj5zB?p;+>+HxhSLwj~g^Km@qV+m8h6U6GjmdoeDi4 zkD`Xq#$KLF1fX`uwdYlB)Otla+Srbw2g}XvN5-H%YmhSPt|2MIz*4`0g33#nOwm<4 z72^`nN$T~bJeHQt4u2xE;ohdqvADJUNF20doh8m>GND$)Z_cnemyAI=@@>kPUNwdO zVRCQ#5i)4Yx(k_UEOiS!_BVT58x6EFd;7F~mEsksVP%3gY`Mq-hmXvstwVYh#w&JHEnzXAUbCO7 z{)c$e(ALn)p6F^>ZAlBMR%xjxRmK>qQ?ON@k#lWJx5l$b^HiOQ~s-G_HK^y3Bv zvUHn`9~Lj!^CsPnzs@(?bS$}TI~r}X&EhV5|9QJ!b^gL0{KR2+!+*n1`8V@|AV_W) z{5SMHKM0c>4@|V!yBT<$Ke5FdpSRh3GZ@@#*6Xb4ZHKNmz1QJuoM-oZ>!jNX2LI^e zYnF~47Rz)se@aKlaqQ`(G>|mfLCsj{Z)7KOW@;5lF!TJfO)FJ-Df#MduZT*Ew$!uL zP3lL9Bic8pah3W=jk7SCVp~8%LfDtk$>FNf7%}xSdVJa_*7bvfox!%jJ*+{FWOy z`G~XJB?bqkWF#jukIkZ_%&+{!JaWC7!R?qm`Gxh<6MU%VLXBM+&R9hpz*DUFpyxUf zQaHmOYQ=kn!y+6}_(+Gn*R$`4gX&V{52-E>b84;Ut9hzc*cHqR!eYBJI!Pb?xEf$Vr4ZsF81aCgp%r`l zTXB4rVHcQ$N6T$wUG>1=;5>AQmVb94%u@~SZ2x23nUCHF`YxZ6h zp#4R4q#SD@Yn|3cyiJ27rYo$(k}JsJy9|w#Qm3#z3fbGB6X)0|pk5{=^UtVe;tfsY z2_Wrss+q^-6C$W98Y)b#peMlPXed5#o0#g$_W7wdEmb0^D{K`9)D%xw_-+7-*a=qN zosAf)cg8|Qb%nJi9>EjVS&K#{8=BxFWtKDSRl*(#{WI=kiN2!pB#^JwkFTW=))5v< zyilUA@Rf+gtg#qEh>6MiWimusSJ;eA2--M*OxnzVFE+{tFgVC+L4Z>iNuycR zXuQ)nF`GeVL*#Wuvt31r!DWH=uP`63XzWi6XO!U(+T;q$L2@BV&L<6LS;O&Bp2T#9 znGTWI6}C&ru(X@;AwV-c!iE^nIODAg>E;USO{O%I=4|lES1>mp#%szJ={u*9XN#0= z`3jjGVZVtNQtGe+>~~)XW(pbf9Wp3S$&+S=D=f%L9YV?HJA=>1H6Vvw>DP%o7%o%@hptX zy``^+JU1#?IiX2)p|Z53ah{owV!`Al1^v z95`X%mCEJ%W*PFU=>!+*K^gESWkOmbpSx z=K}YhjH4a9OJ=wNIq3dtPw>E0%G{myoS1I^_8dj_T*m99C4j*}iRzQWW z8o{Op#QGa#FPee_uYqgH}um?fh^r-VSA4_P;rA){muxcl`THOL^3$*Hb5G%x z{kE!F6o(|>w_H%>!cq()E*Y=M%ww}CDf25oF^^oYW`Idx_T(4VPfzfnnhQ1dUN~bF zaR5)T;v1gpL`dNbf2b9&(l3>MI_y=ReMdBM*rY#tjJj0$L#oTeoGO)Q=~nPaHBZ$F zdlRblOoAA*oi%l<(wWOh-WCERBnz*iIde(fPK3Hm&ZBO1D!6$~RnS2)IaxsmzBTaH zu!4?fY@+CYI|}+@&JdO@R#ZA1FM(x(Kyg{6U)~-%XauM{*oP6Id8#!d;PQ?I@R>EU zLEV{>*$`2MI(9qFwN{dHU2c6b@zA7WAcGvWD4HgpRXFe^(%kLc?$V+yE|;)-Q6Y@D zs30XQwkv~^^x==I0TxsWAs&Je4fq*ag79y}@ma9chl}leez%p!0WN(KmjG>lc)(Zg z)8C)wpW$8j6Zqm{Raw;S82^%J&-VDtANg+n z{;%^FxbQGvZt)devZW*?oD!jo&dElx7tnxZT{WozHbUK2HG8iL(EidUq#SD@Yo&c! zQao6)2`11-@eKe^g*M{lR?e{!ORgZd?ohm;bQ(S_*B|H0A6_y@Z%FS!1eUHEZqO(9 zpP1=Xt(4-%X|8CdfO?VGWT#~zP>G@XU?@aTS6C`cuArv>ax@fg14UY@_ZI4sq^_`4 z9N;QPK7gmUWV-uCUg`BY46ZJW(_*l;?n$t3T#)Z>B&zDPfPK zxvXd|K3kj^tar0;*9}<`))5Vsc%ejJ;VTh~Sz|GT5R(?`Q;U^G^tr-jY(mh+84N{! z7KqVy3BiVX`#Y!6f&iy3l18(r(fABqc^*is^{v%P5B@)I&AEonY(h>emG$z5T~DRtL6e;iS`H9NMuN77{9FzMaY_6>_?VO;JleMRh9raj`(g8H!7uJNTLDSuo|<4cvOm`4*v z5fYsWJs*!Yx2Nyt>bXR~F%vG-My*#Q1p3*&=BLQb?MKF-J!_CM>aHOv!@yF%f`ZEO zWQ+K;QNhi7Xzr>y--3nS$@4AzD7caVRN8}VWxhpMqt4t}X?`-6GghWtz#$XiQxGl= zPr10*owV!`Ak|W9zN-8v&4JPsEA41H**m>-D-68SJXIS5HQsmlc;D?}50yJ+$YdH{ zL1r{IL;T=GGvuZ9PqR`mch!{P5|ZJ<2Y!~i31QfZvoD%Jfi$pgBmr;!ylbh*8&ipz z+#*GE7kl3UmaUK8i@DR){Nyv3IvAF@LR04g_nwTS>=AP1hLRbsz&N_VW9W=I<$E5x zGIJ_nr-3^E{SObYsFq6P!+dVv8{`w7Zdo{GlQ8tc2o?h|v>Qf3-Lg1I65r=|j4##~ ztM%=462!sO+6d8P=11i?3>>=tW_)X-hE78)yM2{{52#@U@PI8x=GGNj0TsGh*08=H zt~79~FoAkfYrzMVXKKL*%~M?mA1WKwj}DUb=Z~w2UaGX>qKFsLfGIMaPOqRHDtETN zTdwcE3@h{eYA?Wmr2O7@AKu;2PcsFwbeoMI7BAWJCf$y|&Nth1yob_WMx%$tGD|n3 zZMIq5W$!<4*Q@5I>92b56Nljq{|!IY-$@K>EC_s`^nf~f@pN#vetLp-cDM88a`3P9 z=F4Edx*x38gRjf^>)>hrCEX4_uOC;d*THuK*-27ctjP5ywpD7O$|gMY9ALDmFbJO=ZdA<)In?-0X@>s`Ed?8S@n=Oa#8znQTW)mOT)KQYnBax-8;` z;q?GLs!|$oM|DwPP!;O!M)$()`PA~gw)jKBE5}XtZIg0~$EFXR*$&J2725M!{6sy! zT6Hb4D!j4!`7#EgJ}&Ul)A~Mz0}L*@IJPx>q!Bn;9&9C11fs>lD{0W~3_x`Z{?i%w z+2bA@^l63vuq5()!hdYQMuh(mu0)s_VTYHEp%VT>us6Z~6b5-?;UElj5dI@`lrdSf zz9->7>1zIzjwHp5zL48N_|M`VFcb{V0f@3n)BC^9Uj#ac;1y?pJNTA_|DcVji|C;` z5CQV$zyE;$e&FxlXIeOvpwx{2@RX2|A9<%G0v*7ALeEbs`9HoNQvQz(_~!=UKSxHk zOAz>Rp^G2(aq%D1`F*-U`T&ksMIa7$-=exIL?H;u-9yI4Kymc-6wF(V94P^|VO=0; zSQB>>xzfy^$c)d+j#t>+q@Gk0qCJ0NO}4EXErOd-Y{I{S9`5F(z$FAQ&&K>k7u6Q0 z?`_5^gp&PVmB^KUO99Qzbp@i~9G1iEP|krMTS`mJ%SmbPO1(1#pt|DRL=eAxbH z75v{zpbVJme=QtPvi~dEjdD>{3*rBJl>&PA96_3%YyiUli`aB?VQYu*UmM^* zuaFXUn>{&J#l?Odj7zUK|ezNEto0v5r!ym9RA-C_}_o$ z*7iS3!jO^uZ)nR)k0txRs&k~0A^U&XEnk)J{|m%KRxAMQ`XI&G!FEu)n0@0sB9R62FZ9L;r^$BKuzw z(BKPX|5N`@>MKh9RjJSH1@_Rj*#F^>fAp=0ht*kS)cBKn?oiJi>bcXs=Z?fE!S|!a z4-&z}WO6A@_supKh6yXWux&f8HSevw}H>yyIs&dYo@Z`842@8h{?aex$4N~2KL%kR`RF?QCppj9U#vZjdwu$RPEoeXF6wXQS;+QB$XyPJM0Tu$rbj$u zlk(6+Z33@0vTJYX+~sYxO=CsfLmrC%vVDGneoQQkiU=gEqq&-w)C#JU5PCVs0TQrq zv-KkzTA{oxyj|C?6n=hv`nX;$?tWUVz95Hf*P6SWPte?(n;VLpbm$@b?o87_N@Jxr zQ-2LKWNS2S9gQE%e18@My$Ie5Iu(-gkGtmUvjIBkxxo6{ykni8vf)So7h4XC%BI6w zwSWqi_K=O-NB%fXQNDgB;btLz6Bg8U<9$DVKmOl8!9j&nUpnyccE=m@@xr_Bmg~DO zRg1Uw!ZB4ny7+&+|JN-epuPXcf`sNjNFUAQ3-bSpCNmdh;*kH>h!3bnNHMuu)klgp zs#OMkl=G^-1NncAo7sF(ZZ)?TZ1n?G_YfH%gU4y#(Tr|Hn@b`F}PWv)8(LwHNyI|4x|%*xvsOnNRUQlWw1UHu-<# z|1GzvLVbs!Krr-!VgnF9!_~hnM`nev_3b{x=w2ki-+SJp?-pj~mWQ{vY{& z-Lg~3|9i9kU#mc1d;iameTx4{AI;|Mbe=d<5guzSxANhZGcNG8I zJA&l@4SkO#BQG2=?-za6V8_IZ3ql2ia2!(pCxk31|Fhyu9Gm|s<9{7mf*0q*(o#sygL7{MSor@{L=;g$|WBcNF%B7DDuaXzOv1;4DW)6v`W)^7|;Y4N*hg{ zAC&EtiuQD+CoG;tl=*2iee;BeS3SQLs(?!VAa}a4?2E0JypJjR(m88*p{N!>HU9*wO65G9Yp17xMoqb#14V{E`26 zc?t0p^W$ZT6!UBF9**_@I)we?r*`oFLXYBql71#%kpD;iUvBcr!au#DC;yK+znl=7 zG4oalX>gZ?I=}4m{(u;#j;SO6?=?&F7U-+_Q#vwpdQX2U4|wvQwtb+xl>F({0>%GM z-^JdaAjKm2f8_ria2}5H|GGr|iVtq@|9PGt(ENvjg63Y4|405GHz9`P|8X(^A?i{> z$p7ozP&xI1($FFQk1GGv%0G(#QT&f)KBOCPg1!~l5Y2o*$sl#g9u&$a4*hWdahuH_ z9_1e=^908lT>X$ zpq=s;i?c7Ira>&1RCd%bqn0(aj3JoTN3yknY5SSaCYjhk1Vm4F8|PGP5y%=5?Jo9> ziz}VXY!aksPxv$IMQLSM;ASaGBcDm73G0_8O1TVgH&u<^ar^|jT3WSrQw&g*8u3%A0 z{+}qCt#x+jg5oif|7XLvKjJeE_AQ^Sm1gSzlqUS72|j5uX4+S~$PiUiu2UsJ@#=D&PZ=a5(-QqTI zwZoNvhs4LXq6LBQwNK+~{kxBfUD_!5Ga<@O`IDvSR%^#hNkNof*dzxl*@aprDMfVT zpQ5ccqnba;`J|Yidqs`p^I5Uz+kME9{$IDi-~Ou{ivKD8AJqSal>gaoBRk$r{vV$Z zhWm_=|2OEn;eK|l=()G2|w z9!Wy}Uq>6=WQOH`IF_JO7TD3jfb24so4zpK6Z`!YWoS7RP%?5 z`^2dR`cTcE+kPzhes1g{^$K)=Pw`wN-;~C{*Rs(+wEfYsgDtW2mC)T2$cDMam>j7>%6Hg z-iZCb&1SvX8^Pc9(iY0~w%hrqd=BPf_4|CexStL9`4}v=gH8H>o}s|+epgLX?W~m^ z_qf5%Zp=Tg`iSl){~xKaN&nl}7h9jv zn*Tc(0*Clt)&DH^NdH?o0*L=Ls$9?OSgmW`MEc*#&h_&lE%?84F7P4#SM@)O{h0KB zKRev~6vY3e|C>p5l~<4F{|<_OPq9P%uj+p<@Tvc^mGg%9U!%%N|6AFFGk(Zn{_m{z z5dV|@H%VwmpM8k`yKDX84?e{IivDMb$H@OL2x#yX;(yZr z2I=hTqjmhBZRQK;tng{HUCy_Uqr3HHm2O6N^KIHK8{h!{CrK1l`u~O@BmHmX$RPgT zWiHC)ii*#W)|LYWpl0D0OJBJSvohJjy}F-=?Ib~SM#TIbl3mSSmprBEXipg z6DN1QHX@J7m0hDnzv%X>%Ny1*W2M{N3w=gque#@Kscp}!a3 zO_u;yDu0q+&{l&Kt9yfTA&cFCMP+|rt-3?7RHZzB9BPBoOnbQb?#uT1i8l=kV&)4< z!@8E%u&z53uzdE>2e_8l#{SJmz}Cyx(erBgeD~#*kCaYFAJfVCumZ^ztu?%6V3 zeaar+XD``r&s=%%1S1@DI8su5D^f;9LA$Ger;UchXA`PjHog#cqU;q**#$4!=~oa( zF^S@173%n;9R=B^?kSg()m`O6GG8mU9+vjv8|@c=U{?VybvZnQ1bE{C7;o2Lbz$j! zsS;ZIhg`J?*8j!Ac+v2q%8d#yY7HB$S)<`u4aZJ?@q<}7orNKpyLWebZj)+}%e;L* zh>~>dSBTba34A)Tg1t+&g4^e%Uf4UDQ{ubfKkZQA_V^Fve^UQ9!hiCv$%Ow9{=@Ck z0-Hm+kMN&asUtF1%&0rk9suEWRf9pbx{B~0GZ=Cw=UD8NG|7)c*4s3sBm74PxgO`6 z5EPH00m6SkoN7H?SiVnxf0}>Bp`HDr(Pp4FfNd>^aES=L_75TaXAl-p0^vVR{b0_< zZG``A{!=n+3IB0dA&7chw^{00zB?D z;Xj1`5dQP}H6M#W_z!o8B?Qww$CB_LEPbi|%T5yIg`qj^zpf$tr$t-9gZNJnRQvzX z{0}SWPr3iU1C4)51Nf-&iz>gkN~Fvm%KYItH2`%ThRoWC)pg2nu~71LK5^QKBGQRa zLz`+~(|A7$%K0hzBPZ=Bg6xYLlh%+u%F#Lnw5Ogwcw-x1>%CBY&6lIHS)WI7)xuZ* zC%YwG3GKm*r{^3|3}n+9hLaA|G4(} zPvAu~|54p611l*1=aBy9$5-l*chegU-nO9llmKbq9Wd2Eu?2|W|3M=;p zxe>+gw00vTw;7|3QP|KpUUh^X_shzYby4-}ZJr5Q#>9%?9U#(@#PRqzFE% zheATQgan+lqjnsax*aP!Fogf$eQkbC_zzDz9SpM$#a`zVzRh5Q8`8B7Y|t7v)a^&J zX>cs5+s}?YkDhtb9#FZkcbLV0+GPC{s6~7HhecsX{htd8ntMg~58*$2p1ISl@Cg4Q z{AU+*A^fLRztQu#ASa;(8e>;Ab*cXA0x(XIb3ph{?x*_i{UA(kJl|u4|5S)*=${Dx!C3(;8u0k}?SKE1&v;n* z-XO%LfDtk$>F zNf7%i`EA7}VtK`z_usPLR@FkwokG3;;Xr#L6#5tW5kojg$;b;w%=?8UGtZv|llO2M z|BeOg-Q#?-O*2r~9O^{|>)rb43H(jX1=KBAK0cmBY!>>;<3HsMl`D_dHOT`hi^dmJ z-XIzjSC&PN!)}}KU$tHQo7*6j`*-nz>f&ntq`4Qi4;~;k5YYwp4=(I?5UuAM$lrq2 zc4dOFm>Wa;?SRv1e2GDS^ozL&KlG<_*@DN4`K0Flb`#q4AVx>f{ z=7S@nV26*ejE$9U)gDKDz=p;5?0-H+h2Z^|FOrV@acx*o7%x#gnTVrT=C*QQ~ zhw47VCBe6qorWvtnflCQFJ&{!--Bj6DA7H9lhIMwKQ0>xk)eAwe)zyPqt5Q^! z(W?~wQ?(M*z=XV>Hj3+w^*#4a0USanw4EZ7^siGxT3R7BG@VZIr)!A_w>$1RaKHb% z<@)aUR#t7Z$qa#1^jKpQ(Dnbq_;0t2zw*~@jsLPZ4r0pxD^tB30BYoZlDva zSeq)|W(8CL1Rv>Scdf<>c{C=)d96P+aL|YKr+KQ@a4}&0RS3?_E<0A7`Zpshj_}`o z^p5af!hcs^oD9_|P^3n3m=x9sv(!85TEwzeToeAg%X{P+fbd_S#gOn{8TkfQQo$^) zuY1eLP+>KAycLVQKm5yzB~SRTNu?t3N4*f#qK~yIMP(Vnf4P!T;Cfi9X5he*Rt;%) z0B#mxNWy>LnSr0^sb{7@J^m{uJ)E8h+#3J&S&&fux0RDY_-}vKrWSm%Vr{B;n-!~( z@ZX)`AreL@{}=L^09G2R=aKMVepKK`+Vzzz{G(ggl*%+H|Cd|otqL`?sh02*D}q{q zH{pY=h-%9J-Lqd!3cuI|!hiR4>Oo*5TEa2cI^J3|owGFWNduaM@_#A+w`l3xPSDqZ zI#vWd;lHSuvQzuaZ1XIKAjxLVJ(1ONP?7N8mgNmN|GfuABui zjE<1`Z@jSZeB^O_-^T z{%f8}`M)S%T}uqG5FM}LBK)`7)utURK=?0A6y|52@_#kWdJtyW0bZlzZ)r9>kT`VgIZBR`0st* zjq}|H!hfy6an?WN2>kct4!{TTUl{gX?f=Ut|JTY{xB&dO#mpCK{44U9D%pkC-}qNQ zZK0Bgsxc^JKCV7Bu^4II+bZ$L(hjEM7&zL-k*rC%iyDA-+cgPSd8s( z5bV_}hMqt~%j!gCo9Y9I+LKxvKva3A*6LRgOlu9~d)g>Mdr^AIsS1d?{aOLgF8o6d zAjUV(DWQ9J? zS%NBR*@q>ld8#(ql{)_pE_IBMTa({<00#*F-AAG-%1C6RSC)^+>2k2;gI-7z{#y*B zwdS%bMDNG>Mp!z3Aocv^37CZc+8DpA;$J{|D^_@a@Rt?qo$%i?*ZZj_wGXRb^Hf__ ze}4=>*}fuPL-?;10PKx_NIm|0a@wz?Y#01Dru<(?Ka(#A|0VplJ+wghZ?2`O^TXa) z8OR206~Mh8P(fx?)Ikb$F&N7K^#-{ec}w}fH1h5IEguN~^%x$170s%rlJH;Z`8#&8 z=Wh=oJ~fvS^m$Ju9@?x*!hcadA?5#uzD)2xZ`Gd$sTFA73H{zQPbK_U7l5pj6~bGf zZoky+!6fG9(zEOE-_x^xi@&lx{u>1zyBT=JBh0;ehM`TH!Qf`IUT008a_D-~dmX+; z_%GqVg#XS4k;jCsOr3w9pE~#bBK(&_;=JYFlhKl5%Kv==L_#CGbp}86f1v&kDV&v| zen2P6S#6QATAQ+^X0q!`cD1LH@L$4z3IF9Pv|U&CI!uT1fA=AJ>i;kx{5L-f2CDuj z|MzZ-XV%pWncX`E^Uq+5$WVkSZ-IOD-!0d7U-AyV+_~jg4}4nfg>*&TejSGDjC?g6 z{>!6A+Y!(I{W==)aWf-7@&^84C~(Q3%Y_hH{%zaStiR!9gdJ2P5R z0#^2wYIx~*^1%B=ur-`AoZhLW2LDR>A$3C0Vlu1Efi_v^uL0`@e3WZ^@9eYXY@yB)Ht|atBafT|~ zrTO{=x%fAIbK2|Y*Qbx`<>IbK&fC5|afzm|UBrset#Tw3d8^%vMinLxPQ$SYf?hP3 zWVYh)8$fG{(^@4dXN?`FA)@m0+e(p1g7L@Ia$1#SaI?^3ap2Y2gc=I*@8>9g)j}D3f;Xips6wit=lCj?&x}bOT01OfSb2LD3JpRK?f|iLt$KpS%n*YNhkMN(P z_wbY(5&m;cO8F~&u0z@DSIs6Zn$ScDNSl0w)#6BYVZCpAneB>8y-eUWN9A(>86 zk3X(92ce3V!ObEE;R>^T3}~z_FwY^LtAY}O;ZRD-*%+>xw9?Vq(;R!kc}n@J8VUh( zQl3wndakR-k_hKH#r4nMdo=#jCGltf?GEPuDEJR_$xSH#=j6>j;sJ#JXi`Th^Cx%C za+rhgAHsj;YACZQVUF-0s`=Wx+}s4+%MxoSD&aqE(+&v#DfAuTKV0oY+~=sue!_o{ zpcC*u<@tEwhbzQX=ec?`r~MyD_|Fj@e)BB{@t^K(f8+-r#DA3j zKP(EV|Bs}f$rlL!F_#QX{eN~gl_M1_lm%3n`(o}6S3bgi;}!}s>l*!6b4=4F8R$U2 zEE!CrT%h?fZ)Jc92HU+#)BC^9Umyj)6r6@DY6_x;m~fw(S_O;k+9njR8Gl}voCWIt zQ$apNEoB=>2p^56?JqJ`G@Gw(J=K4;WUqq0{je8h1P$^?2F_tMr@guWLkBpI@`7?J zl7n+ONZENtO9A&*Nm_6kO16T^{+`mdw+@RS<~|KUoNs=%lUjPM`D%Im>rEkKPHkVeO>dWmZq&7~*&2jr!ZZVBeR zQNn*(HXQ4{x3LQwqOpqOXOECj#yTaIue4$mm10b&a-q zn2?`>fHKe{Nyw40JYNE@(B!WiGBm(0ZBl*?af;4w6FgJ&)legQg!yR1j)s`rwmrQm zZ2^xp+R6=mN-jL-#{d_#0eg<-q5_T3Y`YOIk|MXkhpL{7j=(9QJw-w&)qipAM)hC$ z;94IVQH+|3nL09@)F()+m~68}c|Q4}=I7c7j@l!3L617V0W{$}Cqn}V@Sl_Ne#Dn+ zjsLJXPJHVBBj{)HH{n0j{|D7QQUB+oE58hQu7v-zo|sYq!Y1u!X|ERrbcFxpZsMu+ zlLokm@SjQ*92RLp)|Z;C68=N@PgU|#{~wsgMfi^h07epy2E}(E0@w_h!TSZqO8tMR z{|`uB?t{XqXpejm{$mmvpl1^Whyp|bq5x5VC_oe-3J?W|0z?6#08xM_KolSf5Cw<= pL;<1zQGh5w6d(!^1&9Jf0ipm=fG9u|APNu#hyp|bqJYB``2V#>R+j(( literal 0 HcmV?d00001 diff --git a/test/fixtures/sync-gzip-fail.tgz b/test/fixtures/sync-gzip-fail.tgz new file mode 100644 index 0000000000000000000000000000000000000000..def1ccfb8dc5ce601c097ff9e8610698b71f7174 GIT binary patch literal 296 zcmb2|=3r=hZ5749{Pxz_EG9z{hlgu^i+pA?w>R&!I~O3Z>#fF7}V zKl$u~-nPYyZycHV`QG(8)8B86377x6>zFIzyF;5uZTO3&Xzx0X8-^3?ak#4 z=~+Q%(@Vat|6=d7^#4jz&1c5De)$7A3xOQYXU0{(`0xDZ7kp8lRsH|j%)j^Re_gI$ z3zYt_hw;pslLu?uuK%rH_Fs_iiTzf!EW5?4|2zCw*7)nc*3)SI#jE?5{}&VjaZKi4 p{Q6t|{{QxlFFrX$>lx6h{C?M{fxTMpfXAA)h3;?Q4p7sC$ literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/bad-cksum.tar b/test/fixtures/tars/bad-cksum.tar new file mode 100644 index 0000000000000000000000000000000000000000..8a6b1f47558f9b21477a37f93690c99ea473a2b1 GIT binary patch literal 3072 zcmeH`O%8-0423yLFQ9qI-+9nr;zpB!N%Z!^$f^g>uxK~UYYDu5p~s$v`6_8FXHgFY z0B&B2vacDJ4?_eIIRc|`C-?7bBUj7ZObt(nYEax$JUiqxM+j4 j;Q->zepT$(nmBubz%KhQ`~Si}lP83L5D)@Fpf3VH&#o~x literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/body-byte-counts.tar b/test/fixtures/tars/body-byte-counts.tar new file mode 100644 index 0000000000000000000000000000000000000000..8cb1edacd69d5f380a38e333da1914d3d9ffecb9 GIT binary patch literal 5120 zcmeHJ+X{m)4E5Qs@CP=MHch|B4TZf-&<@e3(xanJGw&DJD7eoD{*(;dBqp za13K8vMc~#qN)(<*(EDkUsk>uc`CHvjkm;TD?sb5D=NrR&FrVQA=JH;b{XpWJj{X< zSGKk7#Gk)P6S0rjWU}-4M*UHjBA^KD6@k*B$u0j;5`XDGM!kINKLh!w|IDEJzsAVe z>%rH)69Q#-Z4&?U-TsOt{tNx_!+&B&>Hgot;Sj?E(QX!Qf6-|&RB2iJA#E1xRP-0MMk)VpWL=mBl0u6}6K*14y zXMQ001jY%LA{3yBQ35;7c%OG?=h!(4UOn%7CBHh`Yd6}NupSy?Cqjs@ZOcF|h12JR z4b}(|LM5>%Cz46-ID%V*A|r-XAG;7 zEP=~G#m!~8kW`p7o1npZIaqV4IVJA-^J*q>Pt#D$i|_N_VW0A!3nC4Rq^VRQ`=953 z9Dh((pspc0>UIu5-GI6Ubq6W}bq{APP!FIUK|OS%>Pxu9Ww&$KYoFptgz&3zt}{M)aTCQ06VU(Tb~)7l4eb9mM@;ws^q)#4@Mo5H xLO-3!Z=nBA^&cm|r2gB&v2p(6(xJNkryqU8@P6YGeTVjd_JH<)_Q1q>;2reW({=y= literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/file.tar b/test/fixtures/tars/file.tar new file mode 100644 index 0000000000000000000000000000000000000000..36d96afd3434934b1eee0900b68ca845ed7a6003 GIT binary patch literal 2048 zcmeH@OA3H63`BdBTtJ!H-+8JixKXeb^!8S}$^i;4l1-RN2$Q#Ob2r|3?(>yZqXOWq zB~^Ox?&}z;F4kL`v_TkxvEEsNHo<8{Xq1PYJyVWHiMFN~r^H4~l(l7H4j1*2`W!%f U_+J(O8%>f40U;m+gg`?A4>b4~oB#j- literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/global-header.tar b/test/fixtures/tars/global-header.tar new file mode 100644 index 0000000000000000000000000000000000000000..21cf9d3cff4e127d2591d25d49f24853a8039f8c GIT binary patch literal 3072 zcmeH{!3x4K42F01Df$9xvaajNyGLIk)lR*rY#q$EH(OB{VM!pYx8t=<2n~>M&@DQpHE#Xk4VmZ_n`Pdff97CWl=KtfKn^WL@<-T sEcE98+7KO^`40Xjs%k#{;odJKzEmzMMT?py4U-&54kQPX1OIa11-D%)Q2+n{ literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/links-invalid.tar b/test/fixtures/tars/links-invalid.tar new file mode 100644 index 0000000000000000000000000000000000000000..9b76fa4d7292c151a37fee8a7d3e0a4100ca0d59 GIT binary patch literal 3072 zcmeHHQ4WGI4BfY<*ab}5veEM_B4I%=Vfx|i?I21_#2+&f!ur!~UAFeM?=^0yF1~M% zsFE1~l*VW!o=ZD=plL5h00n7<1u(HK2~h!B;23XS$x*W0)IHqXAgTG_+$k*oBiHJB zIUI`04c| zVxj9R@x>uR__XKy*jNYC0Kjb9D^%8W_r5yq8Fj`Ms{_qj|2$U4Z61=wZ~c>AKJ~9S zBmJ`lT*BpaaQ(YyH>rP1TEqzPua)2X-}isWzf`pUrB=ECzVM%LI1kQ$M4EG|+=1MI HKkL8?vuRb4 literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/long-paths.tar b/test/fixtures/tars/long-paths.tar new file mode 100644 index 0000000000000000000000000000000000000000..8bd1c100830b997db1ae436f9cba2a5baf7af2a6 GIT binary patch literal 26624 zcmeI4&2ri>5P&)J6n+7M{sjk4y`(cebf%{s-2@6#0vVtk@<@4^JX7Toz(#m;nx!0~&%Nms6Fvvrz2tS>*%T{f9q{yBR&ckEs+`)tV(9rhW4Eoq9I ztmfBrdp}Me$E!XUI6XlpGmWeEFEu~dzc4DZf6iCPndIGcsa{k}` zFaNKkJotZQ#6SPfHTi!i(~$f4VDJBt@W<~{yb*)6gL)$dDa@^o7&t!mApiev|3WG9 z{~>k^y*9pi`Vygaqx}3QU;(yG||GAXfbP|nM zrK98ViCztp?M$`ZRf0M2MA^s@H3qmjRk2f0(=WpElFydbTg>-U_e=H3E z@E4lwABlKT>~;RnQM>?vzs}ZwQU70Lg>hEKKgLK9z~4~(4}-QZvz-5=b{`PV-!e=6 zzYhzcqzeCKO$`9>cPlce|3|>>iLA!IUQ7_cUmJ@5c&soAs`9TB4+!Qj+#NLk!@%vy ztj-@k8wBtdlKj8N3Zo!|KXio%fWNZT|6}0xWQOsF%?1JdjiC6y#|on$ls_aQ6waT! z4TCiP$KZV`Gn{|;8X*9GN#nm$QaI-j{+qyf0D!+%6#vBmej*jdKWw#l2!9v(OPJf& zOY#2`P)Mgx{^{LjyQx?w$N%d7fA{lY{l8oIm+`ko(Egu_&0FiT^>n$~(B}ABZP@0U z{oPveOUmp&zyF_S`+tfE{box)h(bFR|%&qUTj_focDk0l+60r=-mOl{)7C z+1bCc%*Fp&o&N`9|JAw0x{?pfF8>dxzWr%Gj*5g!@v;DL<&pu_${VER?PUQ7Z}{Ll zg7*Kv`+p{#{kJ;*573@s*>zPp!88FkRILkL*L(}){r@)jsHO~M{$IP)ZiW5-%D7CR zy1%SiU zT-4z0wd}8eGXF1J&hNed-~IoirFHTDR?q*TKpMW!@_N(%9evNWYT*+07ANB_r;Dzh z#8(b)HYH!98UVHba;rbSMw$IHCQj^MD(2Szx7z<7U;jgYdwc!R)uYN$3s4JC3s4In GwZLCSW^b|p literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/long-pax.tar b/test/fixtures/tars/long-pax.tar new file mode 100644 index 0000000000000000000000000000000000000000..2da42706ae620447e6bf4edfa376d318690060a4 GIT binary patch literal 3072 zcmeHJy>f#v4EF4&&#B0TOKe%f zcio)8`V4#x=h6;P*^_JGt3G-^fCWA;*w;MTY_~dW_u-Y^h1|iR$P$H;LO6^dl}vqE zDuk*lSR}KfccWFPBq?Z%A66lo6ZGsDB1wv%pFHP|FQ24QuN3A3+WrFmBNBfO{@_0_ d{wo~|z?E{oTK2{9e*vBEGJRF=P54(8_yxeOS~may literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/next-file-has-long.tar b/test/fixtures/tars/next-file-has-long.tar new file mode 100644 index 0000000000000000000000000000000000000000..632720f1cced31eab03c5773fca81763d7be2326 GIT binary patch literal 4608 zcmeH~|4PF!5XbWe%J`i8y!7~#%%arflKi5|_`Jm2)cEquk_@1Vocxmb{IvMw zjKreE*+iA0OQ;zGcTJ)ZUsfKnTZJ~ z-a!DJ1||w4m>5Lf(9q1lm_fmZM(#l|78d_S`S~R%5@;Mk@@UG33b%x!{EuCCNqSX$ zT4oOJazhWOVyFbrFn1^R7$mm*$F3Va{y~}A%nY3Wv6lbFhREf=A%lUjsi~)1p!Pq*_evb=`%Nipzq{6GahWcu6SIG( zfA;RH|ACu~{wp3^TXQPbx{p!%a@@)Nwx{n;*%j*g^T}=hf0h5L=bNqn$BY~X4W)c6 zO(D}5G>`>H*`pya8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? l8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Au#en003Z>3c&yX literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/path-missing.tar b/test/fixtures/tars/path-missing.tar new file mode 100644 index 0000000000000000000000000000000000000000..00e2901c45c3d7e9378f230cf7d3f99606061dc8 GIT binary patch literal 2048 zcmeH@OAf#w2t+xGM*u}V4{2i3ZE5dctZR35VZv-Cd=iESuwIB*m;;#Cl0U~dYHOJ& z041!kCN7x)iBd+}TOSSJ(OWKycB;ss^NY6D+I-xfGmYoEZz9xPQVE`fqx0S DJkb-B literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/trailing-slash-corner-case.tar b/test/fixtures/tars/trailing-slash-corner-case.tar new file mode 100644 index 0000000000000000000000000000000000000000..5f26213079d18296e991702b3b3be7fd22108293 GIT binary patch literal 10240 zcmeH~-EM*~7>0Z7Rdg3n>>m=&mYppj+sSUAN);lO1xqG(zoL=&vlxw|@#p(aN=u>i zdHLG6aZJXI)g;X;qZXP>{y&D)MHGf;U5+*-<#Jtb+gu2Um_FtfkMVum> z^z=P@ukG|NOS^aDpz@PxT^zJMKsEM||BBeEE*essqMpnfGR+H3#=0p@N|>OV1?XGZ zj1=0;Y!=wnNhuxx`^`+jhyJ_yA04m%jE??T{{_O-2c<6mpL6|x(^*-hFZdm+1ytEP2NARKl1^$mq;m&{V{4Y89zcVGgsvG#fXSQ<}&mH{VRoMm)0|6ia f1b_e#00KY&2mk>f00e*l5C8%|00;m9zXW~(!M!ak literal 0 HcmV?d00001 diff --git a/test/fixtures/tars/utf8.tar b/test/fixtures/tars/utf8.tar new file mode 100644 index 0000000000000000000000000000000000000000..ab63bc72cab9675679d44a873e0da5fc265902a1 GIT binary patch literal 7168 zcmeHL&5qMB5bilokr&wY*pBVykQ0|h;;<4Yj?p${D@t3n0hKEfoL2maLxsF5Tv!z- zaNwuB#6HBl!0sd9G_>6%f`nFvPfjPh=`gKXxBx%~ zfnPJDl43pr%Vnbipi=sjgJOyYz@-mVfCy^-(868{F7FM}xNo-B8pQFzpzwI9Fw2_F zrBs~E-vsiP12b;PMTOss)59o_zQ@2nNLzQ4hz2382b==Sbn!)<5_OMp|K_#5>o;!g zHj?`hl}ahbz+-HoZgsj*Sm%;a<0^oAy}00?$z6ulxsKzwzJv z89>d4l?!{bE6)GZi9KkY=l>sp{bl|?A0LhFQ~+iCrwSJQ7eewZ{|jmO@AAL>?}w^9 z|1Y9nr~pDC3l%^Z^6C|UqS93W_5-=*FD&A|rgM81v`05z-C)A%&e?|Qb^>@@W)Iad}Ax@v;^aYL{;pj2y zH#jneU*;a(8u4uQ^nCo%SQ?d?9ldrn|AvvWW8Us|Ztr9rAnB8Y#H4NR2V{pdjFga` znKen*=rXx)q@G!ml0&kp8_GL~GX68M>i-oeADG~Zx%_V@;+MTDn&8}QIo4VNQjN7^jz)%H}z|BL;9&VO?bC|&-qhVEvoT>rlre$Lt<;1F;KY%2mk E0U~{M{{R30 literal 0 HcmV?d00001 diff --git a/test/fixtures/test.js b/test/fixtures/test.js new file mode 100644 index 0000000..e1a34da --- /dev/null +++ b/test/fixtures/test.js @@ -0,0 +1,20 @@ +const platform = process.platform === 'win32' ? 'win32' : 'posix' +const {spawn} = require('child_process') +const c = spawn(process.execPath, [ + process.env.npm_execpath, + 'run', + `test:${platform}`, + '--', + ...process.argv.slice(2), +], { + stdio: 'inherit', +}) +c.on('close', (code, signal) => { + process.exitCode = code + if (signal) { + process.kill(process.pid, signal) + setTimeout(() => {}, 200) + } +}) +process.on('SIGTERM', () => c.kill('SIGTERM')) +process.on('SIGINT', () => c.kill('SIGINT')) diff --git a/test/get-write-flag.js b/test/get-write-flag.js new file mode 100644 index 0000000..e527fe4 --- /dev/null +++ b/test/get-write-flag.js @@ -0,0 +1,64 @@ +const t = require('tap') + +// run three scenarios +// unix (no fmap) +// win32 (without fmap support) +// win32 (with fmap support) + +const fs = require('fs') +const hasFmap = !!fs.constants.UV_FS_O_FILEMAP +const platform = process.platform +const UV_FS_O_FILEMAP = 0x20000000 + +switch (process.argv[2]) { + case 'win32-fmap': { + if (!hasFmap) { + global.__FAKE_TESTING_FS__ = { + constants: { + ...fs.constants, + ...{ UV_FS_O_FILEMAP }, + }, + } + } + const { O_CREAT, O_TRUNC, O_WRONLY } = fs.constants + if (platform !== 'win32') + process.env.__FAKE_PLATFORM__ = 'win32' + const getFlag = require('../lib/get-write-flag.js') + t.equal(getFlag(1), UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY) + t.equal(getFlag(512 * 1024 + 1), 'w') + break + } + + case 'win32-nofmap': { + if (hasFmap) { + global.__FAKE_TESTING_FS__ = { + constants: { + ...fs.constants, + ...{ UV_FS_O_FILEMAP: 0 }, + }, + } + } + if (platform !== 'win32') + process.env.__FAKE_PLATFORM__ = 'win32' + const getFlag = require('../lib/get-write-flag.js') + t.equal(getFlag(1), 'w') + t.equal(getFlag(512 * 1024 + 1), 'w') + break + } + + case 'unix': { + if (platform === 'win32') + process.env.__FAKE_PLATFORM__ = 'darwin' + const getFlag = require('../lib/get-write-flag.js') + t.equal(getFlag(1), 'w') + t.equal(getFlag(512 * 1024 + 1), 'w') + break + } + + default: { + const node = process.execPath + t.spawn(node, [__filename, 'win32-fmap']) + t.spawn(node, [__filename, 'win32-nofmap']) + t.spawn(node, [__filename, 'unix']) + } +} diff --git a/test/header.js b/test/header.js new file mode 100644 index 0000000..1a17eb8 --- /dev/null +++ b/test/header.js @@ -0,0 +1,614 @@ +'use strict' +const t = require('tap') +const Header = require('../lib/header.js') + +t.test('ustar format', t => { + const buf = Buffer.from( + '666f6f2e74787400000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003035373736312000303030303234200037373737' + + '3737373737373700313236373735363735343000303133303531200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + + const h = new Header({ + path: 'foo.txt', + }) + const slab = Buffer.alloc(1024) + h.set({ + mode: 0o755, + uid: 24561, + gid: 20, + size: 0o77777777777, + mtime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + }) + h.encode(slab) + + t.equal(slab.slice(0, 512).toString('hex'), buf.toString('hex')) + t.equal(slab.toString('hex'), buf.toString('hex') + + (new Array(1025).join('0'))) + + const h2 = new Header(buf) + + t.match(h2, { + path: 'foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 0o77777777777, + ctime: null, + atime: null, + uname: 'isaacs', + gname: 'staff', + cksumValid: true, + cksum: 5673, + }) + + t.end() +}) + +t.test('xstar format', t => { + const buf = Buffer.from( + '666f6f2e74787400000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003035373736312000303030303234200030303030' + + '3030303134342000313236373735363735343000303135313331200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000031323637' + + '3735363735343000313236373735363735343000000000000000000000000000' + + // just some junk + '420420420420420420420420420420420420420420420420420420420420', + 'hex') + + const h = new Header({ + path: 'foo.txt', + }) + + h.set({ + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + }) + h.encode() + const slab = h.block + + t.equal(slab.toString('hex'), buf.slice(0, 512).toString('hex')) + + const h2 = new Header(buf) + + t.match(h2, { + path: 'foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + cksumValid: true, + cksum: 6745, + }) + + t.end() +}) + +t.test('prefix handling', t => { + t.plan(4) + + t.test('no times', t => { + const buf = Buffer.from( + '666f6f2e74787400000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003035373736312000303030303234200030303030' + + '3030303134342000313236373735363735343000303337323734200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '00000000000000000030303030303020003030303030302000722f652f612f6c' + + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d' + + '2f702f612f742f68000000000000000000000000000000000000000000000000', + 'hex') + + const h = new Header({ + path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: null, + atime: undefined, + type: '0', + uname: 'isaacs', + gname: 'staff', + }) + const b2 = Buffer.alloc(512) + h.encode(b2, 0) + + t.equal(b2.toString().replace(/\0+/g, ' '), + buf.toString().replace(/\0+/g, ' ')) + t.equal(b2.toString('hex'), buf.toString('hex')) + + const h2 = new Header(buf) + + t.match(h2, { + path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: null, + atime: null, + type: 'File', + uname: 'isaacs', + gname: 'staff', + cksumValid: true, + cksum: 16060, + needPax: false, + }) + + t.equal(b2.toString().replace(/\0.*$/, ''), 'foo.txt') + t.equal(b2.slice(345).toString().replace(/\0.*$/, ''), 'r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/d/e/e/p/-/p/a/t/h') + + t.end() + }) + + t.test('a/c times, use shorter prefix field', t => { + const buf = Buffer.from( + '652f702f2d2f702f612f742f682f666f6f2e7478740000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003035373736312000303030303234200030303030' + + '3030303134342000313236373735363735343000303431353030200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '00000000000000000030303030303020003030303030302000722f652f612f6c' + + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f65000031323637' + + '3735363735343000313236373735363735343000000000000000000000000000', + 'hex') + + const h = new Header() + h.path = 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt' + h.mode = 0o755 + h.uid = 24561 + h.gid = 20 + h.size = 100 + h.mtime = new Date('2016-04-01T22:00Z') + h.ctime = new Date('2016-04-01T22:00Z') + h.atime = new Date('2016-04-01T22:00Z') + h.type = 'File' + h.uname = 'isaacs' + h.gname = 'staff' + const b2 = Buffer.alloc(512) + h.encode(b2, 0) + + t.equal(b2.toString('hex'), buf.toString('hex')) + + const b3 = Buffer.alloc(1024) + h.encode(b3, 100) + t.equal(b2.toString('hex'), b3.slice(100, 612).toString('hex')) + + const h2 = new Header(b3, 100) + + t.match(h2, { + path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + cksumValid: true, + cksum: 17216, + needPax: false, + }, 'header from buffer') + + t.equal(b2.toString().replace(/\0.*$/, ''), 'e/p/-/p/a/t/h/foo.txt') + t.equal(b2.slice(345).toString().replace(/\0.*$/, ''), 'r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-' + + '/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e') + + t.end() + }) + + t.test('hella long basename', t => { + const buf = Buffer.from( + '6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f' + + '6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e67' + + '2d66696c652d6c6f6e672d66696c652d6c6f6e672d66696c652d6c6f6e672d66' + + '696c650030303037353520003035373736312000303030303234200030303030' + + '3030303134342000313236373735363735343000303630313431200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '00000000000000000030303030303020003030303030302000722f652f612f6c' + + '2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f79' + + '2f2d2f722f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f72' + + '2f652f612f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f722f652f61' + + '2f6c2f6c2f792f2d2f722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d' + + '2f702f612f742f68000000000000000000000000000000000000000000000000', + 'hex') + const h = new Header({ + path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/' + + (new Array(20).join('long-file-')) + 'long-file.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: null, + atime: undefined, + type: '0', + uname: 'isaacs', + gname: 'staff', + }) + const b2 = Buffer.alloc(513) + h.encode(b2, 1) + + t.equal(b2.toString('hex'), '00' + buf.toString('hex')) + t.ok(h.needPax, 'need pax because long filename') + + const h2 = new Header(b2, 1) + + t.match(h2, { + cksumValid: true, + cksum: 24673, + path: 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/r/e/a/l/l/y/-/' + + 'r/e/a/l/l/y/-/d/e/e/p/-/p/a/t/h/long-file-long-file-long-' + + 'file-long-file-long-file-long-file-long-file-long-file-long-' + + 'file-long-file', + needPax: false, + }) + + t.end() + }) + + t.test('long basename, long dirname', t => { + const buf = Buffer.from( + '6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d64' + + '69726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d65' + + '2d6c6f6e672d6469726e616d652d6c6f6e672d6469726e616d652d6c6f6e672d' + + '6469720030303037353520003035373736312000303030303234200030303030' + + '3030303134342000313236373735363735343000303334323035200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + + const h = new Header({ + path: (new Array(30).join('long-dirname-')) + 'long-dirname/' + + (new Array(20).join('long-file-')) + 'long-file.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: null, + atime: undefined, + type: '0', + uname: 'isaacs', + gname: 'staff', + }) + const b2 = Buffer.alloc(512) + h.encode(b2, 0) + + t.equal(h.type, 'File') + t.equal(h.typeKey, '0') + + t.equal(b2.toString('hex'), buf.toString('hex')) + t.equal(h.cksum, 14469) + t.ok(h.needPax, 'need pax because long filename') + + const h2 = new Header(b2) + + t.match(h2, { + path: 'long-dirname-long-dirname-long-dirname-long-dirname-' + + 'long-dirname-long-dirname-long-dirname-long-dir', + cksum: 14469, + cksumValid: true, + needPax: false, + }) + + t.end() + }) +}) + +t.test('throwers', t => { + t.throws(_ => new Header(Buffer.alloc(100)), + new Error('need 512 bytes for header')) + + t.throws(_ => new Header({}).encode(Buffer.alloc(100)), + new Error('need 512 bytes for header')) + + t.end() +}) + +t.test('null block', t => { + const h = new Header(Buffer.alloc(512)) + t.match(h, { + cksumValid: false, + needPax: false, + path: '', + type: 'File', + mode: null, + uid: null, + gid: null, + size: null, + mtime: null, + cksum: null, + linkpath: '', + uname: null, + gname: null, + devmaj: 0, + devmin: 0, + atime: null, + ctime: null, + nullBlock: true, + }) + t.end() +}) + +t.test('unknown type', t => { + const h = new Header(Buffer.from( + '666f6f2e74787400000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003035373736312000303030303234200030303030' + + '303030313434200031323637373536373534300030303630373620005a000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex')) + + t.equal(h.type, 'Z') + t.equal(h.typeKey, 'Z') + t.end() +}) + +t.test('dir as file with trailing /', t => { + const b = Buffer.from( + '782f792f00000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000030303030' + + '3030303030302000000000000000000000000000303034363136200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030300000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + const h = new Header(b) + t.equal(h.type, 'Directory') + b[156] = '0'.charCodeAt(0) + const h2 = new Header(b) + t.equal(h2.type, 'Directory') + t.end() +}) + +t.test('null numeric values do not get written', t => { + const b = Buffer.alloc(512) + const h = new Header() + h.encode(b, 0) + t.equal( + b.toString('hex'), + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000303033303737200030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030300000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000') + const h2 = new Header(b) + t.match(h2, { + type: 'File', + cksumValid: true, + needPax: false, + nullBlock: false, + path: '', + mode: null, + uid: null, + gid: null, + size: null, + mtime: null, + cksum: 1599, + linkpath: '', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + atime: null, + ctime: null, + }) + t.end() +}) + +t.test('big numbers', t => { + const b = Buffer.alloc(512) + const h = new Header({ + path: 'bignum', + size: 0o77777777777 + 1, + }) + h.encode(b, 0) + const h2 = new Header(b) + t.equal(h2.size, 0o77777777777 + 1) + t.end() +}) + +t.test('dir with long body', t => { + const b = Buffer.from( + '7061636b6167652f76656e646f72000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303037353520003030303030302000303030303030200030303030' + + '3030313030303020313330363133303232343120303132303236200035000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030300000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + const h = new Header(b) + t.equal(h.type, 'Directory') + t.equal(h.size, 0) + t.end() +}) + +t.test('null block, global extended header', t => { + const h = new Header(Buffer.alloc(512), 0, { + undef: undefined, + blerg: 'bloo', + }, { + path: '/global.path', + foo: 'global foo', + }) + t.match(h, { + cksumValid: false, + needPax: false, + path: '', + type: 'File', + mode: null, + uid: null, + gid: null, + size: null, + mtime: null, + cksum: null, + linkpath: '', + uname: null, + gname: null, + devmaj: 0, + devmin: 0, + atime: null, + ctime: null, + nullBlock: true, + blerg: 'bloo', + foo: 'global foo', + }) + t.end() +}) + +t.test('gnutar-generated 10gb file size', t => { + const b = Buffer.from( + '313067622e696d67000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303030363634003030303137353000303030313735300080000000' + + '0000000280000000313334373434303132303500303131313437002030000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461722020006973616163730000000000000000000000000000000000' + + '0000000000000000006973616163730000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', 'hex') + const h = new Header(b) + t.equal(h.size, 1024 * 1024 * 1024 * 10, 'should be 10gb file') + t.end() +}) diff --git a/test/high-level-opt.js b/test/high-level-opt.js new file mode 100644 index 0000000..7a82ef3 --- /dev/null +++ b/test/high-level-opt.js @@ -0,0 +1,42 @@ +'use strict' + +const t = require('tap') +const hlo = require('../lib/high-level-opt.js') + +t.same(hlo(), {}) + +t.same(hlo({ + C: 'dir', + f: 'file', + z: 'zip', + P: 'preserve', + U: 'unlink', + 'strip-components': 99, + foo: 'bar', +}), { + cwd: 'dir', + file: 'file', + gzip: 'zip', + preservePaths: 'preserve', + unlink: 'unlink', + strip: 99, + foo: 'bar', +}) + +t.same(hlo({ + C: 'dir', + f: 'file', + z: 'zip', + P: 'preserve', + U: 'unlink', + stripComponents: 99, + foo: 'bar', +}), { + cwd: 'dir', + file: 'file', + gzip: 'zip', + preservePaths: 'preserve', + unlink: 'unlink', + strip: 99, + foo: 'bar', +}) diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000..548a1de --- /dev/null +++ b/test/index.js @@ -0,0 +1,73 @@ +const t = require('tap') +const tar = require('../') +t.match(tar, { + create: Function, + c: Function, + replace: Function, + r: Function, + list: Function, + t: Function, + update: Function, + u: Function, + extract: Function, + x: Function, + Pack: Function, + Unpack: Function, + Parse: Function, + ReadEntry: Function, + WriteEntry: Function, + Header: Function, + Pax: Function, + types: { + name: new Map([ + ['0', 'File'], + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + ['7', 'ContiguousFile'], + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + ['A', 'SolarisACL'], + ['D', 'GNUDumpDir'], + ['I', 'Inode'], + ['K', 'NextFileHasLongLinkpath'], + ['L', 'NextFileHasLongPath'], + ['M', 'ContinuationFile'], + ['N', 'OldGnuLongPath'], + ['S', 'SparseFile'], + ['V', 'TapeVolumeHeader'], + ['X', 'OldExtendedHeader'], + ]), + code: new Map([ + ['File', '0'], + ['OldFile', ''], + ['Link', '1'], + ['SymbolicLink', '2'], + ['CharacterDevice', '3'], + ['BlockDevice', '4'], + ['Directory', '5'], + ['FIFO', '6'], + ['ContiguousFile', '7'], + ['GlobalExtendedHeader', 'g'], + ['ExtendedHeader', 'x'], + ['SolarisACL', 'A'], + ['GNUDumpDir', 'D'], + ['Inode', 'I'], + ['NextFileHasLongLinkpath', 'K'], + ['NextFileHasLongPath', 'L'], + ['ContinuationFile', 'M'], + ['OldGnuLongPath', 'N'], + ['SparseFile', 'S'], + ['TapeVolumeHeader', 'V'], + ['OldExtendedHeader', 'X'], + ]), + }, +}) +t.match(tar.Pack.Sync, Function) +t.match(tar.WriteEntry.Sync, Function) +t.match(tar.WriteEntry.Tar, Function) +t.match(tar.Pax.parse, Function) diff --git a/test/large-numbers.js b/test/large-numbers.js new file mode 100644 index 0000000..055493e --- /dev/null +++ b/test/large-numbers.js @@ -0,0 +1,85 @@ +'use strict' +const large = require('../lib/large-numbers.js') +const encode = large.encode +const parse = large.parse +const t = require('tap') + +t.test('parse', t => { + const cases = new Map([ + ['ffffffffffffffffffffffff', -1], + ['800000000000100000000020', 17592186044448], + ['fffffffffffffffe1ecc8020', -8073215968], + ['fffffffffffffff000000020', -68719476704], + ['80000000001fffffffffffff', 9007199254740991], // MAX_SAFE_INTEGER + ['ffffffffffe0000000000001', -9007199254740991], // MIN_SAFE_INTEGER + ['800000000000100000000000', 17592186044416], + ['fffffffffffffffe1ecc8000', -8073216000], + ['fffffffffffffff000000000', -68719476736], + ['800000000000000353b66200', 14289363456], + ]) + t.plan(cases.size) + cases.forEach((value, hex) => + t.equal(parse(Buffer.from(hex, 'hex')), value)) +}) + +t.test('parse out of range', t => { + const cases = [ + '800000030000000000000000', + '800000000020000000000000', // MAX_SAFE_INTEGER + 1 + 'ffffffffffe0000000000000', // MIN_SAFE_INTEGER - 1 + 'fffffffffdd0000000000000', + ] + t.plan(cases.length) + cases.forEach((hex) => + t.throws(_ => parse(Buffer.from(hex, 'hex')), + Error('parsed number outside of javascript safe integer range'))) +}) + +t.test('parse invalid base256 encoding', t => { + const cases = [ + '313233343536373131', // octal encoded + '700000030000000000000000', // does not start with 0x80 or 0xff + ] + t.plan(cases.length) + cases.forEach((hex) => + t.throws(_ => parse(Buffer.from(hex, 'hex')), + Error('invalid base256 encoding'))) +}) + +t.test('encode', t => { + const cases = new Map([ + ['ffffffffffffffffffffffff', -1], + ['800000000000100000000020', 17592186044448], + ['800000000000100000000000', 17592186044416], + ['fffffffffffffffe1ecc8020', -8073215968], + ['fffffffffffffff000000020', -68719476704], + ['fffffffffffffff000000000', -68719476736], // Allows us to test the case where there's a trailing 00 + ['80000000001fffffffffffff', 9007199254740991], // MAX_SAFE_INTEGER + ['ffffffffffe0000000000001', -9007199254740991], // MIN_SAFE_INTEGER + ]) + t.plan(2) + t.test('alloc', t => { + t.plan(cases.size) + cases.forEach((value, hex) => + t.equal(encode(value, Buffer.alloc(12)).toString('hex'), hex)) + }) + t.test('allocUnsafe', t => { + t.plan(cases.size) + cases.forEach((value, hex) => + t.equal(encode(value, Buffer.allocUnsafe(12)).toString('hex'), hex)) + }) +}) + +t.test('encode unsafe numbers', t => { + const cases = [ + Number.MAX_VALUE, + Number.MAX_SAFE_INTEGER + 1, + Number.MIN_SAFE_INTEGER - 1, + Number.MIN_VALUE, + ] + + t.plan(cases.length) + cases.forEach((value) => + t.throws(_ => encode(value), + Error('cannot encode number outside of javascript safe integer range'))) +}) diff --git a/test/list.js b/test/list.js new file mode 100644 index 0000000..33c03d7 --- /dev/null +++ b/test/list.js @@ -0,0 +1,228 @@ +'use strict' +const t = require('tap') +const list = require('../lib/list.js') +const path = require('path') +const fs = require('fs') +const mutateFS = require('mutate-fs') + +t.test('basic', t => { + const file = path.resolve(__dirname, 'fixtures/tars/long-paths.tar') + const expect = require('./fixtures/parse/long-paths.json').filter( + e => Array.isArray(e) && e[0] === 'entry' + ).map(e => e[1].path) + + const check = (actual, t) => { + t.same(actual, expect) + return Promise.resolve(null) + } + + ;[1000, null].forEach(maxReadSize => { + t.test('file maxReadSize=' + maxReadSize, t => { + t.test('sync', t => { + const actual = [] + const onentry = entry => actual.push(entry.path) + list({ + file: file, + sync: true, + onentry: onentry, + maxReadSize: maxReadSize, + }) + return check(actual, t) + }) + + t.test('async promise', t => { + const actual = [] + const onentry = entry => actual.push(entry.path) + return list({ + file: file, + onentry: onentry, + maxReadSize: maxReadSize, + }).then(_ => check(actual, t)) + }) + + t.test('async cb', t => { + const actual = [] + const onentry = entry => actual.push(entry.path) + list({ + file: file, + onentry: onentry, + maxReadSize: maxReadSize, + }, er => { + if (er) + throw er + check(actual, t) + t.end() + }) + }) + t.end() + }) + }) + + t.test('stream', t => { + t.test('sync', t => { + const actual = [] + const onentry = entry => actual.push(entry.path) + const l = list({ sync: true, onentry: onentry }) + l.end(fs.readFileSync(file)) + return check(actual, t) + }) + + t.test('async', t => { + const actual = [] + const onentry = entry => actual.push(entry.path) + const l = list() + l.on('entry', onentry) + l.on('end', _ => check(actual, t).then(_ => t.end())) + fs.createReadStream(file).pipe(l) + }) + t.end() + }) + + t.test('no onentry function', t => list({ file: file })) + + t.test('limit to specific files', t => { + const fileList = [ + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', + '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc///', + ] + + const expect = [ + '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + ] + + t.test('no filter function', t => { + const check = _ => t.same(actual, expect) + const actual = [] + return list({ + file: file, + onentry: entry => actual.push(entry.path), + }, fileList).then(check) + }) + + t.test('no filter function, stream', t => { + const check = _ => t.same(actual, expect) + const actual = [] + const onentry = entry => actual.push(entry.path) + fs.createReadStream(file).pipe(list(fileList) + .on('entry', onentry) + .on('end', _ => { + check() + t.end() + })) + }) + + t.test('filter function', t => { + const check = _ => t.same(actual, expect.slice(0, 1)) + const actual = [] + return list({ + file: file, + filter: path => path === expect[0], + onentry: entry => actual.push(entry.path), + }, fileList).then(check) + }) + + return t.test('list is unmunged', t => { + t.same(fileList, [ + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t', + '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc///', + ]) + t.end() + }) + }) + + t.end() +}) + +t.test('bad args', t => { + t.throws(_ => list({ file: __filename, sync: true }, _ => _), + new TypeError('callback not supported for sync tar functions')) + t.throws(_ => list(_ => _), + new TypeError('callback only supported with file option')) + t.end() +}) + +t.test('stat fails', t => { + const poop = new Error('poop') + t.teardown(mutateFS.statFail(poop)) + t.test('sync', t => { + t.plan(1) + t.throws(_ => list({ file: __filename, sync: true }), poop) + }) + t.test('cb', t => { + t.plan(1) + list({ file: __filename }, er => t.equal(er, poop)) + }) + t.test('promise', t => { + t.plan(1) + list({ file: __filename }).catch(er => t.equal(er, poop)) + }) + t.end() +}) + +t.test('read fail', t => { + t.test('sync', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + t.plan(1) + t.throws(_ => list({ + file: __filename, + sync: true, + maxReadSize: 10, + }), poop) + }) + t.test('cb', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + t.plan(1) + list({ file: __filename }, er => t.equal(er, poop)) + }) + t.test('promise', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + t.plan(1) + list({ file: __filename }).catch(er => t.equal(er, poop)) + }) + t.end() +}) + +t.test('noResume option', t => { + const file = path.resolve(__dirname, 'fixtures/tars/file.tar') + t.test('sync', t => { + let e + list({ + file: file, + onentry: entry => { + e = entry + process.nextTick(_ => { + t.notOk(entry.flowing) + entry.resume() + }) + }, + sync: true, + noResume: true, + }) + t.ok(e) + t.notOk(e.flowing) + e.on('end', _ => t.end()) + }) + + t.test('async', t => list({ + file: file, + onentry: entry => { + process.nextTick(_ => { + t.notOk(entry.flowing) + entry.resume() + }) + }, + noResume: true, + })) + + t.end() +}) diff --git a/test/load-all.js b/test/load-all.js new file mode 100644 index 0000000..524a3f4 --- /dev/null +++ b/test/load-all.js @@ -0,0 +1,10 @@ +'use strict' +// just load all the files so we can't cheat coverage by avoiding something +require('../') +const fs = require('fs') +const path = require('path') +const lib = path.resolve(__dirname, '../lib') +fs.readdirSync(lib) + .filter(f => /\.js$/.test(f)) + .forEach(f => require('../lib/' + f)) +require('tap').pass('all lib files loaded') diff --git a/test/make-tar.js b/test/make-tar.js new file mode 100644 index 0000000..33de124 --- /dev/null +++ b/test/make-tar.js @@ -0,0 +1,25 @@ +'use strict' +// a little utility to create virtual tar data +if (module === require.main) + return require('tap').pass('this is fine') + +const Header = require('../lib/header.js') +module.exports = chunks => { + let dataLen = 0 + return Buffer.concat(chunks.map(chunk => { + if (Buffer.isBuffer(chunk)) { + dataLen += chunk.length + return chunk + } + const size = Math.max(typeof chunk === 'string' + ? 512 * Math.ceil(chunk.length / 512) + : 512) + dataLen += size + const buf = Buffer.alloc(size) + if (typeof chunk === 'string') + buf.write(chunk) + else + new Header(chunk).encode(buf, 0) + return buf + }), dataLen) +} diff --git a/test/map.js b/test/map.js new file mode 100644 index 0000000..fcd4e47 --- /dev/null +++ b/test/map.js @@ -0,0 +1,7 @@ +const t = require('tap') +const map = require('../map.js') +t.equal(map('test/index.js'), 'index.js') +t.same(map('test/unpack.js'), ['lib/unpack.js', 'lib/mkdir.js']) +t.same(map('test/load-all.js'), []) +t.equal(map(__filename), 'map.js') +t.equal(map('test/asdf'), 'lib/asdf') diff --git a/test/mode-fix.js b/test/mode-fix.js new file mode 100644 index 0000000..779124b --- /dev/null +++ b/test/mode-fix.js @@ -0,0 +1,16 @@ +'use strict' +const t = require('tap') +const mf = require('../lib/mode-fix.js') + +t.equal(mf(0o10644, false), 0o644) +t.equal(mf(0o10644, true), 0o755) +t.equal(mf(0o10604, true), 0o705) +t.equal(mf(0o10600, true), 0o700) +t.equal(mf(0o10066, true), 0o077) + +t.equal(mf(0o10664, false, true), 0o644) +t.equal(mf(0o10066, false, true), 0o644) +t.equal(mf(0o10666, true, true), 0o755) +t.equal(mf(0o10604, true, true), 0o705) +t.equal(mf(0o10600, true, true), 0o700) +t.equal(mf(0o10066, true, true), 0o755) diff --git a/test/normalize-unicode.js b/test/normalize-unicode.js new file mode 100644 index 0000000..c5d8be0 --- /dev/null +++ b/test/normalize-unicode.js @@ -0,0 +1,12 @@ +const t = require('tap') +const normalize = require('../lib/normalize-unicode.js') + +// café +const cafe1 = Buffer.from([0x63, 0x61, 0x66, 0xc3, 0xa9]).toString() + +// cafe with a ` +const cafe2 = Buffer.from([0x63, 0x61, 0x66, 0x65, 0xcc, 0x81]).toString() + +t.equal(normalize(cafe1), normalize(cafe2), 'matching unicodes') +t.equal(normalize(cafe1), normalize(cafe2), 'cached') +t.equal(normalize('foo'), 'foo', 'non-unicdoe string') diff --git a/test/normalize-windows-path.js b/test/normalize-windows-path.js new file mode 100644 index 0000000..3081fa0 --- /dev/null +++ b/test/normalize-windows-path.js @@ -0,0 +1,26 @@ +const t = require('tap') + +const realPlatform = process.platform +const fakePlatform = realPlatform === 'win32' ? 'posix' : 'win32' + +t.test('posix', t => { + if (realPlatform === 'win32') + process.env.TESTING_TAR_FAKE_PLATFORM = fakePlatform + else + delete process.env.TESTING_TAR_FAKE_PLATFORM + const normPath = t.mock('../lib/normalize-windows-path.js') + t.equal(normPath('/some/path/back\\slashes'), '/some/path/back\\slashes') + t.equal(normPath('c:\\foo\\bar'), 'c:\\foo\\bar') + t.end() +}) + +t.test('win32', t => { + if (realPlatform !== 'win32') + process.env.TESTING_TAR_FAKE_PLATFORM = fakePlatform + else + delete process.env.TESTING_TAR_FAKE_PLATFORM + const normPath = t.mock('../lib/normalize-windows-path.js') + t.equal(normPath('/some/path/back\\slashes'), '/some/path/back/slashes') + t.equal(normPath('c:\\foo\\bar'), 'c:/foo/bar') + t.end() +}) diff --git a/test/pack.js b/test/pack.js new file mode 100644 index 0000000..2df2961 --- /dev/null +++ b/test/pack.js @@ -0,0 +1,1161 @@ +'use strict' +const t = require('tap') +const Pack = require('../lib/pack.js') +const PackSync = Pack.Sync +const fs = require('fs') +const path = require('path') +const fixtures = path.resolve(__dirname, 'fixtures') +const files = path.resolve(fixtures, 'files') +const tars = path.resolve(fixtures, 'tars') +const chmodr = require('chmodr') +const Header = require('../lib/header.js') +const zlib = require('zlib') +const miniz = require('minizlib') +const mutateFS = require('mutate-fs') +const MiniPass = require('minipass') +process.env.USER = 'isaacs' +const EE = require('events').EventEmitter +const rimraf = require('rimraf') +const mkdirp = require('mkdirp') +const ReadEntry = require('../lib/read-entry.js') +const isWindows = process.platform === 'win32' +const normPath = require('../lib/normalize-windows-path.js') + +const ctime = new Date('2017-05-10T01:03:12.000Z') +const atime = new Date('2017-04-17T00:00:00.000Z') +const mtime = new Date('2016-04-01T19:00:00.000Z') + +t.teardown(mutateFS.statMutate((er, st) => { + if (st) { + st.ctime = ctime + st.atime = atime + st.mtime = mtime + } +})) + +t.test('set up', t => { + const one = fs.statSync(files + '/hardlink-1') + const two = fs.statSync(files + '/hardlink-2') + if (one.dev !== two.dev || one.ino !== two.ino) { + try { + fs.unlinkSync(files + '/hardlink-2') + } catch (e) {} + fs.linkSync(files + '/hardlink-1', files + '/hardlink-2') + } + chmodr.sync(files, 0o644) + t.end() +}) + +t.test('pack a file', t => { + const out = [] + new Pack({ cwd: files }) + .end('one-byte.txt') + .on('data', c => out.push(c)) + .on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(data.slice(512).toString(), /^a\0{511}\0{1024}$/) + const h = new Header(data) + const expect = { + cksumValid: true, + needPax: false, + path: 'one-byte.txt', + mode: isWindows ? 0o666 : 0o644, + size: 1, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + type: 'File', + } + t.match(h, expect) || console.log(h, expect) + const ps = new PackSync({ cwd: files }) + const sout = [] + ps.on('data', chunk => sout.push(chunk)) + ps.add('one-byte.txt').end() + const sync = Buffer.concat(sout) + if (sync.length === 0) + throw new Error('no data!') + + t.equal(sync.slice(512).toString(), data.slice(512).toString()) + const hs = new Header(sync) + t.match(hs, expect) + t.end() + }) +}) + +t.test('pack a file with a prefix', t => { + const out = [] + new Pack({ cwd: files, prefix: 'package/' }) + .end('.dotfile') + .on('data', c => out.push(c)) + .on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(data.slice(512).toString(), /^.\n\0{510}\0{1024}$/) + const h = new Header(data) + const expect = { + cksumValid: true, + needPax: false, + path: 'package/.dotfile', + mode: isWindows ? 0o666 : 0o644, + size: 2, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + type: 'File', + } + t.match(h, expect) + const sync = new PackSync({ cwd: files, prefix: 'package' }) + .add('.dotfile').end().read() + t.equal(sync.slice(512).toString(), data.slice(512).toString()) + const hs = new Header(sync) + t.match(hs, expect) + t.end() + }) +}) + +t.test('portable pack a dir', t => { + const out = [] + + new Pack({ cwd: files, portable: true, gzip: true }) + .add('dir') + .on('data', c => out.push(c)) + .end() + .on('end', _ => { + const zipped = Buffer.concat(out) + t.equal(zipped[9], 255, 'gzip OS flag set to "unknown"') + const data = new miniz.Gunzip().end(zipped).read() + // dir/, dir/x, and the nulls + // neither the dir or the file have any body bits + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'dir/', + mode: 0o755, + size: 0, + mtime: null, + cksum: Number, + linkpath: '', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + atime: null, + ctime: null, + nullBlock: false, + } + t.match(h, expect) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0{1024}$/) + + const syncgz = new PackSync({ cwd: files, portable: true, gzip: true }) + .add('dir').end().read() + + t.equal(syncgz[9], 255, 'gzip OS flag set to "unknown"') + const sync = new miniz.Gunzip().end(zipped).read() + + t.equal(sync.slice(512).toString(), data.slice(512).toString()) + const hs = new Header(sync) + t.match(hs, expect) + + const expect2 = { + type: 'File', + cksumValid: true, + needPax: false, + path: 'dir/x', + mode: 0o644, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: '', + gname: '', + devmaj: 0, + devmin: 0, + atime: null, + ctime: null, + nullBlock: false, + } + t.match(new Header(data.slice(512)), expect2) + t.match(new Header(sync.slice(512)), expect2) + t.end() + }) +}) + +t.test('use process cwd if cwd not specified', t => { + const cwd = process.cwd() + t.teardown(_ => process.chdir(cwd)) + process.chdir(files) + + const out = [] + + new Pack() + .add('dir') + .on('data', c => out.push(c)) + .end() + .on('end', _ => { + const data = Buffer.concat(out) + // dir/, dir/x, and the nulls + // neither the dir or the file have any body bits + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'dir/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(h, expect) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0{1024}$/) + + const sync = new PackSync({ cwd: files }) + .add('dir').end().read() + t.equal(sync.slice(512).toString(), data.slice(512).toString()) + const hs = new Header(sync) + t.match(hs, expect) + + const expect2 = { + type: 'File', + cksumValid: true, + needPax: false, + path: 'dir/x', + mode: isWindows ? 0o666 : 0o644, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(new Header(data.slice(512)), expect2) + t.match(new Header(sync.slice(512)), expect2) + t.end() + }) +}) + +t.test('filter', t => { + const out = [] + const filter = (path, stat) => stat.isDirectory() + + // only include directories, so dir/x should not appear + new Pack({ cwd: files, filter: filter }) + .add('dir') + .on('data', c => out.push(c)) + .end() + .on('end', _ => { + const data = Buffer.concat(out) + // dir/, dir/x, and the nulls + // neither the dir or the file have any body bits + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'dir/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(h, expect) + t.equal(data.length, 1536) + t.match(data.slice(512).toString(), /^\0{1024}$/) + + const sync = new PackSync({ cwd: files, filter: filter }) + .add('dir').end().read() + t.equal(sync.slice(512).toString(), data.slice(512).toString()) + const hs = new Header(sync) + t.match(hs, expect) + t.end() + }) +}) + +t.test('add the same dir twice (exercise cache code)', t => { + const out = [] + const filter = (path, stat) => stat.isDirectory() + + // only include directories, so dir/x should not appear + const pack = new Pack({ cwd: files, filter: filter }) + .add('dir') + .add('dir') + .on('data', c => out.push(c)) + .end() + .on('end', _ => { + const data = Buffer.concat(out) + // dir/, dir/x, and the nulls + // neither the dir or the file have any body bits + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'dir/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(h, expect) + const h2 = new Header(data.slice(512)) + t.match(h2, expect) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0{1024}$/) + + const sync = new PackSync({ + cwd: files, + filter: filter, + linkCache: pack.linkCache, + readdirCache: pack.readdirCache, + statCache: pack.statCache, + }) + .add('dir').add('dir').end().read() + t.equal(sync.slice(1024).toString(), data.slice(1024).toString()) + const hs = new Header(sync) + t.match(hs, expect) + const hs2 = new Header(sync.slice(512)) + t.match(hs2, expect) + t.end() + }) +}) + +t.test('if gzip is truthy, make it an object', t => { + const opt = { gzip: true } + new Pack(opt) + t.type(opt.gzip, 'object') + t.end() +}) + +t.test('gzip, also a very deep path', t => { + const out = [] + + new Pack({ + cwd: files, + gzip: { flush: 1 }, + }) + .add('dir') + .add('long-path') + .on('data', c => out.push(c)) + .end() + .on('end', _ => { + const zipped = Buffer.concat(out) + const data = zlib.unzipSync(zipped) + const entries = [] + for (var i = 0; i < data.length; i += 512) { + const slice = data.slice(i, i + 512) + const h = new Header(slice) + if (h.nullBlock) + entries.push('null block') + else if (h.cksumValid) + entries.push([h.type, h.path]) + else if (entries[entries.length - 1][0] === 'File') + entries[entries.length - 1].push(slice.toString().replace(/\0.*$/, '')) + } + + const expect = [ + ['Directory', 'dir/'], + ['Directory', 'long-path/'], + ['File', 'dir/x'], + ['Directory', 'long-path/r/'], + ['Directory', 'long-path/r/e/'], + ['Directory', 'long-path/r/e/a/'], + ['Directory', 'long-path/r/e/a/l/'], + ['Directory', 'long-path/r/e/a/l/l/'], + ['Directory', 'long-path/r/e/a/l/l/y/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'], + ['ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222'], + ['ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'], + ['ExtendedHeader', 'PaxHeader/Ω.txt'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω'], + 'null block', + 'null block', + ] + + let ok = true + entries.forEach((entry, i) => { + ok = ok && + t.equal(entry[0], expect[i][0]) && + t.equal(entry[1], expect[i][1]) && + (!entry[2] || t.equal(entry[2], expect[i][2])) + }) + + // t.match(entries, expect) + t.end() + }) +}) + +t.test('very deep gzip path, sync', t => { + const pack = new PackSync({ + cwd: files, + gzip: true, + }).add('dir') + .add('long-path') + .end() + + // these do nothing! + pack.pause() + pack.resume() + + const zipped = pack.read() + t.type(zipped, Buffer) + const data = zlib.unzipSync(zipped) + const entries = [] + for (var i = 0; i < data.length; i += 512) { + const slice = data.slice(i, i + 512) + const h = new Header(slice) + if (h.nullBlock) + entries.push('null block') + else if (h.cksumValid) + entries.push([h.type, h.path]) + else if (entries[entries.length - 1][0] === 'File') + entries[entries.length - 1].push(slice.toString().replace(/\0.*$/, '')) + } + + const expect = [ + ['Directory', 'dir/'], + ['File', 'dir/x'], + ['Directory', 'long-path/'], + ['Directory', 'long-path/r/'], + ['Directory', 'long-path/r/e/'], + ['Directory', 'long-path/r/e/a/'], + ['Directory', 'long-path/r/e/a/l/'], + ['Directory', 'long-path/r/e/a/l/l/'], + ['Directory', 'long-path/r/e/a/l/l/y/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/'], + ['Directory', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt', 'short\n'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111'], + ['ExtendedHeader', 'PaxHeader/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', '2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222'], + ['ExtendedHeader', 'PaxHeader/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccc'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxccccccccccccccccccccccccccccccccccccccccccccccccc', 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'], + ['ExtendedHeader', 'PaxHeader/Ω.txt'], + ['File', 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', 'Ω'], + 'null block', + 'null block', + ] + + let ok = true + entries.forEach((entry, i) => { + ok = ok && + t.equal(entry[0], expect[i][0]) && + t.equal(entry[1], expect[i][1]) && + (!entry[2] || t.equal(entry[2], expect[i][2])) + }) + + // t.match(entries, expect) + t.end() +}) + +t.test('write after end', t => { + const p = new Pack() + p.end() + t.throws(_ => p.add('nope'), new Error('write after end')) + t.end() +}) + +t.test('emit error when stat fail', t => { + t.teardown(mutateFS.statFail(new Error('xyz'))) + t.throws(_ => new PackSync({ cwd: files }).add('one-byte.txt'), + new Error('xyz')) + + new Pack({ cwd: files }).add('one-byte.txt').on('error', e => { + t.match(e, { message: 'xyz' }) + t.end() + }) +}) + +t.test('readdir fail', t => { + t.teardown(mutateFS.fail('readdir', new Error('xyz'))) + t.throws(_ => new PackSync({ cwd: files }).add('dir'), new Error('xyz')) + + new Pack({ cwd: files }).add('dir').on('error', e => { + t.match(e, { message: 'xyz' }) + t.end() + }) +}) + +t.test('pipe into a slow reader', t => { + const out = [] + const mp = new MiniPass() + const mp2 = new MiniPass() + const p = new Pack({ cwd: files }).add('long-path').end() + p.pause() + p.pipe(mp).pipe(mp2) + setTimeout(_ => { + mp2.on('data', c => out.push(c)) + setTimeout(_ => p.resume(), 100) + }, 100) + mp.on('end', _ => { + const data = Buffer.concat(out) + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'long-path/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(h, expect) + t.equal(data.length, 21504) + t.match(data.slice(data.length - 1024).toString(), /^\0{1024}$/) + t.end() + }) +}) + +t.test('pipe into a slow gzip reader', t => { + const out = [] + const mp2 = new miniz.Unzip() + const p = new Pack({ cwd: files, gzip: true }).add('long-path').end() + p.pause() + + class SlowStream extends EE { + write (chunk) { + mp2.write(chunk) + setTimeout(_ => { + this.emit('drain') + p.resume() + }) + return false + } + + end (chunk) { + return mp2.end(chunk) + } + } + const ss = new SlowStream() + + setTimeout(_ => { + p.pipe(ss) + p.resume() + }) + + mp2.on('data', c => out.push(c)) + mp2.on('end', _ => { + t.pass('mp2 end') + const data = Buffer.concat(out) + // dir/, dir/x, and the nulls + // neither the dir or the file have any body bits + const h = new Header(data) + const expect = { + type: 'Directory', + cksumValid: true, + needPax: false, + path: 'long-path/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + mtime: mtime, + cksum: Number, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + atime: atime, + ctime: ctime, + nullBlock: false, + } + t.match(h, expect) + t.equal(data.length, 21504) + t.match(data.slice(data.length - 1024).toString(), /^\0{1024}$/) + t.end() + }) +}) + +t.test('ignores mid-queue', t => { + // we let the first one through, and then ignore all the others + // so that we trigger the case where an ignored entry is not the + // head of the queue. + let didFirst = false + const p = new Pack({ + cwd: tars, + filter: (p, st) => { + if (p === './') + return true + if (!didFirst) + return didFirst = true + return false + }, + }) + + const out = [] + const files = fs.readdirSync(tars) + + p.on('data', c => out.push(c)) + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.slice(0, 100).toString().replace(/\0.*$/, ''), './') + const file = data.slice(512, 612).toString().replace(/\0.*$/, '') + t.not(files.indexOf(file), -1) + t.end() + }) + + p.add('') + p.end() +}) + +t.test('warnings', t => { + const f = path.resolve(files, '512-bytes.txt') + t.test('preservePaths=false strict=false', t => { + const warnings = [] + const p = new Pack({ + cwd: files, + onwarn: (c, m, p) => warnings.push([c, m, p]), + }).end(f).on('data', c => out.push(c)) + + const out = [] + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(warnings, [[ + 'TAR_ENTRY_INFO', + /stripping .* from absolute path/, + { path: normPath(f) }, + ]]) + + t.match(new Header(data), { + path: normPath(f).replace(/^(\/|[a-z]:\/)/i, ''), + }) + t.end() + }) + }) + + t.test('preservePaths=true', t => { + t.plan(2) + // with preservePaths, strictness doens't matter + ;[true, false].forEach(strict => { + t.test('strict=' + strict, t => { + const warnings = [] + const out = [] + const p = new Pack({ + cwd: files, + strict: strict, + preservePaths: true, + onwarn: (c, m, p) => warnings.push([c, m, p]), + }).end(f).on('data', c => out.push(c)) + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(warnings.length, 0) + + t.match(new Header(data), { + path: normPath(f), + }) + t.end() + }) + }) + }) + }) + + t.test('preservePaths=false strict=true', t => { + new Pack({ + strict: true, + cwd: files, + }).end(f).on('error', e => { + t.match(e, { + message: /stripping .* from absolute path/, + path: normPath(f), + }) + t.end() + }) + }) + + t.end() +}) + +t.test('no dir recurse', t => { + const dir = path.resolve(fixtures, 'pack-no-dir-recurse') + t.teardown(_ => rimraf.sync(dir)) + t.beforeEach(() => { + rimraf.sync(dir) + mkdirp.sync(dir + '/x') + fs.writeFileSync(dir + '/x/y', 'y') + }) + + const check = (t, data) => { + t.equal(data.length, 512 + 1024) + t.equal(data.slice(512).toString(), new Array(1025).join('\0')) + t.match(new Header(data), { + type: 'Directory', + path: 'x/', + size: 0, + }) + t.end() + } + + t.test('async', t => { + const p = new Pack({ + cwd: dir, + noDirRecurse: true, + }) + + const out = [] + p.end('x') + .on('data', c => out.push(c)) + .on('end', _ => check(t, Buffer.concat(out))) + }) + + t.test('sync', t => { + const p = new Pack.Sync({ + cwd: dir, + noDirRecurse: true, + }) + + p.end('x') + check(t, p.read()) + }) + + t.end() +}) + +t.test('follow', { skip: isWindows && 'file symlinks not available' }, t => { + const check = (out, t) => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(new Header(data, 0), { + type: 'File', + cksumValid: true, + needPax: false, + path: 'symlink', + mode: isWindows ? 0o666 : 0o644, + size: 26, + }) + t.match(data.slice(512).toString(), /this link is like diamond\n\0+$/) + t.end() + } + + t.test('async', t => { + const out = [] + const p = new Pack({ cwd: files, follow: true }) + p.on('data', c => out.push(c)) + p.on('end', _ => check(out, t)) + p.end('symlink') + }) + + t.test('sync', t => { + const out = [] + const p = new Pack.Sync({ cwd: files, follow: true }) + p.on('data', c => out.push(c)) + p.end('symlink') + check(out, t) + }) + + t.end() +}) + +t.test('pack ReadEntries', t => { + t.test('basic', t => { + const readEntry = new ReadEntry(new Header({ + path: 'x', + type: 'File', + size: 1, + })) + const p = new Pack() + p.end(readEntry) + const out = [] + p.on('data', c => out.push(c)) + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0+$/) + t.equal(data.slice(0, 100).toString().replace(/\0.*$/, ''), 'x') + t.equal(data.slice(512, 514).toString(), 'x\0') + t.end() + }) + const buf = Buffer.alloc(512) + buf.write('x') + readEntry.end(buf) + }) + + t.test('prefix', t => { + const readEntry = new ReadEntry(new Header({ + path: 'x', + type: 'File', + size: 1, + })) + const p = new Pack({ prefix: 'y' }) + p.end(readEntry) + const out = [] + p.on('data', c => out.push(c)) + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0+$/) + t.equal(data.slice(0, 100).toString().replace(/\0.*$/, ''), 'y/x') + t.equal(data.slice(512, 514).toString(), 'x\0') + t.end() + }) + const buf = Buffer.alloc(512) + buf.write('x') + readEntry.end(buf) + }) + + t.test('filter out', t => { + const re1 = new ReadEntry(new Header({ + path: 'a', + type: 'File', + size: 1, + })) + const re2 = new ReadEntry(new Header({ + path: 'x', + type: 'File', + size: 1, + })) + const re3 = new ReadEntry(new Header({ + path: 'y', + type: 'File', + size: 1, + })) + const p = new Pack({ filter: p => p === 'x' }) + p.add(re1) + p.add(re2) + p.end(re3) + const out = [] + p.on('data', c => out.push(c)) + p.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 2048) + t.match(data.slice(1024).toString(), /^\0+$/) + t.equal(data.slice(0, 100).toString().replace(/\0.*$/, ''), 'x') + t.equal(data.slice(512, 514).toString(), 'x\0') + t.end() + }) + { + const buf = Buffer.alloc(512) + buf.write('x') + re1.end(buf) + } + { + const buf = Buffer.alloc(512) + buf.write('x') + re2.end(buf) + } + { + const buf = Buffer.alloc(512) + buf.write('x') + re3.end(buf) + } + }) + + t.end() +}) + +t.test('filter out everything', t => { + const filter = _ => false + + const check = (out, t) => { + const data = Buffer.concat(out) + t.equal(data.length, 1024) + t.match(data.toString(), /^\0+$/) + t.end() + } + + t.test('sync', t => { + const out = [] + const p = new Pack.Sync({ cwd: files, filter: filter }) + p.on('data', c => out.push(c)) + p.end('./') + check(out, t) + }) + + t.test('async', t => { + const out = [] + const p = new Pack.Sync({ cwd: files, filter: filter }) + p.on('data', c => out.push(c)) + p.on('end', _ => check(out, t)) + p.end('./') + }) + + t.end() +}) + +t.test('fs.open fails', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('open', poop)) + + t.test('async', t => { + t.plan(1) + new Pack({ cwd: files }) + .on('error', er => t.equal(er, poop)) + .end('one-byte.txt') + }) + + t.test('sync', t => { + t.plan(1) + t.throws(_ => + new Pack.Sync({ cwd: files }).end('one-byte.txt'), poop) + }) + + t.end() +}) + +const write = opts => new Promise((resolve, reject) => { + const p = new Pack() + let totalSize = 0 + p.on('data', d => totalSize += d.length) + p.once('error', reject) + p.once('end', () => resolve(totalSize)) + + const file1 = new ReadEntry(new Header({ + path: 'file1.txt', + size: 5, + })) + if (opts.before) { + file1.end('file1') + p.add(file1) + } else { + p.add(file1) + file1.end('file1') + } + + p.end() +}) + +t.test('padding works regardless of arite/add order', t => + Promise.all([ + write({ before: true }), + write({ before: false }), + ]).then(res => + t.equal(res[0], res[1], 'length is the same regardless of write/add order'))) + +t.test('prefix and subdirs', t => { + const dir = path.resolve(fixtures, 'pack-prefix-subdirs') + t.teardown(_ => rimraf.sync(dir)) + mkdirp.sync(dir + '/in/a/b/c') + fs.writeFileSync(dir + '/in/a/b/c/d', 'ddd') + fs.writeFileSync(dir + '/in/a/b/d', 'ddd') + fs.writeFileSync(dir + '/in/a/d', 'ddd') + fs.writeFileSync(dir + '/in/d', 'ddd') + + const expect = [ + 'out/x/\0', + 'out/x/a/\0', + 'out/x/d\0', + 'ddd\0', + 'out/x/a/b/\0', + 'out/x/a/d\0', + 'ddd\0', + 'out/x/a/b/c/\0', + 'out/x/a/b/d\0', + 'ddd\0', + 'out/x/a/b/c/d\0', + 'ddd\0', + '\0', + '\0', + ] + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => + t.equal(e, data.slice(i * 512, i * 512 + e.length).toString())) + t.end() + } + + const runTest = (t, path, Class) => { + const p = new Class({ + cwd: dir + '/in', + prefix: 'out/x', + }) + const out = [] + p.on('data', d => out.push(d)) + p.on('end', _ => check(out, t)) + p.end(path) + } + + t.test('async', t => { + t.test('.', t => runTest(t, '.', Pack)) + return t.test('./', t => runTest(t, './', Pack)) + }) + + return t.test('sync', t => { + t.test('.', t => runTest(t, '.', Pack.Sync)) + return t.test('./', t => runTest(t, './', Pack.Sync)) + }) +}) + +// https://github.com/npm/node-tar/issues/284 +t.test('prefix and hard links', t => { + const dir = path.resolve(fixtures, 'pack-prefix-hardlinks') + t.teardown(_ => rimraf.sync(dir)) + mkdirp.sync(dir + '/in/z/b/c') + fs.writeFileSync(dir + '/in/target', 'ddd') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/c/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/d') + fs.linkSync(dir + '/in/target', dir + '/in/y') + + const expect = [ + 'out/x/\0', + { + type: 'File', + size: 3, + path: 'out/x/target', + linkpath: '', + }, + 'ddd\0\0\0\0\0\0\0\0\0\0\0', + { + path: 'out/x/y', + type: 'Link', + linkpath: 'out/x/target', + }, + 'out/x/z/\0', + 'out/x/z/b/\0', + { + path: 'out/x/z/d', + type: 'Link', + linkpath: 'out/x/target', + }, + 'out/x/z/b/c/\0', + { + path: 'out/x/z/b/d', + type: 'Link', + linkpath: 'out/x/target', + }, + { + path: 'out/x/z/b/c/d', + type: 'Link', + linkpath: 'out/x/target', + }, + '\0', + '\0', + ] + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => { + if (typeof e === 'string') + t.equal(data.slice(i * 512, i * 512 + e.length).toString(), e) + else + t.match(new Header(data.slice(i * 512, (i + 1) * 512)), e) + }) + t.end() + } + + const runTest = (t, path, Class) => { + const p = new Class({ + cwd: dir + '/in', + prefix: 'out/x', + noDirRecurse: true, + }) + const out = [] + p.on('data', d => out.push(d)) + p.on('end', () => check(out, t)) + p.write(path) + if (path === '.') + path = './' + p.write(`${path}target`) + p.write(`${path}y`) + p.write(`${path}z`) + p.write(`${path}z/b`) + p.write(`${path}z/d`) + p.write(`${path}z/b/c`) + p.write(`${path}z/b/d`) + p.write(`${path}z/b/c/d`) + p.end() + } + + t.test('async', t => { + t.test('.', t => runTest(t, '.', Pack)) + return t.test('./', t => runTest(t, './', Pack)) + }) + + t.test('sync', t => { + t.test('.', t => runTest(t, '.', Pack.Sync)) + return t.test('./', t => runTest(t, './', Pack.Sync)) + }) + + t.end() +}) diff --git a/test/parse.js b/test/parse.js new file mode 100644 index 0000000..920b0c4 --- /dev/null +++ b/test/parse.js @@ -0,0 +1,689 @@ +'use strict' +const t = require('tap') +const Parse = require('../lib/parse.js') + +const makeTar = require('./make-tar.js') +const fs = require('fs') +const path = require('path') +const tardir = path.resolve(__dirname, 'fixtures/tars') +const zlib = require('zlib') +const MiniPass = require('minipass') +const Header = require('../lib/header.js') +const EE = require('events').EventEmitter + +t.test('fixture tests', t => { + class ByteStream extends MiniPass { + write (chunk) { + for (let i = 0; i < chunk.length - 1; i++) + super.write(chunk.slice(i, i + 1)) + + return super.write(chunk.slice(chunk.length - 1, chunk.length)) + } + } + + const trackEvents = (t, expect, p, slow) => { + let ok = true + let cursor = 0 + p.on('entry', entry => { + ok = ok && t.match(['entry', entry], expect[cursor++], entry.path) + if (slow) + setTimeout(_ => entry.resume()) + else + entry.resume() + }) + p.on('ignoredEntry', entry => { + ok = ok && t.match(['ignoredEntry', entry], expect[cursor++], + 'ignored: ' + entry.path) + }) + p.on('warn', (c, message, data) => { + ok = ok && t.match(['warn', c, message], expect[cursor++], 'warn') + }) + p.on('nullBlock', _ => { + ok = ok && t.match(['nullBlock'], expect[cursor++], 'null') + }) + p.on('error', er => { + ok = ok && t.match(['error', er], expect[cursor++], 'error') + }) + p.on('meta', meta => { + ok = ok && t.match(['meta', meta], expect[cursor++], 'meta') + }) + p.on('eof', _ => { + ok = ok && t.match(['eof'], expect[cursor++], 'eof') + }) + p.on('end', _ => { + ok = ok && t.match(['end'], expect[cursor++], 'end') + t.end() + }) + } + + t.jobs = 4 + const path = require('path') + const parsedir = path.resolve(__dirname, 'fixtures/parse') + const files = fs.readdirSync(tardir) + const maxMetaOpt = [250, null] + const filterOpt = [true, false] + const strictOpt = [true, false] + const runTest = (file, maxMeta, filter, strict) => { + const tardata = fs.readFileSync(file) + const base = path.basename(file, '.tar') + t.test('file=' + base + '.tar' + + ' maxmeta=' + maxMeta + + ' filter=' + filter + + ' strict=' + strict, t => { + const o = + (maxMeta ? '-meta-' + maxMeta : '') + + (filter ? '-filter' : '') + + (strict ? '-strict' : '') + const tail = (o ? '-' + o : '') + '.json' + const eventsFile = parsedir + '/' + base + tail + const expect = require(eventsFile) + + t.test('one byte at a time', t => { + const bs = new ByteStream() + const opt = (maxMeta || filter || strict) ? { + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict, + } : null + const bp = new Parse(opt) + trackEvents(t, expect, bp) + bs.pipe(bp) + bs.end(tardata) + }) + + t.test('all at once', t => { + const p = new Parse({ + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict, + }) + trackEvents(t, expect, p) + p.end(tardata) + }) + + t.test('gzipped all at once', t => { + const p = new Parse({ + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict, + }) + trackEvents(t, expect, p) + p.end(zlib.gzipSync(tardata)) + }) + + t.test('gzipped byte at a time', t => { + const bs = new ByteStream() + const bp = new Parse({ + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict, + }) + trackEvents(t, expect, bp) + bs.pipe(bp) + bs.end(zlib.gzipSync(tardata)) + }) + + t.test('async chunks', t => { + const p = new Parse({ + maxMetaEntrySize: maxMeta, + filter: filter ? (path, entry) => entry.size % 2 !== 0 : null, + strict: strict, + }) + trackEvents(t, expect, p, true) + p.write(tardata.slice(0, Math.floor(tardata.length / 2))) + process.nextTick(_ => p.end(tardata.slice(Math.floor(tardata.length / 2)))) + }) + + t.end() + }) + } + + files + .map(f => path.resolve(tardir, f)).forEach(file => + maxMetaOpt.forEach(maxMeta => + strictOpt.forEach(strict => + filterOpt.forEach(filter => + runTest(file, maxMeta, filter, strict))))) + t.end() +}) + +t.test('strict warn with an error emits that error', t => { + t.plan(1) + const p = new Parse({ + strict: true, + }) + p.on('error', emitted => t.equal(emitted, er)) + const er = new Error('yolo') + p.warn('TAR_TEST', er) +}) + +t.test('onwarn gets added to the warn event', t => { + t.plan(1) + const p = new Parse({ + onwarn (code, message) { + t.equal(message, 'this is fine') + }, + }) + p.warn('TAR_TEST', 'this is fine') +}) + +t.test('onentry gets added to entry event', t => { + t.plan(1) + const p = new Parse({ + onentry: entry => t.equal(entry, 'yes hello this is dog'), + }) + p.emit('entry', 'yes hello this is dog') +}) + +t.test('drain event timings', t => { + let sawOndone = false + const ondone = function () { + sawOndone = true + this.emit('prefinish') + this.emit('finish') + this.emit('end') + this.emit('close') + } + + // write 1 header and body, write 2 header, verify false return + // wait for drain event before continuing. + // write 2 body, 3 header and body, 4 header, verify false return + // wait for drain event + // write 4 body and null blocks + + const data = [ + [ + { + path: 'one', + size: 513, + type: 'File', + }, + new Array(513).join('1'), + '1', + { + path: 'two', + size: 513, + type: 'File', + }, + new Array(513).join('2'), + '2', + { + path: 'three', + size: 1024, + type: 'File', + }, + ], + [ + new Array(513).join('3'), + new Array(513).join('3'), + { + path: 'four', + size: 513, + type: 'File', + }, + ], + [ + new Array(513).join('4'), + '4', + { + path: 'five', + size: 1024, + type: 'File', + }, + new Array(513).join('5'), + new Array(513).join('5'), + { + path: 'six', + size: 1024, + type: 'File', + }, + new Array(513).join('6'), + new Array(513).join('6'), + { + path: 'seven', + size: 1024, + type: 'File', + }, + new Array(513).join('7'), + new Array(513).join('7'), + { + path: 'eight', + size: 1024, + type: 'File', + }, + new Array(513).join('8'), + new Array(513).join('8'), + { + path: 'four', + size: 513, + type: 'File', + }, + new Array(513).join('4'), + '4', + { + path: 'five', + size: 1024, + type: 'File', + }, + new Array(513).join('5'), + new Array(513).join('5'), + { + path: 'six', + size: 1024, + type: 'File', + }, + new Array(513).join('6'), + new Array(513).join('6'), + { + path: 'seven', + size: 1024, + type: 'File', + }, + new Array(513).join('7'), + new Array(513).join('7'), + { + path: 'eight', + size: 1024, + type: 'File', + }, + new Array(513).join('8'), + ], + [ + new Array(513).join('8'), + { + path: 'nine', + size: 1537, + type: 'File', + }, + new Array(513).join('9'), + ], + [new Array(513).join('9')], + [new Array(513).join('9')], + ['9'], + ].map(chunks => makeTar(chunks)) + + const expect = [ + 'one', 'two', 'three', + 'four', 'five', 'six', 'seven', 'eight', + 'four', 'five', 'six', 'seven', 'eight', + 'nine', + 'one', 'two', 'three', + 'four', 'five', 'six', 'seven', 'eight', + 'four', 'five', 'six', 'seven', 'eight', + 'nine', + ] + + class SlowStream extends EE { + write () { + setTimeout(_ => this.emit('drain')) + return false + } + + end () { + return this.write() + } + } + + let currentEntry + const autoPipe = true + const p = new Parse({ + ondone, + onentry: entry => { + t.equal(entry.path, expect.shift()) + currentEntry = entry + if (autoPipe) + setTimeout(_ => entry.pipe(new SlowStream())) + }, + }) + + data.forEach(d => { + if (!t.equal(p.write(d), false, 'write should return false')) + return t.end() + }) + + let interval + const go = _ => { + const d = data.shift() + if (d === undefined) + return p.end() + + let paused + if (currentEntry) { + currentEntry.pause() + paused = true + } + + const hunklen = Math.floor(d.length / 2) + const hunks = [ + d.slice(0, hunklen), + d.slice(hunklen), + ] + p.write(hunks[0]) + + if (currentEntry && !paused) { + console.error('has current entry') + currentEntry.pause() + paused = true + } + + if (!t.equal(p.write(hunks[1]), false, 'write should return false: ' + d)) + return t.end() + + p.once('drain', go) + + if (paused) + currentEntry.resume() + } + + p.once('drain', go) + p.on('end', _ => { + clearInterval(interval) + t.ok(sawOndone) + t.end() + }) + go() +}) + +t.test('consume while consuming', t => { + const data = makeTar([ + { + path: 'one', + size: 0, + type: 'File', + }, + { + path: 'zero', + size: 0, + type: 'File', + }, + { + path: 'two', + size: 513, + type: 'File', + }, + new Array(513).join('2'), + '2', + { + path: 'three', + size: 1024, + type: 'File', + }, + new Array(513).join('3'), + new Array(513).join('3'), + { + path: 'zero', + size: 0, + type: 'File', + }, + { + path: 'zero', + size: 0, + type: 'File', + }, + { + path: 'four', + size: 1024, + type: 'File', + }, + new Array(513).join('4'), + new Array(513).join('4'), + { + path: 'zero', + size: 0, + type: 'File', + }, + { + path: 'zero', + size: 0, + type: 'File', + }, + ]) + + const runTest = (t, size) => { + const p = new Parse() + const first = data.slice(0, size) + const rest = data.slice(size) + p.once('entry', entry => { + for (let pos = 0; pos < rest.length; pos += size) + p.write(rest.slice(pos, pos + size)) + + p.end() + }) + .on('entry', entry => entry.resume()) + .on('end', _ => t.end()) + .write(first) + } + + // one that aligns, and another that doesn't, so that we + // get some cases where there's leftover chunk and a buffer + t.test('size=1000', t => runTest(t, 1000)) + t.test('size=1024', t => runTest(t, 4096)) + t.end() +}) + +t.test('truncated input', t => { + const data = makeTar([ + { + path: 'foo/', + type: 'Directory', + }, + { + path: 'foo/bar', + type: 'File', + size: 18, + }, + ]) + + t.test('truncated at block boundary', t => { + const warnings = [] + const p = new Parse({ onwarn: (c, message) => warnings.push(message) }) + p.end(data) + t.same(warnings, [ + 'Truncated input (needed 512 more bytes, only 0 available)', + ]) + t.end() + }) + + t.test('truncated mid-block', t => { + const warnings = [] + const p = new Parse({ onwarn: (c, message) => warnings.push(message) }) + p.write(data) + p.end(Buffer.from('not a full block')) + t.same(warnings, [ + 'Truncated input (needed 512 more bytes, only 16 available)', + ]) + t.end() + }) + + t.end() +}) + +t.test('truncated gzip input', t => { + const raw = makeTar([ + { + path: 'foo/', + type: 'Directory', + }, + { + path: 'foo/bar', + type: 'File', + size: 18, + }, + new Array(19).join('x'), + '', + '', + ]) + const tgz = zlib.gzipSync(raw) + const split = Math.floor(tgz.length * 2 / 3) + const trunc = tgz.slice(0, split) + + const skipEarlyEnd = process.version.match(/^v4\./) + t.test('early end', { + skip: skipEarlyEnd ? 'not a zlib error on v4' : false, + }, t => { + const warnings = [] + const p = new Parse() + p.on('error', er => warnings.push(er.message)) + let aborted = false + p.on('abort', _ => aborted = true) + p.end(trunc) + t.equal(aborted, true, 'aborted writing') + t.same(warnings, ['zlib: unexpected end of file']) + t.end() + }) + + t.test('just wrong', t => { + const warnings = [] + const p = new Parse() + p.on('error', er => warnings.push(er.message)) + let aborted = false + p.on('abort', _ => aborted = true) + p.write(trunc) + p.write(trunc) + p.write(tgz.slice(split)) + p.end() + t.equal(aborted, true, 'aborted writing') + t.same(warnings, ['zlib: incorrect data check']) + t.end() + }) + + t.end() +}) + +t.test('end while consuming', t => { + // https://github.com/npm/node-tar/issues/157 + const data = zlib.gzipSync(makeTar([ + { + path: 'package/package.json', + type: 'File', + size: 130, + }, + new Array(131).join('x'), + { + path: 'package/node_modules/@c/d/node_modules/e/package.json', + type: 'File', + size: 30, + }, + new Array(31).join('e'), + { + path: 'package/node_modules/@c/d/package.json', + type: 'File', + size: 33, + }, + new Array(34).join('d'), + { + path: 'package/node_modules/a/package.json', + type: 'File', + size: 59, + }, + new Array(60).join('a'), + { + path: 'package/node_modules/b/package.json', + type: 'File', + size: 30, + }, + new Array(31).join('b'), + '', + '', + ])) + + const actual = [] + const expect = [ + 'package/package.json', + 'package/node_modules/@c/d/node_modules/e/package.json', + 'package/node_modules/@c/d/package.json', + 'package/node_modules/a/package.json', + 'package/node_modules/b/package.json', + ] + + const mp = new MiniPass() + const p = new Parse({ + onentry: entry => { + actual.push(entry.path) + entry.resume() + }, + onwarn: (c, m, data) => t.fail(`${c}: ${m}`, data), + }) + p.on('end', () => { + t.same(actual, expect) + t.end() + }) + mp.end(data) + mp.pipe(p) +}) + +t.test('bad archives', t => { + const p = new Parse() + const warnings = [] + p.on('warn', (code, msg, data) => { + warnings.push([code, msg, data]) + }) + p.on('end', () => { + // last one should be 'this archive sucks' + t.match(warnings.pop(), [ + 'TAR_BAD_ARCHIVE', + 'Unrecognized archive format', + { code: 'TAR_BAD_ARCHIVE', tarCode: 'TAR_BAD_ARCHIVE' }, + ]) + t.end() + }) + // javascript test is not a tarball. + p.end(fs.readFileSync(__filename)) +}) + +t.test('header that throws', t => { + const p = new Parse() + p.on('warn', (c, m, d) => { + t.equal(m, 'invalid base256 encoding') + t.match(d, { + code: 'TAR_ENTRY_INVALID', + }) + t.end() + }) + const h = new Header({ + path: 'path', + mode: 0o07777, // gonna make this one invalid + uid: 1234, + gid: 4321, + type: 'File', + size: 1, + }) + h.encode() + const buf = h.block + const bad = Buffer.from([0x81, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + bad.copy(buf, 100) + t.throws(() => new Header(buf), 'the header with that buffer throws') + p.write(buf) +}) + +t.test('warnings that are not so bad', t => { + const p = new Parse() + const warnings = [] + p.on('warn', (code, m, d) => { + warnings.push([code, m, d]) + t.fail('should get no warnings') + }) + // the parser doesn't actually decide what's "ok" or "supported", + // it just parses. So we have to set it ourselves like unpack does + p.once('entry', entry => entry.invalid = true) + p.on('entry', entry => entry.resume()) + const data = makeTar([ + { + path: '/a/b/c', + type: 'File', + size: 1, + }, + 'a', + { + path: 'a/b/c', + type: 'Directory', + }, + '', + '', + ]) + p.on('end', () => { + t.same(warnings, []) + t.end() + }) + p.end(data) +}) diff --git a/test/path-reservations.js b/test/path-reservations.js new file mode 100644 index 0000000..e73f743 --- /dev/null +++ b/test/path-reservations.js @@ -0,0 +1,152 @@ +const t = require('tap') + +// load up the posix and windows versions of the reserver +if (process.platform === 'win32') + process.env.TESTING_TAR_FAKE_PLATFORM = 'posix' +const { reserve } = t.mock('../lib/path-reservations.js', { + path: require('path').posix, +})() +delete process.env.TESTING_TAR_FAKE_PLATFORM +if (process.platform !== 'win32') + process.env.TESTING_TAR_FAKE_PLATFORM = 'win32' +const { reserve: winReserve } = t.mock('../lib/path-reservations.js', { + path: require('path').win32, +})() + +t.test('basic race', t => { + // simulate the race conditions we care about + let didFile = false + const file = done => { + t.equal(didFile, false, 'only call file once') + didFile = true + t.equal(didLink, false, 'do file before link') + setTimeout(done) + } + + let didLink = false + const link = done => { + t.equal(didLink, false, 'only call once') + t.equal(didFile, true, 'do file before link') + didLink = true + // make sure this one is super duper cleared lol + // the subsequent calls are no-ops, but verify as much + done() + done() + done() + } + + let didDir = false + const dir = done => { + t.equal(didDir, false, 'only do dir once') + t.equal(didLink, true, 'do link before dir') + didDir = true + done() + } + + let didDir2 = false + const dir2 = done => { + t.equal(didDir, true, 'did dir before dir2') + t.equal(didDir2, false, 'only do dir2 once') + didDir2 = true + done() + } + + let didDir3 = false + const dir3 = done => { + t.equal(didDir2, true, 'did dir2 before dir3') + t.equal(didDir3, false, 'only do dir3 once') + didDir3 = true + done() + t.end() + } + + t.ok(reserve(['a/b/c/d'], file), 'file starts right away') + t.notOk(reserve(['a/B/c////D', 'a/b/e'], link), 'link waits') + t.notOk(reserve(['a/b/e/f'], dir), 'dir waits') + t.notOk(reserve(['a/b'], dir2), 'dir2 waits') + t.notOk(reserve(['a/b/x'], dir3), 'dir3 waits') +}) + +t.test('unicode shenanigans', t => { + const e1 = Buffer.from([0xc3, 0xa9]) + const e2 = Buffer.from([0x65, 0xcc, 0x81]) + let didCafe1 = false + const cafe1 = done => { + t.equal(didCafe1, false, 'did cafe1 only once') + t.equal(didCafe2, false, 'did cafe1 before cafe2') + didCafe1 = true + setTimeout(done) + } + let didCafe2 = false + const cafe2 = done => { + t.equal(didCafe1, true, 'did cafe1 before cafe2') + t.equal(didCafe2, false, 'did cafe2 only once') + didCafe2 = true + done() + t.end() + } + const cafePath1 = `c/a/f/${e1}` + const cafePath2 = `c/a/f/${e2}` + t.ok(reserve([cafePath1], cafe1)) + t.notOk(reserve([cafePath2], cafe2)) +}) + +t.test('absolute paths and trailing slash', t => { + let calledA1 = false + let calledA2 = false + const a1 = done => { + t.equal(calledA1, false, 'called a1 only once') + t.equal(calledA2, false, 'called a1 before 2') + calledA1 = true + setTimeout(done) + } + const a2 = done => { + t.equal(calledA1, true, 'called a1 before 2') + t.equal(calledA2, false, 'called a2 only once') + calledA2 = true + done() + if (calledR2) + t.end() + } + let calledR1 = false + let calledR2 = false + const r1 = done => { + t.equal(calledR1, false, 'called r1 only once') + t.equal(calledR2, false, 'called r1 before 2') + calledR1 = true + setTimeout(done) + } + const r2 = done => { + t.equal(calledR1, true, 'called r1 before 2') + t.equal(calledR2, false, 'called r1 only once') + calledR2 = true + done() + if (calledA2) + t.end() + } + t.ok(reserve(['/p/a/t/h'], a1)) + t.notOk(reserve(['/p/a/t/h/'], a2)) + t.ok(reserve(['p/a/t/h'], r1)) + t.notOk(reserve(['p/a/t/h/'], r2)) +}) + +t.test('on windows, everything collides with everything', t => { + const reserve = winReserve + let called1 = false + let called2 = false + const f1 = done => { + t.equal(called1, false, 'only call 1 once') + t.equal(called2, false, 'call 1 before 2') + called1 = true + setTimeout(done) + } + const f2 = done => { + t.equal(called1, true, 'call 1 before 2') + t.equal(called2, false, 'only call 2 once') + called2 = true + done() + t.end() + } + t.equal(reserve(['some/path'], f1), true) + t.equal(reserve(['other/path'], f2), false) +}) diff --git a/test/pax.js b/test/pax.js new file mode 100644 index 0000000..25ea5be --- /dev/null +++ b/test/pax.js @@ -0,0 +1,253 @@ +'use strict' +const t = require('tap') +const Pax = require('../lib/pax.js') + +t.test('create a pax', t => { + const p = new Pax({ + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('1979-07-01T19:10:00.000Z'), + mtime: new Date('1979-07-01T19:10:00.000Z'), + gid: 20, + gname: 'staff', + uid: 24561, + uname: 'isaacs', + path: 'foo.txt', + size: 100, + dev: 123456, + ino: 7890, + nlink: 1, + }) + + // console.log(p.encode().toString('hex').split('').reduce((s,c)=>{if(s[s.length-1].length<64)s[s.length-1]+=c;else s.push(c);return s},[''])) + + const buf = Buffer.from( + // pax entry header + '5061784865616465722f666f6f2e747874000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303036343420003035373736312000303030303234200030303030' + + '3030303330342000323136373231373631302000303136373332200078000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030306973616163730000000000000000000000000000000000' + + '0000000000000000007374616666000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000032313637' + + '3231373631302000323136373231373631302000000000000000000000000000' + + + // entry body + '313620706174683d666f6f2e7478740a3139206374696d653d32393937303432' + + '30300a3139206174696d653d3239393730343230300a323120534348494c592e' + + '6465763d3132333435360a313920534348494c592e696e6f3d373839300a3138' + + '20534348494c592e6e6c696e6b3d310a39206769643d32300a313520676e616d' + + '653d73746166660a3139206d74696d653d3239393730343230300a3132207369' + + '7a653d3130300a3133207569643d32343536310a313620756e616d653d697361' + + '6163730a00000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + + const actual = p.encode() + t.equal(actual.toString('hex'), buf.toString('hex')) + t.end() +}) + +t.test('null pax', t => { + const p = new Pax({}) + t.equal(p.encode(), null) + t.end() +}) + +t.test('tiny pax', t => { + // weird to have a global setting a path. Maybe this should be + // an error? + const p = new Pax({path: 'ab'}, true) + const actual = p.encode() + // console.log(actual.toString('hex').split('').reduce((s,c)=>{if(s[s.length-1].length<64)s[s.length-1]+=c;else s.push(c);return s},[''])) + // return Promise.resolve() + + const buf = Buffer.from( + // header + '5061784865616465722f61620000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000030303036343420000000000000000000000000000000000030303030' + + '3030303031332000000000000000000000000000303037303534200067000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0075737461720030300000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000003030303030302000303030303030200000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + + // body + // note that a 2-char path is 11, but a 1 char path is 9, because + // adding the second char bumps the n to 10, which adds 1, which + // means it has to be 11. + // a 1-char path COULD be encoded as EITHER "10 path=x\n", or as + // "9 path=x\n", and it'd be true either way. + '313120706174683d61620a000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000', + 'hex') + + t.equal(actual.toString('hex'), buf.toString('hex')) + + t.end() +}) + +t.test('parse', t => { + t.same(Pax.parse('11 path=ab\n', { uid: 24561 }, true), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + mtime: null, + path: 'ab', + size: null, + uid: 24561, + uname: null, + dev: null, + ino: null, + nlink: null, + global: true, + }) + + t.same(Pax.parse('11 path=ab\n', null, false), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + mtime: null, + path: 'ab', + size: null, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + global: false, + }) + + t.same(Pax.parse('9 gid=20\n9 path=x\n', null, false), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: 20, + gname: null, + linkpath: null, + mtime: null, + path: 'x', + size: null, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + global: false, + }) + + t.same(Pax.parse('9 gid=20\n9 path=x\n', null, false), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: 20, + gname: null, + linkpath: null, + mtime: null, + path: 'x', + size: null, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + global: false, + }) + + t.same(Pax.parse('20 mtime=1491436800\n', null, false), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + mtime: new Date('2017-04-06'), + path: null, + size: null, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + global: false, + }) + + const breaky = + '93 NODETAR.package.readme=karma-moment\n' + + '=================\n' + + '\n' + + 'Karma plugin for Moment framework\n' + + '\n' + + const noKey = '10 =pathx\n' + + t.same(Pax.parse(breaky + '9 gid=20\n10 path=x\n' + noKey, null, false), { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: 20, + gname: null, + linkpath: null, + mtime: null, + path: 'x', + size: null, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + global: false, + }) + + t.end() +}) diff --git a/test/read-entry.js b/test/read-entry.js new file mode 100644 index 0000000..4e12e87 --- /dev/null +++ b/test/read-entry.js @@ -0,0 +1,224 @@ +'use strict' +const t = require('tap') +const ReadEntry = require('../lib/read-entry.js') +const Header = require('../lib/header.js') + +t.test('create read entry', t => { + const h = new Header({ + path: 'oof.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + }) + h.encode() + + const entry = new ReadEntry(h, { x: 'y', path: 'foo.txt' }, { z: 0, a: null, b: undefined }) + + t.ok(entry.header.cksumValid, 'header checksum should be valid') + + t.match(entry, { + extended: { x: 'y', path: 'foo.txt' }, + globalExtended: { z: 0, a: null, b: undefined }, + header: { + cksumValid: true, + needPax: false, + path: 'oof.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00:00.000Z'), + typeKey: '0', + type: 'File', + linkpath: null, + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + atime: new Date('2016-04-01T22:00:00.000Z'), + ctime: new Date('2016-04-01T22:00:00.000Z'), + }, + blockRemain: 512, + remain: 100, + type: 'File', + meta: false, + ignore: false, + path: 'foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + uname: 'isaacs', + gname: 'staff', + size: 100, + mtime: new Date('2016-04-01T22:00:00.000Z'), + atime: new Date('2016-04-01T22:00:00.000Z'), + ctime: new Date('2016-04-01T22:00:00.000Z'), + linkpath: null, + x: 'y', + z: 0, + }) + + let data = '' + let ended = false + entry.on('data', c => data += c) + entry.on('end', _ => ended = true) + + const body = Buffer.alloc(512) + body.write(new Array(101).join('z'), 0) + entry.write(body) + entry.end() + + t.equal(data, new Array(101).join('z')) + t.ok(ended, 'saw end event') + + t.end() +}) + +t.test('meta entry', t => { + const h = new Header({ + path: 'PaxHeader/foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 23, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'NextFileHasLongLinkpath', + uname: 'isaacs', + gname: 'staff', + }) + const body = Buffer.alloc(512) + body.write('not that long, actually') + + const expect = 'not that long, actually' + let actual = '' + + const entry = new ReadEntry(h) + entry.on('data', c => actual += c) + + entry.write(body.slice(0, 1)) + entry.write(body.slice(1, 25)) + entry.write(body.slice(25)) + t.throws(_ => entry.write(Buffer.alloc(1024))) + + t.equal(actual, expect) + t.match(entry, { meta: true, type: 'NextFileHasLongLinkpath' }) + t.end() +}) + +t.test('unknown entry type', t => { + const h = new Header({ + path: 'PaxHeader/foo.txt', + mode: 0o755, + uid: 24561, + gid: 20, + size: 23, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + uname: 'isaacs', + gname: 'staff', + }) + h.encode() + h.block.write('9', 156, 1, 'ascii') + + const body = Buffer.alloc(512) + body.write('not that long, actually') + + const expect = '' + let actual = '' + + const entry = new ReadEntry(new Header(h.block)) + + entry.on('data', c => actual += c) + + entry.write(body.slice(0, 1)) + entry.write(body.slice(1, 25)) + entry.write(body.slice(25)) + t.throws(_ => entry.write(Buffer.alloc(1024))) + + t.equal(actual, expect) + t.match(entry, { ignore: true }) + t.end() +}) + +t.test('entry without mode', t => { + const h = new Header({ + path: 'foo.txt', + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00Z'), + ctime: new Date('2016-04-01T22:00Z'), + atime: new Date('2016-04-01T22:00Z'), + type: 'File', + uname: 'isaacs', + gname: 'staff', + }) + h.encode() + + const entry = new ReadEntry(h) + + t.ok(entry.header.cksumValid, 'header checksum should be valid') + + t.match(entry, { + header: { + cksumValid: true, + needPax: false, + path: 'foo.txt', + mode: null, + uid: 24561, + gid: 20, + size: 100, + mtime: new Date('2016-04-01T22:00:00.000Z'), + typeKey: '0', + type: 'File', + linkpath: null, + uname: 'isaacs', + gname: 'staff', + devmaj: 0, + devmin: 0, + atime: new Date('2016-04-01T22:00:00.000Z'), + ctime: new Date('2016-04-01T22:00:00.000Z'), + }, + blockRemain: 512, + remain: 100, + type: 'File', + meta: false, + ignore: false, + path: 'foo.txt', + mode: null, + uid: 24561, + gid: 20, + uname: 'isaacs', + gname: 'staff', + size: 100, + mtime: new Date('2016-04-01T22:00:00.000Z'), + atime: new Date('2016-04-01T22:00:00.000Z'), + ctime: new Date('2016-04-01T22:00:00.000Z'), + linkpath: null, + }) + + let data = '' + let ended = false + entry.on('data', c => data += c) + entry.on('end', _ => ended = true) + + const body = Buffer.alloc(512) + body.write(new Array(101).join('z'), 0) + entry.write(body) + entry.end() + + t.equal(data, new Array(101).join('z')) + t.ok(ended, 'saw end event') + + t.end() +}) diff --git a/test/replace.js b/test/replace.js new file mode 100644 index 0000000..80326b7 --- /dev/null +++ b/test/replace.js @@ -0,0 +1,400 @@ +'use strict' +const t = require('tap') +const r = require('../lib/replace.js') +const path = require('path') +const fs = require('fs') +const mutateFS = require('mutate-fs') +const list = require('../lib/list.js') +const {resolve} = require('path') + +const fixtures = path.resolve(__dirname, 'fixtures') +const tars = path.resolve(fixtures, 'tars') +const zlib = require('zlib') + +const spawn = require('child_process').spawn + +const data = fs.readFileSync(tars + '/body-byte-counts.tar') +const dataNoNulls = data.slice(0, data.length - 1024) +const fixtureDef = { + 'body-byte-counts.tar': data, + 'no-null-eof.tar': dataNoNulls, + 'truncated-head.tar': Buffer.concat([dataNoNulls, data.slice(0, 500)]), + 'truncated-body.tar': Buffer.concat([dataNoNulls, data.slice(0, 700)]), + 'zero.tar': Buffer.from(''), + 'empty.tar': Buffer.alloc(512), + 'compressed.tgz': zlib.gzipSync(data), +} + +t.test('basic file add to archive (good or truncated)', t => { + const check = (file, t) => { + const c = spawn('tar', ['tf', file], { stdio: [0, 'pipe', 2] }) + const out = [] + c.stdout.on('data', chunk => out.push(chunk)) + c.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) + t.same(actual, [ + '1024-bytes.txt', + '512-bytes.txt', + 'one-byte.txt', + 'zero-byte.txt', + path.basename(__filename), + ]) + t.end() + }) + } + + const files = [ + 'body-byte-counts.tar', + 'no-null-eof.tar', + 'truncated-head.tar', + 'truncated-body.tar', + ] + const td = files.map(f => [f, fixtureDef[f]]).reduce((s, [k, v]) => { + s[k] = v + return s + }, {}) + const fileList = [path.basename(__filename)] + t.test('sync', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + r({ + sync: true, + file: resolve(dir, file), + cwd: __dirname, + }, fileList) + check(resolve(dir, file), t) + }) + } + }) + + t.test('async cb', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + r({ + file: resolve(dir, file), + cwd: __dirname, + }, fileList, er => { + if (er) + throw er + check(resolve(dir, file), t) + }) + }) + } + }) + + t.test('async', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + r({ + file: resolve(dir, file), + cwd: __dirname, + }, fileList).then(() => { + check(resolve(dir, file), t) + }) + }) + } + }) + + t.end() +}) + +t.test('add to empty archive', t => { + const check = (file, t) => { + const c = spawn('tar', ['tf', file]) + const out = [] + c.stdout.on('data', chunk => out.push(chunk)) + c.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + const actual = Buffer.concat(out).toString().trim().split('\n') + t.same(actual, [ + path.basename(__filename), + ]) + t.end() + }) + } + + const files = [ + 'empty.tar', + 'zero.tar', + ] + const td = files.map(f => [f, fixtureDef[f]]).reduce((s, [k, v]) => { + s[k] = v + return s + }, {}) + files.push('not-existing.tar') + + t.test('sync', t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + r({ + sync: true, + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)]) + check(resolve(dir, file), t) + }) + } + }) + + t.test('async cb', t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + r({ + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)], er => { + if (er) + throw er + check(resolve(dir, file), t) + }) + }) + } + }) + + t.test('async', async t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + r({ + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)]).then(() => { + check(resolve(dir, file), t) + }) + }) + } + }) + + t.end() +}) + +t.test('cannot append to gzipped archives', async t => { + const dir = t.testdir({ + 'compressed.tgz': fixtureDef['compressed.tgz'], + }) + const file = resolve(dir, 'compressed.tgz') + + const expect = new Error('cannot append to compressed archives') + const expectT = new TypeError('cannot append to compressed archives') + + t.throws(_ => r({ + file, + cwd: __dirname, + gzip: true, + }, [path.basename(__filename)]), expectT) + + t.throws(_ => r({ + file, + cwd: __dirname, + sync: true, + }, [path.basename(__filename)]), expect) + + return r({ + file, + cwd: __dirname, + }, [path.basename(__filename)], er => t.match(er, expect)) +}) + +t.test('other throws', t => { + t.throws(_ => r({}, ['asdf']), new TypeError('file is required')) + t.throws(_ => r({file: 'asdf'}, []), + new TypeError('no files or directories specified')) + t.end() +}) + +t.test('broken open', t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + }) + const file = resolve(dir, 'body-byte-counts.tar') + const poop = new Error('poop') + t.teardown(mutateFS.fail('open', poop)) + t.throws(_ => r({ sync: true, file }, ['README.md']), poop) + r({ file }, ['README.md'], er => { + t.match(er, poop) + t.end() + }) +}) + +t.test('broken fstat', t => { + const td = { + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + } + const poop = new Error('poop') + t.test('sync', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + t.teardown(mutateFS.fail('fstat', poop)) + t.throws(_ => r({ sync: true, file }, ['README.md']), poop) + t.end() + }) + t.test('async', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + t.teardown(mutateFS.fail('fstat', poop)) + r({ file }, ['README.md'], async er => { + t.match(er, poop) + t.end() + }) + }) + t.end() +}) + +t.test('broken read', t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + }) + const file = resolve(dir, 'body-byte-counts.tar') + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + t.throws(_ => r({ sync: true, file }, ['README.md']), poop) + r({ file }, ['README.md'], er => { + t.match(er, poop) + t.end() + }) +}) + +t.test('mtime cache', async t => { + const td = { + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + } + + let mtimeCache + + const check = (file, t) => { + const c = spawn('tar', ['tf', file]) + const out = [] + c.stdout.on('data', chunk => out.push(chunk)) + c.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) + t.same(actual, [ + '1024-bytes.txt', + '512-bytes.txt', + 'one-byte.txt', + 'zero-byte.txt', + path.basename(__filename), + ]) + const mtc = {} + mtimeCache.forEach((v, k) => mtc[k] = mtimeCache.get(k).toISOString()) + t.same(mtc, { + '1024-bytes.txt': '2017-04-10T16:57:47.000Z', + '512-bytes.txt': '2017-04-10T17:08:55.000Z', + 'one-byte.txt': '2017-04-10T16:58:20.000Z', + 'zero-byte.txt': '2017-04-10T17:08:01.000Z', + }) + t.end() + }) + } + + t.test('sync', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + r({ + sync: true, + file, + cwd: __dirname, + mtimeCache: mtimeCache = new Map(), + }, [path.basename(__filename)]) + check(file, t) + }) + + t.test('async cb', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + r({ + file, + cwd: __dirname, + mtimeCache: mtimeCache = new Map(), + }, [path.basename(__filename)], er => { + if (er) + throw er + check(file, t) + }) + }) + + t.test('async promise', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + r({ + file, + cwd: __dirname, + mtimeCache: mtimeCache = new Map(), + }, [path.basename(__filename)]).then(_ => check(file, t)) + }) + + t.end() +}) + +t.test('create tarball out of another tarball', t => { + const td = { + 'out.tar': fs.readFileSync(path.resolve(tars, 'dir.tar')), + } + + const check = (out, t) => { + const expect = [ + 'dir/', + 'Ω.txt', + '🌟.txt', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + ] + list({ + f: out, + sync: true, + onentry: entry => { + t.equal(entry.path, expect.shift()) + }}) + t.same(expect, []) + t.end() + } + + t.test('sync', t => { + const dir = t.testdir(td) + const out = resolve(dir, 'out.tar') + r({ + f: out, + cwd: tars, + sync: true, + }, ['@utf8.tar']) + check(out, t) + }) + + t.test('async cb', t => { + const dir = t.testdir(td) + const out = resolve(dir, 'out.tar') + r({ + f: out, + cwd: tars, + }, ['@utf8.tar'], er => { + if (er) + throw er + check(out, t) + }) + }) + + t.test('async', t => { + const dir = t.testdir(td) + const out = resolve(dir, 'out.tar') + r({ + f: out, + cwd: tars, + }, ['@utf8.tar']).then(() => check(out, t)) + }) + + t.end() +}) diff --git a/test/strip-absolute-path.js b/test/strip-absolute-path.js new file mode 100644 index 0000000..98c6ec1 --- /dev/null +++ b/test/strip-absolute-path.js @@ -0,0 +1,51 @@ +const t = require('tap') +const stripAbsolutePath = require('../lib/strip-absolute-path.js') +const cwd = process.cwd() + +t.test('basic', t => { + const cases = { + '/': ['/', ''], + '////': ['////', ''], + 'c:///a/b/c': ['c:///', 'a/b/c'], + '\\\\foo\\bar\\baz': ['\\\\foo\\bar\\', 'baz'], + '//foo//bar//baz': ['//', 'foo//bar//baz'], + 'c:\\c:\\c:\\c:\\\\d:\\e/f/g': ['c:\\c:\\c:\\c:\\\\d:\\', 'e/f/g'], + } + + for (const [input, [root, stripped]] of Object.entries(cases)) + t.strictSame(stripAbsolutePath(input, cwd), [root, stripped], input) + t.end() +}) + +t.test('drive-local paths', t => { + const env = process.env + t.teardown(() => process.env = env) + const cwd = 'D:\\safety\\land' + const realPath = require('path') + // be windowsy + const path = { + ...realPath.win32, + win32: realPath.win32, + posix: realPath.posix, + } + const stripAbsolutePath = t.mock('../lib/strip-absolute-path.js', { path }) + const cases = { + '/': ['/', ''], + '////': ['////', ''], + 'c:///a/b/c': ['c:///', 'a/b/c'], + '\\\\foo\\bar\\baz': ['\\\\foo\\bar\\', 'baz'], + '//foo//bar//baz': ['//', 'foo//bar//baz'], + 'c:\\c:\\c:\\c:\\\\d:\\e/f/g': ['c:\\c:\\c:\\c:\\\\d:\\', 'e/f/g'], + 'c:..\\system\\explorer.exe': ['c:', '..\\system\\explorer.exe'], + 'd:..\\..\\unsafe\\land': ['d:', '..\\..\\unsafe\\land'], + 'c:foo': ['c:', 'foo'], + 'D:mark': ['D:', 'mark'], + '//?/X:/y/z': ['//?/X:/', 'y/z'], + '\\\\?\\X:\\y\\z': ['\\\\?\\X:\\', 'y\\z'], + } + for (const [input, [root, stripped]] of Object.entries(cases)) { + if (!t.strictSame(stripAbsolutePath(input, cwd), [root, stripped], input)) + break + } + t.end() +}) diff --git a/test/strip-trailing-slashes.js b/test/strip-trailing-slashes.js new file mode 100644 index 0000000..ce0695f --- /dev/null +++ b/test/strip-trailing-slashes.js @@ -0,0 +1,8 @@ +const t = require('tap') +const stripSlash = require('../lib/strip-trailing-slashes.js') +const short = '///a///b///c///' +const long = short.repeat(10) + '/'.repeat(1000000) + +t.equal(stripSlash('no slash'), 'no slash') +t.equal(stripSlash(short), '///a///b///c') +t.equal(stripSlash(long), short.repeat(9) + '///a///b///c') diff --git a/test/types.js b/test/types.js new file mode 100644 index 0000000..c2ca5f6 --- /dev/null +++ b/test/types.js @@ -0,0 +1,6 @@ +'use strict' +// not much to test here, just 2 maps. +const t = require('tap') +const types = require('../lib/types.js') +t.equal(types.name.get('0'), 'File') +t.equal(types.code.get('File'), '0') diff --git a/test/unpack.js b/test/unpack.js new file mode 100644 index 0000000..b691992 --- /dev/null +++ b/test/unpack.js @@ -0,0 +1,3230 @@ +'use strict' + +process.umask(0o022) + +const Unpack = require('../lib/unpack.js') +const UnpackSync = Unpack.Sync +const t = require('tap') +const MiniPass = require('minipass') + +const makeTar = require('./make-tar.js') +const Header = require('../lib/header.js') +const z = require('minizlib') +const fs = require('fs') +const path = require('path') +const fixtures = path.resolve(__dirname, 'fixtures') +const tars = path.resolve(fixtures, 'tars') +const parses = path.resolve(fixtures, 'parse') +const unpackdir = path.resolve(fixtures, 'unpack') +const {promisify} = require('util') +const rimraf = promisify(require('rimraf')) +const mkdirp = require('mkdirp') +const mutateFS = require('mutate-fs') +const eos = require('end-of-stream') +const normPath = require('../lib/normalize-windows-path.js') + +// On Windows in particular, the "really deep folder path" file +// often tends to cause problems, which don't indicate a failure +// of this library, it's just what happens on Windows with super +// long file paths. +const isWindows = process.platform === 'win32' +const isLongFile = f => f.match(/r.e.a.l.l.y.-.d.e.e.p.-.f.o.l.d.e.r.-.p.a.t.h/) + +t.teardown(_ => rimraf(unpackdir)) + +t.before(async () => { + await rimraf(unpackdir) + await mkdirp(unpackdir) +}) + +t.test('basic file unpack tests', t => { + const basedir = path.resolve(unpackdir, 'basic') + t.teardown(_ => rimraf(basedir)) + + const cases = { + 'emptypax.tar': { + '🌟.txt': '🌟✧✩⭐︎✪✫✬✭✮⚝✯✰✵✶✷✸✹❂⭑⭒★☆✡☪✴︎✦✡️🔯✴️🌠\n', + 'one-byte.txt': 'a', + }, + 'body-byte-counts.tar': { + '1024-bytes.txt': new Array(1024).join('x') + '\n', + '512-bytes.txt': new Array(512).join('x') + '\n', + 'one-byte.txt': 'a', + 'zero-byte.txt': '', + }, + 'utf8.tar': { + '🌟.txt': '🌟✧✩⭐︎✪✫✬✭✮⚝✯✰✵✶✷✸✹❂⭑⭒★☆✡☪✴︎✦✡️🔯✴️🌠\n', + 'Ω.txt': 'Ω', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', + }, + 'file.tar': { + 'one-byte.txt': 'a', + }, + 'global-header.tar': { + 'one-byte.txt': 'a', + }, + 'long-pax.tar': { + '120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + }, + 'long-paths.tar': { + '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + '120-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + '170-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt': 'short\n', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', + }, + } + + const tarfiles = Object.keys(cases) + t.plan(tarfiles.length) + t.jobs = tarfiles.length + + tarfiles.forEach(tarfile => { + t.test(tarfile, t => { + const tf = path.resolve(tars, tarfile) + const dir = path.resolve(basedir, tarfile) + const linkdir = path.resolve(basedir, tarfile + '.link') + t.beforeEach(async () => { + await rimraf(dir) + await rimraf(linkdir) + await mkdirp(dir) + fs.symlinkSync(dir, linkdir, 'junction') + }) + + const check = t => { + const expect = cases[tarfile] + Object.keys(expect).forEach(file => { + const f = path.resolve(dir, file) + if (isWindows && isLongFile(file)) + return + t.equal(fs.readFileSync(f, 'utf8'), expect[file], file) + }) + t.end() + } + + t.plan(2) + + t.test('async unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack({ cwd: linkdir, strict: true }) + fs.createReadStream(tf).pipe(unpack) + eos(unpack, _ => check(t)) + }) + t.test('loose', t => { + const unpack = new Unpack({ cwd: linkdir }) + fs.createReadStream(tf).pipe(unpack) + eos(unpack, _ => check(t)) + }) + }) + + t.test('sync unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new UnpackSync({ cwd: linkdir }) + unpack.end(fs.readFileSync(tf)) + check(t) + }) + t.test('loose', t => { + const unpack = new UnpackSync({ cwd: linkdir }) + unpack.end(fs.readFileSync(tf)) + check(t) + }) + }) + }) + }) +}) + +t.test('cwd default to process cwd', t => { + const u = new Unpack() + const us = new UnpackSync() + const cwd = normPath(process.cwd()) + t.equal(u.cwd, cwd) + t.equal(us.cwd, cwd) + t.end() +}) + +t.test('links!', t => { + const dir = path.resolve(unpackdir, 'links') + const data = fs.readFileSync(tars + '/links.tar') + const stripData = fs.readFileSync(tars + '/links-strip.tar') + + t.plan(6) + t.beforeEach(() => mkdirp(dir)) + t.afterEach(() => rimraf(dir)) + + const check = t => { + const hl1 = fs.lstatSync(dir + '/hardlink-1') + const hl2 = fs.lstatSync(dir + '/hardlink-2') + t.equal(hl1.dev, hl2.dev) + t.equal(hl1.ino, hl2.ino) + t.equal(hl1.nlink, 2) + t.equal(hl2.nlink, 2) + if (!isWindows) { + // doesn't work on win32 without special privs + const sym = fs.lstatSync(dir + '/symlink') + t.ok(sym.isSymbolicLink()) + t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') + } + t.end() + } + const checkForStrip = t => { + const hl1 = fs.lstatSync(dir + '/hardlink-1') + const hl2 = fs.lstatSync(dir + '/hardlink-2') + const hl3 = fs.lstatSync(dir + '/1/2/3/hardlink-3') + t.equal(hl1.dev, hl2.dev) + t.equal(hl1.ino, hl2.ino) + t.equal(hl1.dev, hl3.dev) + t.equal(hl1.ino, hl3.ino) + t.equal(hl1.nlink, 3) + t.equal(hl2.nlink, 3) + if (!isWindows) { + const sym = fs.lstatSync(dir + '/symlink') + t.ok(sym.isSymbolicLink()) + t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') + } + t.end() + } + const checkForStrip3 = t => { + // strips the linkpath entirely, so the link doesn't get extracted. + t.throws(() => fs.lstatSync(dir + '/3'), { code: 'ENOENT' }) + t.end() + } + + t.test('async', t => { + const unpack = new Unpack({ cwd: dir }) + let finished = false + unpack.on('finish', _ => finished = true) + unpack.on('close', _ => t.ok(finished, 'emitted finish before close')) + unpack.on('close', _ => check(t)) + unpack.end(data) + }) + + t.test('sync', t => { + const unpack = new UnpackSync({ cwd: dir }) + unpack.end(data) + check(t) + }) + + t.test('sync strip', t => { + const unpack = new UnpackSync({ cwd: dir, strip: 1 }) + unpack.end(stripData) + checkForStrip(t) + }) + + t.test('async strip', t => { + const unpack = new Unpack({ cwd: dir, strip: 1 }) + let finished = false + unpack.on('finish', _ => finished = true) + unpack.on('close', _ => t.ok(finished, 'emitted finish before close')) + unpack.on('close', _ => checkForStrip(t)) + unpack.end(stripData) + }) + + t.test('sync strip 3', t => { + const unpack = new UnpackSync({ cwd: dir, strip: 3 }) + unpack.end(fs.readFileSync(tars + '/links-strip.tar')) + checkForStrip3(t) + }) + + t.test('async strip 3', t => { + const unpack = new Unpack({ cwd: dir, strip: 3 }) + let finished = false + unpack.on('finish', _ => finished = true) + unpack.on('close', _ => t.ok(finished, 'emitted finish before close')) + unpack.on('close', _ => checkForStrip3(t)) + unpack.end(stripData) + }) +}) + +t.test('links without cleanup (exercise clobbering code)', t => { + const dir = path.resolve(unpackdir, 'links') + const data = fs.readFileSync(tars + '/links.tar') + + t.plan(6) + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + + t.beforeEach(() => { + // clobber this junk + try { + mkdirp.sync(dir + '/hardlink-1') + mkdirp.sync(dir + '/hardlink-2') + fs.writeFileSync(dir + '/symlink', 'not a symlink') + } catch (er) {} + }) + + const check = t => { + const hl1 = fs.lstatSync(dir + '/hardlink-1') + const hl2 = fs.lstatSync(dir + '/hardlink-2') + t.equal(hl1.dev, hl2.dev) + t.equal(hl1.ino, hl2.ino) + t.equal(hl1.nlink, 2) + t.equal(hl2.nlink, 2) + if (!isWindows) { + const sym = fs.lstatSync(dir + '/symlink') + t.ok(sym.isSymbolicLink()) + t.equal(fs.readlinkSync(dir + '/symlink'), 'hardlink-2') + } + t.end() + } + + t.test('async', t => { + const unpack = new Unpack({ cwd: dir }) + let prefinished = false + unpack.on('prefinish', _ => prefinished = true) + unpack.on('finish', _ => + t.ok(prefinished, 'emitted prefinish before finish')) + unpack.on('close', _ => check(t)) + unpack.end(data) + }) + + t.test('sync', t => { + const unpack = new UnpackSync({ cwd: dir }) + unpack.end(data) + check(t) + }) + + t.test('async again', t => { + const unpack = new Unpack({ cwd: dir }) + eos(unpack, _ => check(t)) + unpack.end(data) + }) + + t.test('sync again', t => { + const unpack = new UnpackSync({ cwd: dir }) + unpack.end(data) + check(t) + }) + + t.test('async unlink', t => { + const unpack = new Unpack({ cwd: dir, unlink: true }) + unpack.on('close', _ => check(t)) + unpack.end(data) + }) + + t.test('sync unlink', t => { + const unpack = new UnpackSync({ cwd: dir, unlink: true }) + unpack.end(data) + check(t) + }) +}) + +t.test('nested dir dupe', t => { + const dir = path.resolve(unpackdir, 'nested-dir') + mkdirp.sync(dir + '/d/e/e/p') + t.teardown(_ => rimraf(dir)) + const expect = { + 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/a.txt': 'short\n', + 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': 'cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + 'd/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': 'Ω', + } + + const check = t => { + const entries = fs.readdirSync(dir) + t.equal(entries.length, 1) + t.equal(entries[0], 'd') + Object.keys(expect).forEach(f => { + const file = dir + '/' + f + t.equal(fs.readFileSync(file, 'utf8'), expect[f]) + }) + t.end() + } + + const unpack = new Unpack({ cwd: dir, strip: 8 }) + const data = fs.readFileSync(tars + '/long-paths.tar') + // while we're at it, why not use gzip too? + const zip = new z.Gzip() + zip.pipe(unpack) + unpack.on('close', _ => check(t)) + zip.end(data) +}) + +t.test('symlink in dir path', { + skip: isWindows && 'symlinks not fully supported', +}, t => { + const dir = path.resolve(unpackdir, 'symlink-junk') + + t.teardown(_ => rimraf(dir)) + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const data = makeTar([ + { + path: 'd/i', + type: 'Directory', + }, + { + path: 'd/i/r/dir', + type: 'Directory', + mode: 0o751, + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/file', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + { + path: 'd/i/r/link', + type: 'Link', + linkpath: 'd/i/r/file', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/symlink', + type: 'SymbolicLink', + linkpath: './dir', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/symlink/x', + type: 'File', + size: 0, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '', + '', + ]) + + t.test('no clobbering', t => { + const warnings = [] + const u = new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + }) + u.on('close', _ => { + t.equal(fs.lstatSync(dir + '/d/i').mode & 0o7777, isWindows ? 0o666 : 0o755) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + if (!isWindows) { + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.throws(_ => fs.statSync(dir + '/d/i/r/symlink/x')) + } + t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') + if (!isWindows) { + t.equal(warnings[0][1], 'Cannot extract through symbolic link') + t.match(warnings[0][2], { + name: 'SylinkError', + path: dir + '/d/i/r/symlink/', + symlink: dir + '/d/i/r/symlink', + }) + } + t.equal(warnings.length, 1) + t.end() + }) + u.end(data) + }) + + t.test('no clobbering, sync', t => { + const warnings = [] + const u = new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + }) + u.end(data) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + if (!isWindows) { + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.throws(_ => fs.statSync(dir + '/d/i/r/symlink/x')) + } + t.equal(warnings.length, 1) + t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') + t.equal(warnings[0][1], 'Cannot extract through symbolic link') + t.match(warnings[0][2], { + name: 'SylinkError', + path: dir + '/d/i/r/symlink/', + symlink: dir + '/d/i/r/symlink', + }) + t.end() + }) + + t.test('extract through symlink', t => { + const warnings = [] + const u = new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + preservePaths: true, + }) + u.on('close', _ => { + t.same(warnings, []) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.ok(fs.lstatSync(dir + '/d/i/r/dir/x').isFile(), 'x thru link') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink/x').isFile(), 'x thru link') + t.end() + }) + u.end(data) + }) + + t.test('extract through symlink sync', t => { + const warnings = [] + const u = new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + preservePaths: true, + }) + u.end(data) + t.same(warnings, []) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.ok(fs.lstatSync(dir + '/d/i/r/dir/x').isFile(), 'x thru link') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink/x').isFile(), 'x thru link') + t.end() + }) + + t.test('clobber through symlink', t => { + const warnings = [] + const u = new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + unlink: true, + }) + u.on('close', _ => { + t.same(warnings, []) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.notOk(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'no link') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isDirectory(), 'sym is dir') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink/x').isFile(), 'x thru link') + t.end() + }) + u.end(data) + }) + + t.test('clobber through symlink with busted unlink', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('unlink', poop)) + const warnings = [] + const u = new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + unlink: true, + }) + u.on('close', _ => { + t.same(warnings, [['TAR_ENTRY_ERROR', 'poop', poop]]) + t.end() + }) + u.end(data) + }) + + t.test('clobber through symlink sync', t => { + const warnings = [] + const u = new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([c, w, d]), + unlink: true, + }) + u.end(data) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.notOk(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'no link') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isDirectory(), 'sym is dir') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink/x').isFile(), 'x thru link') + t.end() + }) + + t.test('clobber dirs', t => { + mkdirp.sync(dir + '/d/i/r/dir') + mkdirp.sync(dir + '/d/i/r/file') + mkdirp.sync(dir + '/d/i/r/link') + mkdirp.sync(dir + '/d/i/r/symlink') + const warnings = [] + const u = new Unpack({ + cwd: dir, + onwarn: (c, w, d) => { + warnings.push([c, w, d]) + }, + }) + u.on('close', _ => { + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.throws(_ => fs.statSync(dir + '/d/i/r/symlink/x')) + t.equal(warnings.length, 1) + t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') + t.equal(warnings[0][1], 'Cannot extract through symbolic link') + t.match(warnings[0][2], { + name: 'SylinkError', + path: dir + '/d/i/r/symlink/', + symlink: dir + '/d/i/r/symlink', + }) + t.end() + }) + u.end(data) + }) + + t.test('clobber dirs sync', t => { + mkdirp.sync(dir + '/d/i/r/dir') + mkdirp.sync(dir + '/d/i/r/file') + mkdirp.sync(dir + '/d/i/r/link') + mkdirp.sync(dir + '/d/i/r/symlink') + const warnings = [] + const u = new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => { + warnings.push([c, w, d]) + }, + }) + u.end(data) + t.equal(fs.lstatSync(dir + '/d/i/r/dir').mode & 0o7777, 0o751) + t.ok(fs.lstatSync(dir + '/d/i/r/file').isFile(), 'got file') + t.ok(fs.lstatSync(dir + '/d/i/r/symlink').isSymbolicLink(), 'got symlink') + t.throws(_ => fs.statSync(dir + '/d/i/r/symlink/x')) + t.equal(warnings.length, 1) + t.equal(warnings[0][0], 'TAR_ENTRY_ERROR') + t.equal(warnings[0][1], 'Cannot extract through symbolic link') + t.match(warnings[0][2], { + name: 'SylinkError', + path: dir + '/d/i/r/symlink/', + symlink: dir + '/d/i/r/symlink', + }) + t.end() + }) + + t.end() +}) + +t.test('unsupported entries', t => { + const dir = path.resolve(unpackdir, 'unsupported-entries') + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + const unknown = new Header({ path: 'qux', type: 'File', size: 4 }) + unknown.type = 'Z' + unknown.encode() + const data = makeTar([ + { + path: 'dev/random', + type: 'CharacterDevice', + }, + { + path: 'dev/hd0', + type: 'BlockDevice', + }, + { + path: 'dev/fifo0', + type: 'FIFO', + }, + // note: unrecognized types are ignored, so this won't emit a warning. + // gnutar and bsdtar treat unrecognized types as 'file', so it may be + // worth doing the same thing, but with a warning. + unknown.block, + 'asdf', + '', + '', + ]) + + t.test('basic, warns', t => { + const warnings = [] + const u = new Unpack({ cwd: dir, onwarn: (c, w, d) => warnings.push([c, w, d]) }) + const c = 'TAR_ENTRY_UNSUPPORTED' + const expect = [ + [c, 'unsupported entry type: CharacterDevice', { + entry: { path: 'dev/random' }}], + [c, 'unsupported entry type: BlockDevice', { + entry: { path: 'dev/hd0' }}], + [c, 'unsupported entry type: FIFO', { + entry: { path: 'dev/fifo0' }}], + ] + u.on('close', _ => { + t.equal(fs.readdirSync(dir).length, 0) + t.match(warnings, expect) + t.end() + }) + u.end(data) + }) + + t.test('strict, throws', t => { + const warnings = [] + const errors = [] + const u = new Unpack({ + cwd: dir, + strict: true, + onwarn: (c, w, d) => warnings.push([c, w, d]), + }) + u.on('error', e => errors.push(e)) + u.on('close', _ => { + t.equal(fs.readdirSync(dir).length, 0) + t.same(warnings, []) + t.match(errors, [ + { + message: 'unsupported entry type: CharacterDevice', + entry: { path: 'dev/random' }, + }, + { + message: 'unsupported entry type: BlockDevice', + entry: { path: 'dev/hd0' }, + }, + { + message: 'unsupported entry type: FIFO', + entry: { path: 'dev/fifo0' }, + }, + ]) + t.end() + }) + u.end(data) + }) + + t.end() +}) + +t.test('file in dir path', t => { + const dir = path.resolve(unpackdir, 'file-junk') + + t.teardown(_ => rimraf(dir)) + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const data = makeTar([ + { + path: 'd/i/r/file', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + { + path: 'd/i/r/file/a/b/c', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'b', + '', + '', + ]) + + t.test('fail because of file', t => { + const check = t => { + t.equal(fs.readFileSync(dir + '/d/i/r/file', 'utf8'), 'a') + t.throws(_ => fs.statSync(dir + '/d/i/r/file/a/b/c')) + t.end() + } + + t.plan(2) + + t.test('async', t => { + new Unpack({ cwd: dir }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ cwd: dir }).end(data) + check(t) + }) + }) + + t.test('clobber on through', t => { + const check = t => { + t.ok(fs.statSync(dir + '/d/i/r/file').isDirectory()) + t.equal(fs.readFileSync(dir + '/d/i/r/file/a/b/c', 'utf8'), 'b') + t.end() + } + + t.plan(2) + + t.test('async', t => { + new Unpack({ cwd: dir, unlink: true }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ cwd: dir, unlink: true }).end(data) + check(t) + }) + }) + + t.end() +}) + +t.test('set umask option', t => { + const dir = path.resolve(unpackdir, 'umask') + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + + const data = makeTar([ + { + path: 'd/i/r/dir', + type: 'Directory', + mode: 0o751, + }, + '', + '', + ]) + + new Unpack({ + umask: 0o027, + cwd: dir, + }).on('close', _ => { + t.equal(fs.statSync(dir + '/d/i/r').mode & 0o7777, isWindows ? 0o666 : 0o750) + t.equal(fs.statSync(dir + '/d/i/r/dir').mode & 0o7777, isWindows ? 0o666 : 0o751) + t.end() + }).end(data) +}) + +t.test('absolute paths', t => { + const dir = path.join(unpackdir, 'absolute-paths') + t.teardown(_ => rimraf(dir)) + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const absolute = path.resolve(dir, 'd/i/r/absolute') + const root = path.parse(absolute).root + const extraAbsolute = root + root + root + absolute + t.ok(path.isAbsolute(extraAbsolute)) + t.ok(path.isAbsolute(absolute)) + const parsed = path.parse(absolute) + const relative = absolute.substr(parsed.root.length) + t.notOk(path.isAbsolute(relative)) + + const data = makeTar([ + { + path: extraAbsolute, + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + '', + '', + ]) + + t.test('warn and correct', t => { + const check = t => { + const r = normPath(root) + t.match(warnings, [[ + `stripping ${r}${r}${r}${r} from absolute path`, + { path: normPath(absolute), code: 'TAR_ENTRY_INFO' }, + ]]) + t.ok(fs.lstatSync(path.resolve(dir, relative)).isFile(), 'is file') + t.end() + } + + const warnings = [] + + t.test('async', t => { + warnings.length = 0 + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + warnings.length = 0 + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.end() + }) + + t.test('preserve absolute path', t => { + // if we use the extraAbsolute path here, we end up creating a dir + // like C:\C:\C:\C:\path\to\absolute, which is both 100% valid on + // windows, as well as SUUUUUPER annoying. + const data = makeTar([ + { + path: isWindows ? absolute : extraAbsolute, + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + '', + '', + ]) + const check = t => { + t.same(warnings, []) + t.ok(fs.lstatSync(absolute).isFile(), 'is file') + t.end() + } + + const warnings = [] + + t.test('async', t => { + warnings.length = 0 + new Unpack({ + preservePaths: true, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + warnings.length = 0 + new UnpackSync({ + preservePaths: true, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.end() + }) + + t.end() +}) + +t.test('.. paths', t => { + const dir = path.join(unpackdir, 'dotted-paths') + t.teardown(_ => rimraf(dir)) + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const fmode = 0o755 + const dotted = 'a/b/c/../d' + const resolved = path.resolve(dir, dotted) + + const data = makeTar([ + { + path: dotted, + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'd', + '', + '', + ]) + + t.test('warn and skip', t => { + const check = t => { + t.match(warnings, [[ + 'path contains \'..\'', + { path: dotted, code: 'TAR_ENTRY_ERROR' }, + ]]) + t.throws(_ => fs.lstatSync(resolved)) + t.end() + } + + const warnings = [] + + t.test('async', t => { + warnings.length = 0 + new Unpack({ + fmode: fmode, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + warnings.length = 0 + new UnpackSync({ + fmode: fmode, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.end() + }) + + t.test('preserve dotted path', t => { + const check = t => { + t.same(warnings, []) + t.ok(fs.lstatSync(resolved).isFile(), 'is file') + t.equal(fs.lstatSync(resolved).mode & 0o777, isWindows ? 0o666 : fmode) + t.end() + } + + const warnings = [] + + t.test('async', t => { + warnings.length = 0 + new Unpack({ + fmode: fmode, + preservePaths: true, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + warnings.length = 0 + new UnpackSync({ + fmode: fmode, + preservePaths: true, + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.end() + }) + + t.end() +}) + +t.test('fail all stats', t => { + const poop = new Error('poop') + poop.code = 'EPOOP' + const dir = normPath(path.join(unpackdir, 'stat-fail')) + const { + stat, + fstat, + lstat, + statSync, + fstatSync, + lstatSync, + } = fs + const unmutate = () => Object.assign(fs, { + stat, + fstat, + lstat, + statSync, + fstatSync, + lstatSync, + }) + const mutate = () => { + fs.stat = fs.lstat = fs.fstat = (...args) => { + // don't fail statting the cwd, or we get different errors + if (normPath(args[0]) === dir) + return lstat(dir, args.pop()) + process.nextTick(() => args.pop()(poop)) + } + fs.statSync = fs.lstatSync = fs.fstatSync = (...args) => { + if (normPath(args[0]) === dir) + return lstatSync(dir) + throw poop + } + } + + const warnings = [] + t.beforeEach(() => { + warnings.length = 0 + mkdirp.sync(dir) + mutate() + }) + t.afterEach(async () => { + unmutate() + await rimraf(dir) + }) + + const data = makeTar([ + { + path: 'd/i/r/file/', + type: 'Directory', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/dir/', + type: 'Directory', + mode: 0o751, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/file', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + { + path: 'd/i/r/link', + type: 'Link', + linkpath: 'd/i/r/file', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/symlink', + type: 'SymbolicLink', + linkpath: './dir', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '', + '', + ]) + + const check = (t, expect) => { + t.match(warnings, expect) + warnings.forEach(w => t.equal(w[0], w[1].message)) + t.end() + } + + t.test('async', t => { + const expect = [ + ['poop', poop], + ['poop', poop], + ] + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t, expect)).end(data) + }) + + t.test('sync', t => { + const expect = [ + [ + String, + { + code: 'EISDIR', + path: normPath(path.resolve(dir, 'd/i/r/file')), + syscall: 'open', + }, + ], + [ + String, + { + dest: normPath(path.resolve(dir, 'd/i/r/link')), + path: normPath(path.resolve(dir, 'd/i/r/file')), + syscall: 'link', + }, + ], + ] + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t, expect) + }) + + t.end() +}) + +t.test('fail symlink', t => { + const poop = new Error('poop') + poop.code = 'EPOOP' + const unmutate = mutateFS.fail('symlink', poop) + const dir = path.join(unpackdir, 'symlink-fail') + t.teardown(async _ => { + unmutate() + await rimraf(dir) + }) + + const warnings = [] + t.beforeEach(async () => { + warnings.length = 0 + await rimraf(dir) + await mkdirp(dir) + }) + + const data = makeTar([ + { + path: 'd/i/r/dir/', + type: 'Directory', + mode: 0o751, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/symlink', + type: 'SymbolicLink', + linkpath: './dir', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '', + '', + ]) + + const check = (t, expect) => { + t.match(warnings, expect) + warnings.forEach(w => t.equal(w[0], w[1].message)) + t.end() + } + + t.test('async', t => { + const expect = [['poop', poop]] + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t, expect)).end(data) + }) + + t.test('sync', t => { + const expect = [['poop', poop]] + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t, expect) + }) + + t.end() +}) + +t.test('fail chmod', t => { + const poop = new Error('poop') + poop.code = 'EPOOP' + const unmutate = mutateFS.fail('chmod', poop) + const dir = path.join(unpackdir, 'chmod-fail') + t.teardown(async _ => { + unmutate() + await rimraf(dir) + }) + + const warnings = [] + t.beforeEach(async () => { + warnings.length = 0 + await rimraf(dir) + await mkdirp(dir) + }) + + const data = makeTar([ + { + path: 'd/i/r/dir/', + type: 'Directory', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/dir/', + type: 'Directory', + mode: 0o751, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '', + '', + ]) + + const check = (t, expect) => { + t.match(warnings, expect) + warnings.forEach(w => t.equal(w[0], w[1].message)) + t.end() + } + + t.test('async', t => { + const expect = [['poop', poop]] + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t, expect)).end(data) + }) + + t.test('sync', t => { + const expect = [['poop', poop]] + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t, expect) + }) + + t.end() +}) + +t.test('fail mkdir', t => { + const poop = new Error('poop') + poop.code = 'EPOOP' + let unmutate + const dir = path.join(unpackdir, 'mkdir-fail') + t.teardown(_ => rimraf(dir)) + + const warnings = [] + t.beforeEach(async () => { + warnings.length = 0 + await rimraf(dir) + await mkdirp(dir) + unmutate = mutateFS.fail('mkdir', poop) + }) + t.afterEach(() => unmutate()) + + const data = makeTar([ + { + path: 'dir/', + type: 'Directory', + mode: 0o751, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '', + '', + ]) + + const expect = [[ + 'ENOENT: no such file or directory', + { + code: 'ENOENT', + syscall: 'lstat', + path: normPath(path.resolve(dir, 'dir')), + }, + ]] + + const check = t => { + t.match(warnings, expect) + warnings.forEach(w => t.equal(w[0], w[1].message)) + t.end() + } + + t.test('sync', t => { + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.test('async', t => { + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.end() +}) + +t.test('fail write', t => { + const poop = new Error('poop') + poop.code = 'EPOOP' + const unmutate = mutateFS.fail('write', poop) + const dir = path.join(unpackdir, 'write-fail') + t.teardown(async _ => { + unmutate() + await rimraf(dir) + }) + + const warnings = [] + t.beforeEach(async () => { + warnings.length = 0 + await rimraf(dir) + await mkdirp(dir) + }) + + const data = makeTar([ + { + path: 'x', + type: 'File', + size: 1, + mode: 0o751, + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'x', + '', + '', + ]) + + const expect = [['poop', poop]] + + const check = t => { + t.match(warnings, expect) + warnings.forEach(w => t.equal(w[0], w[1].message)) + t.end() + } + + t.test('async', t => { + new Unpack({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ + cwd: dir, + onwarn: (c, w, d) => warnings.push([w, d]), + }).end(data) + check(t) + }) + + t.end() +}) + +t.test('skip existing', t => { + const dir = path.join(unpackdir, 'skip-newer') + t.teardown(_ => rimraf(dir)) + + const date = new Date('2011-03-27T22:16:31.000Z') + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + fs.writeFileSync(dir + '/x', 'y') + fs.utimesSync(dir + '/x', date, date) + }) + + const data = makeTar([ + { + path: 'x', + type: 'File', + size: 1, + mode: 0o751, + mtime: new Date('2013-12-19T17:00:00.000Z'), + }, + 'x', + '', + '', + ]) + + const check = t => { + const st = fs.lstatSync(dir + '/x') + t.equal(st.atime.toISOString(), date.toISOString()) + t.equal(st.mtime.toISOString(), date.toISOString()) + const data = fs.readFileSync(dir + '/x', 'utf8') + t.equal(data, 'y') + t.end() + } + + t.test('async', t => { + new Unpack({ + cwd: dir, + keep: true, + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ + cwd: dir, + keep: true, + }).end(data) + check(t) + }) + + t.end() +}) + +t.test('skip newer', t => { + const dir = path.join(unpackdir, 'skip-newer') + t.teardown(_ => rimraf(dir)) + + const date = new Date('2013-12-19T17:00:00.000Z') + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + fs.writeFileSync(dir + '/x', 'y') + fs.utimesSync(dir + '/x', date, date) + }) + + const data = makeTar([ + { + path: 'x', + type: 'File', + size: 1, + mode: 0o751, + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'x', + '', + '', + ]) + + const check = t => { + const st = fs.lstatSync(dir + '/x') + t.equal(st.atime.toISOString(), date.toISOString()) + t.equal(st.mtime.toISOString(), date.toISOString()) + const data = fs.readFileSync(dir + '/x', 'utf8') + t.equal(data, 'y') + t.end() + } + + t.test('async', t => { + new Unpack({ + cwd: dir, + newer: true, + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ + cwd: dir, + newer: true, + }).end(data) + check(t) + }) + + t.end() +}) + +t.test('no mtime', t => { + const dir = path.join(unpackdir, 'skip-newer') + t.teardown(_ => rimraf(dir)) + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const date = new Date('2011-03-27T22:16:31.000Z') + const data = makeTar([ + { + path: 'x/', + type: 'Directory', + size: 0, + atime: date, + ctime: date, + mtime: date, + }, + { + path: 'x/y', + type: 'File', + size: 1, + mode: 0o751, + atime: date, + ctime: date, + mtime: date, + }, + 'x', + '', + '', + ]) + + const check = t => { + // this may fail if it's run on March 27, 2011 + const stx = fs.lstatSync(dir + '/x') + t.not(stx.atime.toISOString(), date.toISOString()) + t.not(stx.mtime.toISOString(), date.toISOString()) + const sty = fs.lstatSync(dir + '/x/y') + t.not(sty.atime.toISOString(), date.toISOString()) + t.not(sty.mtime.toISOString(), date.toISOString()) + const data = fs.readFileSync(dir + '/x/y', 'utf8') + t.equal(data, 'x') + t.end() + } + + t.test('async', t => { + new Unpack({ + cwd: dir, + noMtime: true, + }).on('close', _ => check(t)).end(data) + }) + + t.test('sync', t => { + new UnpackSync({ + cwd: dir, + noMtime: true, + }).end(data) + check(t) + }) + + t.end() +}) + +t.test('unpack big enough to pause/drain', t => { + const dir = path.resolve(unpackdir, 'drain-clog') + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + const stream = fs.createReadStream(fixtures + '/parses.tar') + const u = new Unpack({ + cwd: dir, + strip: 3, + strict: true, + }) + + u.on('ignoredEntry', entry => + t.fail('should not get ignored entry: ' + entry.path)) + + u.on('close', _ => { + t.pass('extraction finished') + const actual = fs.readdirSync(dir) + const expected = fs.readdirSync(parses) + t.same(actual, expected) + t.end() + }) + + stream.pipe(u) +}) + +t.test('set owner', t => { + // fake it on platforms that don't have getuid + const myUid = 501 + const myGid = 1024 + const getuid = process.getuid + const getgid = process.getgid + process.getuid = _ => myUid + process.getgid = _ => myGid + t.teardown(_ => (process.getuid = getuid, process.getgid = getgid)) + + // can't actually do this because it requires root, but we can + // verify that chown gets called. + t.test('as root, defaults to true', t => { + const getuid = process.getuid + process.getuid = _ => 0 + const u = new Unpack() + t.equal(u.preserveOwner, true, 'preserveOwner enabled') + process.getuid = getuid + t.end() + }) + + t.test('as non-root, defaults to false', t => { + const getuid = process.getuid + process.getuid = _ => 501 + const u = new Unpack() + t.equal(u.preserveOwner, false, 'preserveOwner disabled') + process.getuid = getuid + t.end() + }) + + const data = makeTar([ + { + uid: 2456124561, + gid: 813708013, + path: 'foo/', + type: 'Directory', + }, + { + uid: myUid, + gid: 813708013, + path: 'foo/my-uid-different-gid', + type: 'File', + size: 3, + }, + 'qux', + { + uid: 2456124561, + path: 'foo/different-uid-nogid', + type: 'Directory', + }, + { + uid: 2456124561, + path: 'foo/different-uid-nogid/bar', + type: 'File', + size: 3, + }, + 'qux', + { + gid: 813708013, + path: 'foo/different-gid-nouid/bar', + type: 'File', + size: 3, + }, + 'qux', + { + uid: myUid, + gid: myGid, + path: 'foo-mine/', + type: 'Directory', + }, + { + uid: myUid, + gid: myGid, + path: 'foo-mine/bar', + type: 'File', + size: 3, + }, + 'qux', + { + uid: myUid, + path: 'foo-mine/nogid', + type: 'Directory', + }, + { + uid: myUid, + path: 'foo-mine/nogid/bar', + type: 'File', + size: 3, + }, + 'qux', + '', + '', + ]) + + t.test('chown failure results in unpack failure', t => { + const dir = path.resolve(unpackdir, 'chown') + const poop = new Error('expected chown failure') + const un = mutateFS.fail('chown', poop) + const unl = mutateFS.fail('lchown', poop) + const unf = mutateFS.fail('fchown', poop) + + t.teardown(async () => { + un() + unf() + unl() + await rimraf(dir) + }) + + t.test('sync', t => { + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + let warned = false + const u = new Unpack.Sync({ + cwd: dir, + preserveOwner: true, + onwarn: (c, m, er) => { + if (!warned) { + warned = true + t.equal(er, poop) + t.end() + } + }, + }) + u.end(data) + }) + + t.test('async', t => { + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + let warned = false + const u = new Unpack({ + cwd: dir, + preserveOwner: true, + onwarn: (c, m, er) => { + if (!warned) { + warned = true + t.equal(er, poop) + t.end() + } + }, + }) + u.end(data) + }) + + t.end() + }) + + t.test('chown when true', t => { + const dir = path.resolve(unpackdir, 'chown') + const chown = fs.chown + const lchown = fs.lchown + const fchown = fs.fchown + const chownSync = fs.chownSync + const fchownSync = fs.fchownSync + const lchownSync = fs.lchownSync + let called = 0 + fs.fchown = fs.chown = fs.lchown = (path, owner, group, cb) => { + called++ + cb() + } + fs.chownSync = fs.lchownSync = fs.fchownSync = _ => called++ + + t.teardown(_ => { + fs.chown = chown + fs.fchown = fchown + fs.lchown = lchown + fs.chownSync = chownSync + fs.fchownSync = fchownSync + fs.lchownSync = lchownSync + }) + + t.test('sync', t => { + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + called = 0 + const u = new Unpack.Sync({ cwd: dir, preserveOwner: true }) + u.end(data) + t.ok(called >= 5, 'called chowns') + t.end() + }) + + t.test('async', t => { + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + called = 0 + const u = new Unpack({ cwd: dir, preserveOwner: true }) + u.end(data) + u.on('close', _ => { + t.ok(called >= 5, 'called chowns') + t.end() + }) + }) + + t.end() + }) + + t.test('no chown when false', t => { + const dir = path.resolve(unpackdir, 'nochown') + const poop = new Error('poop') + const un = mutateFS.fail('chown', poop) + const unf = mutateFS.fail('fchown', poop) + const unl = mutateFS.fail('lchown', poop) + t.teardown(async _ => { + un() + unf() + unl() + await rimraf(dir) + }) + + t.beforeEach(() => mkdirp(dir)) + t.afterEach(() => rimraf(dir)) + + const check = t => { + const dirStat = fs.statSync(dir + '/foo') + t.not(dirStat.uid, 2456124561) + t.not(dirStat.gid, 813708013) + const fileStat = fs.statSync(dir + '/foo/my-uid-different-gid') + t.not(fileStat.uid, 2456124561) + t.not(fileStat.gid, 813708013) + const dirStat2 = fs.statSync(dir + '/foo/different-uid-nogid') + t.not(dirStat2.uid, 2456124561) + const fileStat2 = fs.statSync(dir + '/foo/different-uid-nogid/bar') + t.not(fileStat2.uid, 2456124561) + t.end() + } + + t.test('sync', t => { + const u = new Unpack.Sync({ cwd: dir, preserveOwner: false }) + u.end(data) + check(t) + }) + + t.test('async', t => { + const u = new Unpack({ cwd: dir, preserveOwner: false }) + u.end(data) + u.on('close', _ => check(t)) + }) + + t.end() + }) + + t.end() +}) + +t.test('unpack when dir is not writable', t => { + const data = makeTar([ + { + path: 'a/', + type: 'Directory', + mode: 0o444, + }, + { + path: 'a/b', + type: 'File', + size: 1, + }, + 'a', + '', + '', + ]) + + const dir = path.resolve(unpackdir, 'nowrite-dir') + t.beforeEach(() => mkdirp(dir)) + t.afterEach(() => rimraf(dir)) + + const check = t => { + t.equal(fs.statSync(dir + '/a').mode & 0o7777, isWindows ? 0o666 : 0o744) + t.equal(fs.readFileSync(dir + '/a/b', 'utf8'), 'a') + t.end() + } + + t.test('sync', t => { + const u = new Unpack.Sync({ cwd: dir, strict: true }) + u.end(data) + check(t) + }) + + t.test('async', t => { + const u = new Unpack({ cwd: dir, strict: true }) + u.end(data) + u.on('close', _ => check(t)) + }) + + t.end() +}) + +t.test('transmute chars on windows', t => { + const data = makeTar([ + { + path: '<|>?:.txt', + size: 5, + type: 'File', + }, + '<|>?:', + '', + '', + ]) + + const dir = path.resolve(unpackdir, 'winchars') + t.beforeEach(() => mkdirp(dir)) + t.afterEach(() => rimraf(dir)) + + const hex = 'ef80bcef81bcef80beef80bfef80ba2e747874' + const uglyName = Buffer.from(hex, 'hex').toString() + const ugly = path.resolve(dir, uglyName) + + const check = t => { + t.same(fs.readdirSync(dir), [uglyName]) + t.equal(fs.readFileSync(ugly, 'utf8'), '<|>?:') + t.end() + } + + t.test('async', t => { + const u = new Unpack({ + cwd: dir, + win32: true, + }) + u.end(data) + u.on('close', _ => check(t)) + }) + + t.test('sync', t => { + const u = new Unpack.Sync({ + cwd: dir, + win32: true, + }) + u.end(data) + check(t) + }) + + t.end() +}) + +t.test('safely transmute chars on windows with absolutes', t => { + // don't actually make the directory + const poop = new Error('poop') + t.teardown(mutateFS.fail('mkdir', poop)) + + const data = makeTar([ + { + path: 'c:/x/y/z/<|>?:.txt', + size: 5, + type: 'File', + }, + '<|>?:', + '', + '', + ]) + + const hex = 'ef80bcef81bcef80beef80bfef80ba2e747874' + const uglyName = Buffer.from(hex, 'hex').toString() + const uglyPath = 'c:/x/y/z/' + uglyName + + const u = new Unpack({ + win32: true, + preservePaths: true, + }) + u.on('entry', entry => { + t.equal(entry.path, uglyPath) + t.end() + }) + + u.end(data) +}) + +t.test('use explicit chmod when required by umask', t => { + process.umask(0o022) + + const basedir = path.resolve(unpackdir, 'umask-chmod') + + const data = makeTar([ + { + path: 'x/y/z', + mode: 0o775, + type: 'Directory', + }, + '', + '', + ]) + + const check = async t => { + const st = fs.statSync(basedir + '/x/y/z') + t.equal(st.mode & 0o777, isWindows ? 0o666 : 0o775) + await rimraf(basedir) + t.end() + } + + t.test('async', t => { + mkdirp.sync(basedir) + const unpack = new Unpack({ cwd: basedir }) + unpack.on('close', _ => check(t)) + unpack.end(data) + }) + + return t.test('sync', t => { + mkdirp.sync(basedir) + const unpack = new Unpack.Sync({ cwd: basedir }) + unpack.end(data) + check(t) + }) +}) + +t.test('dont use explicit chmod if noChmod flag set', t => { + process.umask(0o022) + const { umask } = process + t.teardown(() => process.umask = umask) + process.umask = () => { + throw new Error('should not call process.umask()') + } + + const basedir = path.resolve(unpackdir, 'umask-no-chmod') + + const data = makeTar([ + { + path: 'x/y/z', + mode: 0o775, + type: 'Directory', + }, + '', + '', + ]) + + const check = async t => { + const st = fs.statSync(basedir + '/x/y/z') + t.equal(st.mode & 0o777, isWindows ? 0o666 : 0o755) + await rimraf(basedir) + t.end() + } + + t.test('async', t => { + mkdirp.sync(basedir) + const unpack = new Unpack({ cwd: basedir, noChmod: true }) + unpack.on('close', _ => check(t)) + unpack.end(data) + }) + + return t.test('sync', t => { + mkdirp.sync(basedir) + const unpack = new Unpack.Sync({ cwd: basedir, noChmod: true}) + unpack.end(data) + check(t) + }) +}) + +t.test('chown implicit dirs and also the entries', t => { + const basedir = path.resolve(unpackdir, 'chownr') + + // club these so that the test can run as non-root + const chown = fs.chown + const chownSync = fs.chownSync + const lchown = fs.lchown + const lchownSync = fs.lchownSync + const fchown = fs.fchown + const fchownSync = fs.fchownSync + + const getuid = process.getuid + const getgid = process.getgid + t.teardown(_ => { + fs.chown = chown + fs.chownSync = chownSync + fs.lchown = lchown + fs.lchownSync = lchownSync + fs.fchown = fchown + fs.fchownSync = fchownSync + process.getgid = getgid + }) + + let chowns = 0 + + let currentTest = null + fs.lchown = fs.fchown = fs.chown = (path, uid, gid, cb) => { + currentTest.equal(uid, 420, 'chown(' + path + ') uid') + currentTest.equal(gid, 666, 'chown(' + path + ') gid') + chowns++ + cb() + } + + fs.lchownSync = fs.chownSync = fs.fchownSync = (path, uid, gid) => { + currentTest.equal(uid, 420, 'chownSync(' + path + ') uid') + currentTest.equal(gid, 666, 'chownSync(' + path + ') gid') + chowns++ + } + + const data = makeTar([ + { + path: 'a/b/c', + mode: 0o775, + type: 'File', + size: 1, + uid: null, + gid: null, + }, + '.', + { + path: 'x/y/z', + mode: 0o775, + uid: 12345, + gid: 54321, + type: 'File', + size: 1, + }, + '.', + '', + '', + ]) + + const check = async t => { + currentTest = null + t.equal(chowns, 8) + chowns = 0 + await rimraf(basedir) + t.end() + } + + t.test('throws when setting uid/gid improperly', t => { + t.throws(_ => new Unpack({ uid: 420 }), + TypeError('cannot set owner without number uid and gid')) + t.throws(_ => new Unpack({ gid: 666 }), + TypeError('cannot set owner without number uid and gid')) + t.throws(_ => new Unpack({ uid: 1, gid: 2, preserveOwner: true }), + TypeError('cannot preserve owner in archive and also set owner explicitly')) + t.end() + }) + + const tests = () => + t.test('async', t => { + currentTest = t + mkdirp.sync(basedir) + const unpack = new Unpack({ cwd: basedir, uid: 420, gid: 666 }) + unpack.on('close', _ => check(t)) + unpack.end(data) + }).then(t.test('sync', t => { + currentTest = t + mkdirp.sync(basedir) + const unpack = new Unpack.Sync({ cwd: basedir, uid: 420, gid: 666 }) + unpack.end(data) + check(t) + })) + + tests() + + t.test('make it look like processUid is 420', t => { + process.getuid = () => 420 + t.end() + }) + + tests() + + t.test('make it look like processGid is 666', t => { + process.getuid = getuid + process.getgid = () => 666 + t.end() + }) + + return tests() +}) + +t.test('bad cwd setting', t => { + const basedir = path.resolve(unpackdir, 'bad-cwd') + mkdirp.sync(basedir) + t.teardown(_ => rimraf(basedir)) + + const cases = [ + // the cwd itself + { + path: './', + type: 'Directory', + }, + // a file directly in the cwd + { + path: 'a', + type: 'File', + }, + // a file nested within a subdir of the cwd + { + path: 'a/b/c', + type: 'File', + }, + ] + + fs.writeFileSync(basedir + '/file', 'xyz') + + cases.forEach(c => t.test(c.type + ' ' + c.path, t => { + const data = makeTar([ + { + path: c.path, + mode: 0o775, + type: c.type, + size: 0, + uid: null, + gid: null, + }, + '', + '', + ]) + + t.test('cwd is a file', t => { + const cwd = basedir + '/file' + const opt = { cwd: cwd } + + t.throws(_ => new Unpack.Sync(opt).end(data), { + name: 'CwdError', + message: 'ENOTDIR: Cannot cd into \'' + normPath(cwd) + '\'', + path: normPath(cwd), + code: 'ENOTDIR', + }) + + new Unpack(opt).on('error', er => { + t.match(er, { + name: 'CwdError', + message: 'ENOTDIR: Cannot cd into \'' + normPath(cwd) + '\'', + path: normPath(cwd), + code: 'ENOTDIR', + }) + t.end() + }).end(data) + }) + + return t.test('cwd is missing', t => { + const cwd = basedir + '/asdf/asdf/asdf' + const opt = { cwd: cwd } + + t.throws(_ => new Unpack.Sync(opt).end(data), { + name: 'CwdError', + message: 'ENOENT: Cannot cd into \'' + normPath(cwd) + '\'', + path: normPath(cwd), + code: 'ENOENT', + }) + + new Unpack(opt).on('error', er => { + t.match(er, { + name: 'CwdError', + message: 'ENOENT: Cannot cd into \'' + normPath(cwd) + '\'', + path: normPath(cwd), + code: 'ENOENT', + }) + t.end() + }).end(data) + }) + })) + + t.end() +}) + +t.test('transform', t => { + const basedir = path.resolve(unpackdir, 'transform') + t.teardown(_ => rimraf(basedir)) + + const cases = { + 'emptypax.tar': { + '🌟.txt': '🌟✧✩⭐︎✪✫✬✭✮⚝✯✰✵✶✷✸✹❂⭑⭒★☆✡☪✴︎✦✡️🔯✴️🌠\n', + 'one-byte.txt': '[a]', + }, + 'body-byte-counts.tar': { + '1024-bytes.txt': new Array(1024).join('[x]') + '[\n]', + '512-bytes.txt': new Array(512).join('[x]') + '[\n]', + 'one-byte.txt': '[a]', + 'zero-byte.txt': '', + }, + 'utf8.tar': { + '🌟.txt': '🌟✧✩⭐︎✪✫✬✭✮⚝✯✰✵✶✷✸✹❂⭑⭒★☆✡☪✴︎✦✡️🔯✴️🌠\n', + 'Ω.txt': '[Ω]', + 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt': '[Ω]', + }, + } + + const txFn = entry => { + switch (path.basename(entry.path)) { + case 'zero-bytes.txt': + return entry + + case 'one-byte.txt': + case '1024-bytes.txt': + case '512-bytes.txt': + case 'Ω.txt': + return new Bracer() + } + } + + class Bracer extends MiniPass { + write (data) { + const d = data.toString().split('').map(c => '[' + c + ']').join('') + return super.write(d) + } + } + + const tarfiles = Object.keys(cases) + t.plan(tarfiles.length) + t.jobs = tarfiles.length + + tarfiles.forEach(tarfile => { + t.test(tarfile, t => { + const tf = path.resolve(tars, tarfile) + const dir = path.resolve(basedir, tarfile) + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + const check = t => { + const expect = cases[tarfile] + Object.keys(expect).forEach(file => { + const f = path.resolve(dir, file) + t.equal(fs.readFileSync(f, 'utf8'), expect[file], file) + }) + t.end() + } + + t.plan(2) + + t.test('async unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack({ cwd: dir, strict: true, transform: txFn }) + fs.createReadStream(tf).pipe(unpack) + eos(unpack, _ => check(t)) + }) + t.test('loose', t => { + const unpack = new Unpack({ cwd: dir, transform: txFn }) + fs.createReadStream(tf).pipe(unpack) + eos(unpack, _ => check(t)) + }) + }) + + t.test('sync unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new UnpackSync({ cwd: dir, strict: true, transform: txFn }) + unpack.end(fs.readFileSync(tf)) + check(t) + }) + t.test('loose', t => { + const unpack = new UnpackSync({ cwd: dir, transform: txFn }) + unpack.end(fs.readFileSync(tf)) + check(t) + }) + }) + }) + }) +}) + +t.test('transform error', t => { + const dir = path.resolve(unpackdir, 'transform-error') + mkdirp.sync(dir) + t.teardown(_ => rimraf(dir)) + + const tarfile = path.resolve(tars, 'body-byte-counts.tar') + const tardata = fs.readFileSync(tarfile) + const poop = new Error('poop') + + const txFn = () => { + const tx = new MiniPass() + tx.write = () => tx.emit('error', poop) + tx.resume() + return tx + } + + t.test('sync unpack', t => { + t.test('strict', t => { + const unpack = new UnpackSync({ cwd: dir, strict: true, transform: txFn }) + const expect = 3 + let actual = 0 + unpack.on('error', er => { + t.equal(er, poop) + actual++ + }) + unpack.end(tardata) + t.equal(actual, expect, 'error count') + t.end() + }) + t.test('loose', t => { + const unpack = new UnpackSync({ cwd: dir, transform: txFn }) + const expect = 3 + let actual = 0 + unpack.on('warn', (code, msg, er) => { + t.equal(er, poop) + actual++ + }) + unpack.end(tardata) + t.equal(actual, expect, 'error count') + t.end() + }) + t.end() + }) + t.test('async unpack', t => { + // the last error is about the folder being deleted, just ignore that one + t.test('strict', t => { + const unpack = new Unpack({ cwd: dir, strict: true, transform: txFn }) + t.plan(3) + t.teardown(() => { + unpack.removeAllListeners('error') + unpack.on('error', () => {}) + }) + unpack.on('error', er => t.equal(er, poop)) + unpack.end(tardata) + }) + t.test('loose', t => { + const unpack = new Unpack({ cwd: dir, transform: txFn }) + t.plan(3) + t.teardown(() => unpack.removeAllListeners('warn')) + unpack.on('warn', (code, msg, er) => t.equal(er, poop)) + unpack.end(tardata) + }) + t.end() + }) + + t.end() +}) + +t.test('futimes/fchown failures', t => { + const archive = path.resolve(tars, 'utf8.tar') + const dir = path.resolve(unpackdir, 'futimes-fchown-fails') + const tardata = fs.readFileSync(archive) + + const poop = new Error('poop') + const second = new Error('second error') + + t.beforeEach(async () => { + await rimraf(dir) + await mkdirp(dir) + }) + + t.teardown(() => rimraf(dir)) + + const methods = ['utimes', 'chown'] + methods.forEach(method => { + const fc = method === 'chown' + t.test(method + ' fallback', t => { + t.teardown(mutateFS.fail('f' + method, poop)) + // forceChown will fail on systems where the user is not root + // and/or the uid/gid in the archive aren't valid. We're just + // verifying coverage here, so make the method auto-pass. + t.teardown(mutateFS.pass(method)) + t.plan(2) + t.test('async unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack({ cwd: dir, strict: true, forceChown: fc }) + unpack.on('finish', t.end) + unpack.end(tardata) + }) + t.test('loose', t => { + const unpack = new Unpack({ cwd: dir, forceChown: fc }) + unpack.on('finish', t.end) + unpack.on('warn', t.fail) + unpack.end(tardata) + }) + }) + t.test('sync unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack.Sync({ cwd: dir, strict: true, forceChown: fc }) + unpack.end(tardata) + t.end() + }) + t.test('loose', t => { + const unpack = new Unpack.Sync({ cwd: dir, forceChown: fc }) + unpack.on('warn', t.fail) + unpack.end(tardata) + t.end() + }) + }) + }) + + t.test('also fail ' + method, t => { + const unmutate = mutateFS.fail('f' + method, poop) + const unmutate2 = mutateFS.fail(method, second) + t.teardown(() => { + unmutate() + unmutate2() + }) + t.plan(2) + t.test('async unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack({ cwd: dir, strict: true, forceChown: fc }) + t.plan(3) + unpack.on('error', er => t.equal(er, poop)) + unpack.end(tardata) + }) + t.test('loose', t => { + const unpack = new Unpack({ cwd: dir, forceChown: fc }) + t.plan(3) + unpack.on('warn', (code, m, er) => t.equal(er, poop)) + unpack.end(tardata) + }) + }) + t.test('sync unpack', t => { + t.plan(2) + t.test('strict', t => { + const unpack = new Unpack.Sync({ cwd: dir, strict: true, forceChown: fc }) + t.plan(3) + unpack.on('error', er => t.equal(er, poop)) + unpack.end(tardata) + }) + t.test('loose', t => { + const unpack = new Unpack.Sync({ cwd: dir, forceChown: fc }) + t.plan(3) + unpack.on('warn', (c, m, er) => t.equal(er, poop)) + unpack.end(tardata) + }) + }) + }) + }) + + t.end() +}) + +t.test('onentry option is preserved', t => { + const basedir = path.resolve(unpackdir, 'onentry-method') + mkdirp.sync(basedir) + t.teardown(() => rimraf(basedir)) + + let oecalls = 0 + const onentry = entry => oecalls++ + const data = makeTar([ + { + path: 'd/i', + type: 'Directory', + }, + { + path: 'd/i/r/dir', + type: 'Directory', + mode: 0o751, + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + { + path: 'd/i/r/file', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + '', + '', + ]) + + const check = t => { + t.equal(oecalls, 3) + oecalls = 0 + t.end() + } + + t.test('sync', t => { + const dir = path.join(basedir, 'sync') + mkdirp.sync(dir) + const unpack = new UnpackSync({ cwd: dir, onentry }) + unpack.end(data) + check(t) + }) + + t.test('async', t => { + const dir = path.join(basedir, 'async') + mkdirp.sync(dir) + const unpack = new Unpack({ cwd: dir, onentry }) + unpack.on('finish', () => check(t)) + unpack.end(data) + }) + + t.end() +}) + +t.test('do not reuse hardlinks, only nlink=1 files', t => { + const basedir = path.resolve(unpackdir, 'hardlink-reuse') + mkdirp.sync(basedir) + t.teardown(() => rimraf(basedir)) + + const now = new Date('2018-04-30T18:30:39.025Z') + + const data = makeTar([ + { + path: 'overwriteme', + type: 'File', + size: 4, + mode: 0o644, + mtime: now, + }, + 'foo\n', + { + path: 'link', + linkpath: 'overwriteme', + type: 'Link', + mode: 0o644, + mtime: now, + }, + { + path: 'link', + type: 'File', + size: 4, + mode: 0o644, + mtime: now, + }, + 'bar\n', + '', + '', + ]) + + const checks = { + link: 'bar\n', + overwriteme: 'foo\n', + } + + const check = t => { + for (const f in checks) { + t.equal(fs.readFileSync(basedir + '/' + f, 'utf8'), checks[f], f) + t.equal(fs.statSync(basedir + '/' + f).nlink, 1, f) + } + t.end() + } + + t.test('async', t => { + const u = new Unpack({ cwd: basedir }) + u.on('close', () => check(t)) + u.end(data) + }) + + t.test('sync', t => { + const u = new UnpackSync({ cwd: basedir }) + u.end(data) + check(t) + }) + + t.end() +}) + +t.test('trying to unpack a non-zlib gzip file should fail', t => { + const data = Buffer.from('hello this is not gzip data') + const dataGzip = Buffer.concat([Buffer.from([0x1f, 0x8b]), data]) + const basedir = path.resolve(unpackdir, 'bad-archive') + t.test('abort if gzip has an error', t => { + t.plan(2) + const expect = { + message: /^zlib/, + errno: Number, + code: /^Z/, + recoverable: false, + cwd: normPath(basedir), + tarCode: 'TAR_ABORT', + } + const opts = { + cwd: basedir, + gzip: true, + } + new Unpack(opts) + .once('error', er => t.match(er, expect, 'async emits')) + .end(dataGzip) + const skip = !/^v([0-9]|1[0-3])\./.test(process.version) ? false + : 'node prior to v14 did not raise sync zlib errors properly' + t.throws(() => new UnpackSync(opts).end(dataGzip), + expect, 'sync throws', {skip}) + }) + + t.test('bad archive if no gzip', t => { + t.plan(2) + const expect = { + tarCode: 'TAR_BAD_ARCHIVE', + recoverable: false, + } + const opts = { cwd: basedir } + new Unpack(opts) + .on('error', er => t.match(er, expect, 'async emits')) + .end(data) + t.throws(() => new UnpackSync(opts).end(data), expect, 'sync throws') + }) + + t.end() +}) + +t.test('handle errors on fs.close', t => { + const poop = new Error('poop') + const { close, closeSync } = fs + // have to actually close them, or else windows gets mad + fs.close = (fd, cb) => close(fd, () => cb(poop)) + fs.closeSync = (fd) => { + closeSync(fd) + throw poop + } + t.teardown(() => Object.assign(fs, { close, closeSync })) + const dir = path.resolve(unpackdir, 'close-fail') + mkdirp.sync(dir + '/sync') + mkdirp.sync(dir + '/async') + const data = makeTar([ + { + path: 'file', + type: 'File', + size: 1, + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + 'a', + '', + '', + ]) + + t.plan(2) + new Unpack({ cwd: dir + '/async', strict: true }) + .on('error', er => t.equal(er, poop, 'async')) + .end(data) + t.throws(() => new UnpackSync({ + cwd: normPath(dir + '/sync'), strict: true, + }).end(data), poop, 'sync') +}) + +t.test('drop entry from dirCache if no longer a directory', { + skip: isWindows && 'symlinks not fully supported', +}, t => { + const dir = path.resolve(unpackdir, 'dir-cache-error') + mkdirp.sync(dir + '/sync/y') + mkdirp.sync(dir + '/async/y') + const data = makeTar([ + { + path: 'x', + type: 'Directory', + }, + { + path: 'x', + type: 'SymbolicLink', + linkpath: './y', + }, + { + path: 'x/ginkoid', + type: 'File', + size: 'ginkoid'.length, + }, + 'ginkoid', + '', + '', + ]) + t.plan(2) + const WARNINGS = {} + const check = (t, path) => { + t.equal(fs.statSync(path + '/x').isDirectory(), true) + t.equal(fs.lstatSync(path + '/x').isSymbolicLink(), true) + t.equal(fs.statSync(path + '/y').isDirectory(), true) + t.strictSame(fs.readdirSync(path + '/y'), []) + t.throws(() => fs.readFileSync(path + '/x/ginkoid'), { code: 'ENOENT' }) + t.strictSame(WARNINGS[path], [ + 'TAR_ENTRY_ERROR', + 'Cannot extract through symbolic link', + ]) + t.end() + } + t.test('async', t => { + const path = dir + '/async' + new Unpack({ cwd: path }) + .on('warn', (code, msg) => WARNINGS[path] = [code, msg]) + .on('end', () => check(t, path)) + .end(data) + }) + t.test('sync', t => { + const path = dir + '/sync' + new UnpackSync({ cwd: path }) + .on('warn', (code, msg) => WARNINGS[path] = [code, msg]) + .end(data) + check(t, path) + }) +}) + +t.test('using strip option when top level file exists', t => { + const dir = path.resolve(unpackdir, 'strip-with-top-file') + mkdirp.sync(dir + '/sync/y') + mkdirp.sync(dir + '/async/y') + const data = makeTar([ + { + path: 'top', + type: 'File', + size: 0, + }, + { + path: 'x', + type: 'Directory', + }, + { + path: 'x/a', + type: 'File', + size: 'a'.length, + }, + 'a', + { + path: 'y', + type: 'GNUDumpDir', + }, + { + path: 'y/b', + type: 'File', + size: 'b'.length, + }, + 'b', + '', + '', + ]) + t.plan(2) + const check = (t, path) => { + t.equal(fs.statSync(path).isDirectory(), true) + t.equal(fs.readFileSync(path + '/a', 'utf8'), 'a') + t.equal(fs.readFileSync(path + '/b', 'utf8'), 'b') + t.throws(() => fs.statSync(path + '/top'), { code: 'ENOENT' }) + t.end() + } + t.test('async', t => { + const path = dir + '/async' + new Unpack({ cwd: path, strip: 1 }) + .on('end', () => check(t, path)) + .end(data) + }) + t.test('sync', t => { + const path = dir + '/sync' + new UnpackSync({ cwd: path, strip: 1 }).end(data) + check(t, path) + }) +}) + +t.test('handle EPERMs when creating symlinks', t => { + // https://github.com/npm/node-tar/issues/265 + const msg = 'You do not have sufficient privilege to perform this operation.' + const er = Object.assign(new Error(msg), { + code: 'EPERM', + }) + t.teardown(mutateFS.fail('symlink', er)) + const data = makeTar([ + { + path: 'x', + type: 'Directory', + }, + { + path: 'x/y', + type: 'File', + size: 'hello, world'.length, + }, + 'hello, world', + { + path: 'x/link1', + type: 'SymbolicLink', + linkpath: './y', + }, + { + path: 'x/link2', + type: 'SymbolicLink', + linkpath: './y', + }, + { + path: 'x/link3', + type: 'SymbolicLink', + linkpath: './y', + }, + { + path: 'x/z', + type: 'File', + size: 'hello, world'.length, + }, + 'hello, world', + '', + '', + ]) + + const dir = path.resolve(unpackdir, 'eperm-symlinks') + mkdirp.sync(`${dir}/sync`) + mkdirp.sync(`${dir}/async`) + + const check = path => { + t.match(WARNINGS, [ + ['TAR_ENTRY_ERROR', msg], + ['TAR_ENTRY_ERROR', msg], + ['TAR_ENTRY_ERROR', msg], + ], 'got expected warnings') + t.equal(WARNINGS.length, 3) + WARNINGS.length = 0 + t.equal(fs.readFileSync(`${path}/x/y`, 'utf8'), 'hello, world') + t.equal(fs.readFileSync(`${path}/x/z`, 'utf8'), 'hello, world') + t.throws(() => fs.statSync(`${path}/x/link1`), { code: 'ENOENT' }) + t.throws(() => fs.statSync(`${path}/x/link2`), { code: 'ENOENT' }) + t.throws(() => fs.statSync(`${path}/x/link3`), { code: 'ENOENT' }) + } + + const WARNINGS = [] + const u = new Unpack({ + cwd: `${dir}/async`, + onwarn: (code, msg, er) => WARNINGS.push([code, msg]), + }) + u.on('end', () => { + check(`${dir}/async`) + const u = new UnpackSync({ + cwd: `${dir}/sync`, + onwarn: (code, msg, er) => WARNINGS.push([code, msg]), + }) + u.end(data) + check(`${dir}/sync`) + t.end() + }) + u.end(data) +}) + +t.test('close fd when error writing', t => { + const data = makeTar([ + { + type: 'Directory', + path: 'x', + }, + { + type: 'File', + size: 1, + path: 'x/y', + }, + '.', + '', + '', + ]) + t.teardown(mutateFS.fail('write', new Error('nope'))) + const CLOSES = [] + const OPENS = {} + const {open} = require('fs') + t.teardown(() => fs.open = open) + fs.open = (...args) => { + const cb = args.pop() + args.push((er, fd) => { + OPENS[args[0]] = fd + cb(er, fd) + }) + return open.call(fs, ...args) + } + t.teardown(mutateFS.mutateArgs('close', ([fd]) => { + CLOSES.push(fd) + return [fd] + })) + const WARNINGS = [] + const dir = path.resolve(unpackdir, 'close-on-write-error') + mkdirp.sync(dir) + const unpack = new Unpack({ + cwd: dir, + onwarn: (code, msg) => WARNINGS.push([code, msg]), + }) + unpack.on('end', () => { + for (const [path, fd] of Object.entries(OPENS)) + t.equal(CLOSES.includes(fd), true, 'closed fd for ' + path) + t.end() + }) + unpack.end(data) +}) + +t.test('close fd when error setting mtime', t => { + const data = makeTar([ + { + type: 'Directory', + path: 'x', + }, + { + type: 'File', + size: 1, + path: 'x/y', + atime: new Date('1979-07-01T19:10:00.000Z'), + ctime: new Date('2011-03-27T22:16:31.000Z'), + mtime: new Date('2011-03-27T22:16:31.000Z'), + }, + '.', + '', + '', + ]) + // have to clobber these both, because we fall back + t.teardown(mutateFS.fail('futimes', new Error('nope'))) + t.teardown(mutateFS.fail('utimes', new Error('nooooope'))) + const CLOSES = [] + const OPENS = {} + const {open} = require('fs') + t.teardown(() => fs.open = open) + fs.open = (...args) => { + const cb = args.pop() + args.push((er, fd) => { + OPENS[args[0]] = fd + cb(er, fd) + }) + return open.call(fs, ...args) + } + t.teardown(mutateFS.mutateArgs('close', ([fd]) => { + CLOSES.push(fd) + return [fd] + })) + const WARNINGS = [] + const dir = path.resolve(unpackdir, 'close-on-futimes-error') + mkdirp.sync(dir) + const unpack = new Unpack({ + cwd: dir, + onwarn: (code, msg) => WARNINGS.push([code, msg]), + }) + unpack.on('end', () => { + for (const [path, fd] of Object.entries(OPENS)) + t.equal(CLOSES.includes(fd), true, 'closed fd for ' + path) + t.end() + }) + unpack.end(data) +}) + +t.test('do not hang on large files that fail to open()', t => { + const data = makeTar([ + { + type: 'Directory', + path: 'x', + }, + { + type: 'File', + size: 31745, + path: 'x/y', + }, + 'x'.repeat(31745), + '', + '', + ]) + t.teardown(mutateFS.fail('open', new Error('nope'))) + const dir = path.resolve(unpackdir, 'no-hang-for-large-file-failures') + mkdirp.sync(dir) + const WARNINGS = [] + const unpack = new Unpack({ + cwd: dir, + onwarn: (code, msg) => WARNINGS.push([code, msg]), + }) + unpack.on('end', () => { + t.strictSame(WARNINGS, [['TAR_ENTRY_ERROR', 'nope']]) + t.end() + }) + unpack.write(data.slice(0, 2048)) + setTimeout(() => { + unpack.write(data.slice(2048, 4096)) + setTimeout(() => { + unpack.write(data.slice(4096)) + setTimeout(() => { + unpack.end() + }) + }) + }) +}) + +t.test('dirCache pruning unicode normalized collisions', { + skip: isWindows && 'symlinks not fully supported', +}, t => { + const data = makeTar([ + { + type: 'Directory', + path: 'foo', + }, + { + type: 'File', + path: 'foo/bar', + size: 1, + }, + 'x', + { + type: 'Directory', + // café + path: Buffer.from([0x63, 0x61, 0x66, 0xc3, 0xa9]).toString(), + }, + { + type: 'SymbolicLink', + // cafe with a ` + path: Buffer.from([0x63, 0x61, 0x66, 0x65, 0xcc, 0x81]).toString(), + linkpath: 'foo', + }, + { + type: 'Directory', + path: 'foo', + }, + { + type: 'File', + path: Buffer.from([0x63, 0x61, 0x66, 0xc3, 0xa9]).toString() + '/bar', + size: 1, + }, + 'y', + '', + '', + ]) + + const check = (path, dirCache, t) => { + path = path.replace(/\\/g, '/') + t.strictSame([...dirCache.entries()][0], [`${path}/foo`, true]) + t.equal(fs.readFileSync(path + '/foo/bar', 'utf8'), 'x') + t.end() + } + + t.test('sync', t => { + const path = t.testdir() + const dirCache = new Map() + new UnpackSync({ cwd: path, dirCache }).end(data) + check(path, dirCache, t) + }) + t.test('async', t => { + const path = t.testdir() + const dirCache = new Map() + new Unpack({ cwd: path, dirCache }) + .on('close', () => check(path, dirCache, t)) + .end(data) + }) + + t.end() +}) + +t.test('dircache prune all on windows when symlink encountered', t => { + if (process.platform !== 'win32') { + process.env.TESTING_TAR_FAKE_PLATFORM = 'win32' + t.teardown(() => { + delete process.env.TESTING_TAR_FAKE_PLATFORM + }) + } + const symlinks = [] + const Unpack = t.mock('../lib/unpack.js', { + fs: { + ...fs, + symlink: (target, dest, cb) => { + symlinks.push(['async', target, dest]) + process.nextTick(cb) + }, + symlinkSync: (target, dest) => symlinks.push(['sync', target, dest]), + }, + }) + const UnpackSync = Unpack.Sync + + const data = makeTar([ + { + type: 'Directory', + path: 'foo', + }, + { + type: 'File', + path: 'foo/bar', + size: 1, + }, + 'x', + { + type: 'Directory', + // café + path: Buffer.from([0x63, 0x61, 0x66, 0xc3, 0xa9]).toString(), + }, + { + type: 'SymbolicLink', + // cafe with a ` + path: Buffer.from([0x63, 0x61, 0x66, 0x65, 0xcc, 0x81]).toString(), + linkpath: 'safe/actually/but/cannot/be/too/careful', + }, + { + type: 'File', + path: 'bar/baz', + size: 1, + }, + 'z', + '', + '', + ]) + + const check = (path, dirCache, t) => { + // symlink blew away all dirCache entries before it + path = path.replace(/\\/g, '/') + t.strictSame([...dirCache.entries()], [ + [`${path}/bar`, true], + ]) + t.equal(fs.readFileSync(`${path}/foo/bar`, 'utf8'), 'x') + t.equal(fs.readFileSync(`${path}/bar/baz`, 'utf8'), 'z') + t.end() + } + + t.test('sync', t => { + const path = t.testdir() + const dirCache = new Map() + new UnpackSync({ cwd: path, dirCache }).end(data) + check(path, dirCache, t) + }) + + t.test('async', t => { + const path = t.testdir() + const dirCache = new Map() + new Unpack({ cwd: path, dirCache }) + .on('close', () => check(path, dirCache, t)) + .end(data) + }) + + t.end() +}) + +t.test('recognize C:.. as a dot path part', t => { + if (process.platform !== 'win32') { + process.env.TESTING_TAR_FAKE_PLATFORM = 'win32' + t.teardown(() => { + delete process.env.TESTING_TAR_FAKE_PLATFORM + }) + } + const Unpack = t.mock('../lib/unpack.js', { + path: { + ...path.win32, + win32: path.win32, + posix: path.posix, + }, + }) + const UnpackSync = Unpack.Sync + + const data = makeTar([ + { + type: 'File', + path: 'C:../x/y/z', + size: 1, + }, + 'z', + { + type: 'File', + path: 'x:..\\y\\z', + size: 1, + }, + 'x', + { + type: 'File', + path: 'Y:foo', + size: 1, + }, + 'y', + '', + '', + ]) + + const check = (path, warnings, t) => { + t.equal(fs.readFileSync(`${path}/foo`, 'utf8'), 'y') + t.strictSame(warnings, [ + [ + 'TAR_ENTRY_ERROR', + "path contains '..'", + 'C:../x/y/z', + 'C:../x/y/z', + ], + ['TAR_ENTRY_ERROR', "path contains '..'", 'x:../y/z', 'x:../y/z'], + [ + 'TAR_ENTRY_INFO', + 'stripping Y: from absolute path', + 'Y:foo', + 'foo', + ], + ]) + t.end() + } + + t.test('async', t => { + const warnings = [] + const path = t.testdir() + new Unpack({ + cwd: path, + onwarn: (c, w, { entry, path }) => warnings.push([c, w, path, entry.path]), + }) + .on('close', () => check(path, warnings, t)) + .end(data) + }) + + t.test('sync', t => { + const warnings = [] + const path = t.testdir() + new UnpackSync({ + cwd: path, + onwarn: (c, w, { entry, path }) => warnings.push([c, w, path, entry.path]), + }).end(data) + check(path, warnings, t) + }) + + t.end() +}) diff --git a/test/update.js b/test/update.js new file mode 100644 index 0000000..1e18205 --- /dev/null +++ b/test/update.js @@ -0,0 +1,369 @@ +'use strict' +const t = require('tap') +const u = require('../lib/update.js') +const path = require('path') +const fs = require('fs') +const mutateFS = require('mutate-fs') + +const {resolve} = require('path') +const fixtures = path.resolve(__dirname, 'fixtures') +const tars = path.resolve(fixtures, 'tars') +const zlib = require('zlib') + +const spawn = require('child_process').spawn + +const data = fs.readFileSync(tars + '/body-byte-counts.tar') +const dataNoNulls = data.slice(0, data.length - 1024) +const fixtureDef = { + 'body-byte-counts.tar': data, + 'no-null-eof.tar': dataNoNulls, + 'truncated-head.tar': Buffer.concat([dataNoNulls, data.slice(0, 500)]), + 'truncated-body.tar': Buffer.concat([dataNoNulls, data.slice(0, 700)]), + 'zero.tar': Buffer.from(''), + 'empty.tar': Buffer.alloc(512), + 'compressed.tgz': zlib.gzipSync(data), +} + +t.test('basic file add to archive (good or truncated)', t => { + const check = (file, t) => { + const c = spawn('tar', ['tf', file]) + const out = [] + c.stdout.on('data', chunk => out.push(chunk)) + c.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) + t.same(actual, [ + '1024-bytes.txt', + '512-bytes.txt', + 'one-byte.txt', + 'zero-byte.txt', + path.basename(__filename), + ]) + t.end() + }) + } + + const files = [ + 'body-byte-counts.tar', + 'no-null-eof.tar', + 'truncated-head.tar', + 'truncated-body.tar', + ] + const td = files.map(f => [f, fixtureDef[f]]).reduce((s, [k, v]) => { + s[k] = v + return s + }, {}) + const fileList = [path.basename(__filename)] + t.test('sync', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + u({ + sync: true, + file: resolve(dir, file), + cwd: __dirname, + }, fileList) + check(resolve(dir, file), t) + }) + } + }) + + t.test('async cb', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + u({ + file: resolve(dir, file), + cwd: __dirname, + }, fileList, er => { + if (er) + throw er + check(resolve(dir, file), t) + }) + }) + } + }) + + t.test('async', t => { + t.plan(files.length) + const dir = t.testdir(td) + for (const file of files) { + t.test(file, t => { + u({ + file: resolve(dir, file), + cwd: __dirname, + }, fileList).then(() => { + check(resolve(dir, file), t) + }) + }) + } + }) + + t.end() +}) + +t.test('add to empty archive', t => { + const check = (file, t) => { + const c = spawn('tar', ['tf', file]) + const out = [] + c.stdout.on('data', chunk => out.push(chunk)) + c.on('close', (code, signal) => { + t.equal(code, 0) + t.equal(signal, null) + const actual = Buffer.concat(out).toString().trim().split(/\r?\n/) + t.same(actual, [ + path.basename(__filename), + ]) + t.end() + }) + } + + const files = [ + 'empty.tar', + 'zero.tar', + ] + const td = files.map(f => [f, fixtureDef[f]]).reduce((s, [k, v]) => { + s[k] = v + return s + }, {}) + files.push('not-existing.tar') + + t.test('sync', t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + u({ + sync: true, + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)]) + check(resolve(dir, file), t) + }) + } + }) + + t.test('async cb', t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + u({ + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)], er => { + if (er) + throw er + check(resolve(dir, file), t) + }) + }) + } + }) + + t.test('async', async t => { + const dir = t.testdir(td) + t.plan(files.length) + for (const file of files) { + t.test(file, t => { + u({ + file: resolve(dir, file), + cwd: __dirname, + }, [path.basename(__filename)]).then(() => { + check(resolve(dir, file), t) + }) + }) + } + }) + + t.end() +}) + +t.test('cannot append to gzipped archives', t => { + const dir = t.testdir({ + 'compressed.tgz': fixtureDef['compressed.tgz'], + }) + const file = resolve(dir, 'compressed.tgz') + + const expect = new Error('cannot append to compressed archives') + const expectT = new TypeError('cannot append to compressed archives') + + t.throws(_ => u({ + file, + cwd: __dirname, + gzip: true, + }, [path.basename(__filename)]), expectT) + + t.throws(_ => u({ + file, + cwd: __dirname, + sync: true, + }, [path.basename(__filename)]), expect) + + u({ + file, + cwd: __dirname, + }, [path.basename(__filename)], er => { + t.match(er, expect) + t.end() + }) +}) + +t.test('other throws', t => { + t.throws(_ => u({}, ['asdf']), new TypeError('file is required')) + t.throws(_ => u({file: 'asdf'}, []), + new TypeError('no files or directories specified')) + t.end() +}) + +t.test('broken open', t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + }) + const file = resolve(dir, 'body-byte-counts.tar') + const poop = new Error('poop') + t.teardown(mutateFS.fail('open', poop)) + t.throws(_ => u({ sync: true, file: file }, ['README.md']), poop) + u({ file }, ['README.md'], er => { + t.match(er, poop) + t.end() + }) +}) + +t.test('broken fstat', t => { + const td = { + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + } + const poop = new Error('poop') + t.test('sync', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + t.teardown(mutateFS.fail('fstat', poop)) + t.throws(_ => u({ sync: true, file }, ['README.md']), poop) + t.end() + }) + t.test('async', t => { + const dir = t.testdir(td) + const file = resolve(dir, 'body-byte-counts.tar') + t.teardown(mutateFS.fail('fstat', poop)) + u({ file }, ['README.md'], async er => { + t.match(er, poop) + t.end() + }) + }) + t.end() +}) + +t.test('broken read', t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + }) + const file = resolve(dir, 'body-byte-counts.tar') + const poop = new Error('poop') + t.teardown(mutateFS.fail('read', poop)) + t.throws(_ => u({ sync: true, file }, ['README.md']), poop) + u({ file }, ['README.md'], er => { + t.match(er, poop) + t.end() + }) +}) + +t.test('do not add older file', t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + '1024-bytes.txt': '.'.repeat(1024), + foo: 'foo', + }) + const file = resolve(dir, 'body-byte-counts.tar') + + const f = resolve(dir, '1024-bytes.txt') + const oldDate = new Date('1997-04-10T16:57:47.000Z') + fs.utimesSync(f, oldDate, oldDate) + + // file size should not change + const expect = fixtureDef['body-byte-counts.tar'].length + const check = t => { + t.equal(fs.statSync(file).size, expect) + t.end() + } + + t.test('sync', t => { + u({ + mtimeCache: new Map(), + file, + cwd: dir, + sync: true, + filter: path => path === '1024-bytes.txt', + }, ['1024-bytes.txt', 'foo']) + check(t) + }) + + t.test('async', t => { + u({ file, cwd: dir }, ['1024-bytes.txt']).then(_ => check(t)) + }) + + t.test('async cb', t => { + u({ file, cwd: dir }, ['1024-bytes.txt'], er => { + if (er) + throw er + check(t) + }) + }) + + t.end() +}) + +t.test('do add newer file', t => { + const setup = t => { + const dir = t.testdir({ + 'body-byte-counts.tar': fixtureDef['body-byte-counts.tar'], + '1024-bytes.txt': '.'.repeat(1024), + foo: 'foo', + }) + + const f = resolve(dir, '1024-bytes.txt') + const newDate = new Date(Date.now() + 24 * 60 * 60 * 1000) + fs.utimesSync(f, newDate, newDate) + return dir + } + + // a chunk for the header, then 2 for the body + const expect = fixtureDef['body-byte-counts.tar'].length + 512 + 1024 + const check = (file, t) => { + t.equal(fs.statSync(file).size, expect) + t.end() + } + + t.test('sync', t => { + const dir = setup(t) + const file = resolve(dir, 'body-byte-counts.tar') + u({ + mtimeCache: new Map(), + file, + cwd: dir, + sync: true, + filter: path => path === '1024-bytes.txt', + }, ['1024-bytes.txt', 'foo']) + check(file, t) + }) + + t.test('async', t => { + const dir = setup(t) + const file = resolve(dir, 'body-byte-counts.tar') + u({ file, cwd: dir }, ['1024-bytes.txt']).then(_ => check(file, t)) + }) + + t.test('async cb', t => { + const dir = setup(t) + const file = resolve(dir, 'body-byte-counts.tar') + u({ file, cwd: dir }, ['1024-bytes.txt'], er => { + if (er) + throw er + check(file, t) + }) + }) + + t.end() +}) diff --git a/test/warn-mixin.js b/test/warn-mixin.js new file mode 100644 index 0000000..36350e4 --- /dev/null +++ b/test/warn-mixin.js @@ -0,0 +1,37 @@ +const t = require('tap') +const EE = require('events').EventEmitter +const warner = require('../lib/warn-mixin.js') + +const Warner = warner(EE) + +const w = new Warner() + +t.type(w.warn, 'function') + +const warning = [] +w.once('warn', (code, msg, data) => warning.push(code, msg, data)) +w.warn('code', 'hello') +t.same(warning, ['code', 'hello', { tarCode: 'code', code: 'code' }]) + +warning.length = 0 +w.once('warn', (code, msg, data) => warning.push(code, msg, data)) +w.warn('ok', new Error('this is fine'), { foo: 'bar' }) +t.match(warning, ['ok', 'this is fine', { + message: 'this is fine', + foo: 'bar', +}]) + +w.strict = true +t.throws(_ => w.warn('code', 'hello', { data: 123 }), + { message: 'hello', data: 123 }) +const poop = new Error('poop') +t.throws(_ => w.warn('ok', poop), poop) + +w.file = 'some/file' +t.throws(_ => w.warn('ok', 'this is fine'), { file: 'some/file' }) +w.cwd = 'some/dir' +t.throws(_ => w.warn('ok', 'this is fine'), { cwd: 'some/dir' }) + +w.strict = false +t.throws(_ => w.warn('ok', 'this is fine', { recoverable: false }), + { cwd: 'some/dir', recoverable: false }) diff --git a/test/winchars.js b/test/winchars.js new file mode 100644 index 0000000..120c581 --- /dev/null +++ b/test/winchars.js @@ -0,0 +1,7 @@ +'use strict' +const t = require('tap') +const wc = require('../lib/winchars.js') + +t.equal(wc.encode('<>'), '\uf03c\uf03e', 'encode') +t.equal(wc.decode(wc.encode('<>')), '<>', 'decode') +t.equal(wc.decode(wc.encode('\\|<>?:')), '\\|<>?:', 'all chars') diff --git a/test/write-entry.js b/test/write-entry.js new file mode 100644 index 0000000..b6cd1c3 --- /dev/null +++ b/test/write-entry.js @@ -0,0 +1,1702 @@ +'use strict' +const t = require('tap') +const mkdirp = require('mkdirp') + +// make our tests verify that windows link targets get turned into / paths +const fs = require('fs') +const {readlink, readlinkSync} = fs +fs.readlink = (path, cb) => { + readlink(path, (er, path) => { + if (er) + return cb(er) + else + cb(null, path.replace(/\//g, '\\')) + }) +} +fs.readlinkSync = path => readlinkSync(path).replace(/\//g, '\\') + +const ReadEntry = require('../lib/read-entry.js') +const makeTar = require('./make-tar.js') +const WriteEntry = require('../lib/write-entry.js') +const path = require('path') +const fixtures = path.resolve(__dirname, 'fixtures') +const files = path.resolve(fixtures, 'files') +const Header = require('../lib/header.js') +const mutateFS = require('mutate-fs') +process.env.USER = 'isaacs' +const chmodr = require('chmodr') +const Parser = require('../lib/parse.js') +const rimraf = require('rimraf') +const isWindows = process.platform === 'win32' +const normPath = require('../lib/normalize-windows-path.js') + +t.test('set up', t => { + const one = fs.statSync(files + '/hardlink-1') + const two = fs.statSync(files + '/hardlink-2') + if (one.dev !== two.dev || one.ino !== two.ino) { + fs.unlinkSync(files + '/hardlink-2') + fs.linkSync(files + '/hardlink-1', files + '/hardlink-2') + } + chmodr.sync(files, isWindows ? 0o666 : 0o644) + t.end() +}) + +t.test('100 byte filename', t => { + // do this one twice, so we have it with and without cache + let statCache = null + let linkCache = null + t.plan(2) + + const runTest = t => { + const f = '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' + const ws = new WriteEntry(f, { + cwd: files, + linkCache: linkCache, + statCache: statCache, + }) + + let out = [] + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + out = Buffer.concat(out) + t.match(ws, { + header: { + cksumValid: true, + needPax: false, + path: '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: isWindows ? 0o666 : 0o644, + size: 100, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }, + }) + + const wss = new WriteEntry.Sync(f, { + cwd: files, + linkCache: linkCache, + statCache: statCache, + }) + linkCache = ws.linkCache + statCache = ws.statCache + + t.equal(out.slice(512).toString('hex'), + wss.read().slice(512).toString('hex')) + + t.equal(out.length, 1024) + t.equal(out.slice(0, 100).toString(), f) + const h = new Header(out.slice(0, 512)) + t.match(h, { + cksumValid: true, + needPax: false, + path: '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: isWindows ? 0o666 : 0o644, + size: 100, + linkpath: '', + uname: 'isaacs', + gname: '', + devmaj: 0, + devmin: 0, + }) + + t.equal(out.slice(512).toString('hex'), + '6363636363636363636363636363636363636363636363636363636363636363' + + '6363636363636363636363636363636363636363636363636363636363636363' + + '6363636363636363636363636363636363636363636363636363636363636363' + + '6363636300000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000' + + '0000000000000000000000000000000000000000000000000000000000000000') + + t.end() + }) + } + + t.test('uncached', runTest) + t.test('cached', runTest) +}) + +t.test('directory', t => { + const ws = new WriteEntry('dir', { + cwd: files, + }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.match(ws.header, { + cksumValid: true, + needPax: false, + path: 'dir/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.equal(out.length, 512) + + const wss = new WriteEntry.Sync('dir', { cwd: files }) + t.equal(wss.read().length, 512) + t.match(wss.header, { + cksumValid: true, + needPax: false, + path: 'dir/', + mode: isWindows ? 0o777 : 0o755, + size: 0, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + + t.end() + }) +}) + +t.test('empty path for cwd', t => { + const ws = new WriteEntry('') + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.match(ws.header, { + cksumValid: true, + needPax: false, + path: './', + mode: isWindows ? 0o777 : fs.statSync('./').mode & 0o7777, + size: 0, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) +}) + +t.test('symlink', { + skip: isWindows && 'symlinks not fully supported', +}, t => { + const ws = new WriteEntry('symlink', { cwd: files }) + let out = [] + ws.on('data', c => out.push(c)) + const header = { + cksumValid: true, + needPax: false, + path: 'symlink', + size: 0, + linkpath: 'hardlink-2', + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + } + + const wss = new WriteEntry.Sync('symlink', { cwd: files }) + t.match(wss.header, header) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 512) + t.match(ws.header, header) + t.end() + }) +}) + +t.test('zero-byte file', t => { + const ws = new WriteEntry('files/zero-byte.txt', { cwd: fixtures }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 512) + t.match(ws.header, { + path: 'files/zero-byte.txt', + cksumValid: true, + needPax: false, + mode: isWindows ? 0o666 : 0o644, + size: 0, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) +}) + +t.test('zero-byte file, but close fails', t => { + const poop = new Error('poop') + t.teardown(mutateFS.fail('close', poop)) + + const ws = new WriteEntry('files/1024-bytes.txt', { cwd: fixtures }) + + ws.on('end', _ => + t.fail('should not get an end, because the close fails')) + + ws.on('error', er => { + t.match(er, { message: 'poop' }) + t.end() + }) + ws.resume() +}) + +t.test('hardlinks', t => { + const wss = new WriteEntry.Sync('hardlink-1', { + cwd: files, + }) + + const ws = new WriteEntry('files/hardlink-2', { + cwd: fixtures, + linkCache: wss.linkCache, + }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 512) + t.match(ws.header, { + type: 'Link', + path: 'files/hardlink-2', + cksumValid: true, + needPax: false, + mode: isWindows ? 0o666 : 0o644, + size: 0, + linkpath: 'files/hardlink-1', + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) +}) + +t.test('hardlinks far away', t => { + const h1 = 'hardlink-1' + const f = path.resolve(files, h1) + const stat = fs.statSync(f) + const linkCache = new Map([[stat.dev + ':' + stat.ino, '/a/b/c/d/e']]) + + const ws = new WriteEntry('files/hardlink-2', { + cwd: fixtures, + linkCache: linkCache, + }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 1024) + t.match(ws.header, { + path: 'files/hardlink-2', + cksumValid: true, + needPax: false, + mode: isWindows ? 0o666 : 0o644, + size: 26, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) +}) + +t.test('really deep path', t => { + const f = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' + const ws = new WriteEntry(f, { cwd: files }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.match(ws.header, { + cksumValid: true, + needPax: true, + path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: isWindows ? 0o666 : 0o644, + size: 100, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.equal(out.length, 2048) + t.end() + }) +}) + +t.test('no pax', t => { + const f = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' + const ws = new WriteEntry(f, { cwd: files, noPax: true }) + let out = [] + ws.on('data', c => out.push(c)) + + ws.on('end', _ => { + out = Buffer.concat(out) + t.match(ws.header, { + cksumValid: true, + needPax: true, + path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc', + mode: isWindows ? 0o666 : 0o644, + size: 100, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.equal(out.length, 1024) + t.end() + }) +}) + +t.test('nonexistent file', t => { + const f = path.resolve(files, 'does not exist') + const ws = new WriteEntry('does not exist', { cwd: files }) + ws.on('error', er => { + t.match(er, { + message: 'ENOENT: no such file or directory, lstat \'' + f + '\'', + code: 'ENOENT', + path: f, + syscall: 'lstat', + }) + t.end() + }) +}) + +t.test('absolute path', t => { + const absolute = path.resolve(files, '512-bytes.txt') + const { root } = path.parse(absolute) + const f = root + root + root + absolute + const warn = normPath(isWindows ? root : root + root + root + root) + t.test('preservePaths=false strict=false', t => { + const warnings = [] + // on windows, c:\c:\c:\... is a valid path, so just use the + // single-root absolute version of it. + const ws = new WriteEntry(isWindows ? absolute : f, { + cwd: files, + onwarn: (c, m, p) => warnings.push([c, m, p]), + }) + let out = [] + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 1024) + t.match(warnings, [[ + 'TAR_ENTRY_INFO', + `stripping ${warn} from absolute path`, + { path: normPath(isWindows ? absolute : f) }, + ]]) + + t.match(ws.header, { + cksumValid: true, + needPax: false, + path: normPath(absolute.replace(/^(\/|[a-z]:[/\\])*/i, '')), + mode: isWindows ? 0o666 : 0o644, + size: 512, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) + }) + + t.test('preservePaths=true', t => { + t.plan(2) + // with preservePaths, strictness doens't matter + ;[true, false].forEach(strict => { + t.test('strict=' + strict, t => { + const warnings = [] + const ws = new WriteEntry(isWindows ? absolute : f, { + cwd: files, + strict: strict, + preservePaths: true, + onwarn: (c, m, p) => warnings.push([c, m, p]), + }) + let out = [] + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(warnings.length, 0) + + t.match(ws.header, { + cksumValid: true, + needPax: false, + path: normPath(isWindows ? absolute : f), + mode: isWindows ? 0o666 : 0o644, + size: 512, + linkpath: null, + uname: 'isaacs', + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) + }) + }) + }) + + t.test('preservePaths=false strict=true', t => { + t.throws(_ => { + new WriteEntry(isWindows ? absolute : f, { + strict: true, + cwd: files, + }) + }, { + message: /stripping .* from absolute path/, + path: normPath(isWindows ? absolute : f), + }) + t.end() + }) + + t.end() +}) + +t.throws(_ => new WriteEntry(null), new TypeError('path is required')) + +t.test('no user environ, sets uname to empty string', t => { + delete process.env.USER + const ws = new WriteEntry('512-bytes.txt', { cwd: files }) + let out = [] + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 1024) + t.match(ws.header, { + cksumValid: true, + needPax: false, + path: '512-bytes.txt', + mode: isWindows ? 0o666 : 0o644, + size: 512, + uname: '', + linkpath: null, + gname: null, + devmaj: 0, + devmin: 0, + }) + t.end() + }) +}) + +t.test('an unsuppored type', { + skip: isWindows && '/dev/random on windows', +}, t => { + const ws = new WriteEntry('/dev/random', { preservePaths: true }) + ws.on('data', c => { + throw new Error('should not get data from random') + }) + ws.on('stat', stat => { + t.match(stat, { + dev: Number, + mode: 0o020666, + nlink: 1, + rdev: Number, + blksize: Number, + ino: Number, + size: 0, + blocks: 0, + }) + t.ok(stat.isCharacterDevice(), 'random is a character device') + }) + ws.on('end', _ => { + t.match(ws, { type: 'Unsupported', path: '/dev/random' }) + t.end() + }) +}) + +t.test('readlink fail', t => { + const expect = { + syscall: 'readlink', + path: String, + } + // pretend everything is a symbolic link, then read something that isn't + t.teardown(mutateFS.statType('SymbolicLink')) + t.throws(_ => { + return new WriteEntry.Sync('write-entry.js', { cwd: __dirname }) + }, expect) + new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { + t.match(er, expect) + t.equal(normPath(er.path), normPath(__filename)) + t.end() + }) +}) + +t.test('open fail', t => { + t.teardown(mutateFS.fail('open', new Error('pwn'))) + t.throws(_ => new WriteEntry.Sync('write-entry.js', { cwd: __dirname }), + { message: 'pwn' }) + new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { + t.match(er, { message: 'pwn' }) + t.end() + }) +}) + +t.test('read fail', t => { + const expect = { + message: 'EISDIR: illegal operation on a directory, read', + code: 'EISDIR', + syscall: 'read', + } + // pretend everything is a file, then read something that isn't + t.teardown(mutateFS.statMutate((er, st) => { + if (er) + return [er, st] + st.isFile = () => true + st.size = 123 + })) + t.throws(_ => new WriteEntry.Sync('fixtures', { + cwd: __dirname, + }), expect) + new WriteEntry('fixtures', { cwd: __dirname }).on('error', er => { + t.match(er, expect) + t.end() + }) +}) + +t.test('read invalid EOF', t => { + t.teardown(mutateFS.mutate('read', (er, br) => [er, 0])) + const expect = { + message: 'encountered unexpected EOF', + path: normPath(__filename), + syscall: 'read', + code: 'EOF', + } + t.throws(_ => new WriteEntry.Sync('write-entry.js', { cwd: __dirname }), + expect) + new WriteEntry('write-entry.js', { cwd: __dirname }).on('error', er => { + t.match(er, expect) + t.end() + }) +}) + +t.test('read overflow expectation', t => { + t.teardown(mutateFS.statMutate((er, st) => { + if (st) + st.size = 3 + })) + const f = '512-bytes.txt' + const expect = { + message: 'did not encounter expected EOF', + path: normPath(path.resolve(files, f)), + syscall: 'read', + code: 'EOF', + } + t.plan(2) + t.throws(_ => new WriteEntry.Sync(f, { cwd: files, maxReadSize: 2 }), expect) + new WriteEntry(f, { cwd: files, maxReadSize: 2 }).on('error', er => { + t.match(er, expect) + }).resume() +}) + +t.test('short reads', t => { + t.teardown(mutateFS.zenoRead()) + const cases = { + '1024-bytes.txt': new Array(1024).join('x') + '\n', + '100-byte-filename-cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc': new Array(101).join('c'), + } + + const maxReadSize = [null, 1024, 100, 111] + + Object.keys(cases).forEach(filename => { + t.test(filename.split('byte').shift() + 'byte', t => { + const contents = cases[filename] + maxReadSize.forEach(mRS => { + t.test('maxReadSize=' + mRS, t => { + let out = [] + const ws = new WriteEntry(filename, { + maxReadSize: mRS, + cwd: files, + }) + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + out = Buffer.concat(out) + t.equal(out.length, 512 * Math.ceil(1 + contents.length / 512)) + t.equal(out.slice(512).toString().replace(/\0.*$/, ''), contents) + const wss = new WriteEntry.Sync(filename, { cwd: files }) + const syncOut = wss.read() + t.equal(syncOut.length, out.length) + t.equal(syncOut.slice(512).toString(), out.slice(512).toString()) + t.end() + }) + }) + }) + t.end() + }) + }) + t.end() +}) + +t.test('win32 path conversion', { + skip: isWindows && 'no need to test on windows', +}, t => { + const ws = new WriteEntry('long-path\\r', { + cwd: files, + win32: true, + }) + t.equal(ws.path, 'long-path/r') + t.end() +}) + +t.test('win32 <|>? in paths', { + skip: isWindows && 'do not create annoying junk on windows systems', +}, t => { + const file = path.resolve(fixtures, '<|>?.txt') + const uglyName = Buffer.from('ef80bcef81bcef80beef80bf2e747874', 'hex').toString() + const ugly = path.resolve(fixtures, uglyName) + t.teardown(_ => { + rimraf.sync(file) + rimraf.sync(ugly) + }) + + fs.writeFileSync(ugly, '<|>?') + + const wc = new WriteEntry(uglyName, { + cwd: fixtures, + win32: true, + }) + + const out = [] + wc.on('data', c => out.push(c)) + wc.on('end', _ => { + const data = Buffer.concat(out).toString() + t.equal(data.substr(0, 4), '<|>?') + t.end() + }) + + t.equal(wc.path, '<|>?.txt') + t.equal(wc.absolute, ugly) +}) + +t.test('uid doesnt match, dont set uname', t => { + t.teardown(mutateFS.statMutate((er, st) => { + if (st) + st.uid -= 1 + })) + const ws = new WriteEntry('long-path/r', { + cwd: files, + }) + t.notOk(ws.uname) + t.end() +}) + +t.test('override absolute to some other file', t => { + const ws = new WriteEntry('blerg', { + absolute: files + '/one-byte.txt', + }) + const out = [] + ws.on('data', c => out.push(c)) + ws.on('end', _ => { + const data = Buffer.concat(out) + t.equal(data.length, 1024) + t.match(data.slice(512).toString(), /^a\0{511}$/) + t.match(ws, { + path: 'blerg', + header: { size: 1 }, + }) + const wss = new WriteEntry.Sync('blerg', { + absolute: files + '/one-byte.txt', + }) + const sdata = wss.read() + t.equal(sdata.length, 1024) + t.match(sdata.slice(512).toString(), /^a\0{511}$/) + t.match(wss, { + path: 'blerg', + header: { size: 1 }, + }) + t.end() + }) +}) + +t.test('portable entries, nothing platform-specific', t => { + const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' + const ws = new WriteEntry(om, { + cwd: files, + portable: true, + }) + + const pexpect = { + atime: null, + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + size: 2, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + } + + const hexpect = { + size: 2, + ctime: null, + atime: null, + uid: null, + uname: '', + gid: null, + gname: '', + } + + const ps = new Parser() + const wss = new WriteEntry.Sync(om, { + cwd: files, + portable: true, + }) + ps.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + }) + ps.end(wss.read()) + + const p = new Parser() + ws.pipe(p) + p.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + t.end() + }) +}) + +t.test('no mtime', t => { + const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' + const ws = new WriteEntry(om, { + cwd: files, + noMtime: true, + portable: true, + }) + + const pexpect = { + atime: null, + mtime: null, + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + size: 2, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + } + + const hexpect = { + size: 2, + ctime: null, + atime: null, + mtime: null, + uid: null, + uname: '', + gid: null, + gname: '', + } + + const ps = new Parser() + const wss = new WriteEntry.Sync(om, { + cwd: files, + portable: true, + noMtime: true, + }) + ps.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + }) + ps.end(wss.read()) + + const p = new Parser() + ws.pipe(p) + p.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + t.end() + }) +}) + +t.test('force mtime', t => { + const om = 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt' + const date = new Date('1979-07-01T19:10:00.000Z') + const ws = new WriteEntry(om, { + cwd: files, + mtime: date, + portable: true, + }) + + const pexpect = { + atime: null, + mtime: new Date('1979-07-01T19:10:00.000Z'), + charset: null, + comment: null, + ctime: null, + gid: null, + gname: null, + linkpath: null, + path: 'long-path/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/Ω.txt', + size: 2, + uid: null, + uname: null, + dev: null, + ino: null, + nlink: null, + } + + const hexpect = { + size: 2, + ctime: null, + atime: null, + mtime: new Date('1979-07-01T19:10:00.000Z'), + uid: null, + uname: '', + gid: null, + gname: '', + } + + const ps = new Parser() + const wss = new WriteEntry.Sync(om, { + cwd: files, + portable: true, + mtime: new Date('1979-07-01T19:10:00.000Z'), + }) + ps.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + }) + ps.end(wss.read()) + + const p = new Parser() + ws.pipe(p) + p.on('entry', entry => { + t.match(entry.extended, pexpect) + t.match(entry.header, hexpect) + t.end() + }) +}) + +t.test('portable dir entries, no mtime', t => { + const dir = 'long-path/' + const ws = new WriteEntry(dir, { + cwd: files, + portable: true, + }) + + const hexpect = { + path: 'long-path/', + ctime: null, + atime: null, + uid: null, + uname: '', + gid: null, + gname: '', + mtime: null, + } + + const ps = new Parser() + const wss = new WriteEntry.Sync(dir, { + cwd: files, + portable: true, + }) + ps.on('entry', entry => { + t.match(entry.header, hexpect) + }) + ps.end(wss.read()) + + const p = new Parser() + ws.pipe(p) + p.on('entry', entry => { + t.match(entry.header, hexpect) + t.end() + }) +}) + +t.test('writing more data than is appropriate', t => { + const path = t.testdir({ + file: 'hello', + }) + const wss = new WriteEntry(`${path}/file`) + wss.on('error', er => { + t.match(er, { + message: 'writing more data than expected', + }) + t.end() + }) + wss.on('stat', () => wss.write(Buffer.from('some more stuff'))) +}) + +t.test('write entry from read entry', t => { + const data = makeTar([ + { + path: '$', + type: 'File', + size: 10, + mode: isWindows ? 0o777 : 0o755, + uid: 123, + gid: 321, + ctime: new Date('1979-07-01'), + atime: new Date('1980-08-17'), + }, + '$$$$$$$$$$', + { + path: 'blep', + type: 'SymbolicLink', + linkpath: 'xyz', + }, + '', + '', + ]) + + t.test('basic file', t => { + const fileEntry = new ReadEntry(new Header(data)) + const wetFile = new WriteEntry.Tar(fileEntry) + const out = [] + let wetFileEnded = false + wetFile.on('data', c => out.push(c)) + wetFile.on('end', _ => wetFileEnded = true) + fileEntry.write(data.slice(512, 550)) + fileEntry.write(data.slice(550, 1000)) + fileEntry.end(data.slice(1000, 1024)) + t.equal(wetFileEnded, true) + const result = Buffer.concat(out) + t.equal(result.length, 1024) + t.equal(result.toString().replace(/\0.*$/, ''), '$') + const body = result.slice(512).toString().replace(/\0*$/, '') + t.equal(body, '$$$$$$$$$$') + t.end() + }) + + t.test('basic file', t => { + const data = makeTar([ + { + path: '$', + type: 'Directory', + size: 0, + mode: isWindows ? 0o777 : 0o755, + uid: 123, + gid: 321, + ctime: new Date('1979-07-01'), + atime: new Date('1980-08-17'), + mtime: new Date('1997-06-21'), + }, + '', + '', + ]) + const fileEntry = new ReadEntry(new Header(data)) + const wetFile = new WriteEntry.Tar(fileEntry, { portable: true }) + const out = [] + let wetFileEnded = false + wetFile.on('data', c => out.push(c)) + wetFile.on('end', _ => wetFileEnded = true) + fileEntry.end() + t.equal(wetFileEnded, true) + const result = Buffer.concat(out) + t.match(new Header(result), { mtime: null }) + t.end() + }) + + t.test('with pax header', t => { + const fileEntryPax = new ReadEntry(new Header(data)) + fileEntryPax.path = new Array(200).join('$') + const wetPax = new WriteEntry.Tar(fileEntryPax) + let wetPaxEnded = false + const out = [] + wetPax.on('data', c => out.push(c)) + wetPax.on('end', _ => wetPaxEnded = true) + fileEntryPax.write(data.slice(512, 550)) + fileEntryPax.write(data.slice(550, 1000)) + fileEntryPax.end(data.slice(1000, 1024)) + t.equal(wetPaxEnded, true) + const result = Buffer.concat(out) + t.equal(result.length, 2048) + t.match(result.slice(1024, 1124).toString(), /^\$+\0?$/) + const body = result.slice(1536).toString().replace(/\0*$/, '') + t.match(new Header(result), { type: 'ExtendedHeader' }) + t.equal(body, '$$$$$$$$$$') + t.end() + }) + + t.test('pax and portable', t => { + const fileEntryPax = new ReadEntry(new Header(data)) + fileEntryPax.path = new Array(200).join('$') + const wetPax = new WriteEntry.Tar(fileEntryPax, { portable: true }) + let wetPaxEnded = false + const out = [] + wetPax.on('data', c => out.push(c)) + wetPax.on('end', _ => wetPaxEnded = true) + fileEntryPax.write(data.slice(512, 550)) + fileEntryPax.write(data.slice(550, 1000)) + fileEntryPax.end(data.slice(1000, 1024)) + t.equal(wetPaxEnded, true) + const result = Buffer.concat(out) + t.equal(result.length, 2048) + t.match(result.slice(1024, 1124).toString(), /^\$+\0?$/) + t.match(new Header(result), { type: 'ExtendedHeader' }) + t.match(new Header(result.slice(1024)), { + ctime: null, + atime: null, + uname: '', + gname: '', + }) + const body = result.slice(1536).toString().replace(/\0*$/, '') + t.equal(body, '$$$$$$$$$$') + t.end() + }) + + t.test('pax, portable, and noMtime', t => { + const fileEntryPax = new ReadEntry(new Header(data)) + fileEntryPax.path = new Array(200).join('$') + const wetPax = new WriteEntry.Tar(fileEntryPax, { + noMtime: true, + portable: true, + }) + let wetPaxEnded = false + const out = [] + wetPax.on('data', c => out.push(c)) + wetPax.on('end', _ => wetPaxEnded = true) + fileEntryPax.write(data.slice(512, 550)) + fileEntryPax.write(data.slice(550, 1000)) + fileEntryPax.end(data.slice(1000, 1024)) + t.equal(wetPaxEnded, true) + const result = Buffer.concat(out) + t.equal(result.length, 2048) + t.match(result.slice(1024, 1124).toString(), /^\$+\0?$/) + t.match(new Header(result), { type: 'ExtendedHeader' }) + t.match(new Header(result.slice(1024)), { + mtime: null, + ctime: null, + atime: null, + uname: '', + gname: '', + }) + const body = result.slice(1536).toString().replace(/\0*$/, '') + t.equal(body, '$$$$$$$$$$') + t.end() + }) + + t.test('abs path', t => { + const fileEntry = new ReadEntry(new Header(data)) + fileEntry.path = '/a/b/c' + + t.test('warn', t => { + const warnings = [] + new WriteEntry.Tar(fileEntry, { + onwarn: (code, msg, data) => warnings.push(code, msg, data), + }) + t.match(warnings, ['TAR_ENTRY_INFO', 'stripping / from absolute path', { + path: '/a/b/c', + }]) + t.end() + }) + + t.test('preserve', t => { + const warnings = [] + new WriteEntry.Tar(fileEntry, { + onwarn: (code, msg, data) => warnings.push(code, msg, data), + preservePaths: true, + }) + t.same(warnings, []) + t.end() + }) + + t.test('throw', t => { + t.throws(_ => new WriteEntry.Tar(fileEntry, { + strict: true, + })) + t.end() + }) + t.end() + }) + + t.test('no block remain', t => { + const readEntry = new ReadEntry(new Header({ + size: 512, + type: 'File', + path: 'x', + })) + const wet = new WriteEntry.Tar(readEntry) + const out = [] + wet.on('data', c => out.push(c)) + let wetEnded = false + wet.on('end', _ => wetEnded = true) + t.equal(wetEnded, false) + readEntry.end(Buffer.from(new Array(513).join('@'))) + t.equal(wetEnded, true) + const res = Buffer.concat(out) + t.equal(res.length, 1024) + t.match(res.slice(512).toString(), /^@+$/) + t.end() + }) + + t.test('write more than appropriate', t => { + const readEntry = new ReadEntry(new Header({ + path: 'x', + type: 'File', + size: '1', + })) + const wet = new WriteEntry.Tar(readEntry) + t.throws(_ => wet.write(Buffer.from(new Array(1024).join('x')))) + t.end() + }) + + t.end() +}) + +// https://github.com/npm/node-tar/issues/284 +t.test('prefix and hard links', t => { + const dir = path.resolve(fixtures, 'writeentry-prefix-hardlinks') + rimraf.sync(dir) + t.teardown(_ => rimraf.sync(dir)) + mkdirp.sync(dir + '/in/z/b/c') + fs.writeFileSync(dir + '/in/target', 'ddd') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/c/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/d') + fs.linkSync(dir + '/in/target', dir + '/in/y') + const long = 'y'.repeat(250) + fs.linkSync(dir + '/in/target', dir + '/in/' + long) + + const expect = [ + { + type: 'Directory', + path: 'out/x/', + }, + { + type: 'File', + size: 3, + path: 'out/x/target', + }, + 'ddd\0', + { + path: 'out/x/y', + type: 'Link', + linkpath: 'out/x/target', + }, + { + path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'ExtendedHeader', + }, + new RegExp('^266 path=out.x.' + long + '[\\w\\W]*linkpath=out.x.target'), + { + path: 'out/x/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'Link', + linkpath: 'out/x/target', + }, + { + type: 'Directory', + path: 'out/x/z/', + }, + { + type: 'Directory', + path: 'out/x/z/b/', + }, + { + path: 'out/x/z/d', + type: 'Link', + linkpath: 'out/x/target', + }, + { + type: 'Directory', + path: 'out/x/z/b/c/', + }, + { + path: 'out/x/z/b/d', + type: 'Link', + linkpath: 'out/x/target', + }, + { + path: 'out/x/z/b/c/d', + type: 'Link', + linkpath: 'out/x/target', + }, + ] + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => { + if (typeof e === 'string') + t.equal(data.slice(i * 512, i * 512 + e.length).toString(), e) + else if (e instanceof RegExp) + t.match(data.slice(i * 512, (i + 1) * 512).toString(), e) + else + t.match(new Header(data.slice(i * 512, (i + 1) * 512)), e) + }) + } + + const runTest = async (t, path, Class) => { + const linkCache = new Map() + const statCache = new Map() + const opt = { + cwd: dir + '/in', + prefix: 'out/x', + noDirRecurse: true, + linkCache, + statCache, + } + const out = [] + const entry = (path) => new Promise(resolve => { + const p = new Class(path, opt) + p.on('end', resolve) + p.on('data', d => out.push(d)) + }) + + await entry(path) + if (path === '.') + path = './' + await entry(`${path}target`) + await entry(`${path}y`) + await entry(`${path}${long}`) + await entry(`${path}z`) + await entry(`${path}z/b`) + await entry(`${path}z/d`) + await entry(`${path}z/b/c`) + await entry(`${path}z/b/d`) + await entry(`${path}z/b/c/d`) + check(out, t) + } + + t.test('async', t => { + t.test('.', t => runTest(t, '.', WriteEntry)) + return t.test('./', t => runTest(t, './', WriteEntry)) + }) + + t.test('sync', t => { + t.test('.', t => runTest(t, '.', WriteEntry.Sync)) + return t.test('./', t => runTest(t, './', WriteEntry.Sync)) + }) + + t.end() +}) + +t.test('prefix and hard links from tar entries', t => { + const long = 'y'.repeat(250) + const expect = [ + { + type: 'Directory', + path: 'out/x/', + }, + { + type: 'File', + size: 3, + path: 'out/x/target', + }, + 'ddd\0', + { + path: 'out/x/y', + type: 'Link', + linkpath: 'out/x/target', + }, + { + path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'ExtendedHeader', + }, + new RegExp('^266 path=out.x.' + long + '[\\w\\W]*linkpath=out.x.target'), + { + path: 'out/x/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'Link', + linkpath: 'out/x/target', + }, + { + type: 'Directory', + path: 'out/x/z/', + }, + { + type: 'Directory', + path: 'out/x/z/b/', + }, + { + path: 'out/x/z/d', + type: 'Link', + linkpath: 'out/x/target', + }, + { + type: 'Directory', + path: 'out/x/z/b/c/', + }, + { + path: 'out/x/z/b/d', + type: 'Link', + linkpath: 'out/x/target', + }, + { + path: 'out/x/z/b/c/d', + type: 'Link', + linkpath: 'out/x/target', + }, + ] + + const data = makeTar([ + { + type: 'Directory', + path: './', + }, + { + type: 'File', + size: 3, + path: 'target', + }, + 'ddd\0', + { + path: 'y', + type: 'Link', + linkpath: 'target', + }, + { + path: 'PaxHeader/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'ExtendedHeader', + size: ('260 path=' + long + '\n19 linkpath=target\n').length, + }, + '260 path=' + long + '\n19 linkpath=target\n', + { + path: 'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/', + }, + { + type: 'Directory', + path: 'z/b/', + }, + { + path: 'z/d', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/b/c/', + }, + { + path: 'z/b/d', + type: 'Link', + linkpath: 'target', + }, + { + path: 'z/b/c/d', + type: 'Link', + linkpath: 'target', + }, + '', + '', + ]) + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => { + if (typeof e === 'string') + t.equal(data.slice(i * 512, i * 512 + e.length).toString(), e) + else if (e instanceof RegExp) + t.match(data.slice(i * 512, (i + 1) * 512).toString(), e) + else + t.match(new Header(data.slice(i * 512, (i + 1) * 512)), e) + }) + } + + const runTest = async (t, path) => { + const linkCache = new Map() + const statCache = new Map() + const opt = { + prefix: 'out/x', + noDirRecurse: true, + linkCache, + statCache, + } + const out = [] + const parser = new Parser({ + strict: true, + onentry: readEntry => { + const p = new WriteEntry.Tar(readEntry, opt) + p.on('data', d => out.push(d)) + }, + }) + parser.on('end', () => check(out, t)) + parser.end(data) + } + + t.test('.', t => runTest(t, '.')) + t.test('./', t => runTest(t, './')) + + t.end() +}) + +t.test('hard links and no prefix', t => { + const dir = path.resolve(fixtures, 'writeentry-prefix-hardlinks') + t.teardown(_ => rimraf.sync(dir)) + mkdirp.sync(dir + '/in/z/b/c') + fs.writeFileSync(dir + '/in/target', 'ddd') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/c/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/b/d') + fs.linkSync(dir + '/in/target', dir + '/in/z/d') + fs.linkSync(dir + '/in/target', dir + '/in/y') + + const expect = [ + { + type: 'Directory', + path: './', + }, + { + type: 'File', + size: 3, + path: 'target', + }, + 'ddd\0', + { + path: 'y', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/', + }, + { + type: 'Directory', + path: 'z/b/', + }, + { + path: 'z/d', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/b/c/', + }, + { + path: 'z/b/d', + type: 'Link', + linkpath: 'target', + }, + { + path: 'z/b/c/d', + type: 'Link', + linkpath: 'target', + }, + ] + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => { + if (typeof e === 'string') + t.equal(data.slice(i * 512, i * 512 + e.length).toString(), e) + else + t.match(new Header(data.slice(i * 512, (i + 1) * 512)), e) + }) + } + + const runTest = async (t, path, Class) => { + const linkCache = new Map() + const statCache = new Map() + const opt = { + cwd: dir + '/in', + linkCache, + statCache, + } + const out = [] + const entry = (path) => new Promise(resolve => { + const p = new Class(path, opt) + p.on('end', resolve) + p.on('data', d => out.push(d)) + }) + + await entry(path) + if (path === '.') + path = './' + await entry(`${path}target`) + await entry(`${path}y`) + await entry(`${path}z`) + await entry(`${path}z/b`) + await entry(`${path}z/d`) + await entry(`${path}z/b/c`) + await entry(`${path}z/b/d`) + await entry(`${path}z/b/c/d`) + check(out, t) + } + + t.test('async', t => { + t.test('.', t => runTest(t, '.', WriteEntry)) + return t.test('./', t => runTest(t, './', WriteEntry)) + }) + + t.test('sync', t => { + t.test('.', t => runTest(t, '.', WriteEntry.Sync)) + return t.test('./', t => runTest(t, './', WriteEntry.Sync)) + }) + + t.end() +}) + +t.test('hard links from tar entries and no prefix', t => { + const expect = [ + { + type: 'Directory', + path: './', + }, + { + type: 'File', + size: 3, + path: 'target', + }, + 'ddd\0', + { + path: 'y', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/', + }, + { + type: 'Directory', + path: 'z/b/', + }, + { + path: 'z/d', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/b/c/', + }, + { + path: 'z/b/d', + type: 'Link', + linkpath: 'target', + }, + { + path: 'z/b/c/d', + type: 'Link', + linkpath: 'target', + }, + ] + + const data = makeTar([ + { + type: 'Directory', + path: './', + }, + { + type: 'File', + size: 3, + path: 'target', + }, + 'ddd\0', + { + path: 'y', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/', + }, + { + type: 'Directory', + path: 'z/b/', + }, + { + path: 'z/d', + type: 'Link', + linkpath: 'target', + }, + { + type: 'Directory', + path: 'z/b/c/', + }, + { + path: 'z/b/d', + type: 'Link', + linkpath: 'target', + }, + { + path: 'z/b/c/d', + type: 'Link', + linkpath: 'target', + }, + ]) + + const check = (out, t) => { + const data = Buffer.concat(out) + expect.forEach((e, i) => { + if (typeof e === 'string') + t.equal(data.slice(i * 512, i * 512 + e.length).toString(), e) + else if (e instanceof RegExp) + t.match(data.slice(i * 512, (i + 1) * 512).toString(), e) + else + t.match(new Header(data.slice(i * 512, (i + 1) * 512)), e) + }) + } + + const runTest = async (t, path) => { + const linkCache = new Map() + const statCache = new Map() + const opt = { + noDirRecurse: true, + linkCache, + statCache, + } + const out = [] + const parser = new Parser({ + onentry: readEntry => { + const p = new WriteEntry.Tar(readEntry, opt) + p.on('data', d => out.push(d)) + }, + }) + parser.on('end', () => check(out, t)) + parser.end(data) + } + + t.test('.', t => runTest(t, '.')) + t.test('./', t => runTest(t, './')) + + t.end() +}) + +t.test('myuid set by getuid() if available, otherwise 0', t => { + const {getuid} = process + process.getuid = null + const noUid = new WriteEntry(__filename) + t.equal(noUid.myuid, 0, 'set to zero if no getuid function') + process.getuid = () => 123456789 + const hasUid = new WriteEntry(__filename) + t.equal(hasUid.myuid, 123456789, 'set to process.getuid()') + process.getuid = getuid + t.end() +}) diff --git a/types-tar/LICENSE b/types-tar/LICENSE new file mode 100755 index 0000000..9e841e7 --- /dev/null +++ b/types-tar/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + 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/types-tar/README.md b/types-tar/README.md new file mode 100755 index 0000000..af3538c --- /dev/null +++ b/types-tar/README.md @@ -0,0 +1,16 @@ +# Installation +> `npm install --save @types/tar` + +# Summary +This package contains type definitions for tar (https://github.com/npm/node-tar). + +# Details +Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/tar. + +### Additional Details + * Last updated: Fri, 02 Jul 2021 21:32:11 GMT + * Dependencies: [@types/minipass](https://npmjs.com/package/@types/minipass), [@types/node](https://npmjs.com/package/@types/node) + * Global values: none + +# Credits +These definitions were written by [Maxime LUCE](https://github.com/SomaticIT), and [Connor Peet](https://github.com/connor4312). diff --git a/types-tar/index.d.ts b/types-tar/index.d.ts new file mode 100755 index 0000000..abf31a0 --- /dev/null +++ b/types-tar/index.d.ts @@ -0,0 +1,764 @@ +// Type definitions for tar 4.0 +// Project: https://github.com/npm/node-tar +// Definitions by: Maxime LUCE , Connor Peet +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// TODO: When/if typings for [fstream](https://github.com/npm/fstream) are written, refactor this typing to use it for the various streams. + +/// + +import stream = require('stream'); +import events = require('events'); +import zlib = require('zlib'); +import MiniPass = require('minipass'); + +// #region Interfaces + +export interface HeaderProperties { + path: string; + mode?: number | undefined; + noProprietary?: boolean | undefined; + uid?: number | undefined; + gid?: number | undefined; + size?: number | undefined; + mtime?: number | undefined; + type?: string | undefined; + uname?: string | undefined; + gname?: string | undefined; + devmaj?: number | undefined; + devmin?: number | undefined; +} + +export interface ExtractOptions { + type?: string | undefined; + Directory?: boolean | undefined; + path?: string | undefined; + strip?: number | undefined; +} + +export interface ParseStream extends NodeJS.ReadWriteStream { + position: number; + + _stream: stream.Stream; + _ended: boolean; + + _streamEnd(): void; + _process(c: Buffer): void; + _startEntry(c: Buffer): void; +} + +export interface PackStream extends NodeJS.ReadWriteStream { + writable: boolean; + readable: boolean; + + _noProprietary: boolean; + _global: HeaderProperties; + _buffer: stream.Stream[]; + _currentEntry: any; + _processing: boolean; + _pipeRoot: stream.Stream; + _needDrain: boolean; + _paused: boolean; + + addGlobal(props: HeaderProperties): void; + add(stream: stream.Stream): boolean; + destroy(): void; + + _process(): void; +} + +// #endregion + +// #region Enums + +export interface Fields { + path: number; + mode: number; + uid: number; + gid: number; + size: number; + mtime: number; + cksum: number; + type: number; + linkpath: number; + ustar: number; + ustarvar: number; + uname: number; + gname: number; + devmaj: number; + devmin: number; + prefix: number; + fill: number; +} + +export type fields = Fields; // alias for backwards compatbility + +export const fieldSize: number[]; +export const fieldOffs: number[]; +export const fieldEnds: number[]; + +/** + * Different values of the 'type' field + * paths match the values of Stats.isX() functions, where appropriate + */ +export const types: { + 0: string; + "\0": string; + "": string; + 1: string; + 2: string; + 3: string; + 4: string; + 5: string; + 6: string; + 7: string; + g: string; + x: string; + A: string; + D: string; + I: string; + K: string; + L: string; + M: string; + N: string; + S: string; + V: string; + X: string; + File: string; + OldFile: string; + Link: string; + SymbolicLick: string; + CharacterDevice: string; + BlockDevice: string; + Directory: string; + FIFO: string; + ContiguousFile: string; + GlobalExtendedHeader: string; + ExtendedHeader: string; + SolarisACL: string; + GNUDumpDir: string; + INode: string; + NextFileHasLonLinkPath: string; + NextFileHasLongPath: string; + ContinuationFile: string; + TapeVolumeHeader: string; + OldExtendedHeader: string; +}; + +/** + * Values for the mode field + */ +export const modes: { + suid: number; + sgid: number; + svtx: number; + uread: number; + uwrite: number; + uexec: number; + gread: number; + gwrite: number; + gexec: number; + oread: number; + owrite: number; + oexec: number; +}; + +export const numeric: { + mode: boolean; + uid: boolean; + gid: boolean; + size: boolean; + mtime: boolean; + devmaj: boolean; + devmin: boolean; + cksum: boolean; + atime: boolean; + ctime: boolean; + dev: boolean; + ino: boolean; + nlink: boolean; +}; + +export const knownExtended: { + atime: boolean; + charset: boolean; + comment: boolean; + ctime: boolean; + gid: boolean; + gname: boolean; + linkpat: boolean; + mtime: boolean; + path: boolean; + realtime: boolean; + security: boolean; + size: boolean; + uid: boolean; + uname: boolean; +}; + +export const headerSize: number; +export const blockSize: number; + +//#endregion + +//#region Global Methods + +/** + * Returns a writable stream. Write tar data to it and it will emit entry events for each entry parsed from the tarball. This is used by tar.Extract. + */ +export function Parse(): ParseStream; +/** + * Returns a through stream. Use fstream to write files into the pack stream and you will receive tar archive data from the pack stream. + * This only works with directories, it does not work with individual files. + * The optional properties object are used to set properties in the tar 'Global Extended Header'. + */ +export function Pack(props?: HeaderProperties): PackStream; + +/** + * Returns a through stream. Write tar data to the stream and the files in the tarball will be extracted onto the filesystem. + * options can be: + * ``` + * { + * path: '/path/to/extract/tar/into', + * strip: 0, // how many path segments to strip from the root when extracting + * } + * ``` + * options also get passed to the fstream.Writer instance that tar uses internally. + */ +export function Extract(opts: ExtractOptions | string): ParseStream; + +export interface FileStat extends stream.Readable, Fields { + header: HeaderProperties; + startBlockSize: number; + blockRemain: number; + remain: number; + meta: boolean; + ignore: boolean; + size: number; +} + +export interface ReadEntry extends MiniPass, HeaderProperties { + /** The extended metadata object provided to the constructor. */ + extended: any; + /** The global extended metadata object provided to the constructor. */ + globalExtended: any; + /** The number of bytes remaining to be written into the stream. */ + remain: number; + /** The number of 512-byte blocks remaining to be written into the stream. */ + blockRemain: number; + /** Whether this entry should be ignored. */ + ignore: boolean; + /** + * True if this represents metadata about the next entry, false if it + * represents a filesystem object. + */ + meta: boolean; +} + +export interface CreateOptions { + /** + * A function that will get called with (message, data) + * for any warnings encountered. + */ + onwarn?(message: string, data: Buffer): void; + + /** + * Treat warnings as crash-worthy errors. Default false. + */ + strict?: boolean | undefined; + + /** + * The current working directory for creating the archive. Defaults to process.cwd(). + */ + cwd?: string | undefined; + + /** + * Alias for cwd. + */ + C?: string | undefined; + + /** + * Set to any truthy value to create a gzipped archive, + * or an object with settings for zlib.Gzip() + */ + gzip?: boolean | zlib.ZlibOptions | undefined; + + /** + * Alias for gzip. + */ + z?: boolean | zlib.ZlibOptions | undefined; + + /** + * A function that gets called with (path, stat) for each entry being + * added. Return true to add the entry to the archive, or false to omit it. + */ + filter?(path: string, stat: FileStat): boolean; + + /** + * Omit metadata that is system-specific: ctime, atime, uid, gid, uname, + * gname, dev, ino, and nlink. Note that mtime is still included, + * because this is necessary other time-based operations. + */ + portable?: boolean | undefined; + + /** + * Allow absolute paths. By default, / is stripped from absolute paths. + */ + preservePaths?: boolean | undefined; + + /** + * Alias for presevePaths. + */ + P?: boolean | undefined; + + /** + * The mode to set on the created file archive. + */ + mode?: number | undefined; + + /** + * Do not recursively archive the contents of directories. + */ + noDirRecurse?: boolean | undefined; + + /** + * Set to true to pack the targets of symbolic links. Without this + * option, symbolic links are archived as such. + */ + follow?: boolean | undefined; + + /** + * Alias for follow. + */ + L?: boolean | undefined; + + /** + * Alias for follow. + */ + h?: boolean | undefined; + + /** + * Suppress pax extended headers. Note that this means that long paths and + * linkpaths will be truncated, and large or negative numeric values + * may be interpreted incorrectly. + */ + noPax?: boolean | undefined; + + /** + * A path portion to prefix onto the entries in the archive. + */ + prefix?: string | undefined; +} + +export interface ExtractOptions { + /** + * A function that will get called with (message, data) + * for any warnings encountered. + */ + onwarn?(message: string, data: Buffer): void; + + /** + * Treat warnings as crash-worthy errors. Default false. + */ + strict?: boolean | undefined; + + /** + * Extract files relative to the specified directory. Defaults to + * process.cwd(). If provided, this must exist and must be a directory. + */ + cwd?: string | undefined; + + /** + * Alias for cwd. + */ + C?: string | undefined; + + /** + * A function that gets called with (path, stat) for each entry being + * added. Return true to emit the entry from the archive, or false to skip it. + */ + filter?(path: string, stat: FileStat): boolean; + + /** + * Set to true to keep the existing file on disk if it's newer than + * the file in the archive. + */ + newer?: boolean | undefined; + + /** + * Alias for newer. + */ + 'keep-newer'?: boolean | undefined; + + /** + * Alias for newer. + */ + 'keep-newer-files'?: boolean | undefined; + + /** + * Do not overwrite existing files. In particular, if a file appears more + * than once in an archive, later copies will not overwrite earlier copies + */ + keep?: boolean | undefined; + + /** + * Alias for keep. + */ + k?: boolean | undefined; + + /** + * Alias for keep. + */ + 'keep-existing'?: boolean | undefined; + + /** + * Unlink files before creating them. Without this option, tar overwrites + * existing files, which preserves existing hardlinks. With this option, + * existing hardlinks will be broken, as will any symlink that would + * affect the location of an extracted file. + */ + unlink?: boolean | undefined; + + /** + * Remove the specified number of leading path elements. Pathnames with + * fewer elements will be silently skipped. Note that the pathname + * is edited after applying the filter, but before security checks. + */ + strip?: number | undefined; + + /** + * Alias for strip. + */ + 'strip-components'?: number | undefined; + + /** + * Alias for strip. + */ + stripComponents?: number | undefined; + + /** + * If true, tar will set the uid and gid of extracted entries to the uid + * and gid fields in the archive. This defaults to true when run as root, + * and false otherwise. If false, then files and directories will be set + * with the owner and group of the user running the process. This is + * similar to -p in tar(1), but ACLs and other system-specific data is + * never unpacked in this implementation, and modes + * are set by default already. + */ + preserveOwner?: boolean | undefined; + + /** + * Alias for preserveOwner. + */ + p?: boolean | undefined; + + /** + * Set to a number to force ownership of all extracted files and folders, + * and all implicitly created directories, to be owned by the specified + * user id, regardless of the uid field in the archive. Cannot be used + * along with preserveOwner. Requires also setting a gid option. + */ + uid?: number | undefined; + + /** + * Set to a number to force ownership of all extracted files and folders, + * and all implicitly created directories, to be owned by the specified + * group id, regardless of the gid field in the archive. Cannot be used + * along with preserveOwner. Requires also setting a uid option + */ + gid?: number | undefined; + + /** + * Set to true to omit writing mtime value for extracted entries. + * [Alias: m, no-mtime] + */ + noMtime?: boolean | undefined; + m?: boolean | undefined; + 'no-mtime'?: boolean | undefined; + + /** + * Provide a function that takes an entry object, and returns a stream, + * or any falsey value. If a stream is provided, then that stream's data + * will be written instead of the contents of the archive entry. If a + * falsey value is provided, then the entry is written to disk as normal. + * (To exclude items from extraction, use the filter option described above.) + */ + transform?(entry: ReadEntry): NodeJS.WritableStream | undefined | false | null; + + /** + * A function that gets called with (entry) for each entry that passes the + * filter. + */ + onentry?(entry: ReadEntry): void; + + // The following options are mostly internal, but can be modified in some + // advanced use cases, such as re-using caches between runs. + + /** + * The maximum buffer size for fs.read() operations (in bytes). Defaults to 16 MB. + */ + maxReadSize?: number | undefined; + + /** + * The maximum size of meta entries that is supported. Defaults to 1 MB. + */ + maxMetaEntrySize?: number | undefined; +} + +export interface ListOptions { + /** + * Treat warnings as crash-worthy errors. Default false. + */ + strict?: boolean | undefined; + + /** + * Extract files relative to the specified directory. Defaults to + * process.cwd(). If provided, this must exist and must be a directory. + */ + cwd?: string | undefined; + + /** + * Alias for cwd. + */ + C?: string | undefined; + + /** + * A function that gets called with (path, stat) for each entry being + * added. Return true to emit the entry from the archive, or false to skip it. + */ + filter?(path: string, entry: FileStat): boolean; + + /** + * A function that gets called with (entry) for each entry that passes the + * filter. This is important for when both file and sync are set, because + * it will be called synchronously. + */ + onentry?(entry: FileStat): void; + + /** + * The maximum buffer size for fs.read() operations. Defaults to 16 MB. + */ + maxReadSize?: number | undefined; + + /** + * By default, entry streams are resumed immediately after the call to + * onentry. Set noResume: true to suppress this behavior. Note that by + * opting into this, the stream will never complete until the entry + * data is consumed. + */ + noResume?: boolean | undefined; +} + +export interface ReplaceOptions { + /** + * Required. Write the tarball archive to the specified filename. + */ + file: string; + + /** + * Act synchronously. If this is set, then any provided file will be + * fully written after the call to tar.c. + */ + sync?: boolean | undefined; + + /** + * A function that will get called with (message, data) + * for any warnings encountered. + */ + onwarn?(message: string, data: Buffer): void; + + /** + * Treat warnings as crash-worthy errors. Default false. + */ + strict?: boolean | undefined; + + /** + * Extract files relative to the specified directory. Defaults to + * process.cwd(). If provided, this must exist and must be a directory. + */ + cwd?: string | undefined; + + /** + * Alias for cwd. + */ + C?: string | undefined; + + /** + * A path portion to prefix onto the entries in the archive. + */ + prefix?: string | undefined; + + /** + * Set to any truthy value to create a gzipped archive, + * or an object with settings for zlib.Gzip() + */ + gzip?: boolean | zlib.ZlibOptions | undefined; + + /** + * A function that gets called with (path, stat) for each entry being + * added. Return true to emit the entry from the archive, or false to skip it. + */ + filter?(path: string, stat: FileStat): boolean; + + /** + * Allow absolute paths. By default, / is stripped from absolute paths. + */ + preservePaths?: boolean | undefined; + + /** + * The maximum buffer size for fs.read() operations. Defaults to 16 MB. + */ + maxReadSize?: number | undefined; + + /** + * Do not recursively archive the contents of directories. + */ + noDirRecurse?: boolean | undefined; + + /** + * Set to true to pack the targets of symbolic links. Without this + * option, symbolic links are archived as such. + */ + follow?: boolean | undefined; + + /** + * Alias for follow. + */ + L?: boolean | undefined; + + /** + * Alias for follow. + */ + h?: boolean | undefined; + + /** + * uppress pax extended headers. Note that this means that long paths and + * linkpaths will be truncated, and large or negative numeric values + * may be interpreted incorrectly. + */ + noPax?: boolean | undefined; +} + +export interface FileOptions { + /** + * Uses the given file as the input or output of this function. + */ + file?: string | undefined; + + /** + * Alias for file. + */ + f?: string | undefined; +} + +/** + * Create a tarball archive. The fileList is an array of paths to add to the + * tarball. Adding a directory also adds its children recursively. An entry in + * fileList that starts with an @ symbol is a tar archive whose entries will + * be added. To add a file that starts with @, prepend it with `./`. + * + * Archive data may be read from the returned stream. + */ +export function create(options: CreateOptions, fileList: ReadonlyArray, callback?: (err?: Error) => void): stream.Readable; + +/** + * Create a tarball archive. The fileList is an array of paths to add to the + * tarball. Adding a directory also adds its children recursively. An entry in + * fileList that starts with an @ symbol is a tar archive whose entries will + * be added. To add a file that starts with @, prepend it with `./`. + */ +export function create(options: CreateOptions & FileOptions, fileList: ReadonlyArray): Promise; +export function create(options: CreateOptions & FileOptions & { sync: true }, fileList: ReadonlyArray): void; +export function create(options: CreateOptions & FileOptions, fileList: ReadonlyArray, callback: (err?: Error) => void): void; + +/** + * Alias for create + */ +export const c: typeof create; + +/** + * Extract a tarball archive. The fileList is an array of paths to extract + * from the tarball. If no paths are provided, then all the entries are + * extracted. If the archive is gzipped, then tar will detect this and unzip + * it. Note that all directories that are created will be forced to be + * writable, readable, and listable by their owner, to avoid cases where a + * directory prevents extraction of child entries by virtue of its mode. Most + * extraction errors will cause a warn event to be emitted. If the cwd is + * missing, or not a directory, then the extraction will fail completely. + * + * Archive data should be written to the returned stream. + */ +export function extract(options: ExtractOptions, fileList?: ReadonlyArray, callback?: (err?: Error) => void): stream.Writable; + +/** + * Extract a tarball archive. The fileList is an array of paths to extract + * from the tarball. If no paths are provided, then all the entries are + * extracted. If the archive is gzipped, then tar will detect this and unzip + * it. Note that all directories that are created will be forced to be + * writable, readable, and listable by their owner, to avoid cases where a + * directory prevents extraction of child entries by virtue of its mode. Most + * extraction errors will cause a warn event to be emitted. If the cwd is + * missing, or not a directory, then the extraction will fail completely. + */ +export function extract(options: ExtractOptions & FileOptions, fileList?: ReadonlyArray): Promise; +export function extract(options: ExtractOptions & FileOptions & { sync: true }, fileList?: ReadonlyArray): void; +export function extract(options: ExtractOptions & FileOptions, fileList: ReadonlyArray | undefined, callback: (err?: Error) => void): void; + +/** + * Alias for extract + */ +export const x: typeof extract; + +/** + * List the contents of a tarball archive. The fileList is an array of paths + * to list from the tarball. If no paths are provided, then all the entries + * are listed. If the archive is gzipped, then tar will detect this and unzip + * it. + * + * Archive data should be written to the returned stream. + */ +export function list(options?: ListOptions & FileOptions, fileList?: ReadonlyArray, callback?: (err?: Error) => void): stream.Writable; + +/** + * List the contents of a tarball archive. The fileList is an array of paths + * to list from the tarball. If no paths are provided, then all the entries + * are listed. If the archive is gzipped, then tar will detect this and unzip + * it. + */ +export function list(options: ListOptions & FileOptions, fileList?: ReadonlyArray): Promise; +export function list(options: ListOptions & FileOptions & { sync: true }, fileList?: ReadonlyArray): void; + +/** + * Alias for list + */ +export const t: typeof list; + +/** + * Add files to an existing archive. Because later entries override earlier + * entries, this effectively replaces any existing entries. The fileList is an + * array of paths to add to the tarball. Adding a directory also adds its + * children recursively. An entry in fileList that starts with an @ symbol is + * a tar archive whose entries will be added. To add a file that + * starts with @, prepend it with ./. + */ +export function replace(options: ReplaceOptions, fileList?: ReadonlyArray): Promise; +export function replace(options: ReplaceOptions, fileList: ReadonlyArray | undefined, callback: (err?: Error) => void): Promise; + +/** + * Alias for replace + */ +export const r: typeof replace; + +/** + * Add files to an archive if they are newer than the entry already in the + * tarball archive. The fileList is an array of paths to add to the tarball. + * Adding a directory also adds its children recursively. An entry in fileList + * that starts with an @ symbol is a tar archive whose entries will be added. + * To add a file that starts with @, prepend it with ./. + */ +export function update(options: ReplaceOptions, fileList?: ReadonlyArray): Promise; +export function update(options: ReplaceOptions, fileList: ReadonlyArray | undefined, callback: (err?: Error) => void): Promise; + +/** + * Alias for update + */ +export const u: typeof update; diff --git a/types-tar/package.json b/types-tar/package.json new file mode 100755 index 0000000..23376a0 --- /dev/null +++ b/types-tar/package.json @@ -0,0 +1,33 @@ +{ + "name": "@types/tar", + "version": "4.0.5", + "description": "TypeScript definitions for tar", + "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/tar", + "license": "MIT", + "contributors": [ + { + "name": "Maxime LUCE", + "url": "https://github.com/SomaticIT", + "githubUsername": "SomaticIT" + }, + { + "name": "Connor Peet", + "url": "https://github.com/connor4312", + "githubUsername": "connor4312" + } + ], + "main": "", + "types": "index.d.ts", + "repository": { + "type": "git", + "url": "https://github.com/DefinitelyTyped/DefinitelyTyped.git", + "directory": "types/tar" + }, + "scripts": {}, + "dependencies": { + "@types/minipass": "*", + "@types/node": "*" + }, + "typesPublisherContentHash": "a6efdc2394562ab1a73de84074e183b53ab21d470ff13ecf93b28ba3993bd3d7", + "typeScriptVersion": "3.6" +} \ No newline at end of file