w-zip 1.0.21 → 1.0.23

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.
Files changed (48) hide show
  1. package/.github/workflows/ci-test.yml +3 -3
  2. package/README.md +7 -6
  3. package/dist/w-zip.umd.js +2 -2
  4. package/dist/w-zip.umd.js.map +1 -1
  5. package/docs/index.html +1 -1
  6. package/docs/m7z.html +30 -4
  7. package/docs/m7z.mjs.html +11 -11
  8. package/docs/mZip.html +18 -6
  9. package/docs/mZip.mjs.html +97 -132
  10. package/g-7z.mjs +3 -3
  11. package/g-zip.mjs +3 -3
  12. package/package.json +5 -7
  13. package/script.txt +0 -3
  14. package/src/m7z.mjs +10 -10
  15. package/src/mZip.mjs +96 -131
  16. package/test/7z.test.mjs +3 -3
  17. package/test/output7z/test1.7z +0 -0
  18. package/test/output7z/test2.7z +0 -0
  19. package/test/output7z/test2PW.7z +0 -0
  20. package/test/outputZip/test1.zip +0 -0
  21. package/test/outputZip/test2.zip +0 -0
  22. package/test/outputZip/test2PW.zip +0 -0
  23. package/test/zip.test.mjs +3 -3
  24. package/toolg/gDistRollup.mjs +2 -6
  25. package/testData/output7z/test1.7z +0 -0
  26. package/testData/output7z/test2.7z +0 -0
  27. package/testData/output7z/test2PW.7z +0 -0
  28. package/testData/outputZip/test1.zip +0 -0
  29. package/testData/outputZip/test2.zip +0 -0
  30. package/testData/outputZip/test2PW.zip +0 -0
  31. /package/{testData → test}/input/file1(/344/270/255/346/226/207).txt" +0 -0
  32. /package/{testData → test}/input/folder1/f1-1.xlsx +0 -0
  33. /package/{testData → test}/input/folder1/f1-2.xlsx +0 -0
  34. /package/{testData → test}/input/folder1/folder2/f2-1.xlsx +0 -0
  35. /package/{testData → test}/input/folder1/folder2/f2-2.xlsx +0 -0
  36. /package/{testData → test}/input/folder1/folder2/f2-3(/344/270/255/346/226/207).xlsx" +0 -0
  37. /package/{testData → test}/output7z/extract/test1/file1(/344/270/255/346/226/207).txt" +0 -0
  38. /package/{testData → test}/output7z/extract/test2/folder1/f1-1.xlsx +0 -0
  39. /package/{testData → test}/output7z/extract/test2/folder1/f1-2.xlsx +0 -0
  40. /package/{testData → test}/output7z/extract/test2/folder1/folder2/f2-1.xlsx +0 -0
  41. /package/{testData → test}/output7z/extract/test2/folder1/folder2/f2-2.xlsx +0 -0
  42. /package/{testData → test}/output7z/extract/test2/folder1/folder2/f2-3(/344/270/255/346/226/207).xlsx" +0 -0
  43. /package/{testData → test}/outputZip/extract/test1/file1(/344/270/255/346/226/207).txt" +0 -0
  44. /package/{testData → test}/outputZip/extract/test2/folder1/f1-1.xlsx +0 -0
  45. /package/{testData → test}/outputZip/extract/test2/folder1/f1-2.xlsx +0 -0
  46. /package/{testData → test}/outputZip/extract/test2/folder1/folder2/f2-1.xlsx +0 -0
  47. /package/{testData → test}/outputZip/extract/test2/folder1/folder2/f2-2.xlsx +0 -0
  48. /package/{testData → test}/outputZip/extract/test2/folder1/folder2/f2-3(/344/270/255/346/226/207).xlsx" +0 -0
package/src/m7z.mjs CHANGED
@@ -13,13 +13,13 @@ import checkTarget from './checkTarget.mjs'
13
13
  * @example
14
14
  * import wz from 'w-zip'
15
15
  *
16
- * let fpUnzip = './testData/output7z'
16
+ * let fpUnzip = './test/output7z'
17
17
  * let fpUnzipExtract = fpUnzip + '/extract'
18
18
  *
19
- * let fpSrc1 = './testData/input/file1(中文).txt'
19
+ * let fpSrc1 = './test/input/file1(中文).txt'
20
20
  * let fpZip1 = fpUnzip + '/test1.7z'
