cline 1.0.0-nightly.5 → 1.0.0-nightly.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cline +0 -0
- package/bin/cline-host +0 -0
- package/node_modules/base64-js/LICENSE +21 -0
- package/node_modules/base64-js/README.md +34 -0
- package/node_modules/base64-js/base64js.min.js +1 -0
- package/node_modules/base64-js/index.d.ts +3 -0
- package/node_modules/base64-js/index.js +150 -0
- package/node_modules/base64-js/package.json +47 -0
- package/node_modules/better-sqlite3/LICENSE +21 -0
- package/node_modules/better-sqlite3/README.md +99 -0
- package/node_modules/better-sqlite3/binding.gyp +38 -0
- package/node_modules/better-sqlite3/deps/common.gypi +68 -0
- package/node_modules/better-sqlite3/deps/copy.js +31 -0
- package/node_modules/better-sqlite3/deps/defines.gypi +41 -0
- package/node_modules/better-sqlite3/deps/download.sh +122 -0
- package/node_modules/better-sqlite3/deps/patches/1208.patch +15 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.c +262875 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3.h +13775 -0
- package/node_modules/better-sqlite3/deps/sqlite3/sqlite3ext.h +723 -0
- package/node_modules/better-sqlite3/deps/sqlite3.gyp +80 -0
- package/node_modules/better-sqlite3/deps/test_extension.c +21 -0
- package/node_modules/better-sqlite3/lib/database.js +90 -0
- package/node_modules/better-sqlite3/lib/index.js +3 -0
- package/node_modules/better-sqlite3/lib/methods/aggregate.js +43 -0
- package/node_modules/better-sqlite3/lib/methods/backup.js +67 -0
- package/node_modules/better-sqlite3/lib/methods/function.js +31 -0
- package/node_modules/better-sqlite3/lib/methods/inspect.js +7 -0
- package/node_modules/better-sqlite3/lib/methods/pragma.js +12 -0
- package/node_modules/better-sqlite3/lib/methods/serialize.js +16 -0
- package/node_modules/better-sqlite3/lib/methods/table.js +189 -0
- package/node_modules/better-sqlite3/lib/methods/transaction.js +78 -0
- package/node_modules/better-sqlite3/lib/methods/wrappers.js +54 -0
- package/node_modules/better-sqlite3/lib/sqlite-error.js +20 -0
- package/node_modules/better-sqlite3/lib/util.js +12 -0
- package/node_modules/better-sqlite3/package.json +62 -0
- package/node_modules/better-sqlite3/src/better_sqlite3.cpp +2189 -0
- package/node_modules/better-sqlite3/src/better_sqlite3.hpp +1036 -0
- package/node_modules/bindings/LICENSE.md +22 -0
- package/node_modules/bindings/README.md +98 -0
- package/node_modules/bindings/bindings.js +221 -0
- package/node_modules/bindings/package.json +28 -0
- package/node_modules/bl/.travis.yml +17 -0
- package/node_modules/bl/BufferList.js +396 -0
- package/node_modules/bl/LICENSE.md +13 -0
- package/node_modules/bl/README.md +247 -0
- package/node_modules/bl/bl.js +84 -0
- package/node_modules/bl/package.json +37 -0
- package/node_modules/bl/test/convert.js +21 -0
- package/node_modules/bl/test/indexOf.js +492 -0
- package/node_modules/bl/test/isBufferList.js +32 -0
- package/node_modules/bl/test/test.js +869 -0
- package/node_modules/buffer/AUTHORS.md +70 -0
- package/node_modules/buffer/LICENSE +21 -0
- package/node_modules/buffer/README.md +410 -0
- package/node_modules/buffer/index.d.ts +186 -0
- package/node_modules/buffer/index.js +1817 -0
- package/node_modules/buffer/package.json +96 -0
- package/node_modules/chownr/LICENSE +15 -0
- package/node_modules/chownr/README.md +3 -0
- package/node_modules/chownr/chownr.js +167 -0
- package/node_modules/chownr/package.json +29 -0
- package/node_modules/decompress-response/index.d.ts +22 -0
- package/node_modules/decompress-response/index.js +58 -0
- package/node_modules/decompress-response/license +9 -0
- package/node_modules/decompress-response/package.json +56 -0
- package/node_modules/decompress-response/readme.md +48 -0
- package/node_modules/deep-extend/LICENSE +20 -0
- package/node_modules/deep-extend/README.md +91 -0
- package/node_modules/deep-extend/index.js +1 -0
- package/node_modules/deep-extend/lib/deep-extend.js +150 -0
- package/node_modules/deep-extend/package.json +62 -0
- package/node_modules/detect-libc/LICENSE +201 -0
- package/node_modules/detect-libc/README.md +163 -0
- package/node_modules/detect-libc/index.d.ts +14 -0
- package/node_modules/detect-libc/lib/detect-libc.js +267 -0
- package/node_modules/detect-libc/lib/filesystem.js +41 -0
- package/node_modules/detect-libc/lib/process.js +24 -0
- package/node_modules/detect-libc/package.json +41 -0
- package/node_modules/end-of-stream/LICENSE +21 -0
- package/node_modules/end-of-stream/README.md +54 -0
- package/node_modules/end-of-stream/index.js +96 -0
- package/node_modules/end-of-stream/package.json +37 -0
- package/node_modules/expand-template/.travis.yml +6 -0
- package/node_modules/expand-template/LICENSE +21 -0
- package/node_modules/expand-template/README.md +43 -0
- package/node_modules/expand-template/index.js +26 -0
- package/node_modules/expand-template/package.json +29 -0
- package/node_modules/expand-template/test.js +67 -0
- package/node_modules/file-uri-to-path/.npmignore +1 -0
- package/node_modules/file-uri-to-path/.travis.yml +30 -0
- package/node_modules/file-uri-to-path/History.md +21 -0
- package/node_modules/file-uri-to-path/LICENSE +20 -0
- package/node_modules/file-uri-to-path/README.md +74 -0
- package/node_modules/file-uri-to-path/index.d.ts +2 -0
- package/node_modules/file-uri-to-path/index.js +66 -0
- package/node_modules/file-uri-to-path/package.json +32 -0
- package/node_modules/file-uri-to-path/test/test.js +24 -0
- package/node_modules/file-uri-to-path/test/tests.json +13 -0
- package/node_modules/fs-constants/LICENSE +21 -0
- package/node_modules/fs-constants/README.md +26 -0
- package/node_modules/fs-constants/browser.js +1 -0
- package/node_modules/fs-constants/index.js +1 -0
- package/node_modules/fs-constants/package.json +19 -0
- package/node_modules/github-from-package/.travis.yml +4 -0
- package/node_modules/github-from-package/LICENSE +18 -0
- package/node_modules/github-from-package/example/package.json +8 -0
- package/node_modules/github-from-package/example/url.js +3 -0
- package/node_modules/github-from-package/index.js +17 -0
- package/node_modules/github-from-package/package.json +30 -0
- package/node_modules/github-from-package/readme.markdown +53 -0
- package/node_modules/github-from-package/test/a.json +8 -0
- package/node_modules/github-from-package/test/b.json +5 -0
- package/node_modules/github-from-package/test/c.json +5 -0
- package/node_modules/github-from-package/test/d.json +7 -0
- package/node_modules/github-from-package/test/e.json +5 -0
- package/node_modules/github-from-package/test/url.js +19 -0
- package/node_modules/ieee754/LICENSE +11 -0
- package/node_modules/ieee754/README.md +51 -0
- package/node_modules/ieee754/index.d.ts +10 -0
- package/node_modules/ieee754/index.js +85 -0
- package/node_modules/ieee754/package.json +52 -0
- package/node_modules/inherits/LICENSE +16 -0
- package/node_modules/inherits/README.md +42 -0
- package/node_modules/inherits/inherits.js +9 -0
- package/node_modules/inherits/inherits_browser.js +27 -0
- package/node_modules/inherits/package.json +29 -0
- package/node_modules/ini/LICENSE +15 -0
- package/node_modules/ini/README.md +102 -0
- package/node_modules/ini/ini.js +206 -0
- package/node_modules/ini/package.json +33 -0
- package/node_modules/mimic-response/index.d.ts +17 -0
- package/node_modules/mimic-response/index.js +77 -0
- package/node_modules/mimic-response/license +9 -0
- package/node_modules/mimic-response/package.json +42 -0
- package/node_modules/mimic-response/readme.md +78 -0
- package/node_modules/minimist/.eslintrc +29 -0
- package/node_modules/minimist/.github/FUNDING.yml +12 -0
- package/node_modules/minimist/.nycrc +14 -0
- package/node_modules/minimist/CHANGELOG.md +298 -0
- package/node_modules/minimist/LICENSE +18 -0
- package/node_modules/minimist/README.md +121 -0
- package/node_modules/minimist/example/parse.js +4 -0
- package/node_modules/minimist/index.js +263 -0
- package/node_modules/minimist/package.json +75 -0
- package/node_modules/minimist/test/all_bool.js +34 -0
- package/node_modules/minimist/test/bool.js +177 -0
- package/node_modules/minimist/test/dash.js +43 -0
- package/node_modules/minimist/test/default_bool.js +37 -0
- package/node_modules/minimist/test/dotted.js +24 -0
- package/node_modules/minimist/test/kv_short.js +32 -0
- package/node_modules/minimist/test/long.js +33 -0
- package/node_modules/minimist/test/num.js +38 -0
- package/node_modules/minimist/test/parse.js +209 -0
- package/node_modules/minimist/test/parse_modified.js +11 -0
- package/node_modules/minimist/test/proto.js +64 -0
- package/node_modules/minimist/test/short.js +69 -0
- package/node_modules/minimist/test/stop_early.js +17 -0
- package/node_modules/minimist/test/unknown.js +104 -0
- package/node_modules/minimist/test/whitespace.js +10 -0
- package/node_modules/mkdirp-classic/LICENSE +21 -0
- package/node_modules/mkdirp-classic/README.md +18 -0
- package/node_modules/mkdirp-classic/index.js +98 -0
- package/node_modules/mkdirp-classic/package.json +18 -0
- package/node_modules/napi-build-utils/.github/workflows/run-npm-tests.yml +31 -0
- package/node_modules/napi-build-utils/LICENSE +21 -0
- package/node_modules/napi-build-utils/README.md +52 -0
- package/node_modules/napi-build-utils/index.js +214 -0
- package/node_modules/napi-build-utils/index.md +0 -0
- package/node_modules/napi-build-utils/package.json +42 -0
- package/node_modules/node-abi/LICENSE +21 -0
- package/node_modules/node-abi/README.md +54 -0
- package/node_modules/node-abi/abi_registry.json +408 -0
- package/node_modules/node-abi/index.js +179 -0
- package/node_modules/node-abi/package.json +45 -0
- package/node_modules/once/LICENSE +15 -0
- package/node_modules/once/README.md +79 -0
- package/node_modules/once/once.js +42 -0
- package/node_modules/once/package.json +33 -0
- package/node_modules/prebuild-install/CHANGELOG.md +131 -0
- package/node_modules/prebuild-install/CONTRIBUTING.md +6 -0
- package/node_modules/prebuild-install/LICENSE +21 -0
- package/node_modules/prebuild-install/README.md +163 -0
- package/node_modules/prebuild-install/asset.js +44 -0
- package/node_modules/prebuild-install/bin.js +78 -0
- package/node_modules/prebuild-install/download.js +142 -0
- package/node_modules/prebuild-install/error.js +14 -0
- package/node_modules/prebuild-install/help.txt +16 -0
- package/node_modules/prebuild-install/index.js +1 -0
- package/node_modules/prebuild-install/log.js +33 -0
- package/node_modules/prebuild-install/package.json +67 -0
- package/node_modules/prebuild-install/proxy.js +35 -0
- package/node_modules/prebuild-install/rc.js +64 -0
- package/node_modules/prebuild-install/util.js +143 -0
- package/node_modules/pump/.github/FUNDING.yml +2 -0
- package/node_modules/pump/.travis.yml +5 -0
- package/node_modules/pump/LICENSE +21 -0
- package/node_modules/pump/README.md +74 -0
- package/node_modules/pump/SECURITY.md +5 -0
- package/node_modules/pump/index.js +86 -0
- package/node_modules/pump/package.json +24 -0
- package/node_modules/pump/test-browser.js +66 -0
- package/node_modules/pump/test-node.js +53 -0
- package/node_modules/rc/LICENSE.APACHE2 +15 -0
- package/node_modules/rc/LICENSE.BSD +26 -0
- package/node_modules/rc/LICENSE.MIT +24 -0
- package/node_modules/rc/README.md +227 -0
- package/node_modules/rc/browser.js +7 -0
- package/node_modules/rc/cli.js +4 -0
- package/node_modules/rc/index.js +53 -0
- package/node_modules/rc/lib/utils.js +104 -0
- package/node_modules/rc/package.json +29 -0
- package/node_modules/rc/test/ini.js +16 -0
- package/node_modules/rc/test/nested-env-vars.js +50 -0
- package/node_modules/rc/test/test.js +59 -0
- package/node_modules/readable-stream/CONTRIBUTING.md +38 -0
- package/node_modules/readable-stream/GOVERNANCE.md +136 -0
- package/node_modules/readable-stream/LICENSE +47 -0
- package/node_modules/readable-stream/README.md +106 -0
- package/node_modules/readable-stream/errors-browser.js +127 -0
- package/node_modules/readable-stream/errors.js +116 -0
- package/node_modules/readable-stream/experimentalWarning.js +17 -0
- package/node_modules/readable-stream/lib/_stream_duplex.js +126 -0
- package/node_modules/readable-stream/lib/_stream_passthrough.js +37 -0
- package/node_modules/readable-stream/lib/_stream_readable.js +1027 -0
- package/node_modules/readable-stream/lib/_stream_transform.js +190 -0
- package/node_modules/readable-stream/lib/_stream_writable.js +641 -0
- package/node_modules/readable-stream/lib/internal/streams/async_iterator.js +180 -0
- package/node_modules/readable-stream/lib/internal/streams/buffer_list.js +183 -0
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +96 -0
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/from-browser.js +3 -0
- package/node_modules/readable-stream/lib/internal/streams/from.js +52 -0
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +86 -0
- package/node_modules/readable-stream/lib/internal/streams/state.js +22 -0
- package/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
- package/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
- package/node_modules/readable-stream/package.json +68 -0
- package/node_modules/readable-stream/readable-browser.js +9 -0
- package/node_modules/readable-stream/readable.js +16 -0
- package/node_modules/safe-buffer/LICENSE +21 -0
- package/node_modules/safe-buffer/README.md +584 -0
- package/node_modules/safe-buffer/index.d.ts +187 -0
- package/node_modules/safe-buffer/index.js +65 -0
- package/node_modules/safe-buffer/package.json +51 -0
- package/node_modules/semver/LICENSE +15 -0
- package/node_modules/semver/README.md +664 -0
- package/node_modules/semver/bin/semver.js +191 -0
- package/node_modules/semver/classes/comparator.js +143 -0
- package/node_modules/semver/classes/index.js +7 -0
- package/node_modules/semver/classes/range.js +556 -0
- package/node_modules/semver/classes/semver.js +319 -0
- package/node_modules/semver/functions/clean.js +8 -0
- package/node_modules/semver/functions/cmp.js +54 -0
- package/node_modules/semver/functions/coerce.js +62 -0
- package/node_modules/semver/functions/compare-build.js +9 -0
- package/node_modules/semver/functions/compare-loose.js +5 -0
- package/node_modules/semver/functions/compare.js +7 -0
- package/node_modules/semver/functions/diff.js +60 -0
- package/node_modules/semver/functions/eq.js +5 -0
- package/node_modules/semver/functions/gt.js +5 -0
- package/node_modules/semver/functions/gte.js +5 -0
- package/node_modules/semver/functions/inc.js +21 -0
- package/node_modules/semver/functions/lt.js +5 -0
- package/node_modules/semver/functions/lte.js +5 -0
- package/node_modules/semver/functions/major.js +5 -0
- package/node_modules/semver/functions/minor.js +5 -0
- package/node_modules/semver/functions/neq.js +5 -0
- package/node_modules/semver/functions/parse.js +18 -0
- package/node_modules/semver/functions/patch.js +5 -0
- package/node_modules/semver/functions/prerelease.js +8 -0
- package/node_modules/semver/functions/rcompare.js +5 -0
- package/node_modules/semver/functions/rsort.js +5 -0
- package/node_modules/semver/functions/satisfies.js +12 -0
- package/node_modules/semver/functions/sort.js +5 -0
- package/node_modules/semver/functions/valid.js +8 -0
- package/node_modules/semver/index.js +91 -0
- package/node_modules/semver/internal/constants.js +37 -0
- package/node_modules/semver/internal/debug.js +11 -0
- package/node_modules/semver/internal/identifiers.js +25 -0
- package/node_modules/semver/internal/lrucache.js +42 -0
- package/node_modules/semver/internal/parse-options.js +17 -0
- package/node_modules/semver/internal/re.js +223 -0
- package/node_modules/semver/package.json +78 -0
- package/node_modules/semver/preload.js +4 -0
- package/node_modules/semver/range.bnf +16 -0
- package/node_modules/semver/ranges/gtr.js +6 -0
- package/node_modules/semver/ranges/intersects.js +9 -0
- package/node_modules/semver/ranges/ltr.js +6 -0
- package/node_modules/semver/ranges/max-satisfying.js +27 -0
- package/node_modules/semver/ranges/min-satisfying.js +26 -0
- package/node_modules/semver/ranges/min-version.js +63 -0
- package/node_modules/semver/ranges/outside.js +82 -0
- package/node_modules/semver/ranges/simplify.js +49 -0
- package/node_modules/semver/ranges/subset.js +249 -0
- package/node_modules/semver/ranges/to-comparators.js +10 -0
- package/node_modules/semver/ranges/valid.js +13 -0
- package/node_modules/simple-concat/.travis.yml +3 -0
- package/node_modules/simple-concat/LICENSE +20 -0
- package/node_modules/simple-concat/README.md +44 -0
- package/node_modules/simple-concat/index.js +15 -0
- package/node_modules/simple-concat/package.json +47 -0
- package/node_modules/simple-concat/test/basic.js +41 -0
- package/node_modules/simple-get/.github/dependabot.yml +15 -0
- package/node_modules/simple-get/.github/workflows/ci.yml +23 -0
- package/node_modules/simple-get/LICENSE +20 -0
- package/node_modules/simple-get/README.md +333 -0
- package/node_modules/simple-get/index.js +108 -0
- package/node_modules/simple-get/package.json +67 -0
- package/node_modules/string_decoder/LICENSE +48 -0
- package/node_modules/string_decoder/README.md +47 -0
- package/node_modules/string_decoder/lib/string_decoder.js +296 -0
- package/node_modules/string_decoder/package.json +34 -0
- package/node_modules/strip-json-comments/index.js +70 -0
- package/node_modules/strip-json-comments/license +21 -0
- package/node_modules/strip-json-comments/package.json +42 -0
- package/node_modules/strip-json-comments/readme.md +64 -0
- package/node_modules/tar-fs/.travis.yml +6 -0
- package/node_modules/tar-fs/LICENSE +21 -0
- package/node_modules/tar-fs/README.md +165 -0
- package/node_modules/tar-fs/index.js +358 -0
- package/node_modules/tar-fs/package.json +41 -0
- package/node_modules/tar-fs/test/fixtures/a/hello.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/b/a/test.txt +1 -0
- package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
- package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
- package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
- package/node_modules/tar-fs/test/fixtures/e/file +0 -0
- package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
- package/node_modules/tar-fs/test/index.js +346 -0
- package/node_modules/tar-stream/LICENSE +21 -0
- package/node_modules/tar-stream/README.md +168 -0
- package/node_modules/tar-stream/extract.js +257 -0
- package/node_modules/tar-stream/headers.js +295 -0
- package/node_modules/tar-stream/index.js +2 -0
- package/node_modules/tar-stream/pack.js +255 -0
- package/node_modules/tar-stream/package.json +58 -0
- package/node_modules/tar-stream/sandbox.js +11 -0
- package/node_modules/tunnel-agent/LICENSE +55 -0
- package/node_modules/tunnel-agent/README.md +4 -0
- package/node_modules/tunnel-agent/index.js +244 -0
- package/node_modules/tunnel-agent/package.json +22 -0
- package/node_modules/util-deprecate/History.md +16 -0
- package/node_modules/util-deprecate/LICENSE +24 -0
- package/node_modules/util-deprecate/README.md +53 -0
- package/node_modules/util-deprecate/browser.js +67 -0
- package/node_modules/util-deprecate/node.js +6 -0
- package/node_modules/util-deprecate/package.json +27 -0
- package/node_modules/wrappy/LICENSE +15 -0
- package/node_modules/wrappy/README.md +36 -0
- package/node_modules/wrappy/package.json +29 -0
- package/node_modules/wrappy/wrappy.js +33 -0
- package/package.json +1 -1
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
var test = require('tape')
|
|
2
|
+
var rimraf = require('rimraf')
|
|
3
|
+
var tar = require('../index')
|
|
4
|
+
var tarStream = require('tar-stream')
|
|
5
|
+
var path = require('path')
|
|
6
|
+
var fs = require('fs')
|
|
7
|
+
var os = require('os')
|
|
8
|
+
|
|
9
|
+
var win32 = os.platform() === 'win32'
|
|
10
|
+
|
|
11
|
+
var mtime = function (st) {
|
|
12
|
+
return Math.floor(st.mtime.getTime() / 1000)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
test('copy a -> copy/a', function (t) {
|
|
16
|
+
t.plan(5)
|
|
17
|
+
|
|
18
|
+
var a = path.join(__dirname, 'fixtures', 'a')
|
|
19
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'a')
|
|
20
|
+
|
|
21
|
+
rimraf.sync(b)
|
|
22
|
+
tar.pack(a)
|
|
23
|
+
.pipe(tar.extract(b))
|
|
24
|
+
.on('finish', function () {
|
|
25
|
+
var files = fs.readdirSync(b)
|
|
26
|
+
t.same(files.length, 1)
|
|
27
|
+
t.same(files[0], 'hello.txt')
|
|
28
|
+
var fileB = path.join(b, files[0])
|
|
29
|
+
var fileA = path.join(a, files[0])
|
|
30
|
+
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
|
|
31
|
+
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
|
|
32
|
+
t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
test('copy b -> copy/b', function (t) {
|
|
37
|
+
t.plan(8)
|
|
38
|
+
|
|
39
|
+
var a = path.join(__dirname, 'fixtures', 'b')
|
|
40
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'b')
|
|
41
|
+
|
|
42
|
+
rimraf.sync(b)
|
|
43
|
+
tar.pack(a)
|
|
44
|
+
.pipe(tar.extract(b))
|
|
45
|
+
.on('finish', function () {
|
|
46
|
+
var files = fs.readdirSync(b)
|
|
47
|
+
t.same(files.length, 1)
|
|
48
|
+
t.same(files[0], 'a')
|
|
49
|
+
var dirB = path.join(b, files[0])
|
|
50
|
+
var dirA = path.join(a, files[0])
|
|
51
|
+
t.same(fs.statSync(dirB).mode, fs.statSync(dirA).mode)
|
|
52
|
+
t.same(mtime(fs.statSync(dirB)), mtime(fs.statSync(dirA)))
|
|
53
|
+
t.ok(fs.statSync(dirB).isDirectory())
|
|
54
|
+
var fileB = path.join(dirB, 'test.txt')
|
|
55
|
+
var fileA = path.join(dirA, 'test.txt')
|
|
56
|
+
t.same(fs.readFileSync(fileB, 'utf-8'), fs.readFileSync(fileA, 'utf-8'))
|
|
57
|
+
t.same(fs.statSync(fileB).mode, fs.statSync(fileA).mode)
|
|
58
|
+
t.same(mtime(fs.statSync(fileB)), mtime(fs.statSync(fileA)))
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('symlink', function (t) {
|
|
63
|
+
if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
|
|
64
|
+
t.plan(1)
|
|
65
|
+
t.ok(true)
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
t.plan(5)
|
|
70
|
+
|
|
71
|
+
var a = path.join(__dirname, 'fixtures', 'c')
|
|
72
|
+
|
|
73
|
+
rimraf.sync(path.join(a, 'link'))
|
|
74
|
+
fs.symlinkSync('.gitignore', path.join(a, 'link'))
|
|
75
|
+
|
|
76
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'c')
|
|
77
|
+
|
|
78
|
+
rimraf.sync(b)
|
|
79
|
+
tar.pack(a)
|
|
80
|
+
.pipe(tar.extract(b))
|
|
81
|
+
.on('finish', function () {
|
|
82
|
+
var files = fs.readdirSync(b).sort()
|
|
83
|
+
t.same(files.length, 2)
|
|
84
|
+
t.same(files[0], '.gitignore')
|
|
85
|
+
t.same(files[1], 'link')
|
|
86
|
+
|
|
87
|
+
var linkA = path.join(a, 'link')
|
|
88
|
+
var linkB = path.join(b, 'link')
|
|
89
|
+
|
|
90
|
+
t.same(mtime(fs.lstatSync(linkB)), mtime(fs.lstatSync(linkA)))
|
|
91
|
+
t.same(fs.readlinkSync(linkB), fs.readlinkSync(linkA))
|
|
92
|
+
})
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
test('follow symlinks', function (t) {
|
|
96
|
+
if (win32) { // no symlink support on win32 currently. TODO: test if this can be enabled somehow
|
|
97
|
+
t.plan(1)
|
|
98
|
+
t.ok(true)
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
t.plan(5)
|
|
103
|
+
|
|
104
|
+
var a = path.join(__dirname, 'fixtures', 'c')
|
|
105
|
+
|
|
106
|
+
rimraf.sync(path.join(a, 'link'))
|
|
107
|
+
fs.symlinkSync('.gitignore', path.join(a, 'link'))
|
|
108
|
+
|
|
109
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'c-dereference')
|
|
110
|
+
|
|
111
|
+
rimraf.sync(b)
|
|
112
|
+
tar.pack(a, { dereference: true })
|
|
113
|
+
.pipe(tar.extract(b))
|
|
114
|
+
.on('finish', function () {
|
|
115
|
+
var files = fs.readdirSync(b).sort()
|
|
116
|
+
t.same(files.length, 2)
|
|
117
|
+
t.same(files[0], '.gitignore')
|
|
118
|
+
t.same(files[1], 'link')
|
|
119
|
+
|
|
120
|
+
var file1 = path.join(b, '.gitignore')
|
|
121
|
+
var file2 = path.join(b, 'link')
|
|
122
|
+
|
|
123
|
+
t.same(mtime(fs.lstatSync(file1)), mtime(fs.lstatSync(file2)))
|
|
124
|
+
t.same(fs.readFileSync(file1), fs.readFileSync(file2))
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
test('strip', function (t) {
|
|
129
|
+
t.plan(2)
|
|
130
|
+
|
|
131
|
+
var a = path.join(__dirname, 'fixtures', 'b')
|
|
132
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
|
|
133
|
+
|
|
134
|
+
rimraf.sync(b)
|
|
135
|
+
|
|
136
|
+
tar.pack(a)
|
|
137
|
+
.pipe(tar.extract(b, { strip: 1 }))
|
|
138
|
+
.on('finish', function () {
|
|
139
|
+
var files = fs.readdirSync(b).sort()
|
|
140
|
+
t.same(files.length, 1)
|
|
141
|
+
t.same(files[0], 'test.txt')
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
test('strip + map', function (t) {
|
|
146
|
+
t.plan(2)
|
|
147
|
+
|
|
148
|
+
var a = path.join(__dirname, 'fixtures', 'b')
|
|
149
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'b-strip')
|
|
150
|
+
|
|
151
|
+
rimraf.sync(b)
|
|
152
|
+
|
|
153
|
+
var uppercase = function (header) {
|
|
154
|
+
header.name = header.name.toUpperCase()
|
|
155
|
+
return header
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
tar.pack(a)
|
|
159
|
+
.pipe(tar.extract(b, { strip: 1, map: uppercase }))
|
|
160
|
+
.on('finish', function () {
|
|
161
|
+
var files = fs.readdirSync(b).sort()
|
|
162
|
+
t.same(files.length, 1)
|
|
163
|
+
t.same(files[0], 'TEST.TXT')
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
test('map + dir + permissions', function (t) {
|
|
168
|
+
t.plan(win32 ? 1 : 2) // skip chmod test, it's not working like unix
|
|
169
|
+
|
|
170
|
+
var a = path.join(__dirname, 'fixtures', 'b')
|
|
171
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'a-perms')
|
|
172
|
+
|
|
173
|
+
rimraf.sync(b)
|
|
174
|
+
|
|
175
|
+
var aWithMode = function (header) {
|
|
176
|
+
if (header.name === 'a') {
|
|
177
|
+
header.mode = parseInt(700, 8)
|
|
178
|
+
}
|
|
179
|
+
return header
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
tar.pack(a)
|
|
183
|
+
.pipe(tar.extract(b, { map: aWithMode }))
|
|
184
|
+
.on('finish', function () {
|
|
185
|
+
var files = fs.readdirSync(b).sort()
|
|
186
|
+
var stat = fs.statSync(path.join(b, 'a'))
|
|
187
|
+
t.same(files.length, 1)
|
|
188
|
+
if (!win32) {
|
|
189
|
+
t.same(stat.mode & parseInt(777, 8), parseInt(700, 8))
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
})
|
|
193
|
+
|
|
194
|
+
test('specific entries', function (t) {
|
|
195
|
+
t.plan(6)
|
|
196
|
+
|
|
197
|
+
var a = path.join(__dirname, 'fixtures', 'd')
|
|
198
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'd-entries')
|
|
199
|
+
|
|
200
|
+
var entries = ['file1', 'sub-files/file3', 'sub-dir']
|
|
201
|
+
|
|
202
|
+
rimraf.sync(b)
|
|
203
|
+
tar.pack(a, { entries: entries })
|
|
204
|
+
.pipe(tar.extract(b))
|
|
205
|
+
.on('finish', function () {
|
|
206
|
+
var files = fs.readdirSync(b)
|
|
207
|
+
t.same(files.length, 3)
|
|
208
|
+
t.notSame(files.indexOf('file1'), -1)
|
|
209
|
+
t.notSame(files.indexOf('sub-files'), -1)
|
|
210
|
+
t.notSame(files.indexOf('sub-dir'), -1)
|
|
211
|
+
var subFiles = fs.readdirSync(path.join(b, 'sub-files'))
|
|
212
|
+
t.same(subFiles, ['file3'])
|
|
213
|
+
var subDir = fs.readdirSync(path.join(b, 'sub-dir'))
|
|
214
|
+
t.same(subDir, ['file5'])
|
|
215
|
+
})
|
|
216
|
+
})
|
|
217
|
+
|
|
218
|
+
test('check type while mapping header on packing', function (t) {
|
|
219
|
+
t.plan(3)
|
|
220
|
+
|
|
221
|
+
var e = path.join(__dirname, 'fixtures', 'e')
|
|
222
|
+
|
|
223
|
+
var checkHeaderType = function (header) {
|
|
224
|
+
if (header.name.indexOf('.') === -1) t.same(header.type, header.name)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
tar.pack(e, { map: checkHeaderType })
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
test('finish callbacks', function (t) {
|
|
231
|
+
t.plan(3)
|
|
232
|
+
|
|
233
|
+
var a = path.join(__dirname, 'fixtures', 'a')
|
|
234
|
+
var b = path.join(__dirname, 'fixtures', 'copy', 'a')
|
|
235
|
+
|
|
236
|
+
rimraf.sync(b)
|
|
237
|
+
|
|
238
|
+
var packEntries = 0
|
|
239
|
+
var extractEntries = 0
|
|
240
|
+
|
|
241
|
+
var countPackEntry = function (header) { packEntries++ }
|
|
242
|
+
var countExtractEntry = function (header) { extractEntries++ }
|
|
243
|
+
|
|
244
|
+
var pack
|
|
245
|
+
var onPackFinish = function (passedPack) {
|
|
246
|
+
t.equal(packEntries, 2, 'All entries have been packed') // 2 entries - the file and base directory
|
|
247
|
+
t.equal(passedPack, pack, 'The finish hook passes the pack')
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
var onExtractFinish = function () { t.equal(extractEntries, 2) }
|
|
251
|
+
|
|
252
|
+
pack = tar.pack(a, { map: countPackEntry, finish: onPackFinish })
|
|
253
|
+
|
|
254
|
+
pack.pipe(tar.extract(b, { map: countExtractEntry, finish: onExtractFinish }))
|
|
255
|
+
.on('finish', function () {
|
|
256
|
+
t.end()
|
|
257
|
+
})
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
test('not finalizing the pack', function (t) {
|
|
261
|
+
t.plan(2)
|
|
262
|
+
|
|
263
|
+
var a = path.join(__dirname, 'fixtures', 'a')
|
|
264
|
+
var b = path.join(__dirname, 'fixtures', 'b')
|
|
265
|
+
|
|
266
|
+
var out = path.join(__dirname, 'fixtures', 'copy', 'merged-packs')
|
|
267
|
+
|
|
268
|
+
rimraf.sync(out)
|
|
269
|
+
|
|
270
|
+
var prefixer = function (prefix) {
|
|
271
|
+
return function (header) {
|
|
272
|
+
header.name = path.join(prefix, header.name)
|
|
273
|
+
return header
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
tar.pack(a, {
|
|
278
|
+
map: prefixer('a-files'),
|
|
279
|
+
finalize: false,
|
|
280
|
+
finish: packB
|
|
281
|
+
})
|
|
282
|
+
|
|
283
|
+
function packB (pack) {
|
|
284
|
+
tar.pack(b, { pack: pack, map: prefixer('b-files') })
|
|
285
|
+
.pipe(tar.extract(out))
|
|
286
|
+
.on('finish', assertResults)
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function assertResults () {
|
|
290
|
+
var containers = fs.readdirSync(out)
|
|
291
|
+
t.deepEqual(containers, ['a-files', 'b-files'])
|
|
292
|
+
var aFiles = fs.readdirSync(path.join(out, 'a-files'))
|
|
293
|
+
t.deepEqual(aFiles, ['hello.txt'])
|
|
294
|
+
}
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
test('do not extract invalid tar', function (t) {
|
|
298
|
+
var a = path.join(__dirname, 'fixtures', 'invalid.tar')
|
|
299
|
+
|
|
300
|
+
var out = path.join(__dirname, 'fixtures', 'invalid')
|
|
301
|
+
|
|
302
|
+
rimraf.sync(out)
|
|
303
|
+
|
|
304
|
+
fs.createReadStream(a)
|
|
305
|
+
.pipe(tar.extract(out))
|
|
306
|
+
.on('error', function (err) {
|
|
307
|
+
t.ok(/is not a valid symlink/i.test(err.message))
|
|
308
|
+
fs.stat(path.join(out, '../bar'), function (err) {
|
|
309
|
+
t.ok(err)
|
|
310
|
+
t.end()
|
|
311
|
+
})
|
|
312
|
+
})
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
test('no abs hardlink targets', function (t) {
|
|
316
|
+
var out = path.join(__dirname, 'fixtures', 'invalid')
|
|
317
|
+
var outside = path.join(__dirname, 'fixtures', 'outside')
|
|
318
|
+
|
|
319
|
+
rimraf.sync(out)
|
|
320
|
+
|
|
321
|
+
var s = tarStream.pack()
|
|
322
|
+
|
|
323
|
+
fs.writeFileSync(outside, 'something')
|
|
324
|
+
|
|
325
|
+
s.entry({
|
|
326
|
+
type: 'link',
|
|
327
|
+
name: 'link',
|
|
328
|
+
linkname: outside
|
|
329
|
+
})
|
|
330
|
+
|
|
331
|
+
s.entry({
|
|
332
|
+
name: 'link'
|
|
333
|
+
}, 'overwrite')
|
|
334
|
+
|
|
335
|
+
s.finalize()
|
|
336
|
+
|
|
337
|
+
s.pipe(tar.extract(out))
|
|
338
|
+
.on('error', function (err) {
|
|
339
|
+
t.ok(err, 'had error')
|
|
340
|
+
fs.readFile(outside, 'utf-8', function (err, str) {
|
|
341
|
+
t.error(err, 'no error')
|
|
342
|
+
t.same(str, 'something')
|
|
343
|
+
t.end()
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014 Mathias Buus
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
|
13
|
+
all copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
21
|
+
THE SOFTWARE.
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# tar-stream
|
|
2
|
+
|
|
3
|
+
tar-stream is a streaming tar parser and generator and nothing else. It is streams2 and operates purely using streams which means you can easily extract/parse tarballs without ever hitting the file system.
|
|
4
|
+
|
|
5
|
+
Note that you still need to gunzip your data if you have a `.tar.gz`. We recommend using [gunzip-maybe](https://github.com/mafintosh/gunzip-maybe) in conjunction with this.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
npm install tar-stream
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
[](http://travis-ci.org/mafintosh/tar-stream)
|
|
12
|
+
[](http://opensource.org/licenses/MIT)
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
tar-stream exposes two streams, [pack](https://github.com/mafintosh/tar-stream#packing) which creates tarballs and [extract](https://github.com/mafintosh/tar-stream#extracting) which extracts tarballs. To [modify an existing tarball](https://github.com/mafintosh/tar-stream#modifying-existing-tarballs) use both.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
It implementes USTAR with additional support for pax extended headers. It should be compatible with all popular tar distributions out there (gnutar, bsdtar etc)
|
|
20
|
+
|
|
21
|
+
## Related
|
|
22
|
+
|
|
23
|
+
If you want to pack/unpack directories on the file system check out [tar-fs](https://github.com/mafintosh/tar-fs) which provides file system bindings to this module.
|
|
24
|
+
|
|
25
|
+
## Packing
|
|
26
|
+
|
|
27
|
+
To create a pack stream use `tar.pack()` and call `pack.entry(header, [callback])` to add tar entries.
|
|
28
|
+
|
|
29
|
+
``` js
|
|
30
|
+
var tar = require('tar-stream')
|
|
31
|
+
var pack = tar.pack() // pack is a streams2 stream
|
|
32
|
+
|
|
33
|
+
// add a file called my-test.txt with the content "Hello World!"
|
|
34
|
+
pack.entry({ name: 'my-test.txt' }, 'Hello World!')
|
|
35
|
+
|
|
36
|
+
// add a file called my-stream-test.txt from a stream
|
|
37
|
+
var entry = pack.entry({ name: 'my-stream-test.txt', size: 11 }, function(err) {
|
|
38
|
+
// the stream was added
|
|
39
|
+
// no more entries
|
|
40
|
+
pack.finalize()
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
entry.write('hello')
|
|
44
|
+
entry.write(' ')
|
|
45
|
+
entry.write('world')
|
|
46
|
+
entry.end()
|
|
47
|
+
|
|
48
|
+
// pipe the pack stream somewhere
|
|
49
|
+
pack.pipe(process.stdout)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Extracting
|
|
53
|
+
|
|
54
|
+
To extract a stream use `tar.extract()` and listen for `extract.on('entry', (header, stream, next) )`
|
|
55
|
+
|
|
56
|
+
``` js
|
|
57
|
+
var extract = tar.extract()
|
|
58
|
+
|
|
59
|
+
extract.on('entry', function(header, stream, next) {
|
|
60
|
+
// header is the tar header
|
|
61
|
+
// stream is the content body (might be an empty stream)
|
|
62
|
+
// call next when you are done with this entry
|
|
63
|
+
|
|
64
|
+
stream.on('end', function() {
|
|
65
|
+
next() // ready for next entry
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
stream.resume() // just auto drain the stream
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
extract.on('finish', function() {
|
|
72
|
+
// all entries read
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
pack.pipe(extract)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
The tar archive is streamed sequentially, meaning you **must** drain each entry's stream as you get them or else the main extract stream will receive backpressure and stop reading.
|
|
79
|
+
|
|
80
|
+
## Headers
|
|
81
|
+
|
|
82
|
+
The header object using in `entry` should contain the following properties.
|
|
83
|
+
Most of these values can be found by stat'ing a file.
|
|
84
|
+
|
|
85
|
+
``` js
|
|
86
|
+
{
|
|
87
|
+
name: 'path/to/this/entry.txt',
|
|
88
|
+
size: 1314, // entry size. defaults to 0
|
|
89
|
+
mode: 0o644, // entry mode. defaults to to 0o755 for dirs and 0o644 otherwise
|
|
90
|
+
mtime: new Date(), // last modified date for entry. defaults to now.
|
|
91
|
+
type: 'file', // type of entry. defaults to file. can be:
|
|
92
|
+
// file | link | symlink | directory | block-device
|
|
93
|
+
// character-device | fifo | contiguous-file
|
|
94
|
+
linkname: 'path', // linked file name
|
|
95
|
+
uid: 0, // uid of entry owner. defaults to 0
|
|
96
|
+
gid: 0, // gid of entry owner. defaults to 0
|
|
97
|
+
uname: 'maf', // uname of entry owner. defaults to null
|
|
98
|
+
gname: 'staff', // gname of entry owner. defaults to null
|
|
99
|
+
devmajor: 0, // device major version. defaults to 0
|
|
100
|
+
devminor: 0 // device minor version. defaults to 0
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Modifying existing tarballs
|
|
105
|
+
|
|
106
|
+
Using tar-stream it is easy to rewrite paths / change modes etc in an existing tarball.
|
|
107
|
+
|
|
108
|
+
``` js
|
|
109
|
+
var extract = tar.extract()
|
|
110
|
+
var pack = tar.pack()
|
|
111
|
+
var path = require('path')
|
|
112
|
+
|
|
113
|
+
extract.on('entry', function(header, stream, callback) {
|
|
114
|
+
// let's prefix all names with 'tmp'
|
|
115
|
+
header.name = path.join('tmp', header.name)
|
|
116
|
+
// write the new entry to the pack stream
|
|
117
|
+
stream.pipe(pack.entry(header, callback))
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
extract.on('finish', function() {
|
|
121
|
+
// all entries done - lets finalize it
|
|
122
|
+
pack.finalize()
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
// pipe the old tarball to the extractor
|
|
126
|
+
oldTarballStream.pipe(extract)
|
|
127
|
+
|
|
128
|
+
// pipe the new tarball the another stream
|
|
129
|
+
pack.pipe(newTarballStream)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Saving tarball to fs
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
``` js
|
|
136
|
+
var fs = require('fs')
|
|
137
|
+
var tar = require('tar-stream')
|
|
138
|
+
|
|
139
|
+
var pack = tar.pack() // pack is a streams2 stream
|
|
140
|
+
var path = 'YourTarBall.tar'
|
|
141
|
+
var yourTarball = fs.createWriteStream(path)
|
|
142
|
+
|
|
143
|
+
// add a file called YourFile.txt with the content "Hello World!"
|
|
144
|
+
pack.entry({name: 'YourFile.txt'}, 'Hello World!', function (err) {
|
|
145
|
+
if (err) throw err
|
|
146
|
+
pack.finalize()
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// pipe the pack stream to your file
|
|
150
|
+
pack.pipe(yourTarball)
|
|
151
|
+
|
|
152
|
+
yourTarball.on('close', function () {
|
|
153
|
+
console.log(path + ' has been written')
|
|
154
|
+
fs.stat(path, function(err, stats) {
|
|
155
|
+
if (err) throw err
|
|
156
|
+
console.log(stats)
|
|
157
|
+
console.log('Got file info successfully!')
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Performance
|
|
163
|
+
|
|
164
|
+
[See tar-fs for a performance comparison with node-tar](https://github.com/mafintosh/tar-fs/blob/master/README.md#performance)
|
|
165
|
+
|
|
166
|
+
# License
|
|
167
|
+
|
|
168
|
+
MIT
|