tar-xz 0.1.0
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/LICENSE +165 -0
- package/README.md +201 -0
- package/lib/browser/create.d.ts +27 -0
- package/lib/browser/create.d.ts.map +1 -0
- package/lib/browser/create.js +113 -0
- package/lib/browser/create.js.map +1 -0
- package/lib/browser/extract.d.ts +24 -0
- package/lib/browser/extract.d.ts.map +1 -0
- package/lib/browser/extract.js +112 -0
- package/lib/browser/extract.js.map +1 -0
- package/lib/browser/index.d.ts +7 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +7 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/list.d.ts +23 -0
- package/lib/browser/list.d.ts.map +1 -0
- package/lib/browser/list.js +81 -0
- package/lib/browser/list.js.map +1 -0
- package/lib/index.browser.d.ts +12 -0
- package/lib/index.browser.d.ts.map +1 -0
- package/lib/index.browser.js +14 -0
- package/lib/index.browser.js.map +1 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +14 -0
- package/lib/index.js.map +1 -0
- package/lib/node/create.d.ts +22 -0
- package/lib/node/create.d.ts.map +1 -0
- package/lib/node/create.js +155 -0
- package/lib/node/create.js.map +1 -0
- package/lib/node/extract.d.ts +30 -0
- package/lib/node/extract.d.ts.map +1 -0
- package/lib/node/extract.js +274 -0
- package/lib/node/extract.js.map +1 -0
- package/lib/node/index.d.ts +7 -0
- package/lib/node/index.d.ts.map +1 -0
- package/lib/node/index.js +7 -0
- package/lib/node/index.js.map +1 -0
- package/lib/node/list.d.ts +20 -0
- package/lib/node/list.d.ts.map +1 -0
- package/lib/node/list.js +115 -0
- package/lib/node/list.js.map +1 -0
- package/lib/tar/checksum.d.ts +40 -0
- package/lib/tar/checksum.d.ts.map +1 -0
- package/lib/tar/checksum.js +91 -0
- package/lib/tar/checksum.js.map +1 -0
- package/lib/tar/format.d.ts +87 -0
- package/lib/tar/format.d.ts.map +1 -0
- package/lib/tar/format.js +244 -0
- package/lib/tar/format.js.map +1 -0
- package/lib/tar/index.d.ts +8 -0
- package/lib/tar/index.d.ts.map +1 -0
- package/lib/tar/index.js +6 -0
- package/lib/tar/index.js.map +1 -0
- package/lib/tar/pax.d.ts +82 -0
- package/lib/tar/pax.d.ts.map +1 -0
- package/lib/tar/pax.js +185 -0
- package/lib/tar/pax.js.map +1 -0
- package/lib/types.d.ts +144 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +26 -0
- package/lib/types.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-based TAR listing with XZ decompression
|
|
3
|
+
*/
|
|
4
|
+
import { type TarEntry } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* List contents of a tar.xz archive in browser
|
|
7
|
+
*
|
|
8
|
+
* @param archive - Compressed archive data (ArrayBuffer or Uint8Array)
|
|
9
|
+
* @returns Array of entry metadata (without content)
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const response = await fetch('archive.tar.xz');
|
|
14
|
+
* const data = await response.arrayBuffer();
|
|
15
|
+
* const entries = await listTarXz(data);
|
|
16
|
+
*
|
|
17
|
+
* for (const entry of entries) {
|
|
18
|
+
* console.log(entry.name, entry.size, entry.type);
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function listTarXz(archive: ArrayBuffer | Uint8Array): Promise<TarEntry[]>;
|
|
23
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/browser/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,aAAa,CAAC;AA6D1D;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAUtF"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-based TAR listing with XZ decompression
|
|
3
|
+
*/
|
|
4
|
+
import { unxzAsync } from 'node-liblzma';
|
|
5
|
+
import { applyPaxAttributes, BLOCK_SIZE, calculatePadding, isEmptyBlock, parseHeader, parsePaxData, } from '../tar/index.js';
|
|
6
|
+
import { TarEntryType } from '../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse TAR headers only (skip content)
|
|
9
|
+
*/
|
|
10
|
+
function listTarEntries(data) {
|
|
11
|
+
const entries = [];
|
|
12
|
+
let offset = 0;
|
|
13
|
+
let paxAttrs = null;
|
|
14
|
+
let emptyBlockCount = 0;
|
|
15
|
+
while (offset + BLOCK_SIZE <= data.length) {
|
|
16
|
+
const headerBlock = data.subarray(offset, offset + BLOCK_SIZE);
|
|
17
|
+
offset += BLOCK_SIZE;
|
|
18
|
+
// Check for end-of-archive
|
|
19
|
+
if (isEmptyBlock(headerBlock)) {
|
|
20
|
+
emptyBlockCount++;
|
|
21
|
+
if (emptyBlockCount >= 2) {
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
emptyBlockCount = 0;
|
|
27
|
+
// Parse header
|
|
28
|
+
let entry = parseHeader(headerBlock);
|
|
29
|
+
if (!entry) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
// Handle PAX headers
|
|
33
|
+
if (entry.type === TarEntryType.PAX_HEADER) {
|
|
34
|
+
const paxSize = entry.size;
|
|
35
|
+
const paxData = data.subarray(offset, offset + paxSize);
|
|
36
|
+
offset += paxSize + calculatePadding(paxSize);
|
|
37
|
+
paxAttrs = parsePaxData(paxData);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (entry.type === TarEntryType.PAX_GLOBAL) {
|
|
41
|
+
offset += entry.size + calculatePadding(entry.size);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Apply PAX attributes if present
|
|
45
|
+
if (paxAttrs) {
|
|
46
|
+
entry = applyPaxAttributes(entry, paxAttrs);
|
|
47
|
+
paxAttrs = null;
|
|
48
|
+
}
|
|
49
|
+
// Skip content
|
|
50
|
+
offset += entry.size + calculatePadding(entry.size);
|
|
51
|
+
entries.push(entry);
|
|
52
|
+
}
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* List contents of a tar.xz archive in browser
|
|
57
|
+
*
|
|
58
|
+
* @param archive - Compressed archive data (ArrayBuffer or Uint8Array)
|
|
59
|
+
* @returns Array of entry metadata (without content)
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```ts
|
|
63
|
+
* const response = await fetch('archive.tar.xz');
|
|
64
|
+
* const data = await response.arrayBuffer();
|
|
65
|
+
* const entries = await listTarXz(data);
|
|
66
|
+
*
|
|
67
|
+
* for (const entry of entries) {
|
|
68
|
+
* console.log(entry.name, entry.size, entry.type);
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export async function listTarXz(archive) {
|
|
73
|
+
// Convert to Uint8Array if needed
|
|
74
|
+
const archiveData = archive instanceof Uint8Array ? archive : new Uint8Array(archive);
|
|
75
|
+
// Decompress XZ
|
|
76
|
+
// Cast to any because WASM accepts Uint8Array but types are defined for Node.js Buffer
|
|
77
|
+
const tarData = await unxzAsync(archiveData);
|
|
78
|
+
// List entries
|
|
79
|
+
return listTarEntries(tarData);
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/browser/list.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAiB,YAAY,EAAE,MAAM,aAAa,CAAC;AAE1D;;GAEG;AACH,SAAS,cAAc,CAAC,IAAgB;IACtC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,OAAO,MAAM,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;QAC/D,MAAM,IAAI,UAAU,CAAC;QAErB,2BAA2B;QAC3B,IAAI,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,eAAe,EAAE,CAAC;YAClB,IAAI,eAAe,IAAI,CAAC,EAAE,CAAC;gBACzB,MAAM;YACR,CAAC;YACD,SAAS;QACX,CAAC;QAED,eAAe,GAAG,CAAC,CAAC;QAEpB,eAAe;QACf,IAAI,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,qBAAqB;QACrB,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC;YAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;YACxD,MAAM,IAAI,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC9C,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;YACjC,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QAED,kCAAkC;QAClC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,GAAG,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,eAAe;QACf,MAAM,IAAI,KAAK,CAAC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAEpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAiC;IAC/D,kCAAkC;IAClC,MAAM,WAAW,GAAG,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC;IAEtF,gBAAgB;IAChB,uFAAuF;IACvF,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,WAAyD,CAAC,CAAC;IAE3F,eAAe;IACf,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tar-xz — Create and extract tar.xz archives (Browser)
|
|
3
|
+
*
|
|
4
|
+
* Buffer-based API for browsers with XZ compression powered by node-liblzma WASM.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { createTarXz, extractTarXz, listTarXz } from './browser/index.js';
|
|
9
|
+
export type { CreateHeaderOptions, PaxAttributes } from './tar/index.js';
|
|
10
|
+
export { applyPaxAttributes, BLOCK_SIZE, calculatePadding, createEndOfArchive, createHeader, createPaxData, createPaxHeaderBlocks, needsPaxHeaders, parseHeader, parsePaxData, } from './tar/index.js';
|
|
11
|
+
export { type BrowserCreateOptions, type BrowserExtractOptions, type ExtractedFile, type TarEntry, TarEntryType, type TarEntryWithData, type TarInputFile, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tar-xz — Create and extract tar.xz archives (Browser)
|
|
3
|
+
*
|
|
4
|
+
* Buffer-based API for browsers with XZ compression powered by node-liblzma WASM.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
// Re-export Browser API
|
|
9
|
+
export { createTarXz, extractTarXz, listTarXz } from './browser/index.js';
|
|
10
|
+
// Re-export low-level TAR utilities for advanced usage
|
|
11
|
+
export { applyPaxAttributes, BLOCK_SIZE, calculatePadding, createEndOfArchive, createHeader, createPaxData, createPaxHeaderBlocks, needsPaxHeaders, parseHeader, parsePaxData, } from './tar/index.js';
|
|
12
|
+
// Re-export types
|
|
13
|
+
export { TarEntryType, } from './types.js';
|
|
14
|
+
//# sourceMappingURL=index.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAwB;AACxB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1E,uDAAuD;AACvD,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,kBAAkB;AAClB,OAAO,EAKL,YAAY,GAGb,MAAM,YAAY,CAAC"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tar-xz — Create and extract tar.xz archives
|
|
3
|
+
*
|
|
4
|
+
* Node.js streaming API with XZ compression powered by node-liblzma.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export { create, extract, extractToMemory, list } from './node/index.js';
|
|
9
|
+
export type { CreateHeaderOptions, PaxAttributes } from './tar/index.js';
|
|
10
|
+
export { applyPaxAttributes, BLOCK_SIZE, calculatePadding, createEndOfArchive, createHeader, createPaxData, createPaxHeaderBlocks, needsPaxHeaders, parseHeader, parsePaxData, } from './tar/index.js';
|
|
11
|
+
export { type CreateOptions, type ExtractedFile, type ExtractOptions, type ListOptions, type TarEntry, TarEntryType, type TarEntryWithData, type TarInputFile, } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGzE,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tar-xz — Create and extract tar.xz archives
|
|
3
|
+
*
|
|
4
|
+
* Node.js streaming API with XZ compression powered by node-liblzma.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
// Re-export Node.js API
|
|
9
|
+
export { create, extract, extractToMemory, list } from './node/index.js';
|
|
10
|
+
// Re-export low-level TAR utilities for advanced usage
|
|
11
|
+
export { applyPaxAttributes, BLOCK_SIZE, calculatePadding, createEndOfArchive, createHeader, createPaxData, createPaxHeaderBlocks, needsPaxHeaders, parseHeader, parsePaxData, } from './tar/index.js';
|
|
12
|
+
// Re-export types
|
|
13
|
+
export { TarEntryType, } from './types.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGzE,uDAAuD;AACvD,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,kBAAkB;AAClB,OAAO,EAML,YAAY,GAGb,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js TAR creation with XZ compression
|
|
3
|
+
*/
|
|
4
|
+
import type { CreateOptions } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a tar.xz archive
|
|
7
|
+
*
|
|
8
|
+
* @param options - Creation options
|
|
9
|
+
* @returns Promise that resolves when archive is complete
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* await create({
|
|
14
|
+
* file: 'archive.tar.xz',
|
|
15
|
+
* cwd: '/source',
|
|
16
|
+
* files: ['file1.txt', 'dir/'],
|
|
17
|
+
* preset: 6
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function create(options: CreateOptions): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=create.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/node/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAsHjD;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA6ClE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js TAR creation with XZ compression
|
|
3
|
+
*/
|
|
4
|
+
import { promises as fs } from 'node:fs';
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import { Transform } from 'node:stream';
|
|
7
|
+
import { pipeline } from 'node:stream/promises';
|
|
8
|
+
import { createXz } from 'node-liblzma';
|
|
9
|
+
import { calculatePadding, createEndOfArchive, createHeader, createPaxHeaderBlocks, needsPaxHeaders, } from '../tar/index.js';
|
|
10
|
+
import { TarEntryType } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Transform stream that packs files into TAR format
|
|
13
|
+
*/
|
|
14
|
+
class TarPack extends Transform {
|
|
15
|
+
constructor() {
|
|
16
|
+
super({ objectMode: false });
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Add a file entry to the archive
|
|
20
|
+
*/
|
|
21
|
+
async addEntry(name, content, stats, linkTarget) {
|
|
22
|
+
const isDir = stats.isDirectory();
|
|
23
|
+
const isSymlink = stats.isSymbolicLink();
|
|
24
|
+
const size = isDir || isSymlink ? 0 : stats.size;
|
|
25
|
+
// Normalize path (use forward slashes, add trailing slash for dirs)
|
|
26
|
+
let entryName = name.replace(/\\/g, '/');
|
|
27
|
+
if (isDir && !entryName.endsWith('/')) {
|
|
28
|
+
entryName += '/';
|
|
29
|
+
}
|
|
30
|
+
// Determine type
|
|
31
|
+
let type = TarEntryType.FILE;
|
|
32
|
+
if (isDir) {
|
|
33
|
+
type = TarEntryType.DIRECTORY;
|
|
34
|
+
}
|
|
35
|
+
else if (isSymlink) {
|
|
36
|
+
type = TarEntryType.SYMLINK;
|
|
37
|
+
}
|
|
38
|
+
// Check if PAX headers are needed
|
|
39
|
+
if (needsPaxHeaders({ name: entryName, size, linkname: linkTarget })) {
|
|
40
|
+
const paxBlocks = createPaxHeaderBlocks(entryName, {
|
|
41
|
+
path: entryName,
|
|
42
|
+
size,
|
|
43
|
+
linkpath: linkTarget,
|
|
44
|
+
});
|
|
45
|
+
for (const block of paxBlocks) {
|
|
46
|
+
this.push(block);
|
|
47
|
+
}
|
|
48
|
+
// Truncate name for the regular header (PAX has the full name)
|
|
49
|
+
entryName = entryName.slice(-100);
|
|
50
|
+
}
|
|
51
|
+
// Create header
|
|
52
|
+
const header = createHeader({
|
|
53
|
+
name: entryName,
|
|
54
|
+
type,
|
|
55
|
+
size,
|
|
56
|
+
mode: stats.mode & 0o7777,
|
|
57
|
+
uid: stats.uid,
|
|
58
|
+
gid: stats.gid,
|
|
59
|
+
mtime: Math.floor(stats.mtimeMs / 1000),
|
|
60
|
+
linkname: linkTarget,
|
|
61
|
+
});
|
|
62
|
+
this.push(header);
|
|
63
|
+
// Write content for files
|
|
64
|
+
if (content && size > 0) {
|
|
65
|
+
this.push(content);
|
|
66
|
+
// Add padding
|
|
67
|
+
const padding = calculatePadding(size);
|
|
68
|
+
if (padding > 0) {
|
|
69
|
+
this.push(Buffer.alloc(padding));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Finalize the archive with end-of-archive marker
|
|
75
|
+
*/
|
|
76
|
+
finalize() {
|
|
77
|
+
this.push(createEndOfArchive());
|
|
78
|
+
}
|
|
79
|
+
_transform(chunk, _encoding, callback) {
|
|
80
|
+
// Pass through any data pushed to us
|
|
81
|
+
callback(null, chunk);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Recursively collect all files in a directory
|
|
86
|
+
*/
|
|
87
|
+
async function collectFiles(basePath, relativePath, follow) {
|
|
88
|
+
const results = [];
|
|
89
|
+
const fullPath = path.join(basePath, relativePath);
|
|
90
|
+
const stats = follow ? await fs.stat(fullPath) : await fs.lstat(fullPath);
|
|
91
|
+
results.push({ path: fullPath, relativePath, stats });
|
|
92
|
+
if (stats.isDirectory()) {
|
|
93
|
+
const entries = await fs.readdir(fullPath);
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
const childRelative = path.join(relativePath, entry);
|
|
96
|
+
const childResults = await collectFiles(basePath, childRelative, follow);
|
|
97
|
+
results.push(...childResults);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return results;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a tar.xz archive
|
|
104
|
+
*
|
|
105
|
+
* @param options - Creation options
|
|
106
|
+
* @returns Promise that resolves when archive is complete
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* await create({
|
|
111
|
+
* file: 'archive.tar.xz',
|
|
112
|
+
* cwd: '/source',
|
|
113
|
+
* files: ['file1.txt', 'dir/'],
|
|
114
|
+
* preset: 6
|
|
115
|
+
* });
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export async function create(options) {
|
|
119
|
+
const { file, cwd = process.cwd(), files, preset = 6, follow = false } = options;
|
|
120
|
+
// Collect all files to archive
|
|
121
|
+
const allFiles = [];
|
|
122
|
+
for (const filePattern of files) {
|
|
123
|
+
const collected = await collectFiles(cwd, filePattern, follow);
|
|
124
|
+
allFiles.push(...collected);
|
|
125
|
+
}
|
|
126
|
+
// Sort entries (directories before their contents)
|
|
127
|
+
allFiles.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
128
|
+
// Create streams
|
|
129
|
+
const tarPack = new TarPack();
|
|
130
|
+
const xzStream = createXz({ preset });
|
|
131
|
+
const outputFile = await fs.open(file, 'w');
|
|
132
|
+
const outputStream = outputFile.createWriteStream();
|
|
133
|
+
// Process files
|
|
134
|
+
const processFiles = async () => {
|
|
135
|
+
for (const { path: filePath, relativePath, stats } of allFiles) {
|
|
136
|
+
let content = null;
|
|
137
|
+
let linkTarget;
|
|
138
|
+
if (stats.isSymbolicLink()) {
|
|
139
|
+
linkTarget = await fs.readlink(filePath);
|
|
140
|
+
}
|
|
141
|
+
else if (stats.isFile()) {
|
|
142
|
+
content = await fs.readFile(filePath);
|
|
143
|
+
}
|
|
144
|
+
await tarPack.addEntry(relativePath, content, stats, linkTarget);
|
|
145
|
+
}
|
|
146
|
+
tarPack.finalize();
|
|
147
|
+
tarPack.push(null); // End the stream
|
|
148
|
+
};
|
|
149
|
+
// Start processing and pipeline
|
|
150
|
+
const processPromise = processFiles();
|
|
151
|
+
await pipeline(tarPack, xzStream, outputStream);
|
|
152
|
+
await processPromise;
|
|
153
|
+
await outputFile.close();
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/node/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js TAR extraction with XZ decompression
|
|
3
|
+
*/
|
|
4
|
+
import { type ExtractOptions, type TarEntry } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Extract a tar.xz archive
|
|
7
|
+
*
|
|
8
|
+
* @param options - Extraction options
|
|
9
|
+
* @returns Promise with list of extracted entries
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* await extract({
|
|
14
|
+
* file: 'archive.tar.xz',
|
|
15
|
+
* cwd: '/dest',
|
|
16
|
+
* strip: 1
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export declare function extract(options: ExtractOptions): Promise<TarEntry[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Extract archive to memory (no disk writes)
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractToMemory(file: string, options?: {
|
|
25
|
+
strip?: number;
|
|
26
|
+
filter?: (entry: TarEntry) => boolean;
|
|
27
|
+
}): Promise<Array<TarEntry & {
|
|
28
|
+
content: Buffer;
|
|
29
|
+
}>>;
|
|
30
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/node/extract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgBH,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAiL/E;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqF1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAA;CAAO,GACtE,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAehD"}
|