21
21
  *
22
- * let fpSrc2 = './testData/input/folder1'
22
+ * let fpSrc2 = './test/input/folder1'
23
23
  * let fpZip2 = fpUnzip + '/test2.7z'
24
24
  * let fpZip2PW = fpUnzip + '/test2PW.7z'
25
25
  * let pw = 'abc'
@@ -119,7 +119,7 @@ function m7z() {
119
119
  }
120
120
 
121
121
 
122
- async function zip(fpSrc, fpTar, level = 9, pw = '') {
122
+ async function zip(fpSrc, fpTar, level = 1, pw = '') { //7z的-mx1為最快速壓縮(mx0為不壓縮)
123
123
  let arg = [
124
124
  'a',
125
125
  fpTar,
@@ -141,8 +141,8 @@ function m7z() {
141
141
  * @param {String} fpSrc 輸入壓縮來源檔案位置字串
142
142
  * @param {String} fpTar 輸入壓縮目標檔案位置字串
143
143
  * @param {Object} [opt={}] 輸入設定物件,預設{}
144
- * @param {Integer} [opt.level] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設9
145
- * @param {String} [opt.pw] 輸入壓縮密碼字串,預設''
144
+ * @param {Integer} [opt.level=1] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設1為最快速壓縮
145
+ * @param {String} [opt.pw=''] 輸入壓縮密碼字串,預設''
146
146
  * @returns {Promise} 回傳Promise,resolve為成功資訊,reject為失敗資訊
147
147
  */
148
148
  async function zipFile(fpSrc, fpTar, opt = {}) {
@@ -161,7 +161,7 @@ function m7z() {
161
161
  }
162
162
 
163
163
  //default
164
- let level = get(opt, 'level', 9)
164
+ let level = get(opt, 'level', 1)
165
165
  let pw = get(opt, 'pw', '')
166
166
 
167
167
  //r
@@ -190,7 +190,7 @@ function m7z() {
190
190
  * @param {String} fpSrc 輸入壓縮來源資料夾位置字串
191
191
  * @param {String} fpTar 輸入壓縮目標資料夾位置字串
192
192
  * @param {Object} [opt={}] 輸入設定物件,預設{}
193
- * @param {Integer} [opt.level] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設9
193
+ * @param {Integer} [opt.level=1] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設1為最快速壓縮
194
194
  * @param {String} [opt.pw] 輸入壓縮密碼字串,預設''
195
195
  * @returns {Promise} 回傳Promise,resolve為成功資訊,reject為失敗資訊
196
196
  */
@@ -210,7 +210,7 @@ function m7z() {
210
210
  }
211
211
 
212
212
  //default
213
- let level = get(opt, 'level', 9)
213
+ let level = get(opt, 'level', 1)
214
214
  let pw = get(opt, 'pw', '')
215
215
 
216
216
  //r
@@ -274,7 +274,7 @@ function m7z() {
274
274
  let error = null
275
275
  let r = await execProcess(prog, arg)
276
276
  .catch((err) => {
277
- error = err
277
+ error = err.toString()
278
278
  })
279
279
 
280
280
  //check
package/src/mZip.mjs CHANGED
@@ -1,17 +1,14 @@
1
1
  import path from 'path'
2
2
  import fs from 'fs'
3
- import archiver from 'archiver'
4
- import archiverEnc from 'archiver-zip-encrypted'
5
- import unzipper from 'unzipper'
6
- import get from 'lodash-es/get.js'
7
- import genPm from 'wsemi/src/genPm.mjs'
8
- import pmMap from 'wsemi/src/pmMap.mjs'
3
+ import { configure, ZipWriter, ZipReader, Uint8ArrayReader, Uint8ArrayWriter } from '@zip.js/zip.js'
4
+ import get from 'lodash-es/get.js'
5
+ import fsTreeFolder from 'wsemi/src/fsTreeFolder.mjs'
9
6
  import getFileName from 'wsemi/src/getFileName.mjs'
10
7
  import checkTarget from './checkTarget.mjs'
11
8
 
12
9
 
13
- //registerFormat
14
- archiver.registerFormat('zip-encrypted', archiverEnc)
10
+ //configure
11
+ configure({ useWebWorkers: false }) //關閉web worker改用主執行緒壓縮, 確保nodejs下無殘留worker導致process無法結束
15
12
 
16
13
 
17
14
  /**
@@ -22,13 +19,13 @@ archiver.registerFormat('zip-encrypted', archiverEnc)
22
19
  * @example
23
20
  * import wz from 'w-zip'
24
21
  *
25
- * let fpUnzip = './testData/outputZip'
22
+ * let fpUnzip = './test/outputZip'
26
23
  * let fpUnzipExtract = fpUnzip + '/extract'
27
24
  *
28
- * let fpSrc1 = './testData/input/file1(中文).txt'
25
+ * let fpSrc1 = './test/input/file1(中文).txt'
29
26
  * let fpZip1 = fpUnzip + '/test1.zip'
30
27
  *
31
- * let fpSrc2 = './testData/input/folder1'
28
+ * let fpSrc2 = './test/input/folder1'
32
29
  * let fpZip2 = fpUnzip + '/test2.zip'
33
30
  * let fpZip2PW = fpUnzip + '/test2PW.zip'
34
31
  * let pw = 'abc'
@@ -100,7 +97,7 @@ function mZip() {
100
97
  * @param {String} fpSrc 輸入壓縮來源檔案位置字串
101
98
  * @param {String} fpTar 輸入壓縮目標檔案位置字串
102
99
  * @param {Object} [opt={}] 輸入設定物件,預設{}
103
- * @param {Integer} [opt.level] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設9
100
+ * @param {Integer} [opt.level=9] 輸入壓縮程度整數,範圍為0至9,0為不壓縮而9為最高壓縮,預設9
104
101
  * @param {String} [opt.pw] 輸入壓縮密碼字串,預設''
105
102
  * @returns {Promise} 回傳Promise,resolve為成功資訊,reject為失敗資訊
106
103
  */
@@ -125,54 +122,32 @@ function mZip() {
125
122
 
126
123
  try {
127
124
 
128
- //pm
129
- let pm = genPm()
130
-
131
125
  //check
132
126
  if (!fs.existsSync(path.dirname(fpTar))) {
133
127
  fs.mkdirSync(path.dirname(fpTar), { recursive: true })
134
128
  }
135
129
 
136
- //archiver
137
- let output = fs.createWriteStream(fpTar)
138
- let archive
139
- if (pw === '') {
140
- archive = archiver('zip', {
141
- zlib: { level },
142
- })
143
- }
144
- else {
145
- archive = archiver('zip-encrypted', {
146
- zlib: { level },
147
- encryptionMethod: 'zip20', //只能用zip20, 因unzipper目前不支援aes256
148
- password: pw,
149
- })
130
+ //zipOpt
131
+ let zipOpt = { level }
132
+ if (pw !== '') {
133
+ zipOpt.password = pw
134
+ zipOpt.zipCrypto = true //使用ZipCrypto(即zip20)加密維持與舊版相同相容性, 若需更強加密可改為encryptionStrength: 3(AES-256)
150
135
  }
151
136
 
152
- output.on('close', function() {
153
- //console.log(archive.pointer() + ' total bytes')
154
-
155
- //resolve
156
- pm.resolve('done: ' + fpTar)
137
+ //zipWriter
138
+ let zipWriter = new ZipWriter(new Uint8ArrayWriter(), zipOpt)
157
139
 
158
- })
159
- archive.on('warning', function(warn) {
160
- //console.log('warning', warn)
161
- })
162
- archive.on('error', function(err) {
163
- Promise.reject(err)
164
- })
140
+ //add
141
+ let b = fs.readFileSync(fpSrc)
142
+ await zipWriter.add(path.basename(fpSrc), new Uint8ArrayReader(b))
165
143
 
166
- //pipe
167
- archive.pipe(output)
144
+ //close
145
+ let u8 = await zipWriter.close()
168
146
 
169
- //file
170
- archive.file(fpSrc, { name: path.basename(fpSrc) })
147
+ //writeFileSync
148
+ fs.writeFileSync(fpTar, u8)
171
149
 
172
- //finalize
173
- archive.finalize()
174
-
175
- return pm
150
+ return Promise.resolve('done: ' + fpTar)
176
151
  }
177
152
  catch (err) {
178
153
  return Promise.reject(err)
@@ -210,54 +185,57 @@ function mZip() {
210
185
 
211
186
  try {
212
187
 
213
- //pm
214
- let pm = genPm()
215
-
216
188
  //check
217
189
  if (!fs.existsSync(path.dirname(fpTar))) {
218
190
  fs.mkdirSync(path.dirname(fpTar), { recursive: true })
219
191
  }
220
192
 
221
- //archiver
222
- let output = fs.createWriteStream(fpTar)
223
- let archive
224
- if (pw === '') {
225
- archive = archiver('zip', {
226
- zlib: { level },
227
- })
228
- }
229
- else {
230
- archive = archiver('zip-encrypted', {
231
- zlib: { level },
232
- encryptionMethod: 'zip20', //只能用zip20, 因unzipper目前不支援aes256
233
- password: pw,
234
- })
193
+ //zipOpt
194
+ let zipOpt = { level }
195
+ if (pw !== '') {
196
+ zipOpt.password = pw
197
+ zipOpt.zipCrypto = true //使用ZipCrypto(即zip20)加密維持與舊版相同相容性, 若需更強加密可改為encryptionStrength: 3(AES-256)
235
198
  }
236
199
 
237
- output.on('close', function() {
238
- //console.log(archive.pointer() + ' total bytes')
200
+ //zipWriter
201
+ let zipWriter = new ZipWriter(new Uint8ArrayWriter(), zipOpt)
239
202
 
240
- //resolve
241
- pm.resolve('done: ' + fpTar)
203
+ //bn, 以來源資料夾名稱為zip內根目錄(同archiver.directory(fpSrc, basename)行為)
204
+ let bn = path.basename(fpSrc)
242
205
 
243
- })
244
- archive.on('warning', function(warn) {
245
- //console.log('warning', warn)
246
- })
247
- archive.on('error', function(err) {
248
- Promise.reject(err)
249
- })
206
+ //items, 遞迴列舉資料夾下全部檔案與子資料夾
207
+ let items = fsTreeFolder(fpSrc, null)
250
208
 
251
- //pipe
252
- archive.pipe(output)
209
+ //add
210
+ for (let item of items) {
253
211
 
254
- //directory
255
- archive.directory(fpSrc, path.basename(fpSrc))
212
+ //name, zip內相對路徑統一用'/'
213
+ let rel = path.relative(fpSrc, item.path)
214
+ let name = path.join(bn, rel).replaceAll('\\', '/')
215
+
216
+ if (item.isFolder) {
217
+
218
+ //directory, 保留空資料夾結構
219
+ await zipWriter.add(name, undefined, { directory: true })
220
+
221
+ }
222
+ else {
256
223
 
257
- //finalize
258
- archive.finalize()
224
+ //file
225
+ let b = fs.readFileSync(item.path)
226
+ await zipWriter.add(name, new Uint8ArrayReader(b))
259
227
 
260
- return pm
228
+ }
229
+
230
+ }
231
+
232
+ //close
233
+ let u8 = await zipWriter.close()
234
+
235
+ //writeFileSync
236
+ fs.writeFileSync(fpTar, u8)
237
+
238
+ return Promise.resolve('done: ' + fpTar)
261
239
  }
262
240
  catch (err) {
263
241
  return Promise.reject(err)
@@ -293,67 +271,54 @@ function mZip() {
293
271
  //default
294
272
  let pw = get(opt, 'pw', '')
295
273
 
296
- //extract
297
- async function extract(fpSrc, fpTar, password) {
298
-
299
- //mkdir
300
- async function mkdir(fd) {
301
- try {
302
-
303
- //check
304
- if (!fs.existsSync(fd)) {
305
- fs.mkdirSync(fd, { recursive: true })
306
- }
274
+ try {
307
275
 
308
- }
309
- catch (err) {
310
- return Promise.reject(err)
311
- }
312
- return 'done'
276
+ //readerOpt
277
+ let readerOpt = {}
278
+ if (pw !== '') {
279
+ readerOpt.password = pw
313
280
  }
314
281
 
315
- //extractFile
316
- async function extractFile(file, fn, password = '') {
317
- try {
282
+ //zipReader
283
+ let b = fs.readFileSync(fpSrc)
284
+ let zipReader = new ZipReader(new Uint8ArrayReader(b), readerOpt)
318
285
 
319
- //check
320
- if (!fs.existsSync(path.dirname(fn))) {
321
- fs.mkdirSync(path.dirname(fn), { recursive: true })
322
- }
286
+ //entries
287
+ let entries = await zipReader.getEntries()
323
288
 
324
- //buffer
325
- let b = await file.buffer(password)
289
+ //extract
290
+ for (let entry of entries) {
326
291
 
327
- //writeFileSync
328
- fs.writeFileSync(fn, b)
292
+ //p, 解壓目標位置
293
+ let p = path.join(fpTar, entry.filename)
329
294
 
330
- }
331
- catch (err) {
332
- return Promise.reject(err)
333
- }
334
- return 'done'
335
- }
295
+ if (entry.directory) {
336
296
 
337
- //directory
338
- let directory = await unzipper.Open.file(fpSrc)
297
+ //mkdir
298
+ if (!fs.existsSync(p)) {
299
+ fs.mkdirSync(p, { recursive: true })
300
+ }
339
301
 
340
- //pmMap
341
- return pmMap(directory.files, async (file) => {
342
- let p = path.join(fpTar, file.path)
343
- if (file.type === 'File') {
344
- return extractFile(file, p, password)
345
302
  }
346
303
  else {
347
- return mkdir(p)
348
- }
349
- })
350
304
 
351
- }
305
+ //mkdir, 先建立上層資料夾
306
+ if (!fs.existsSync(path.dirname(p))) {
307
+ fs.mkdirSync(path.dirname(p), { recursive: true })
308
+ }
352
309
 
353
- try {
310
+ //getData
311
+ let u8 = await entry.getData(new Uint8ArrayWriter())
354
312
 
355
- //extract
356
- await extract(fpSrc, fpTar, pw)
313
+ //writeFileSync
314
+ fs.writeFileSync(p, u8)
315
+
316
+ }
317
+
318
+ }
319
+
320
+ //close
321
+ await zipReader.close()
357
322
 
358
323
  return Promise.resolve('done: ' + getFileName(fpTar))
359
324
  }
package/test/7z.test.mjs CHANGED
@@ -15,13 +15,13 @@ describe('7z', function() {
15
15
  return
16
16
  }
17
17
 
18
- let fpUnzip = './testData/output7z'
18
+ let fpUnzip = './test/output7z'
19
19
  let fpUnzipExtract = fpUnzip + '/extract'
20
20
 
21
- let fpSrc1 = './testData/input/file1(中文).txt'
21
+ let fpSrc1 = './test/input/file1(中文).txt'
22
22
  let fpZip1 = fpUnzip + '/test1.7z'
23
23
 
24
- let fpSrc2 = './testData/input/folder1'
24
+ let fpSrc2 = './test/input/folder1'
25
25
  let fpZip2 = fpUnzip + '/test2.7z'
26
26
  let fpZip2PW = fpUnzip + '/test2PW.7z'
27
27
  let pw = 'abc'
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/test/zip.test.mjs CHANGED
@@ -10,13 +10,13 @@ import wz from '../src/WZip.mjs'
10
10
 
11
11
  describe('zip', function() {
12
12
 
13
- let fpUnzip = './testData/outputZip'
13
+ let fpUnzip = './test/outputZip'
14
14
  let fpUnzipExtract = fpUnzip + '/extract'
15
15
 
16
- let fpSrc1 = './testData/input/file1(中文).txt'
16
+ let fpSrc1 = './test/input/file1(中文).txt'
17
17
  let fpZip1 = fpUnzip + '/test1.zip'
18
18
 
19
- let fpSrc2 = './testData/input/folder1'
19
+ let fpSrc2 = './test/input/folder1'
20
20
  let fpZip2 = fpUnzip + '/test2.zip'
21
21
  let fpZip2PW = fpUnzip + '/test2PW.zip'
22
22
  let pw = 'abc'
@@ -15,17 +15,13 @@ rollupFiles({
15
15
  'path': 'path',
16
16
  'fs': 'fs',
17
17
  'child_process': 'child_process',
18
- 'archiver': 'archiver',
19
- 'archiver-zip-encrypted': 'archiver-zip-encrypted',
20
- 'unzipper': 'unzipper',
18
+ '@zip.js/zip.js': 'zip',
21
19
  },
22
20
  external: [
23
21
  'path',
24
22
  'fs',
25
23
  'child_process',
26
- 'archiver',
27
- 'archiver-zip-encrypted',
28
- 'unzipper',
24
+ '@zip.js/zip.js',
29
25
  ],
30
26
  })
31
27
 
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
File without changes
File without changes