Skip to content

Commit d80454e

Browse files
committed
让 lzma-native 变成可选依赖,并且在 xz 使用的时候判断依赖是否存在
1 parent 9b17e98 commit d80454e

4 files changed

Lines changed: 64 additions & 11 deletions

File tree

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,20 @@ Currently supported:
2222
- gzip
2323
- tgz
2424
- zip
25-
- xz
25+
- xz (requires optional dependency `lzma-native`)
2626

2727
## Install
2828

2929
```bash
3030
npm install compressing
3131
```
3232

33+
For xz compression/decompression support, you need to install the optional dependency:
34+
35+
```bash
36+
npm install lzma-native
37+
```
38+
3339
## Usage
3440

3541
### Compress a single file
@@ -323,6 +329,8 @@ XZ params:
323329

324330
- opts.lzma - {Object} xz.FileStream uses lzma-native to compress, pass this param to control the behavior of lzma-native.
325331

332+
__Note: xz compression/decompression requires the optional dependency `lzma-native`. If you try to use xz features without installing it, you'll get an error asking you to install it.__
333+
326334
### Stream
327335

328336
The readable stream to compress anything as you need.

lib/xz/index.js

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,55 @@
11
'use strict';
22

33
const utils = require('../utils');
4-
const XzFileStream = require('./file_stream');
5-
const XzUncompressStream = require('./uncompress_stream');
6-
7-
exports.FileStream = XzFileStream;
8-
exports.UncompressStream = XzUncompressStream;
9-
exports.compressFile = utils.makeFileProcessFn(XzFileStream);
10-
exports.uncompress = utils.makeFileProcessFn(XzUncompressStream);
11-
exports.decompress = utils.makeFileProcessFn(XzUncompressStream);
4+
5+
let XzFileStream;
6+
let XzUncompressStream;
7+
8+
function checkDependency() {
9+
try {
10+
require('lzma-native');
11+
return true;
12+
} catch (err) {
13+
return false;
14+
}
15+
}
16+
17+
function throwIfNoDependency() {
18+
if (!checkDependency()) {
19+
throw new Error('lzma-native is required for xz compression/decompression. Please install it with: npm install lzma-native');
20+
}
21+
}
22+
23+
// Lazy load the implementation
24+
function getImplementation() {
25+
if (!XzFileStream) {
26+
throwIfNoDependency();
27+
XzFileStream = require('./file_stream');
28+
XzUncompressStream = require('./uncompress_stream');
29+
}
30+
return { XzFileStream, XzUncompressStream };
31+
}
32+
33+
exports.FileStream = function(opts) {
34+
const { XzFileStream } = getImplementation();
35+
return new XzFileStream(opts);
36+
};
37+
38+
exports.UncompressStream = function(opts) {
39+
const { XzUncompressStream } = getImplementation();
40+
return new XzUncompressStream(opts);
41+
};
42+
43+
exports.compressFile = function(source, dest, opts) {
44+
throwIfNoDependency();
45+
const { XzFileStream } = getImplementation();
46+
return utils.makeFileProcessFn(XzFileStream)(source, dest, opts);
47+
};
48+
49+
exports.uncompress = function(source, dest, opts) {
50+
throwIfNoDependency();
51+
const { XzUncompressStream } = getImplementation();
52+
return utils.makeFileProcessFn(XzUncompressStream)(source, dest, opts);
53+
};
54+
55+
exports.decompress = exports.uncompress;

lib/xz/uncompress_stream.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,5 @@ class XzUncompressStream extends PassThrough {
4545
});
4646
}
4747
}
48-
}
4948

5049
module.exports = XzUncompressStream;

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,16 @@
4242
"flushwritable": "^1.0.0",
4343
"get-ready": "^1.0.0",
4444
"iconv-lite": "^0.5.0",
45-
"lzma-native": "^8.0.5",
4645
"mkdirp": "^0.5.1",
4746
"pump": "^3.0.0",
4847
"streamifier": "^0.1.1",
4948
"tar-stream": "^1.5.2",
5049
"@eggjs/yauzl": "^2.11.0",
5150
"yazl": "^2.4.2"
5251
},
52+
"optionalDependencies": {
53+
"lzma-native": "^8.0.6"
54+
},
5355
"devDependencies": {
5456
"@types/mocha": "10",
5557
"@types/node": "20",

0 commit comments

Comments
 (0)