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.
Files changed (63) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +201 -0
  3. package/lib/browser/create.d.ts +27 -0
  4. package/lib/browser/create.d.ts.map +1 -0
  5. package/lib/browser/create.js +113 -0
  6. package/lib/browser/create.js.map +1 -0
  7. package/lib/browser/extract.d.ts +24 -0
  8. package/lib/browser/extract.d.ts.map +1 -0
  9. package/lib/browser/extract.js +112 -0
  10. package/lib/browser/extract.js.map +1 -0
  11. package/lib/browser/index.d.ts +7 -0
  12. package/lib/browser/index.d.ts.map +1 -0
  13. package/lib/browser/index.js +7 -0
  14. package/lib/browser/index.js.map +1 -0
  15. package/lib/browser/list.d.ts +23 -0
  16. package/lib/browser/list.d.ts.map +1 -0
  17. package/lib/browser/list.js +81 -0
  18. package/lib/browser/list.js.map +1 -0
  19. package/lib/index.browser.d.ts +12 -0
  20. package/lib/index.browser.d.ts.map +1 -0
  21. package/lib/index.browser.js +14 -0
  22. package/lib/index.browser.js.map +1 -0
  23. package/lib/index.d.ts +12 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +14 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/node/create.d.ts +22 -0
  28. package/lib/node/create.d.ts.map +1 -0
  29. package/lib/node/create.js +155 -0
  30. package/lib/node/create.js.map +1 -0
  31. package/lib/node/extract.d.ts +30 -0
  32. package/lib/node/extract.d.ts.map +1 -0
  33. package/lib/node/extract.js +274 -0
  34. package/lib/node/extract.js.map +1 -0
  35. package/lib/node/index.d.ts +7 -0
  36. package/lib/node/index.d.ts.map +1 -0
  37. package/lib/node/index.js +7 -0
  38. package/lib/node/index.js.map +1 -0
  39. package/lib/node/list.d.ts +20 -0
  40. package/lib/node/list.d.ts.map +1 -0
  41. package/lib/node/list.js +115 -0
  42. package/lib/node/list.js.map +1 -0
  43. package/lib/tar/checksum.d.ts +40 -0
  44. package/lib/tar/checksum.d.ts.map +1 -0
  45. package/lib/tar/checksum.js +91 -0
  46. package/lib/tar/checksum.js.map +1 -0
  47. package/lib/tar/format.d.ts +87 -0
  48. package/lib/tar/format.d.ts.map +1 -0
  49. package/lib/tar/format.js +244 -0
  50. package/lib/tar/format.js.map +1 -0
  51. package/lib/tar/index.d.ts +8 -0
  52. package/lib/tar/index.d.ts.map +1 -0
  53. package/lib/tar/index.js +6 -0
  54. package/lib/tar/index.js.map +1 -0
  55. package/lib/tar/pax.d.ts +82 -0
  56. package/lib/tar/pax.d.ts.map +1 -0
  57. package/lib/tar/pax.js +185 -0
  58. package/lib/tar/pax.js.map +1 -0
  59. package/lib/types.d.ts +144 -0
  60. package/lib/types.d.ts.map +1 -0
  61. package/lib/types.js +26 -0
  62. package/lib/types.js.map +1 -0
  63. 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
@@ -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"}